Skip to content

Commit 0910a92

Browse files
authored
Merge pull request #145 from solrudev/develop
0.18.0
2 parents 551ba44 + 5314183 commit 0910a92

64 files changed

Lines changed: 3102 additions & 611 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Ackpine depends on Jetpack libraries, so it's also necessary to add the `google(
3737

3838
```toml
3939
[versions]
40-
ackpine = "0.17.0"
40+
ackpine = "0.18.0"
4141

4242
[libraries]
4343
ackpine-core = { module = "ru.solrudev.ackpine:ackpine-core", version.ref = "ackpine" }
@@ -78,7 +78,7 @@ ackpine = [
7878

7979
```kotlin
8080
dependencies {
81-
val ackpineVersion = "0.17.0"
81+
val ackpineVersion = "0.18.0"
8282
implementation("ru.solrudev.ackpine:ackpine-core:$ackpineVersion")
8383

8484
// optional - Kotlin extensions and Coroutines support

ackpine-api/api-main/api/api-main.api

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public final class ru/solrudev/ackpine/installer/parameters/InstallParameters :
276276
public fun toString ()Ljava/lang/String;
277277
}
278278

279-
public final class ru/solrudev/ackpine/installer/parameters/InstallParameters$Builder : ru/solrudev/ackpine/session/parameters/ConfirmationAware {
279+
public final class ru/solrudev/ackpine/installer/parameters/InstallParameters$Builder : ru/solrudev/ackpine/plugability/AckpinePluginRegistry, ru/solrudev/ackpine/session/parameters/ConfirmationAware {
280280
public fun <init> (Landroid/net/Uri;)V
281281
public fun <init> (Ljava/lang/Iterable;)V
282282
public final fun addApk (Landroid/net/Uri;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
@@ -303,8 +303,10 @@ public final class ru/solrudev/ackpine/installer/parameters/InstallParameters$Bu
303303
public final fun setPreapproval (Lru/solrudev/ackpine/installer/parameters/InstallPreapproval;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
304304
public final fun setRequestUpdateOwnership (Z)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
305305
public final fun setRequireUserAction (Z)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
306-
public final fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
307-
public final fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
306+
public fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
307+
public synthetic fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
308+
public fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;
309+
public synthetic fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
308310
}
309311

310312
public final class ru/solrudev/ackpine/installer/parameters/InstallPreapproval {
@@ -399,7 +401,8 @@ public final class ru/solrudev/ackpine/installer/parameters/PackageSource$Unspec
399401
}
400402

401403
public abstract interface class ru/solrudev/ackpine/plugability/AckpinePlugin {
402-
public abstract fun apply (Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;)V
404+
public fun apply (Lru/solrudev/ackpine/installer/parameters/InstallParameters$Builder;)V
405+
public fun apply (Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;)V
403406
public abstract fun getId ()Ljava/lang/String;
404407
}
405408

@@ -421,6 +424,11 @@ public final class ru/solrudev/ackpine/plugability/AckpinePluginContainer {
421424
public fun toString ()Ljava/lang/String;
422425
}
423426

427+
public abstract interface class ru/solrudev/ackpine/plugability/AckpinePluginRegistry {
428+
public abstract fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
429+
public abstract fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
430+
}
431+
424432
public abstract interface class ru/solrudev/ackpine/session/Failure {
425433
}
426434

@@ -621,7 +629,9 @@ public final class ru/solrudev/ackpine/uninstaller/PackageUninstaller$Companion
621629
public final fun getInstance (Landroid/content/Context;)Lru/solrudev/ackpine/uninstaller/PackageUninstaller;
622630
}
623631

624-
public abstract interface class ru/solrudev/ackpine/uninstaller/UninstallFailure : java/io/Serializable, ru/solrudev/ackpine/session/Failure {
632+
public abstract class ru/solrudev/ackpine/uninstaller/UninstallFailure : java/io/Serializable, ru/solrudev/ackpine/session/Failure {
633+
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
634+
public fun getMessage ()Ljava/lang/String;
625635
}
626636

627637
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Aborted : ru/solrudev/ackpine/uninstaller/UninstallFailure {
@@ -630,12 +640,42 @@ public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Aborted : ru
630640
public final fun copy (Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Aborted;
631641
public static synthetic fun copy$default (Lru/solrudev/ackpine/uninstaller/UninstallFailure$Aborted;Ljava/lang/String;ILjava/lang/Object;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Aborted;
632642
public fun equals (Ljava/lang/Object;)Z
633-
public final fun getMessage ()Ljava/lang/String;
643+
public fun getMessage ()Ljava/lang/String;
644+
public fun hashCode ()I
645+
public fun toString ()Ljava/lang/String;
646+
}
647+
648+
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Blocked : ru/solrudev/ackpine/uninstaller/UninstallFailure {
649+
public fun <init> (Ljava/lang/String;)V
650+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
651+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
652+
public final fun component1 ()Ljava/lang/String;
653+
public final fun component2 ()Ljava/lang/String;
654+
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Blocked;
655+
public static synthetic fun copy$default (Lru/solrudev/ackpine/uninstaller/UninstallFailure$Blocked;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Blocked;
656+
public fun equals (Ljava/lang/Object;)Z
657+
public fun getMessage ()Ljava/lang/String;
658+
public final fun getOtherPackageName ()Ljava/lang/String;
659+
public fun hashCode ()I
660+
public fun toString ()Ljava/lang/String;
661+
}
662+
663+
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Conflict : ru/solrudev/ackpine/uninstaller/UninstallFailure {
664+
public fun <init> (Ljava/lang/String;)V
665+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
666+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
667+
public final fun component1 ()Ljava/lang/String;
668+
public final fun component2 ()Ljava/lang/String;
669+
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Conflict;
670+
public static synthetic fun copy$default (Lru/solrudev/ackpine/uninstaller/UninstallFailure$Conflict;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Conflict;
671+
public fun equals (Ljava/lang/Object;)Z
672+
public fun getMessage ()Ljava/lang/String;
673+
public final fun getOtherPackageName ()Ljava/lang/String;
634674
public fun hashCode ()I
635675
public fun toString ()Ljava/lang/String;
636676
}
637677

638-
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Exceptional : ru/solrudev/ackpine/session/Failure$Exceptional, ru/solrudev/ackpine/uninstaller/UninstallFailure {
678+
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Exceptional : ru/solrudev/ackpine/uninstaller/UninstallFailure, ru/solrudev/ackpine/session/Failure$Exceptional {
639679
public fun <init> (Ljava/lang/Exception;)V
640680
public final fun component1 ()Ljava/lang/Exception;
641681
public final fun copy (Ljava/lang/Exception;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Exceptional;
@@ -648,29 +688,58 @@ public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Exceptional
648688

649689
public final class ru/solrudev/ackpine/uninstaller/UninstallFailure$Generic : ru/solrudev/ackpine/uninstaller/UninstallFailure {
650690
public static final field INSTANCE Lru/solrudev/ackpine/uninstaller/UninstallFailure$Generic;
691+
public fun <init> ()V
692+
public fun <init> (Ljava/lang/String;)V
693+
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
694+
public final fun component1 ()Ljava/lang/String;
695+
public final fun copy (Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Generic;
696+
public static synthetic fun copy$default (Lru/solrudev/ackpine/uninstaller/UninstallFailure$Generic;Ljava/lang/String;ILjava/lang/Object;)Lru/solrudev/ackpine/uninstaller/UninstallFailure$Generic;
651697
public fun equals (Ljava/lang/Object;)Z
698+
public fun getMessage ()Ljava/lang/String;
652699
public fun hashCode ()I
653700
public fun toString ()Ljava/lang/String;
654701
}
655702

656703
public final class ru/solrudev/ackpine/uninstaller/parameters/UninstallParameters : ru/solrudev/ackpine/session/parameters/ConfirmationAware {
657-
public synthetic fun <init> (Ljava/lang/String;Lru/solrudev/ackpine/session/parameters/Confirmation;Lru/solrudev/ackpine/session/parameters/NotificationData;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
704+
public synthetic fun <init> (Ljava/lang/String;Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;Lru/solrudev/ackpine/session/parameters/Confirmation;Lru/solrudev/ackpine/session/parameters/NotificationData;Lru/solrudev/ackpine/plugability/AckpinePluginContainer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
658705
public fun equals (Ljava/lang/Object;)Z
659706
public fun getConfirmation ()Lru/solrudev/ackpine/session/parameters/Confirmation;
660707
public fun getNotificationData ()Lru/solrudev/ackpine/session/parameters/NotificationData;
661708
public final fun getPackageName ()Ljava/lang/String;
709+
public final fun getPluginContainer ()Lru/solrudev/ackpine/plugability/AckpinePluginContainer;
710+
public final fun getUninstallerType ()Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
662711
public fun hashCode ()I
663712
public fun toString ()Ljava/lang/String;
664713
}
665714

666-
public final class ru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder : ru/solrudev/ackpine/session/parameters/ConfirmationAware {
715+
public final class ru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder : ru/solrudev/ackpine/plugability/AckpinePluginRegistry, ru/solrudev/ackpine/session/parameters/ConfirmationAware {
667716
public fun <init> (Ljava/lang/String;)V
668717
public final fun build ()Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters;
669718
public fun getConfirmation ()Lru/solrudev/ackpine/session/parameters/Confirmation;
670719
public fun getNotificationData ()Lru/solrudev/ackpine/session/parameters/NotificationData;
671720
public final fun getPackageName ()Ljava/lang/String;
721+
public final fun getUninstallerType ()Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
672722
public final fun setConfirmation (Lru/solrudev/ackpine/session/parameters/Confirmation;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
673723
public final fun setNotificationData (Lru/solrudev/ackpine/session/parameters/NotificationData;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
674724
public final fun setPackageName (Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
725+
public final fun setUninstallerType (Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
726+
public final fun setUninstallerType (Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;)V
727+
public synthetic fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
728+
public fun usePlugin (Ljava/lang/Class;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
729+
public synthetic fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/plugability/AckpinePluginRegistry;
730+
public fun usePlugin (Ljava/lang/Class;Lru/solrudev/ackpine/plugability/AckpinePlugin$Parameters;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallParameters$Builder;
731+
}
732+
733+
public final class ru/solrudev/ackpine/uninstaller/parameters/UninstallerType : java/lang/Enum {
734+
public static final field Companion Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType$Companion;
735+
public static final field DEFAULT Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
736+
public static final field INTENT_BASED Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
737+
public static final field PACKAGE_INSTALLER_BASED Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
738+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
739+
public static fun valueOf (Ljava/lang/String;)Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
740+
public static fun values ()[Lru/solrudev/ackpine/uninstaller/parameters/UninstallerType;
741+
}
742+
743+
public final class ru/solrudev/ackpine/uninstaller/parameters/UninstallerType$Companion {
675744
}
676745

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (C) 2025 Ilya Fomichev
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package ru.solrudev.ackpine
18+
19+
import android.os.Build
20+
import androidx.annotation.ChecksSdkIntAtLeast
21+
22+
@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.LOLLIPOP)
23+
@JvmSynthetic
24+
internal fun isPackageInstallerApiAvailable(): Boolean = isPackageInstallerAvailable
25+
26+
// To avoid referencing Build.VERSION.SDK_INT
27+
private val isPackageInstallerAvailable = try {
28+
Class.forName("android.content.pm.PackageInstaller")
29+
true
30+
} catch (_: ClassNotFoundException) {
31+
false
32+
}

ackpine-api/api-main/src/main/kotlin/ru/solrudev/ackpine/installer/parameters/InstallParameters.kt

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ import android.os.Build
2323
import androidx.annotation.RequiresApi
2424
import ru.solrudev.ackpine.DelicateAckpineApi
2525
import ru.solrudev.ackpine.exceptions.SplitPackagesNotSupportedException
26+
import ru.solrudev.ackpine.isPackageInstallerApiAvailable
2627
import ru.solrudev.ackpine.plugability.AckpinePlugin
2728
import ru.solrudev.ackpine.plugability.AckpinePluginCache
2829
import ru.solrudev.ackpine.plugability.AckpinePluginContainer
30+
import ru.solrudev.ackpine.plugability.AckpinePluginRegistry
2931
import ru.solrudev.ackpine.session.parameters.Confirmation
3032
import ru.solrudev.ackpine.session.parameters.ConfirmationAware
3133
import ru.solrudev.ackpine.session.parameters.NotificationData
@@ -193,7 +195,7 @@ public class InstallParameters private constructor(
193195
/**
194196
* Builder for [InstallParameters].
195197
*/
196-
public class Builder : ConfirmationAware {
198+
public class Builder : ConfirmationAware, AckpinePluginRegistry<Builder> {
197199

198200
@SuppressLint("NewApi")
199201
public constructor(baseApk: Uri) {
@@ -422,23 +424,14 @@ public class InstallParameters private constructor(
422424
this.packageSource = packageSource
423425
}
424426

425-
/**
426-
* Applies a [plugin] to the session.
427-
* @param plugin Java class of an applied plugin, implementing [AckpinePlugin].
428-
* @param parameters parameters of the applied plugin for the session being configured.
429-
*/
430-
public fun <Params : AckpinePlugin.Parameters> usePlugin(
427+
override fun <Params : AckpinePlugin.Parameters> usePlugin(
431428
plugin: Class<out AckpinePlugin<Params>>,
432429
parameters: Params
433430
): Builder = apply {
434431
plugins[plugin] = parameters
435432
}
436433

437-
/**
438-
* Applies a [plugin] to the session.
439-
* @param plugin Java class of an applied plugin, implementing [AckpinePlugin].
440-
*/
441-
public fun usePlugin(plugin: Class<out AckpinePlugin<AckpinePlugin.Parameters.None>>): Builder = apply {
434+
override fun usePlugin(plugin: Class<out AckpinePlugin<AckpinePlugin.Parameters.None>>): Builder = apply {
442435
plugins[plugin] = AckpinePlugin.Parameters.None
443436
}
444437

@@ -471,8 +464,8 @@ public class InstallParameters private constructor(
471464
}
472465

473466
private fun applyInstallerTypeInvariants(value: InstallerType) = when {
474-
!areSplitPackagesSupported() -> InstallerType.INTENT_BASED
475-
apks.size > 1 && areSplitPackagesSupported() -> InstallerType.SESSION_BASED
467+
!isPackageInstallerApiAvailable() -> InstallerType.INTENT_BASED
468+
apks.size > 1 && isPackageInstallerApiAvailable() -> InstallerType.SESSION_BASED
476469
else -> value
477470
}
478471
}
@@ -527,7 +520,7 @@ private class RealMutableApkList : MutableApkList {
527520
override fun toString() = "ApkList($apks)"
528521

529522
private fun checkSplitPackagesSupport() {
530-
if (!areSplitPackagesSupported()) {
523+
if (!isPackageInstallerApiAvailable()) {
531524
throw SplitPackagesNotSupportedException()
532525
}
533526
}

ackpine-api/api-main/src/main/kotlin/ru/solrudev/ackpine/installer/parameters/InstallerType.kt

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
2121
import android.content.Intent.ACTION_INSTALL_PACKAGE
2222
import android.content.pm.PackageInstaller
2323
import android.os.Build
24-
import androidx.annotation.ChecksSdkIntAtLeast
2524
import androidx.annotation.RequiresApi
2625
import ru.solrudev.ackpine.installer.parameters.InstallerType.INTENT_BASED
2726
import ru.solrudev.ackpine.installer.parameters.InstallerType.SESSION_BASED
27+
import ru.solrudev.ackpine.isPackageInstallerApiAvailable
2828

2929
/**
3030
* Type of the package installer implementation.
@@ -60,18 +60,6 @@ public enum class InstallerType {
6060
* On API level >= 21, the default value is [InstallerType.SESSION_BASED].
6161
*/
6262
@JvmField
63-
public val DEFAULT: InstallerType = if (areSplitPackagesSupported()) SESSION_BASED else INTENT_BASED
63+
public val DEFAULT: InstallerType = if (isPackageInstallerApiAvailable()) SESSION_BASED else INTENT_BASED
6464
}
65-
}
66-
67-
@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.LOLLIPOP)
68-
@JvmSynthetic
69-
internal fun areSplitPackagesSupported(): Boolean = isPackageInstallerAvailable
70-
71-
// To avoid referencing Build.VERSION.SDK_INT
72-
private val isPackageInstallerAvailable = try {
73-
Class.forName("android.content.pm.PackageInstaller")
74-
true
75-
} catch (_: ClassNotFoundException) {
76-
false
7765
}

ackpine-api/api-main/src/main/kotlin/ru/solrudev/ackpine/plugability/AckpinePlugin.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package ru.solrudev.ackpine.plugability
1818

1919
import ru.solrudev.ackpine.installer.parameters.InstallParameters
20+
import ru.solrudev.ackpine.uninstaller.parameters.UninstallParameters
2021

2122
/**
2223
* A plugin for Ackpine. Allows to extend Ackpine's functionality.
@@ -32,7 +33,14 @@ public interface AckpinePlugin<Params : AckpinePlugin.Parameters> {
3233
/**
3334
* Applies some settings to install parameters to accommodate the plugin's functionality.
3435
*/
35-
public fun apply(builder: InstallParameters.Builder)
36+
public fun apply(builder: InstallParameters.Builder) { // no-op by default
37+
}
38+
39+
/**
40+
* Applies some settings to uninstall parameters to accommodate the plugin's functionality.
41+
*/
42+
public fun apply(builder: UninstallParameters.Builder) { // no-op by default
43+
}
3644

3745
/**
3846
* A set of parameters for [AckpinePlugin].

0 commit comments

Comments
 (0)