diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt index b7bac70c8..ae3b54a45 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt @@ -18,11 +18,13 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog import eu.kanade.tachiyomi.ui.manga.MangaController +import eu.kanade.tachiyomi.ui.manga.info.MangaWebViewController import eu.kanade.tachiyomi.util.* import eu.kanade.tachiyomi.widget.AutofitRecyclerView import exh.EXHSavedSearch @@ -350,15 +352,38 @@ open class BrowseCatalogueController(bundle: Bundle) : } } + override fun onPrepareOptionsMenu(menu: Menu) { + super.onPrepareOptionsMenu(menu) + + val isHttpSource = presenter.source is HttpSource + menu.findItem(R.id.action_open_in_browser).isVisible = isHttpSource + menu.findItem(R.id.action_open_in_web_view).isVisible = isHttpSource + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.action_display_mode -> swapDisplayMode() R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(Gravity.END) } + R.id.action_open_in_browser -> openInBrowser() + R.id.action_open_in_web_view -> openInWebView() else -> return super.onOptionsItemSelected(item) } return true } + private fun openInBrowser() { + val source = presenter.source as? HttpSource ?: return + + activity?.openInBrowser(source.baseUrl) + } + + private fun openInWebView() { + val source = presenter.source as? HttpSource ?: return + + router.pushController(MangaWebViewController(source.id, source.baseUrl) + .withFadeTransaction()) + } + /** * Restarts the request with a new query. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index bfc276670..967df034d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -8,10 +8,8 @@ import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.drawable.Drawable -import android.net.Uri import android.os.Build import android.os.Bundle -import android.support.customtabs.CustomTabsIntent import android.support.v4.content.pm.ShortcutInfoCompat import android.support.v4.content.pm.ShortcutManagerCompat import android.support.v4.graphics.drawable.IconCompat @@ -35,7 +33,6 @@ 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.source.Source -import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.DialogController @@ -45,7 +42,7 @@ import eu.kanade.tachiyomi.ui.catalogue.global_search.CatalogueSearchController import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.manga.MangaController -import eu.kanade.tachiyomi.util.getResourceColor +import eu.kanade.tachiyomi.util.openInBrowser import eu.kanade.tachiyomi.util.snack import eu.kanade.tachiyomi.util.toast import eu.kanade.tachiyomi.util.truncateCenter @@ -56,7 +53,6 @@ import exh.ui.webview.WebViewActivity import jp.wasabeef.glide.transformations.CropSquareTransformation import jp.wasabeef.glide.transformations.MaskTransformation import kotlinx.android.synthetic.main.manga_info_controller.* -import timber.log.Timber import uy.kohesive.injekt.injectLazy import java.text.DateFormat import java.text.DecimalFormat @@ -334,11 +330,7 @@ class MangaInfoController : NucleusController(), putExtra(WebViewActivity.KEY_URL, urlString) }) } else { - val url = Uri.parse(urlString) - val intent = CustomTabsIntent.Builder() - .setToolbarColor(context.getResourceColor(R.attr.colorPrimary)) - .build() - intent.launchUrl(activity, url) + context.openInBrowser(source.mangaDetailsRequest(presenter.manga).url().toString()) } // <-- EH } catch (e: Exception) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt index 1dd0dda4c..608339907 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt @@ -11,16 +11,20 @@ import android.content.res.Resources import android.net.ConnectivityManager import android.net.wifi.WifiManager import android.os.Build +import android.net.Uri import android.os.PowerManager import android.os.VibrationEffect import android.os.Vibrator import android.support.annotation.AttrRes +import android.support.annotation.RequiresApi import android.support.annotation.StringRes +import android.support.customtabs.CustomTabsIntent import android.support.v4.app.NotificationCompat import android.support.v4.content.ContextCompat import android.support.v4.content.LocalBroadcastManager import android.widget.Toast import com.nononsenseapps.filepicker.FilePickerActivity +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.widget.CustomLayoutPickerActivity @@ -133,6 +137,7 @@ val Context.clipboardManager: ClipboardManager get() = applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val Context.jobScheduler: JobScheduler + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) get() = applicationContext.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler // <-- EH @@ -183,6 +188,21 @@ fun Context.isServiceRunning(serviceClass: Class<*>): Boolean { .any { className == it.service.className } } +/** + * Opens a URL in a custom tab. + */ +fun Context.openInBrowser(url: String) { + try { + val url = Uri.parse(url) + val intent = CustomTabsIntent.Builder() + .setToolbarColor(getResourceColor(R.attr.colorPrimary)) + .build() + intent.launchUrl(this, url) + } catch (e: Exception) { + toast(e.message) + } +} + fun Context.vibrate(time: Long) { val vibeService = getSystemService(VIBRATOR_SERVICE) as Vibrator if (Build.VERSION.SDK_INT >= 26) { diff --git a/app/src/main/res/menu/catalogue_list.xml b/app/src/main/res/menu/catalogue_list.xml index ff4373df4..1b75d4ae7 100755 --- a/app/src/main/res/menu/catalogue_list.xml +++ b/app/src/main/res/menu/catalogue_list.xml @@ -19,4 +19,15 @@ android:id="@+id/action_display_mode" android:title="@string/action_display_mode" app:showAsAction="ifRoom"/> + + + + +