* feat: add cross device sync. * chore: add google api. * chore: add SY specifics. * feat: add backupSource, backupPref, and "SY" backupSavedSearches. I forgot to add the data into the merging logic, So remote always have empty value :(. Better late than never. * feat(sync): Allow to choose what to sync. Various improvement and added the option to choose what they want to sync. Added sync library button to LibraryTab as well. Signed-off-by: KaiserBh <kaiserbh@proton.me> * oops. Signed-off-by: KaiserBh <kaiserbh@proton.me> * refactor: fix up the sync triggers, and update imports. * refactor * chore: review pointers. * refactor: update imports * refactor: add more error guard for gdrive. Also changed it to be app specific, we don't want them to use sync data from SY or other forks as some of the model and backup is different. So if people using other forks they should use the same data and not mismatch. * fix: conflict and refactor. * refactor: update imports. * chore: fix some of detekt error. * refactor: add breaks and max retries. I think we were reaching deadlock or infinite loop causing the sync to go forever. * feat: db changes to accommodate new syncing logic. Using timestamp to sync is a bit skewed due to system clock etc and therefore there was a lot of issues with it such as removing a manga that shouldn't have been removed. Marking chapters as unread even though it was marked as a read. Hopefully by using versioning system it should eliminate those issues. * chore: add migrations * chore: version and is_syncing fields. * chore: add SY only stuff. * fix: oops wrong index. Signed-off-by: KaiserBh <kaiserbh@proton.me> * chore: review pointers. Signed-off-by: KaiserBh <kaiserbh@proton.me> * chore: remove the option to reset timestamp We don't need this anymore since we are utilizing versioning system. Signed-off-by: KaiserBh <kaiserbh@proton.me> * refactor: Forgot to use the new versioning system. I forgot to cherry pick this from mihon branch. * chore: remove isSyncing from Chapter/Manga model. Signed-off-by: KaiserBh <kaiserbh@proton.me> * chore: remove unused import. Signed-off-by: KaiserBh <kaiserbh@proton.me> * chore: remove isSyncing leftover. Signed-off-by: KaiserBh <kaiserbh@proton.me> * chore: remove isSyncing. Signed-off-by: KaiserBh <kaiserbh@proton.me> * refactor: make sure the manga version is bumped. When there is changes in the chapters table such as reading or updating last read page we should bump the manga version. This way the manga is synced properly as in the History and last_read history is synced properly. This should fix the sorting issue. Signed-off-by: KaiserBh <kaiserbh@proton.me> --------- Signed-off-by: KaiserBh <kaiserbh@proton.me>
399 lines
16 KiB
XML
Executable File
399 lines
16 KiB
XML
Executable File
<?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.WRITE_EXTERNAL_STORAGE"
|
|
tools:ignore="ScopedStorage" />
|
|
|
|
<!-- 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" />
|
|
|
|
<!-- Remove permission from Firebase dependency -->
|
|
<uses-permission
|
|
android:name="com.google.android.gms.permission.AD_ID"
|
|
tools:node="remove" />
|
|
|
|
<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_round"
|
|
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="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"/>
|
|
|
|
<receiver
|
|
android:name=".data.notification.NotificationReceiver"
|
|
android:exported="false" />
|
|
|
|
<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" />
|
|
|
|
<!-- Disable advertising ID collection for Firebase -->
|
|
<meta-data
|
|
android:name="google_analytics_adid_collection_enabled"
|
|
android:value="false" />
|
|
|
|
<!-- EH -->
|
|
<activity
|
|
android:name="exh.ui.intercept.InterceptActivity"
|
|
android:label="@string/app_name"
|
|
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.io" />
|
|
|
|
<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>
|
|
</application>
|
|
|
|
</manifest>
|