Minor adjustments

This commit is contained in:
topjohnwu 2022-02-13 20:16:23 -08:00
parent 668e549208
commit e36596470c
4 changed files with 27 additions and 15 deletions

View File

@ -56,8 +56,11 @@ public final class APKInstall {
} }
public interface Session { public interface Session {
// @WorkerThread
OutputStream openStream(Context context) throws IOException; OutputStream openStream(Context context) throws IOException;
// @WorkerThread
void install(Context context, File apk) throws IOException; void install(Context context, File apk) throws IOException;
// @WorkerThread @Nullable
Intent waitIntent(); Intent waitIntent();
} }
@ -106,11 +109,10 @@ public final class APKInstall {
context.getApplicationContext().unregisterReceiver(this); context.getApplicationContext().unregisterReceiver(this);
} }
// @WorkerThread @Nullable
@Override @Override
public Intent waitIntent() { public Intent waitIntent() {
try { try {
//noinspection ResultOfMethodCallIgnored // noinspection ResultOfMethodCallIgnored
latch.await(5, TimeUnit.SECONDS); latch.await(5, TimeUnit.SECONDS);
} catch (Exception ignored) {} } catch (Exception ignored) {}
return userAction; return userAction;

View File

@ -13,12 +13,14 @@ import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.StubApk import com.topjohnwu.magisk.StubApk
import com.topjohnwu.magisk.core.* import com.topjohnwu.magisk.core.*
import com.topjohnwu.magisk.core.tasks.HideAPK import com.topjohnwu.magisk.core.tasks.HideAPK
import com.topjohnwu.magisk.core.utils.MediaStoreUtils
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
import com.topjohnwu.magisk.ktx.copyAndClose import com.topjohnwu.magisk.ktx.copyAndClose
import com.topjohnwu.magisk.ktx.forEach import com.topjohnwu.magisk.ktx.forEach
import com.topjohnwu.magisk.ktx.withStreams import com.topjohnwu.magisk.ktx.withStreams
import com.topjohnwu.magisk.ktx.writeTo import com.topjohnwu.magisk.ktx.writeTo
import com.topjohnwu.magisk.utils.APKInstall import com.topjohnwu.magisk.utils.APKInstall
import com.topjohnwu.magisk.view.Notifications
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -57,12 +59,13 @@ class DownloadService : NotificationService() {
is Subject.Module -> handleModule(stream, subject.file) is Subject.Module -> handleModule(stream, subject.file)
} }
val activity = ActivityTracker.foreground val activity = ActivityTracker.foreground
if (activity != null && subject.autoStart) { if (activity != null && subject.autoLaunch) {
remove(subject.notifyId) remove(subject.notifyId)
subject.pendingIntent(activity)?.send() subject.pendingIntent(activity)?.send()
} else { } else {
notifyFinish(subject) notifyFinish(subject)
} }
subject.postDownload?.invoke()
if (!hasNotifications) if (!hasNotifications)
stopSelf() stopSelf()
} catch (e: Exception) { } catch (e: Exception) {
@ -79,7 +82,8 @@ class DownloadService : NotificationService() {
private suspend fun handleApp(stream: InputStream, subject: Subject.App) { private suspend fun handleApp(stream: InputStream, subject: Subject.App) {
fun writeTee(output: OutputStream) { fun writeTee(output: OutputStream) {
val external = subject.externalFile.outputStream() val uri = MediaStoreUtils.getFile("${subject.title}.apk").uri
val external = uri.outputStream()
stream.copyAndClose(TeeOutputStream(external, output)) stream.copyAndClose(TeeOutputStream(external, output))
} }
@ -120,8 +124,9 @@ class DownloadService : NotificationService() {
// Relaunch the process if we are foreground // Relaunch the process if we are foreground
StubApk.restartProcess(it) StubApk.restartProcess(it)
} ?: run { } ?: run {
// Or else simply kill the current process // Or else kill the current process after posting notification
Runtime.getRuntime().exit(0) subject.intent = Notifications.selfLaunchIntent(this)
subject.postDownload = { Runtime.getRuntime().exit(0) }
} }
return return
} }

View File

@ -32,7 +32,8 @@ sealed class Subject : Parcelable {
abstract val file: Uri abstract val file: Uri
abstract val title: String abstract val title: String
abstract val notifyId: Int abstract val notifyId: Int
open val autoStart: Boolean get() = true open val autoLaunch: Boolean get() = true
open val postDownload: (() -> Unit)? get() = null
abstract fun pendingIntent(context: Context): PendingIntent? abstract fun pendingIntent(context: Context): PendingIntent?
@ -44,7 +45,7 @@ sealed class Subject : Parcelable {
) : Subject() { ) : Subject() {
override val url: String get() = module.zipUrl override val url: String get() = module.zipUrl
override val title: String get() = module.downloadFilename override val title: String get() = module.downloadFilename
override val autoStart: Boolean get() = action == Action.Flash override val autoLaunch: Boolean get() = action == Action.Flash
@IgnoredOnParcel @IgnoredOnParcel
override val file by lazy { override val file by lazy {
@ -69,11 +70,11 @@ sealed class Subject : Parcelable {
cachedFile("manager.apk") cachedFile("manager.apk")
} }
@IgnoredOnParcel
override var postDownload: (() -> Unit)? = null
@IgnoredOnParcel @IgnoredOnParcel
var intent: Intent? = null var intent: Intent? = null
val externalFile get() = MediaStoreUtils.getFile("$title.apk").uri
override fun pendingIntent(context: Context) = intent?.toPending(context) override fun pendingIntent(context: Context) = intent?.toPending(context)
} }

View File

@ -43,13 +43,17 @@ object Notifications {
} }
} }
fun selfLaunchIntent(context: Context): Intent {
val pm = context.packageManager
val intent = pm.getLaunchIntentForPackage(context.packageName)!!
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
return intent
}
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
fun updateDone(context: Context) { fun updateDone(context: Context) {
val pm = context.packageManager
val intent = pm.getLaunchIntentForPackage(context.packageName) ?: return
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
val flag = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT val flag = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
val pending = PendingIntent.getActivity(context, 0, intent, flag) val pending = PendingIntent.getActivity(context, 0, selfLaunchIntent(context), flag)
val builder = if (SDK_INT >= 26) { val builder = if (SDK_INT >= 26) {
Notification.Builder(context, UPDATED_CHANNEL) Notification.Builder(context, UPDATED_CHANNEL)
.setSmallIcon(context.getBitmap(R.drawable.ic_magisk_outline).toIcon()) .setSmallIcon(context.getBitmap(R.drawable.ic_magisk_outline).toIcon())