diff --git a/app/build.gradle b/app/build.gradle
index c982d32c4..f9e73d2bd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,7 +102,7 @@ android {
dependencies {
// Modified dependencies
- implementation 'com.github.inorichi:subsampling-scale-image-view:c19b883'
+ implementation 'com.github.inorichi:subsampling-scale-image-view:81b9d68'
implementation 'com.github.inorichi:junrar-android:634c1f5'
// Android support library
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b45c798e5..a64d4d0b2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -52,6 +52,9 @@
android:scheme="tachiyomi" />
+
()
+ extensionManager.setInstallationResult(downloadId, success)
+ }
+
+ private companion object {
+ const val INSTALL_REQUEST_CODE = 500
+ }
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt
index 93638ee61..f6feabcb8 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt
@@ -77,8 +77,6 @@ internal class ExtensionInstaller(private val context: Context) {
.mergeWith(pollStatus(id))
// Force an error if the download takes more than 3 minutes
.mergeWith(Observable.timer(3, TimeUnit.MINUTES).map { InstallStep.Error })
- // Force an error if the install process takes more than 10 seconds
- .flatMap { Observable.just(it).mergeWith(timeoutWhenInstalling(it)) }
// Stop when the application is installed or errors
.takeUntil { it.isCompleted() }
// Always notify on main thread
@@ -118,27 +116,15 @@ internal class ExtensionInstaller(private val context: Context) {
}
}
- /**
- * Returns an observable that timeouts the installation after a specified time when the apk has
- * been downloaded.
- *
- * @param currentStep The current step of the installation process.
- */
- private fun timeoutWhenInstalling(currentStep: InstallStep): Observable {
- return Observable.just(currentStep)
- .filter { it == InstallStep.Installing }
- .delay(10, TimeUnit.SECONDS)
- .map { InstallStep.Error }
- }
-
/**
* Starts an intent to install the extension at the given uri.
*
* @param uri The uri of the extension to install.
*/
- fun installApk(uri: Uri) {
- val intent = Intent(Intent.ACTION_VIEW)
+ fun installApk(downloadId: Long, uri: Uri) {
+ val intent = Intent(context, ExtensionInstallActivity::class.java)
.setDataAndType(uri, APK_MIME)
+ .putExtra(EXTRA_DOWNLOAD_ID, downloadId)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION)
context.startActivity(intent)
@@ -158,13 +144,14 @@ internal class ExtensionInstaller(private val context: Context) {
}
/**
- * Called when an extension is installed, allowing to update its installation step.
+ * Sets the result of the installation of an extension.
*
- * @param pkgName The package name of the installed application.
+ * @param downloadId The id of the download.
+ * @param result Whether the extension was installed or not.
*/
- fun onApkInstalled(pkgName: String) {
- val id = activeDownloads[pkgName] ?: return
- downloadsRelay.call(id to InstallStep.Installed)
+ fun setInstallationResult(downloadId: Long, result: Boolean) {
+ val step = if (result) InstallStep.Installed else InstallStep.Error
+ downloadsRelay.call(downloadId to step)
}
/**
@@ -243,17 +230,18 @@ internal class ExtensionInstaller(private val context: Context) {
@Suppress("DEPRECATION")
val uriCompat = File(cursor.getString(cursor.getColumnIndex(
DownloadManager.COLUMN_LOCAL_FILENAME))).getUriCompat(context)
- installApk(uriCompat)
+ installApk(id, uriCompat)
}
}
} else {
- installApk(uri)
+ installApk(id, uri)
}
}
}
- private companion object {
+ companion object {
const val APK_MIME = "application/vnd.android.package-archive"
+ const val EXTRA_DOWNLOAD_ID = "ExtensionInstaller.extra.DOWNLOAD_ID"
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt
index cd79f11d1..a38e95300 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt
@@ -57,7 +57,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
override fun onViewCreated(view: View) {
super.onViewCreated(view)
- val extension = presenter.extension
+ val extension = presenter.extension ?: return
val context = view.context
extension_title.text = extension.name
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsPresenter.kt
index f6a6d4d9a..1b9b958f0 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsPresenter.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsPresenter.kt
@@ -12,7 +12,7 @@ class ExtensionDetailsPresenter(
private val extensionManager: ExtensionManager = Injekt.get()
) : BasePresenter() {
- val extension = extensionManager.installedExtensions.first { it.pkgName == pkgName }
+ val extension = extensionManager.installedExtensions.find { it.pkgName == pkgName }
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
@@ -33,6 +33,7 @@ class ExtensionDetailsPresenter(
}
fun uninstallExtension() {
+ val extension = extension ?: return
extensionManager.uninstallExtension(extension.pkgName)
}
}
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 f1f010f0e..4cd8b2a81 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
@@ -148,7 +148,10 @@ class MainActivity : BaseActivity() {
SHORTCUT_RECENTLY_UPDATED -> setSelectedDrawerItem(R.id.nav_drawer_recent_updates)
SHORTCUT_RECENTLY_READ -> setSelectedDrawerItem(R.id.nav_drawer_recently_read)
SHORTCUT_CATALOGUES -> setSelectedDrawerItem(R.id.nav_drawer_catalogues)
- SHORTCUT_MANGA -> router.setRoot(RouterTransaction.with(MangaController(intent.extras)))
+ SHORTCUT_MANGA -> {
+ val extras = intent.extras ?: return false
+ router.setRoot(RouterTransaction.with(MangaController(extras)))
+ }
SHORTCUT_DOWNLOADS -> {
if (router.backstack.none { it.controller() is DownloadController }) {
setSelectedDrawerItem(R.id.nav_drawer_downloads)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
index 4bcf08a43..d6be75efd 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
@@ -39,7 +39,7 @@ import java.util.*
class MangaController : RxController, TabbedController {
constructor(manga: Manga?, fromCatalogue: Boolean = false) : super(Bundle().apply {
- putLong(MANGA_EXTRA, manga?.id!!)
+ putLong(MANGA_EXTRA, manga?.id ?: 0)
putBoolean(FROM_CATALOGUE_EXTRA, fromCatalogue)
}) {
this.manga = manga
diff --git a/app/src/main/res/layout/catalogue_main_controller_card_item.xml b/app/src/main/res/layout/catalogue_main_controller_card_item.xml
index 9d06cd7d2..14954bc50 100644
--- a/app/src/main/res/layout/catalogue_main_controller_card_item.xml
+++ b/app/src/main/res/layout/catalogue_main_controller_card_item.xml
@@ -14,25 +14,22 @@
+ app:layout_constraintTop_toTopOf="parent"
+ tools:src="@mipmap/ic_launcher_round" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/extension_card_item.xml b/app/src/main/res/layout/extension_card_item.xml
index 6acbe21ba..3d25905a6 100644
--- a/app/src/main/res/layout/extension_card_item.xml
+++ b/app/src/main/res/layout/extension_card_item.xml
@@ -14,14 +14,15 @@
+ tools:src="@mipmap/ic_launcher_round" />