diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7ed70d50c3..00bb6977e8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -204,6 +204,7 @@ dependencies { implementation("com.github.chrisbanes:PhotoView:2.3.0") implementation("com.github.carlosesco:DirectionalViewPager:a844dbca0a") implementation("com.github.florent37:viewtooltip:1.2.2") + implementation("com.getkeepsafe.taptargetview:taptargetview:1.13.0") // Conductor implementation("com.bluelinelabs:conductor:2.1.5") diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 19a47e1b5b..2fdf9dfe53 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -267,4 +267,6 @@ class PreferencesHelper(val context: Context) { fun shownFilterTutorial() = flowPrefs.getBoolean("shown_filter_tutorial", false) fun shownChapterSwipeTutorial() = flowPrefs.getBoolean("shown_swipe_tutorial", false) + + fun shownDownloadQueueTutorial() = flowPrefs.getBoolean("shown_download_queue", false) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 4ca6d077f3..598b9203a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -29,6 +29,8 @@ import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.Router import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.FadeChangeHandler +import com.getkeepsafe.taptargetview.TapTarget +import com.getkeepsafe.taptargetview.TapTargetView import com.google.android.material.snackbar.Snackbar import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.Migrations @@ -38,7 +40,6 @@ import eu.kanade.tachiyomi.data.download.DownloadService import eu.kanade.tachiyomi.data.download.DownloadServiceListener import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.notification.NotificationReceiver -import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi import eu.kanade.tachiyomi.ui.base.activity.BaseActivity @@ -53,6 +54,7 @@ import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate import eu.kanade.tachiyomi.ui.setting.SettingsController import eu.kanade.tachiyomi.ui.setting.SettingsMainController import eu.kanade.tachiyomi.ui.source.SourceController +import eu.kanade.tachiyomi.util.system.contextCompatDrawable import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.hasSideNavBar import eu.kanade.tachiyomi.util.system.isBottomTappable @@ -69,8 +71,6 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.util.Date import java.util.concurrent.TimeUnit @@ -91,6 +91,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { private var canDismissSnackBar = false private var animationSet: AnimatorSet? = null + private val downloadManager: DownloadManager by injectLazy() fun setUndoSnackBar(snackBar: Snackbar?, extraViewToCheck: View? = null) { this.snackBar = snackBar @@ -255,6 +256,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { handler: ControllerChangeHandler ) { appbar.y = 0f + showDLQueueTutorial() } }) @@ -346,6 +348,32 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { // setting in case someone comes from the search activity to main getExtensionUpdates() DownloadService.callListeners() + showDLQueueTutorial() + } + + private fun showDLQueueTutorial() { + if (router.backstackSize == 1 && this !is SearchActivity && + downloadManager.hasQueue() && !preferences.shownDownloadQueueTutorial().get() + ) { + val recentsItem = bottom_nav.getItemView(R.id.nav_recents) ?: return + preferences.shownDownloadQueueTutorial().set(true) + TapTargetView.showFor(this, + TapTarget.forView( + recentsItem, + getString(R.string.manage_whats_downloading), + getString(R.string.visit_recents_for_download_queue) + ).outerCircleColor(R.color.colorAccent).outerCircleAlpha(0.95f).titleTextSize(20) + .titleTextColor(android.R.color.white).descriptionTextSize(16) + .descriptionTextColor(R.color.md_white_1000_76) + .icon(contextCompatDrawable(R.drawable.ic_recent_read_32dp)) + .targetCircleColor(android.R.color.white).targetRadius(45), + object : TapTargetView.Listener() { + override fun onTargetClick(view: TapTargetView) { + super.onTargetClick(view) + bottom_nav.selectedItemId = R.id.nav_recents + } + }) + } } override fun onPause() { @@ -356,7 +384,6 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { private fun getExtensionUpdates() { if (Date().time >= preferences.lastExtCheck().getOrDefault() + TimeUnit.HOURS.toMillis(6)) { GlobalScope.launch(Dispatchers.IO) { - val preferences: PreferencesHelper by injectLazy() try { val pendingUpdates = ExtensionGithubApi().checkForUpdates(this@MainActivity) preferences.extensionUpdatesCount().set(pendingUpdates.size) @@ -529,11 +556,11 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { } override fun downloadStatusChanged(downloading: Boolean) { - val downloadManager = Injekt.get() val hasQueue = downloading || downloadManager.hasQueue() launchUI { if (hasQueue) { bottom_nav?.getOrCreateBadge(R.id.nav_recents) + showDLQueueTutorial() } else { bottom_nav?.removeBadge(R.id.nav_recents) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index efd7790fb8..5f953b51cd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -10,6 +10,7 @@ import android.content.IntentFilter import android.content.pm.PackageManager import android.content.res.Configuration import android.content.res.Resources +import android.graphics.drawable.Drawable import android.net.ConnectivityManager import android.net.Uri import android.os.PowerManager @@ -17,6 +18,7 @@ import android.view.View import android.widget.Toast import androidx.annotation.AttrRes import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.browser.customtabs.CustomTabsIntent import androidx.core.app.NotificationCompat @@ -101,6 +103,15 @@ fun Context.contextCompatColor(@ColorRes resource: Int): Int { return ContextCompat.getColor(this, resource) } +/** + * Returns the color from ContextCompat + * + * @param resource the color. + */ +fun Context.contextCompatDrawable(@DrawableRes resource: Int): Drawable? { + return ContextCompat.getDrawable(this, resource) +} + /** * Converts to dp. */ diff --git a/app/src/main/res/drawable/ic_recent_read_24dp.xml b/app/src/main/res/drawable/ic_recent_read_32dp.xml similarity index 84% rename from app/src/main/res/drawable/ic_recent_read_24dp.xml rename to app/src/main/res/drawable/ic_recent_read_32dp.xml index 11c4d5e625..9b26a9c04b 100644 --- a/app/src/main/res/drawable/ic_recent_read_24dp.xml +++ b/app/src/main/res/drawable/ic_recent_read_32dp.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/ic_recent_read_selector_24dp.xml b/app/src/main/res/drawable/ic_recent_read_selector_24dp.xml index 81ea68a928..0683bf9008 100644 --- a/app/src/main/res/drawable/ic_recent_read_selector_24dp.xml +++ b/app/src/main/res/drawable/ic_recent_read_selector_24dp.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 95938eae2e..a045e3370b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -564,6 +564,9 @@ Download complete Download error Could not download chapters. You can try again in the downloads section + Manage what\'s downloading + Visit the recents tab to access the download + queue. You can also double tap or press and hold for quicker access Could not download chapter due to unexpected error