From 8e44d4a9d959a5bf92b1b89de11e70943b937485 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 29 Jan 2021 11:23:34 +0900 Subject: [PATCH] debug: package list --- lib/utils/android_file_utils.dart | 15 ++-- lib/widgets/debug/android_apps.dart | 80 ++++++++++++++++++++++ lib/widgets/debug/android_dirs.dart | 2 +- lib/widgets/debug/app_debug_page.dart | 2 + lib/widgets/viewer/info/basic_section.dart | 2 +- lib/widgets/viewer/info/info_page.dart | 2 +- 6 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 lib/widgets/debug/android_apps.dart diff --git a/lib/utils/android_file_utils.dart b/lib/utils/android_file_utils.dart index eec38cddf..7565db251 100644 --- a/lib/utils/android_file_utils.dart +++ b/lib/utils/android_file_utils.dart @@ -8,7 +8,7 @@ final AndroidFileUtils androidFileUtils = AndroidFileUtils._private(); class AndroidFileUtils { String primaryStorage, dcimPath, downloadPath, moviesPath, picturesPath; Set storageVolumes = {}; - Map appNameMap = {}; + Map _installedAppNameMap = {}; AChangeNotifier appNameChangeNotifier = AChangeNotifier(); @@ -25,7 +25,7 @@ class AndroidFileUtils { } Future initAppNames() async { - appNameMap = await AndroidAppService.getAppNames() + _installedAppNameMap = await AndroidAppService.getAppNames() ..addAll({'KakaoTalkDownload': 'com.kakao.talk'}); appNameChangeNotifier.notifyListeners(); } @@ -50,15 +50,16 @@ class AndroidFileUtils { if (isScreenshotsPath(albumDirectory)) return AlbumType.screenshots; final parts = albumDirectory.split(separator); - if (albumDirectory.startsWith(primaryStorage) && appNameMap.keys.contains(parts.last)) return AlbumType.app; + if (albumDirectory.startsWith(primaryStorage) && _isInstalledAppName(parts.last)) return AlbumType.app; } return AlbumType.regular; } - String getAlbumAppPackageName(String albumDirectory) { - final parts = albumDirectory.split(separator); - return appNameMap[parts.last]; - } + bool _isInstalledAppName(String name) => _installedAppNameMap.keys.contains(name); + + String getAlbumAppPackageName(String albumDirectory) => _installedAppNameMap[albumDirectory.split(separator).last]; + + String getAppName(String packageName) => _installedAppNameMap.entries.firstWhere((kv) => kv.value == packageName, orElse: () => null)?.key; } enum AlbumType { regular, app, camera, download, screenRecordings, screenshots } diff --git a/lib/widgets/debug/android_apps.dart b/lib/widgets/debug/android_apps.dart new file mode 100644 index 000000000..e929e34eb --- /dev/null +++ b/lib/widgets/debug/android_apps.dart @@ -0,0 +1,80 @@ +import 'package:aves/image_providers/app_icon_image_provider.dart'; +import 'package:aves/services/android_app_service.dart'; +import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class DebugAndroidAppSection extends StatefulWidget { + @override + _DebugAndroidAppSectionState createState() => _DebugAndroidAppSectionState(); +} + +class _DebugAndroidAppSectionState extends State with AutomaticKeepAliveClientMixin { + Future _loader; + + static const iconSize = 20.0; + + @override + void initState() { + super.initState(); + _loader = AndroidAppService.getAppNames(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + + return AvesExpansionTile( + title: 'Android Apps', + children: [ + Padding( + padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + child: FutureBuilder( + future: _loader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + final entries = snapshot.data.entries.toList()..sort((kv1, kv2) => compareAsciiUpperCase(kv1.value, kv2.value)); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: entries.map((kv) { + final appName = kv.key.toString(); + final packageName = kv.value.toString(); + return Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Image( + image: AppIconImage( + packageName: packageName, + size: iconSize, + ), + width: iconSize, + height: iconSize, + ), + ), + TextSpan( + text: ' $packageName', + style: InfoRowGroup.keyStyle, + ), + TextSpan( + text: ' $appName', + style: InfoRowGroup.baseStyle, + ), + ], + ), + ); + }).toList(), + ); + }, + ), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/widgets/debug/android_dirs.dart b/lib/widgets/debug/android_dirs.dart index 3731170fe..92e71bdf7 100644 --- a/lib/widgets/debug/android_dirs.dart +++ b/lib/widgets/debug/android_dirs.dart @@ -24,7 +24,7 @@ class _DebugAndroidDirSectionState extends State with Au super.build(context); return AvesExpansionTile( - title: 'Android Dir', + title: 'Android Dirs', children: [ Padding( padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index 4d560ceb8..b600f0380 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -2,6 +2,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/debug/android_apps.dart'; import 'package:aves/widgets/debug/android_dirs.dart'; import 'package:aves/widgets/debug/android_env.dart'; import 'package:aves/widgets/debug/cache.dart'; @@ -42,6 +43,7 @@ class _AppDebugPageState extends State { padding: EdgeInsets.all(8), children: [ _buildGeneralTabView(), + DebugAndroidAppSection(), DebugAndroidDirSection(), DebugAndroidEnvironmentSection(), DebugCacheSection(), diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index 3e3cf4931..d2ba17492 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -136,7 +136,7 @@ class _OwnerPropState extends State { builder: (context, snapshot) { final packageName = snapshot.data; if (packageName == null) return SizedBox(); - final appName = androidFileUtils.appNameMap.entries.firstWhere((kv) => kv.value == packageName, orElse: () => null)?.key ?? packageName; + final appName = androidFileUtils.getAppName(packageName) ?? packageName; return Text.rich( TextSpan( children: [ diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index b84e2a4d7..3adede21f 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -64,7 +64,7 @@ class _InfoPageState extends State { entry: entry, visibleNotifier: widget.visibleNotifier, scrollController: _scrollController, - split: mqWidth > 400, + split: mqWidth > 600, goToViewer: _goToViewer, ) : SizedBox.shrink();