diff --git a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt index 892f84aa4..21d46b470 100644 --- a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt @@ -1,11 +1,16 @@ package com.example.piliplus +import android.app.PendingIntent import android.app.PictureInPictureParams import android.app.SearchManager import android.content.ComponentName import android.content.Intent import android.content.pm.PackageManager +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager import android.content.res.Configuration +import android.graphics.BitmapFactory +import android.graphics.drawable.Icon import android.os.Build import android.os.Bundle import android.provider.MediaStore @@ -16,6 +21,7 @@ import com.ryanheise.audioservice.AudioServiceActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import kotlin.system.exitProcess +import java.io.File class MainActivity : AudioServiceActivity() { private lateinit var methodChannel: MethodChannel @@ -133,6 +139,38 @@ class MainActivity : AudioServiceActivity() { } } + "createShortcut" -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + val shortcutManager = + context.getSystemService(ShortcutManager::class.java) + if (shortcutManager.isRequestPinShortcutSupported) { + val id = call.argument("id")!! + val uri = call.argument("uri")!! + val label = call.argument("label")!! + val icon = call.argument("icon")!! + val bitmap = BitmapFactory.decodeFile(icon) + val shortcut = + ShortcutInfo.Builder(context, id) + .setShortLabel(label) + .setIcon(Icon.createWithAdaptiveBitmap(bitmap)) + .setIntent(Intent(Intent.ACTION_VIEW, uri.toUri())) + .build() + val pinIntent = + shortcutManager.createShortcutResultIntent(shortcut) + val pendingIntent = PendingIntent.getBroadcast( + context, 0, pinIntent, PendingIntent.FLAG_IMMUTABLE + ) + shortcutManager.requestPinShortcut( + shortcut, + pendingIntent.intentSender + ) + } + } catch (e: Exception) { + } + } + } + else -> result.notImplemented() } } diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index 580cf69f2..1822bcebd 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -28,6 +28,7 @@ class MemberController extends CommonDataController MemberController({required this.mid}); int mid; String? username; + String? userAvatar; late final account = Accounts.main; @@ -71,7 +72,10 @@ class MemberController extends CommonDataController final data = response.response; final card = data.card; username = card?.name ?? ''; + userAvatar = card?.face; + isFollowed = card?.relation?.isFollowed; + // charge final elec = data.elec; charges = elec?.list; diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index 90c495842..41b789551 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -34,12 +34,15 @@ import 'package:PiliPlus/pages/member_video_web/archive/view.dart'; import 'package:PiliPlus/pages/member_video_web/season_series/view.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; @@ -380,11 +383,9 @@ class _MemberPageState extends State { ], ), ), - if (kDebugMode || Platform.isIOS) + if (kDebugMode || PlatformUtils.isMobile) PopupMenuItem( - onTap: () => PageUtils.launchURL( - 'https://www.bilibili.com/blackboard/disablelink/go-to-up-space.html?mid=$_mid', - ), + onTap: _createShortcut, child: const Row( mainAxisSize: MainAxisSize.min, children: [ @@ -688,4 +689,35 @@ class _MemberPageState extends State { SmartDialog.showToast(e.toString()); } } + + void _createShortcut() { + if (Platform.isIOS) { + PageUtils.launchURL( + 'https://www.bilibili.com/blackboard/disablelink/go-to-up-space.html?mid=$_mid', + ); + } else if (Platform.isAndroid) { + _createShortcutAndroid(); + } + } + + Future _createShortcutAndroid() async { + try { + SmartDialog.showLoading(); + final file = (await DefaultCacheManager().getSingleFile( + '${_userController.userAvatar!}@200w_200h.webp'.http2https, + )); + SmartDialog.dismiss(); + await Utils.channel.invokeMethod( + 'createShortcut', + { + 'id': _userController.mid.toString(), + 'uri': 'bilibili://space/${_userController.mid}', + 'label': _userController.username!, + 'icon': file.path, + }, + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + } }