* Add RPC [Barebone, barely works] Co-Authored-By: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> * refactor connections * RPC (#223) * Add error handling and refactor DiscordRPCService methods * Add Discord RPC customization options and preferences * Update Discord RPC button labels and clean up comments * Refactor DiscordRPCService to improve readability by adding braces for null checks * Refactor ConnectionsPreferences to improve code clarity and organization * Refactor ConnectionsPreferences to improve code clarity and organization (cherry picked from commit df42d196368d28c3c9dcee3692f3f9140da7f2a1) * Feat: implement Discord account management enhancements and RPC restart functionality (#245) * fix: correct indentation in CastManager for better readability * feat: implement Discord account management enhancements and RPC restart functionality (cherry picked from commit b7c50f1f0184dd717c5cc4dee0310053bfb8d613) * Notification color & icon for DiscordRPC Co-Authored-By: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> * Change foss variant application id suffix to '.foss' and more (mihonapp/mihon#1831) - Remove `BuildConfig.PREVIEW` - Rename `BuildConfig.INCLUDE_ANALYTICS` -> `BuildConfig.ANALYTICS_INCLUDED` - Rename `BuildConfig.INCLUDE_UPDATER` -> `BuildConfig.UPDATER_ENABLED` - Rename build property `with-analytics` -> `include-analytics` - Rename build property `with-updater` -> `enable-updater` - Add build property to disable code shrink - Add build property to include dependency info in apk/app bundle (cherry picked from commit 0893609ad2c4791dc404d72a5e69a2e0373517ae) * feat(discord): update App/icon & fully works with all screens * update Discord Rich Presence application ID and icon URLs * Fix updateDiscordRPC for all screens (also reuse code) * integrate Discord Rich Presence for WebViewScreen * feat: ghibli style images for Discord RPC * optimize code * further optimize * supprest useless warning * refactor: simplify setScreen calls related to lastUsedScreen * optimize whole file * a Co-Authored-By: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> * fix(discord): update download button URL to point to the official website * feat(discord): allow stop Discord RPC from notification also improve error handling * fix(i18n): Torrent server "stop" multi-lang * Start DiscordRPCService as foreground service on Android O+ This commit modifies the `DiscordRPCService` to start as a foreground service on Android O (API level 26) and above. This change ensures the service continues to run in the background, especially when the app is not in the foreground. - Added a conditional check using `Build.VERSION.SDK_INT` to detect if the device is running Android O or later. - If the device is running Android O or later, `startForegroundService` is called instead of `startService` to ensure it runs as foreground service. - If the device is running a version prior to Android O, `startService` is called. (cherry picked from commit 869617d8cac3aa8461158f1f9a34b9e29147e8f0) * fix(discord): episode/chapter formating * fix(discord): Fix & improve Discord login/accounts * New webview with DiscordLoginScreen * Add appbar * Using Webview directly instead of AndroidView and add clearCookies, browsing navigation * Using coroutine instead of thread * Revert service * use response block * save preference in coroutine too * no web navigator * address comments for DiscordLoginScreen * Refactor Settings screen & dialog * Using serialization to parse JSON to avoid blocking API * Don't clear all cookies and web storage aggressively * Extract constant * Fix login Co-Authored-By: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> * fix(discord): Fix screen crash & token retrievement * Update images to my liking * spotless * small fixes * Update strings.xml * Revert "Update images to my liking" This reverts commit 4ad3b9f84fdada45ee480ae7dc242b6e1b4bc18a. * small fixes * hopeful fix + chapter progress * Update ReaderActivity.kt * Update ReaderActivity.kt * remove timestamps * Remove isNSFW check because 95% of tachi extensions are rated as +18, even when there is sfw content * Clean up * Fix ReaderActivity * Cleanup Settings * Fix login * Fix lag when getting categories * Fix jump to pages * Remove old SDK check * Fix status when back from reading * Remove pages progress * Only set necessary action in ReaderActivity * Using IO coroutine instead * Add back timestamps * Fix strings & settings * Fix crash * ActivityType * Adjust description * refactor Discord settings menu * Using its own scope * Optimize the connection waiting * remove source.isNSFW * Using screenModelScope * Fix state access * add modifier * sharing OkHttpClient instance for better resource management * Restart RPC directly via service intent instead of toggling * remove lint suppression * add back showProgress * Fix set Discord status * Fix Discord login no avatar * Handle API rate limits and errors in getDiscordUri * Token-based isLogged checking * Make Discord token sensitive data and not in backup * Minor fix * remove debug message --------- Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Co-authored-by: Cuong-Tran <cuongtran.tm@gmail.com> Co-authored-by: Dark25 <nadiecaca2000@gmail.com> Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: Jery <jery99961@gmail.com>
422 lines
16 KiB
XML
422 lines
16 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools">
|
|
|
|
<!-- Internet -->
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
|
|
|
<!-- Storage -->
|
|
<uses-permission
|
|
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
|
|
tools:ignore="ScopedStorage" />
|
|
<!-- Permission to save cover into Pictures. It isn't required from API 29 -->
|
|
<uses-permission
|
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
|
android:maxSdkVersion="28" />
|
|
<!-- For access custom cover on Android 12 & below (API 32) -->
|
|
<uses-permission
|
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
|
android:maxSdkVersion="32" />
|
|
<!-- For access custom cover from Android 13+ (API 33) -->
|
|
<uses-permission
|
|
android:name="android.permission.READ_MEDIA_IMAGES"
|
|
tools:ignore="SelectedPhotoAccess" />
|
|
|
|
<!-- For background jobs -->
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
|
|
<!-- For managing extensions -->
|
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
|
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
|
|
<!-- To view extension packages in API 30+ -->
|
|
<uses-permission
|
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
|
tools:ignore="QueryAllPackagesPermission" />
|
|
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
<uses-permission
|
|
android:name="android.permission.READ_APP_SPECIFIC_LOCALES"
|
|
tools:ignore="ProtectedPermissions" />
|
|
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
|
|
|
<application
|
|
android:name=".App"
|
|
android:allowBackup="false"
|
|
android:enableOnBackInvokedCallback="true"
|
|
android:hardwareAccelerated="true"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:label="@string/app_name"
|
|
android:largeHeap="true"
|
|
android:localeConfig="@xml/locales_config"
|
|
android:networkSecurityConfig="@xml/network_security_config"
|
|
android:preserveLegacyExternalStorage="true"
|
|
android:requestLegacyExternalStorage="true"
|
|
android:roundIcon="@mipmap/ic_launcher"
|
|
android:supportsRtl="true"
|
|
android:theme="@style/Theme.Tachiyomi">
|
|
|
|
<activity
|
|
android:name=".ui.main.MainActivity"
|
|
android:exported="true"
|
|
android:launchMode="singleTop"
|
|
android:theme="@style/Theme.Tachiyomi.SplashScreen">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
|
|
<!-- Deep link to add repos -->
|
|
<intent-filter android:label="@string/action_add_repo">
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="tachiyomi" />
|
|
<data android:host="add-repo" />
|
|
</intent-filter>
|
|
|
|
<!-- Open backup files -->
|
|
<intent-filter android:label="@string/pref_restore_backup">
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="file" />
|
|
<data android:scheme="content" />
|
|
<data android:host="*" />
|
|
<data android:mimeType="*/*" />
|
|
<!--
|
|
Work around Android's ugly primitive PatternMatcher
|
|
implementation that can't cope with finding a . early in
|
|
the path unless it's explicitly matched.
|
|
|
|
See https://stackoverflow.com/a/31028507
|
|
-->
|
|
<data android:pathPattern=".*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\..*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\..*\\..*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.tachibk" />
|
|
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.tachibk" />
|
|
</intent-filter>
|
|
|
|
<!--suppress AndroidDomInspection -->
|
|
<meta-data
|
|
android:name="android.app.shortcuts"
|
|
android:resource="@xml/shortcuts" />
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".crash.CrashActivity"
|
|
android:exported="false"
|
|
android:process=":error_handler" />
|
|
|
|
<activity
|
|
android:name=".ui.deeplink.DeepLinkActivity"
|
|
android:exported="true"
|
|
android:label="@string/action_search"
|
|
android:launchMode="singleTask"
|
|
android:theme="@android:style/Theme.NoDisplay">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.SEARCH" />
|
|
<action android:name="com.google.android.gms.actions.SEARCH_ACTION" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="eu.kanade.tachiyomi.SEARCH" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.SEND" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<data android:mimeType="text/plain" />
|
|
</intent-filter>
|
|
|
|
<meta-data
|
|
android:name="android.app.searchable"
|
|
android:resource="@xml/searchable" />
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".ui.reader.ReaderActivity"
|
|
android:exported="false"
|
|
android:launchMode="singleTask">
|
|
<intent-filter>
|
|
<action android:name="com.samsung.android.support.REMOTE_ACTION" />
|
|
</intent-filter>
|
|
|
|
<meta-data
|
|
android:name="com.samsung.android.support.REMOTE_ACTION"
|
|
android:resource="@xml/s_pen_actions" />
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".ui.security.UnlockActivity"
|
|
android:exported="false"
|
|
android:theme="@style/Theme.Tachiyomi" />
|
|
|
|
<activity
|
|
android:name=".ui.webview.WebViewActivity"
|
|
android:configChanges="uiMode|orientation|screenSize"
|
|
android:exported="false" />
|
|
|
|
<activity
|
|
android:name=".extension.util.ExtensionInstallActivity"
|
|
android:exported="false"
|
|
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
|
|
|
|
<activity
|
|
android:name=".ui.setting.track.TrackLoginActivity"
|
|
android:exported="true"
|
|
android:label="@string/track_activity_name">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="komikku" />
|
|
<data android:scheme="mihon" />
|
|
|
|
<data android:host="anilist-auth" />
|
|
<data android:host="bangumi-auth" />
|
|
<data android:host="myanimelist-auth" />
|
|
<data android:host="shikimori-auth" />
|
|
</intent-filter>
|
|
</activity>
|
|
<activity
|
|
android:name=".ui.setting.track.GoogleDriveLoginActivity"
|
|
android:label="GoogleDrive"
|
|
android:exported="true">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data
|
|
android:scheme="eu.kanade.google.oauth" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name="exh.ui.login.EhLoginActivity"
|
|
android:label="EHentaiLogin"
|
|
android:exported="false"/>
|
|
|
|
<service
|
|
android:name=".data.connections.discord.DiscordRPCService"
|
|
android:enabled="true"
|
|
android:exported="false"
|
|
android:foregroundServiceType="dataSync">
|
|
</service>
|
|
|
|
<receiver
|
|
android:name=".data.notification.NotificationReceiver"
|
|
android:exported="false" />
|
|
|
|
<receiver
|
|
android:name=".data.updater.AppUpdateBroadcast"
|
|
android:exported="false">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
|
|
</intent-filter>
|
|
</receiver>
|
|
|
|
<service
|
|
android:name=".extension.util.ExtensionInstallService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="shortService" />
|
|
|
|
<service
|
|
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
|
|
android:enabled="false"
|
|
android:exported="false">
|
|
<meta-data
|
|
android:name="autoStoreLocales"
|
|
android:value="true" />
|
|
</service>
|
|
|
|
<service
|
|
android:name="androidx.work.impl.foreground.SystemForegroundService"
|
|
android:foregroundServiceType="dataSync"
|
|
tools:node="merge" />
|
|
|
|
<provider
|
|
android:name="androidx.core.content.FileProvider"
|
|
android:authorities="${applicationId}.provider"
|
|
android:exported="false"
|
|
android:grantUriPermissions="true">
|
|
<meta-data
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
android:resource="@xml/provider_paths" />
|
|
</provider>
|
|
|
|
<provider
|
|
android:name="rikka.shizuku.ShizukuProvider"
|
|
android:authorities="${applicationId}.shizuku"
|
|
android:enabled="true"
|
|
android:exported="true"
|
|
android:multiprocess="false"
|
|
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
|
|
|
<meta-data
|
|
android:name="android.webkit.WebView.EnableSafeBrowsing"
|
|
android:value="false" />
|
|
<meta-data
|
|
android:name="android.webkit.WebView.MetricsOptOut"
|
|
android:value="true" />
|
|
|
|
<!-- EH -->
|
|
<activity
|
|
android:name="exh.ui.intercept.InterceptActivity"
|
|
android:theme="@style/Theme.Tachiyomi"
|
|
android:exported="true">
|
|
<!-- E-Hentai -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="e-hentai.org" />
|
|
<data android:host="www.e-hentai.org" />
|
|
<data android:host="g.e-hentai.org" />
|
|
|
|
<data android:pathPattern="/g/..*" />
|
|
</intent-filter>
|
|
<!-- ExHentai -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="exhentai.org" />
|
|
<data android:host="www.exhentai.org" />
|
|
|
|
<data android:pathPattern="/g/..*" />
|
|
</intent-filter>
|
|
<!-- NHentai -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="nhentai.net" />
|
|
<data android:host="www.nhentai.net" />
|
|
|
|
<data android:pathPattern="/g/..*" />
|
|
</intent-filter>
|
|
<!-- Tsumino -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="tsumino.com" />
|
|
<data android:host="www.tsumino.com" />
|
|
|
|
<data android:pathPattern="/Read/View/..*" />
|
|
<data android:pathPattern="/Book/Info/..*" />
|
|
</intent-filter>
|
|
<!-- Pururin -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="pururin.me" />
|
|
|
|
<data android:pathPattern="/gallery/..*" />
|
|
</intent-filter>
|
|
<!-- HBrowse -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
<data android:scheme="http" />
|
|
|
|
<data android:host="hbrowse.com" />
|
|
<data android:host="www.hbrowse.com" />
|
|
|
|
<!--<data android:pathPattern="/gallery/..*" />-->
|
|
</intent-filter>
|
|
<!-- Mangadex -->
|
|
<intent-filter android:autoVerify="true">
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data android:scheme="https" />
|
|
|
|
<data android:host="mangadex.org" />
|
|
<data android:host="mangadex.cc" />
|
|
<data android:host="www.mangadex.org" />
|
|
<data android:host="www.mangadex.cc" />
|
|
|
|
<data android:pathPattern="/manga/..*" />
|
|
<data android:pathPattern="/title/..*" />
|
|
<data android:pathPattern="/chapter/..*" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name="exh.md.MangaDexLoginActivity"
|
|
android:label="MangaDexLogin"
|
|
android:exported="true">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
|
|
<data
|
|
android:host="mangadex-auth"
|
|
android:scheme="tachiyomisy" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name="com.journeyapps.barcodescanner.CaptureActivity"
|
|
tools:remove="screenOrientation" />
|
|
</application>
|
|
|
|
</manifest>
|