mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-22 22:19:29 +02:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d33ca0948f | ||
|
f76637a2e1 | ||
|
b7de627c7b | ||
|
27fc60d437 | ||
|
ec240f946e | ||
|
ecd80fc371 | ||
|
68fa660e6d | ||
|
70f9e33d17 | ||
|
2e2dffd8e2 | ||
|
0b1d5bf514 | ||
|
2570c8e289 | ||
|
43a8ba4de1 | ||
|
3f2fb1c1ed | ||
|
40d303fb57 | ||
|
2c1687c33d | ||
|
b688e7f160 |
@@ -47,7 +47,7 @@
|
||||
android:value="2" />
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="dev.imranr.obtainium"
|
||||
android:authorities="${applicationId}"
|
||||
android:grantUriPermissions="true">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
@@ -72,4 +72,4 @@
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="29" />\
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
</manifest>
|
||||
</manifest>
|
||||
|
@@ -24,7 +24,7 @@
|
||||
"colour": "Farbe",
|
||||
"standard": "Standard",
|
||||
"custom": "Benutzerdefiniert",
|
||||
"useMaterialYou": "Verwenden Sie Material, das Sie",
|
||||
"useMaterialYou": "Verwende Material You",
|
||||
"githubStarredRepos": "GitHub Starred Repos",
|
||||
"uname": "Benutzername",
|
||||
"wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) übermittelt",
|
||||
|
@@ -113,6 +113,7 @@
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"followSystem": "Follow System",
|
||||
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
||||
"useBlackTheme": "Use pure black dark theme",
|
||||
"appSortBy": "App Sort By",
|
||||
"authorName": "Author/Name",
|
||||
@@ -258,7 +259,7 @@
|
||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||
"versionExtractionRegEx": "Version String Extraction RegEx",
|
||||
"matchGroupToUse": "Match Group to Use for Version String Extraction Regex",
|
||||
"matchGroupToUse": "Match Group to Use for Version String Extraction RegEx",
|
||||
"highlightTouchTargets": "Highlight less obvious touch targets",
|
||||
"pickExportDir": "Pick Export Directory",
|
||||
"autoExportOnChanges": "Auto-export on changes",
|
||||
|
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"invalidURLForSource": "El URL de la aplicación {} no es válido",
|
||||
"noReleaseFound": "No se ha podido encontrar una versión válida",
|
||||
"noReleaseFound": "No se ha encontrado una versión válida",
|
||||
"noVersionFound": "No se ha podido determinar la versión",
|
||||
"urlMatchesNoSource": "El URL no coincide con ninguna fuente conocida",
|
||||
"cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación",
|
||||
"appIdMismatch": "El id. del paquete descargado no coincide con la ID de la aplicación instalada",
|
||||
"appIdMismatch": "El ID del paquete descargado no coincide con el ID de la aplicación instalada",
|
||||
"functionNotImplemented": "Esta clase no ha implementado esta función",
|
||||
"placeholder": "Espacio reservado",
|
||||
"someErrors": "Han ocurrido algunos errores",
|
||||
@@ -52,7 +52,7 @@
|
||||
"noAppsForFilter": "Sin aplicaciones para filtrar",
|
||||
"byX": "por: {}",
|
||||
"percentProgress": "Progreso: {} %",
|
||||
"pleaseWait": "Espere un momento",
|
||||
"pleaseWait": "Espere...",
|
||||
"updateAvailable": "Actualización disponible",
|
||||
"notInstalled": "No instalado",
|
||||
"pseudoVersion": "pseudoversión",
|
||||
@@ -100,7 +100,7 @@
|
||||
"appURLList": "Lista de URL de aplicaciones",
|
||||
"line": "Línea",
|
||||
"searchX": "Buscar {}",
|
||||
"noResults": "No se encontró ningún resultado",
|
||||
"noResults": "No se ha encontrado ningún resultado",
|
||||
"importX": "Importar desde {}",
|
||||
"importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como «No instalada».\nPara solucionarlo, reinstálelas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a los URL y a los métodos de importación mediante terceros.",
|
||||
"importErrors": "Errores de Importación",
|
||||
@@ -175,7 +175,7 @@
|
||||
"fdroid": "Repositorio oficial F-Droid",
|
||||
"appIdOrName": "ID o Nombre de la Aplicación",
|
||||
"appId": "ID de la Aplicación",
|
||||
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre",
|
||||
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre",
|
||||
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
|
||||
"fdroidThirdPartyRepo": "Repositorio de tercera parte F-Droid",
|
||||
"steamMobile": "Steam para móviles",
|
||||
@@ -192,7 +192,7 @@
|
||||
"downloadedX": "Descargado {}",
|
||||
"releaseAsset": "Liberar activos",
|
||||
"downloadNotifDescription": "Notifica al usuario del progreso de descarga de una aplicación",
|
||||
"noAPKFound": "No se encontró el paquete de instalación APK",
|
||||
"noAPKFound": "No se ha encontrado el paquete de instalación APK",
|
||||
"noVersionDetection": "Sin detección de versiones",
|
||||
"categorize": "Catogorizar",
|
||||
"categories": "Categorías",
|
||||
@@ -204,7 +204,7 @@
|
||||
"addCategory": "Añadir categoría",
|
||||
"label": "Nombre",
|
||||
"language": "Idioma",
|
||||
"copiedToClipboard": "Se copió en el portapapeles",
|
||||
"copiedToClipboard": "Copiado en el portapapeles",
|
||||
"storagePermissionDenied": "Permiso de almacenamiento rechazado",
|
||||
"selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaciones seleccionadas.",
|
||||
"filterAPKsByRegEx": "Filtrar por APK",
|
||||
@@ -221,7 +221,7 @@
|
||||
"standardVersionDetection": "Por versión",
|
||||
"groupByCategory": "Agrupar por categoría",
|
||||
"autoApkFilterByArch": "Filtrar APK por arquitectura del procesador (si es posible)",
|
||||
"overrideSource": "Anular fuente",
|
||||
"overrideSource": "Forzar desde la fuente",
|
||||
"dontShowAgain": "No mostrar de nuevo",
|
||||
"dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps en 'solo seguimiento'",
|
||||
"dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs",
|
||||
@@ -230,7 +230,7 @@
|
||||
"about": "Acerca",
|
||||
"requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)",
|
||||
"checkOnStart": "Comprobar actualizaciones al inicio",
|
||||
"tryInferAppIdFromCode": "Intentar deducir la ID de la app por el código fuente",
|
||||
"tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente",
|
||||
"removeOnExternalUninstall": "Auto eliminar apps desinstaladas externamente",
|
||||
"pickHighestVersionCode": "Auto selección de versión superior del paquete APK",
|
||||
"checkUpdateOnDetailPage": "Comprobar actualizaciones al abrir detalles de la app",
|
||||
@@ -289,10 +289,10 @@
|
||||
"parallelDownloads": "Permitir descargas paralelas",
|
||||
"useShizuku": "Utilice Shizuku o Sui para instalar",
|
||||
"shizukuBinderNotFound": "Shizuku no funciona",
|
||||
"shizukuOld": "Versión antigua de Shizuku (<11) - actualízala",
|
||||
"shizukuOld": "Versión antigua de Shizuku (<11) - actualícela",
|
||||
"shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar",
|
||||
"shizukuPretendToBeGooglePlay": "Establecer Google Play como fuente de instalación (si se utiliza Shizuku)",
|
||||
"useSystemFont": "Usar la fuente de impresión del sistema",
|
||||
"useSystemFont": "Usar fuente del sistema",
|
||||
"useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo",
|
||||
"requestHeader": "Encabezado de solicitud",
|
||||
"useLatestAssetDateAsReleaseDate": "Usar la última carga de recursos como fecha de lanzamiento",
|
||||
|
@@ -113,6 +113,7 @@
|
||||
"dark": "Тёмная",
|
||||
"light": "Светлая",
|
||||
"followSystem": "Системная",
|
||||
"followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений",
|
||||
"useBlackTheme": "Использовать чёрную тему",
|
||||
"appSortBy": "Сортировка приложений",
|
||||
"authorName": "Автор/Название",
|
||||
|
@@ -24,7 +24,7 @@
|
||||
"colour": "配色",
|
||||
"standard": "标准",
|
||||
"custom": "定制",
|
||||
"useMaterialYou": "使用您的材料",
|
||||
"useMaterialYou": "使用 Material You",
|
||||
"githubStarredRepos": "已星标的 GitHub 仓库",
|
||||
"uname": "用户名",
|
||||
"wrongArgNum": "参数数量错误",
|
||||
@@ -190,7 +190,7 @@
|
||||
"downloadingX": "正在下载“{}”",
|
||||
"downloadX": "下载 {}",
|
||||
"downloadedX": "下载 {}",
|
||||
"releaseAsset": "释放资产",
|
||||
"releaseAsset": "发行版",
|
||||
"downloadNotifDescription": "提示应用的下载进度",
|
||||
"noAPKFound": "未找到 APK 文件",
|
||||
"noVersionDetection": "禁用版本检测",
|
||||
@@ -257,8 +257,8 @@
|
||||
"exemptFromBackgroundUpdates": "禁用后台更新(如果已经全局启用)",
|
||||
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
||||
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
|
||||
"versionExtractionRegEx": "版本号提取规则(正则表达式)",
|
||||
"matchGroupToUse": "引用的捕获组",
|
||||
"versionExtractionRegEx": "版本号匹配组规则(正则表达式)",
|
||||
"matchGroupToUse": "引用匹配组规则,将用于版本字符串提取",
|
||||
"highlightTouchTargets": "突出展示不明显的触摸区域",
|
||||
"pickExportDir": "选择导出文件夹",
|
||||
"autoExportOnChanges": "数据变更时自动导出",
|
||||
|
@@ -243,19 +243,28 @@ class HTML extends AppSource {
|
||||
if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty ==
|
||||
true) {
|
||||
var reg = RegExp(additionalSettings['customLinkFilterRegex']);
|
||||
links = allLinks
|
||||
.where((element) => reg.hasMatch(
|
||||
filterLinkByText ? element.value : Uri.decodeFull(element.key)))
|
||||
.toList();
|
||||
links = allLinks.where((element) {
|
||||
var link = element.key;
|
||||
try {
|
||||
link = Uri.decodeFull(element.key);
|
||||
} catch (e) {
|
||||
// Some links may not have valid encoding
|
||||
}
|
||||
return reg.hasMatch(filterLinkByText ? element.value : link);
|
||||
}).toList();
|
||||
} else {
|
||||
links = allLinks
|
||||
.where((element) => Uri.parse(filterLinkByText
|
||||
? element.value
|
||||
: Uri.decodeFull(element.key))
|
||||
.path
|
||||
.toLowerCase()
|
||||
.endsWith('.apk'))
|
||||
.toList();
|
||||
links = allLinks.where((element) {
|
||||
var link = element.key;
|
||||
try {
|
||||
link = Uri.decodeFull(element.key);
|
||||
} catch (e) {
|
||||
// Some links may not have valid encoding
|
||||
}
|
||||
return Uri.parse(filterLinkByText ? element.value : link)
|
||||
.path
|
||||
.toLowerCase()
|
||||
.endsWith('.apk');
|
||||
}).toList();
|
||||
}
|
||||
if (!skipSort) {
|
||||
links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true
|
||||
@@ -310,13 +319,19 @@ class HTML extends AppSource {
|
||||
links = [MapEntry(currentUrl, currentUrl)];
|
||||
}
|
||||
var rel = links.last.key;
|
||||
var relDecoded = rel;
|
||||
try {
|
||||
relDecoded = Uri.decodeFull(rel);
|
||||
} catch (e) {
|
||||
// Some links may not have valid encoding
|
||||
}
|
||||
String? version;
|
||||
version = extractVersion(
|
||||
additionalSettings['versionExtractionRegEx'] as String?,
|
||||
additionalSettings['matchGroupToUse'] as String?,
|
||||
additionalSettings['versionExtractWholePage'] == true
|
||||
? versionExtractionWholePageString
|
||||
: Uri.decodeFull(rel));
|
||||
: relDecoded);
|
||||
version ??=
|
||||
additionalSettings['defaultPseudoVersioningMethod'] == 'APKLinkHash'
|
||||
? rel.hashCode.toString()
|
||||
|
@@ -84,7 +84,7 @@ class HuaweiAppGallery extends AppSource {
|
||||
}
|
||||
var relDate = relDateStrAdj == null
|
||||
? null
|
||||
: DateFormat('yy-MM-dd-HH-mm').parse(relDateStrAdj.join(''));
|
||||
: DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join(''));
|
||||
if (relDateStr == null) {
|
||||
throw NoVersionError();
|
||||
}
|
||||
|
@@ -882,11 +882,10 @@ class AppsPageState extends State<AppsPage> {
|
||||
onPressed: selectedAppIds.isEmpty
|
||||
? null
|
||||
: () {
|
||||
String urls =
|
||||
'<p>${tr('customLinkMessage')}:</p>\n\n<ul>\n';
|
||||
String urls = '';
|
||||
for (var a in selectedApps) {
|
||||
urls +=
|
||||
' <li><a href="obtainium://app/${Uri.encodeComponent(jsonEncode({
|
||||
'https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/${Uri.encodeComponent(jsonEncode({
|
||||
'id': a.id,
|
||||
'url': a.url,
|
||||
'author': a.author,
|
||||
@@ -895,10 +894,8 @@ class AppsPageState extends State<AppsPage> {
|
||||
a.preferredApkIndex,
|
||||
'additionalSettings':
|
||||
jsonEncode(a.additionalSettings)
|
||||
}))}">${a.name}</a></li>\n';
|
||||
}))}\n\n';
|
||||
}
|
||||
urls +=
|
||||
'</ul>\n\n<p><a href="$obtainiumUrl">${tr('about')}</a></p>';
|
||||
Share.share(urls,
|
||||
subject:
|
||||
'Obtainium - ${tr('appsString')}');
|
||||
|
@@ -88,30 +88,12 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
initUpdateIntervalInterpolator();
|
||||
processIntervalSliderValue(settingsProvider.updateIntervalSliderVal);
|
||||
|
||||
var themeDropdown = FutureBuilder(
|
||||
var followSystemThemeExplanation = FutureBuilder(
|
||||
builder: (ctx, val) {
|
||||
return DropdownButtonFormField(
|
||||
decoration: InputDecoration(labelText: tr('theme')),
|
||||
value: settingsProvider.theme,
|
||||
items: [
|
||||
DropdownMenuItem(
|
||||
value: ThemeSettings.light,
|
||||
child: Text(tr('light')),
|
||||
),
|
||||
DropdownMenuItem(
|
||||
value: ThemeSettings.dark,
|
||||
child: Text(tr('dark')),
|
||||
),
|
||||
if ((val.data?.version.sdkInt ?? 0) >= 29) DropdownMenuItem(
|
||||
value: ThemeSettings.system,
|
||||
child: Text(tr('followSystem')),
|
||||
)
|
||||
],
|
||||
onChanged: (value) {
|
||||
if (value != null) {
|
||||
settingsProvider.theme = value;
|
||||
}
|
||||
});
|
||||
return ((val.data?.version.sdkInt ?? 30) < 29) ?
|
||||
Text(tr('followSystemThemeExplanation'),
|
||||
style: Theme.of(context).textTheme.labelSmall)
|
||||
: const SizedBox.shrink();
|
||||
},
|
||||
future: DeviceInfoPlugin().androidInfo
|
||||
);
|
||||
@@ -367,7 +349,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
intervalSlider,
|
||||
FutureBuilder(
|
||||
builder: (ctx, val) {
|
||||
return ((val.data?.version.sdkInt ?? 0) >= 30) || settingsProvider.useShizuku
|
||||
return (settingsProvider.updateInterval > 0) && (((val.data?.version.sdkInt ?? 0) >= 30) || settingsProvider.useShizuku)
|
||||
? Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@@ -583,9 +565,34 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context).colorScheme.primary),
|
||||
),
|
||||
themeDropdown,
|
||||
DropdownButtonFormField(
|
||||
decoration: InputDecoration(labelText: tr('theme')),
|
||||
value: settingsProvider.theme,
|
||||
items: [
|
||||
DropdownMenuItem(
|
||||
value: ThemeSettings.system,
|
||||
child: Text(tr('followSystem')),
|
||||
),
|
||||
DropdownMenuItem(
|
||||
value: ThemeSettings.light,
|
||||
child: Text(tr('light')),
|
||||
),
|
||||
DropdownMenuItem(
|
||||
value: ThemeSettings.dark,
|
||||
child: Text(tr('dark')),
|
||||
)
|
||||
],
|
||||
onChanged: (value) {
|
||||
if (value != null) {
|
||||
settingsProvider.theme = value;
|
||||
}
|
||||
}),
|
||||
height8,
|
||||
if (settingsProvider.theme == ThemeSettings.system)
|
||||
followSystemThemeExplanation,
|
||||
height16,
|
||||
Row(
|
||||
if (settingsProvider.theme != ThemeSettings.light)
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(child: Text(tr('useBlackTheme'))),
|
||||
@@ -593,10 +600,11 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
value: settingsProvider.useBlackTheme,
|
||||
onChanged: (value) {
|
||||
settingsProvider.useBlackTheme = value;
|
||||
})
|
||||
],
|
||||
),
|
||||
height16,
|
||||
}
|
||||
)
|
||||
]
|
||||
),
|
||||
height8,
|
||||
useMaterialThemeSwitch,
|
||||
if (!settingsProvider.useMaterialYou) colorPicker,
|
||||
Row(
|
||||
|
@@ -525,10 +525,11 @@ class AppsProvider with ChangeNotifier {
|
||||
?.installingPackageName
|
||||
: (await pm.getInstallerPackageName(packageName: app.id));
|
||||
} catch (e) {
|
||||
return false; // App probably not installed
|
||||
return false; // App probably not installed
|
||||
}
|
||||
|
||||
int? targetSDK = (await getInstalledInfo(app.id))?.applicationInfo?.targetSdkVersion;
|
||||
int? targetSDK =
|
||||
(await getInstalledInfo(app.id))?.applicationInfo?.targetSdkVersion;
|
||||
// The APK should target a new enough API
|
||||
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
||||
if (!(targetSDK != null && targetSDK >= (osInfo.version.sdkInt - 3))) {
|
||||
@@ -571,7 +572,8 @@ class AppsProvider with ChangeNotifier {
|
||||
|
||||
Future<bool> installXApkDir(
|
||||
DownloadedXApkDir dir, BuildContext? firstTimeWithContext,
|
||||
{bool needsBGWorkaround = false, bool shizukuPretendToBeGooglePlay = false}) async {
|
||||
{bool needsBGWorkaround = false,
|
||||
bool shizukuPretendToBeGooglePlay = false}) async {
|
||||
// We don't know which APKs in an XAPK are supported by the user's device
|
||||
// So we try installing all of them and assume success if at least one installed
|
||||
// If 0 APKs installed, throw the first install error encountered
|
||||
@@ -610,7 +612,8 @@ class AppsProvider with ChangeNotifier {
|
||||
|
||||
Future<bool> installApk(
|
||||
DownloadedApk file, BuildContext? firstTimeWithContext,
|
||||
{bool needsBGWorkaround = false, bool shizukuPretendToBeGooglePlay = false}) async {
|
||||
{bool needsBGWorkaround = false,
|
||||
bool shizukuPretendToBeGooglePlay = false}) async {
|
||||
if (firstTimeWithContext != null &&
|
||||
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
||||
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
||||
@@ -651,7 +654,8 @@ class AppsProvider with ChangeNotifier {
|
||||
}
|
||||
int? code;
|
||||
if (!settingsProvider.useShizuku) {
|
||||
code = await AndroidPackageInstaller.installApk(apkFilePath: file.file.path);
|
||||
code =
|
||||
await AndroidPackageInstaller.installApk(apkFilePath: file.file.path);
|
||||
} else {
|
||||
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
||||
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
||||
@@ -828,7 +832,7 @@ class AppsProvider with ChangeNotifier {
|
||||
throw ObtainiumError(tr('cancelled'));
|
||||
}
|
||||
} else {
|
||||
switch((await ShizukuApkInstaller.checkPermission())!){
|
||||
switch ((await ShizukuApkInstaller.checkPermission())!) {
|
||||
case 'binder_not_found':
|
||||
throw ObtainiumError(tr('shizukuBinderNotFound'));
|
||||
case 'old_shizuku':
|
||||
@@ -839,7 +843,7 @@ class AppsProvider with ChangeNotifier {
|
||||
throw ObtainiumError(tr('cancelled'));
|
||||
}
|
||||
}
|
||||
if (!willBeSilent && context != null) {
|
||||
if (!willBeSilent && context != null && !settingsProvider.useShizuku) {
|
||||
// ignore: use_build_context_synchronously
|
||||
await waitForUserToReturnToForeground(context);
|
||||
}
|
||||
@@ -850,31 +854,46 @@ class AppsProvider with ChangeNotifier {
|
||||
bool sayInstalled = true;
|
||||
var contextIfNewInstall =
|
||||
apps[id]?.installedInfo == null ? context : null;
|
||||
bool needBGWorkaround = willBeSilent && context == null && !settingsProvider.useShizuku;
|
||||
bool needBGWorkaround =
|
||||
willBeSilent && context == null && !settingsProvider.useShizuku;
|
||||
if (downloadedFile != null) {
|
||||
if (needBGWorkaround) {
|
||||
// ignore: use_build_context_synchronously
|
||||
installApk(downloadedFile, contextIfNewInstall, needsBGWorkaround: true);
|
||||
installApk(downloadedFile, contextIfNewInstall,
|
||||
needsBGWorkaround: true);
|
||||
} else {
|
||||
// ignore: use_build_context_synchronously
|
||||
sayInstalled = await installApk(downloadedFile, contextIfNewInstall, shizukuPretendToBeGooglePlay: apps[id]!.app.additionalSettings['shizukuPretendToBeGooglePlay'] == true);
|
||||
sayInstalled = await installApk(
|
||||
downloadedFile, contextIfNewInstall,
|
||||
shizukuPretendToBeGooglePlay:
|
||||
apps[id]!.app.additionalSettings[
|
||||
'shizukuPretendToBeGooglePlay'] ==
|
||||
true);
|
||||
}
|
||||
} else {
|
||||
if (needBGWorkaround) {
|
||||
// ignore: use_build_context_synchronously
|
||||
installXApkDir(downloadedDir!, contextIfNewInstall, needsBGWorkaround: true);
|
||||
installXApkDir(downloadedDir!, contextIfNewInstall,
|
||||
needsBGWorkaround: true);
|
||||
} else {
|
||||
// ignore: use_build_context_synchronously
|
||||
sayInstalled = await installXApkDir(downloadedDir!, contextIfNewInstall, shizukuPretendToBeGooglePlay: apps[id]!.app.additionalSettings['shizukuPretendToBeGooglePlay'] == true);
|
||||
sayInstalled = await installXApkDir(
|
||||
downloadedDir!, contextIfNewInstall,
|
||||
shizukuPretendToBeGooglePlay:
|
||||
apps[id]!.app.additionalSettings[
|
||||
'shizukuPretendToBeGooglePlay'] ==
|
||||
true);
|
||||
}
|
||||
}
|
||||
if (willBeSilent && context == null) {
|
||||
if (!settingsProvider.useShizuku) {
|
||||
notificationsProvider?.notify(SilentUpdateAttemptNotification(
|
||||
[apps[id]!.app], id: id.hashCode));
|
||||
[apps[id]!.app],
|
||||
id: id.hashCode));
|
||||
} else {
|
||||
notificationsProvider?.notify(SilentUpdateNotification(
|
||||
[apps[id]!.app], sayInstalled, id: id.hashCode));
|
||||
[apps[id]!.app], sayInstalled,
|
||||
id: id.hashCode));
|
||||
}
|
||||
}
|
||||
if (sayInstalled) {
|
||||
|
@@ -19,7 +19,7 @@ String obtainiumId = 'dev.imranr.obtainium';
|
||||
String obtainiumUrl = 'https://github.com/ImranR98/Obtainium';
|
||||
Color obtainiumThemeColor = const Color(0xFF6438B5);
|
||||
|
||||
enum ThemeSettings { light, dark, system }
|
||||
enum ThemeSettings { system, light, dark }
|
||||
|
||||
enum SortColumnSettings { added, nameAuthor, authorName, releaseDate }
|
||||
|
||||
@@ -59,7 +59,7 @@ class SettingsProvider with ChangeNotifier {
|
||||
|
||||
ThemeSettings get theme {
|
||||
return ThemeSettings
|
||||
.values[prefs?.getInt('theme') ?? ThemeSettings.light.index];
|
||||
.values[prefs?.getInt('theme') ?? ThemeSettings.system.index];
|
||||
}
|
||||
|
||||
set theme(ThemeSettings t) {
|
||||
|
32
pubspec.lock
32
pubspec.lock
@@ -79,10 +79,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: background_fetch
|
||||
sha256: dbffec0317ccdef6e2014cb543e147f52441e29c4fcb53dfd23558c4d92ddece
|
||||
sha256: "81d0d4eeecd17c971335438a5a55554c8302f479f92c7f7bc7f147f75d3f6074"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
version: "1.3.3"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -135,10 +135,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity_plus
|
||||
sha256: ebe15d94de9dd7c31dc2ac54e42780acdf3384b1497c69290c9f3c5b0279fc57
|
||||
sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.2"
|
||||
version: "6.0.3"
|
||||
connectivity_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -223,10 +223,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: easy_localization
|
||||
sha256: c145aeb6584aedc7c862ab8c737c3277788f47488bfdf9bae0fe112bd0a4789c
|
||||
sha256: "432698c31a488dd64c56d4759f20d04844baba5e9e4f2cb1abb9676257918b17"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.6"
|
||||
easy_logger:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -271,10 +271,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_picker
|
||||
sha256: b6283d7387310ad83bc4f3bc245b75d223a032ae6eba275afcd585de2b9a1476
|
||||
sha256: "45c70b43df893027e441a6fa0aacc8f484fb9f9c60c746dc8f1dc4f774cf55cd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.1"
|
||||
version: "8.0.2"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -340,10 +340,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_local_notifications
|
||||
sha256: a701df4866f9a38bb8e4450a54c143bbeeb0ce2381e7df5a36e1006f3b43bb28
|
||||
sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "17.0.1"
|
||||
version: "17.1.0"
|
||||
flutter_local_notifications_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -356,10 +356,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_local_notifications_platform_interface
|
||||
sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef"
|
||||
sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0+1"
|
||||
version: "7.1.0"
|
||||
flutter_localizations:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
@@ -715,18 +715,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: share_plus
|
||||
sha256: fb5319f3aab4c5dda5ebb92dca978179ba21f8c783ee4380910ef4c1c6824f51
|
||||
sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.3"
|
||||
version: "9.0.0"
|
||||
share_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_platform_interface
|
||||
sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496"
|
||||
sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.0"
|
||||
version: "4.0.0"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
version: 1.1.5+2262
|
||||
version: 1.1.6+2263
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
@@ -56,7 +56,7 @@ dependencies:
|
||||
url: https://github.com/ImranR98/android_package_installer
|
||||
ref: main
|
||||
android_package_manager: ^0.7.0
|
||||
share_plus: ^8.0.2
|
||||
share_plus: ^9.0.0
|
||||
sqflite: ^2.2.0+3
|
||||
easy_localization: ^3.0.1
|
||||
android_intent_plus: ^5.0.1
|
||||
|
Reference in New Issue
Block a user