mirror of
https://github.com/zapstore/zapstore.git
synced 2026-10-05 12:38:24 +00:00
Show non-Zapstore installer package ID in app info.
Expose Android install-source package names so users can see when an app was installed from Play Store or another channel.
This commit is contained in:
@@ -1854,11 +1854,25 @@ class AndroidPackageManagerPlugin :
|
|||||||
"versionName" to pkg.versionName,
|
"versionName" to pkg.versionName,
|
||||||
"versionCode" to versionCode,
|
"versionCode" to versionCode,
|
||||||
"signatureHashes" to getSignatureHashes(pkg.packageName),
|
"signatureHashes" to getSignatureHashes(pkg.packageName),
|
||||||
|
"installerPackageName" to getInstallerPackageName(pkg.packageName),
|
||||||
"canInstallSilently" to canInstallSilently(pkg.packageName)
|
"canInstallSilently" to canInstallSilently(pkg.packageName)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getInstallerPackageName(packageName: String): String? {
|
||||||
|
return try {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
context.packageManager.getInstallSourceInfo(packageName).installingPackageName
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
context.packageManager.getInstallerPackageName(packageName)
|
||||||
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getSignatureHashes(packageName: String): List<String> {
|
private fun getSignatureHashes(packageName: String): List<String> {
|
||||||
return try {
|
return try {
|
||||||
val pm = context.packageManager
|
val pm = context.packageManager
|
||||||
|
|||||||
@@ -512,6 +512,8 @@ final class AndroidPackageManager extends PackageManager {
|
|||||||
versionCode: target.versionCode,
|
versionCode: target.versionCode,
|
||||||
signatureHashes: existingPkg?.signatureHashes ?? const [],
|
signatureHashes: existingPkg?.signatureHashes ?? const [],
|
||||||
installTime: DateTime.now(),
|
installTime: DateTime.now(),
|
||||||
|
installerPackageName:
|
||||||
|
existingPkg?.installerPackageName ?? kZapstoreAppIdentifier,
|
||||||
canInstallSilently: existingPkg?.canInstallSilently ?? false,
|
canInstallSilently: existingPkg?.canInstallSilently ?? false,
|
||||||
);
|
);
|
||||||
state = state.copyWith(installed: {...state.installed, appId: newPkg});
|
state = state.copyWith(installed: {...state.installed, appId: newPkg});
|
||||||
@@ -794,6 +796,7 @@ final class AndroidPackageManager extends PackageManager {
|
|||||||
? rawHashes.cast<String>().toList()
|
? rawHashes.cast<String>().toList()
|
||||||
: <String>[];
|
: <String>[];
|
||||||
final canInstallSilently = app['canInstallSilently'] as bool? ?? false;
|
final canInstallSilently = app['canInstallSilently'] as bool? ?? false;
|
||||||
|
final installerPackageName = app['installerPackageName'] as String?;
|
||||||
|
|
||||||
if (canInstallSilently) anyCanInstallSilently = true;
|
if (canInstallSilently) anyCanInstallSilently = true;
|
||||||
|
|
||||||
@@ -805,6 +808,7 @@ final class AndroidPackageManager extends PackageManager {
|
|||||||
versionCode: versionCode,
|
versionCode: versionCode,
|
||||||
signatureHashes: signatureHashes,
|
signatureHashes: signatureHashes,
|
||||||
installTime: null,
|
installTime: null,
|
||||||
|
installerPackageName: installerPackageName,
|
||||||
canInstallSilently: canInstallSilently,
|
canInstallSilently: canInstallSilently,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ final class BackgroundPackageManager extends PackageManager {
|
|||||||
? rawHashes.cast<String>().toList()
|
? rawHashes.cast<String>().toList()
|
||||||
: const [],
|
: const [],
|
||||||
installTime: null,
|
installTime: null,
|
||||||
|
installerPackageName: app['installerPackageName'] as String?,
|
||||||
canInstallSilently: app['canInstallSilently'] as bool? ?? false,
|
canInstallSilently: app['canInstallSilently'] as bool? ?? false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class InstalledPackagesSnapshot {
|
|||||||
'version': p.version,
|
'version': p.version,
|
||||||
'versionCode': p.versionCode,
|
'versionCode': p.versionCode,
|
||||||
'signatureHashes': p.signatureHashes,
|
'signatureHashes': p.signatureHashes,
|
||||||
|
'installerPackageName': p.installerPackageName,
|
||||||
'canInstallSilently': p.canInstallSilently,
|
'canInstallSilently': p.canInstallSilently,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -87,6 +88,7 @@ class InstalledPackagesSnapshot {
|
|||||||
versionCode: map['versionCode'] as int?,
|
versionCode: map['versionCode'] as int?,
|
||||||
signatureHashes: signatureHashes,
|
signatureHashes: signatureHashes,
|
||||||
installTime: null,
|
installTime: null,
|
||||||
|
installerPackageName: map['installerPackageName'] as String?,
|
||||||
canInstallSilently: (map['canInstallSilently'] as bool?) ?? false,
|
canInstallSilently: (map['canInstallSilently'] as bool?) ?? false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class PackageInfo extends Equatable {
|
|||||||
this.signatureHashes = const [],
|
this.signatureHashes = const [],
|
||||||
this.name,
|
this.name,
|
||||||
this.installTime,
|
this.installTime,
|
||||||
|
this.installerPackageName,
|
||||||
this.canInstallSilently = false,
|
this.canInstallSilently = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -35,6 +36,10 @@ class PackageInfo extends Equatable {
|
|||||||
final int? versionCode;
|
final int? versionCode;
|
||||||
final List<String> signatureHashes;
|
final List<String> signatureHashes;
|
||||||
final DateTime? installTime;
|
final DateTime? installTime;
|
||||||
|
|
||||||
|
/// Package ID of the app that installed this package, if known.
|
||||||
|
/// Examples: `dev.zapstore.app`, `com.android.vending` (Play Store).
|
||||||
|
final String? installerPackageName;
|
||||||
final bool canInstallSilently;
|
final bool canInstallSilently;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -45,6 +50,7 @@ class PackageInfo extends Equatable {
|
|||||||
versionCode,
|
versionCode,
|
||||||
signatureHashes,
|
signatureHashes,
|
||||||
installTime,
|
installTime,
|
||||||
|
installerPackageName,
|
||||||
canInstallSilently,
|
canInstallSilently,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:models/models.dart';
|
import 'package:models/models.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
import 'package:zapstore/services/package_manager/package_manager.dart';
|
||||||
import 'package:zapstore/utils/extensions.dart';
|
import 'package:zapstore/utils/extensions.dart';
|
||||||
import 'package:zapstore/widgets/app_detail_widgets.dart';
|
import 'package:zapstore/widgets/app_detail_widgets.dart';
|
||||||
import 'package:zapstore/widgets/author_container.dart';
|
import 'package:zapstore/widgets/author_container.dart';
|
||||||
@@ -86,6 +87,21 @@ class AppInfoTable extends HookConsumerWidget {
|
|||||||
|
|
||||||
rows.add(_InfoRow(label: 'App ID', value: app.identifier));
|
rows.add(_InfoRow(label: 'App ID', value: app.identifier));
|
||||||
|
|
||||||
|
final installedPackage = ref.watch(
|
||||||
|
installedPackageProvider(app.identifier),
|
||||||
|
);
|
||||||
|
final installerPackageName = installedPackage?.installerPackageName;
|
||||||
|
if (installerPackageName != null &&
|
||||||
|
installerPackageName != kZapstoreAppIdentifier) {
|
||||||
|
rows.add(
|
||||||
|
_InfoRow(
|
||||||
|
label: 'Installer',
|
||||||
|
value: installerPackageName,
|
||||||
|
copyValue: installerPackageName,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (identityProof != null) {
|
if (identityProof != null) {
|
||||||
final npub = Utils.encodeShareableFromString(
|
final npub = Utils.encodeShareableFromString(
|
||||||
identityProof!.pubkey,
|
identityProof!.pubkey,
|
||||||
@@ -154,7 +170,6 @@ class AppInfoTable extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fileMetadata!.versionCode != null) {
|
if (fileMetadata!.versionCode != null) {
|
||||||
final installedPackage = app.installedPackage;
|
|
||||||
final installedVersionCode = installedPackage?.versionCode;
|
final installedVersionCode = installedPackage?.versionCode;
|
||||||
final availableVersionCode = fileMetadata!.versionCode!;
|
final availableVersionCode = fileMetadata!.versionCode!;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user