From 868dbcd32c958185ab0bf7730c4bc3e463d72f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=BD=B3=E7=9D=BF?= Date: Tue, 21 Mar 2023 15:37:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=95=85=E7=8E=A9=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E5=8A=9F=E8=83=BD=E2=80=94=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=20https://jira.shanqu.cc/browse/GHZS-1679?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 7 +- .../java/com/gh/gamecenter/MainActivity.java | 21 ++ .../com/gh/vspace/VDownloadManagerAdapter.kt | 132 ++++++++--- .../com/gh/vspace/VDownloadManagerFragment.kt | 1 + .../gh/vspace/VDownloadManagerViewModel.kt | 7 + app/src/main/java/com/gh/vspace/VHelper.kt | 35 +++ .../menu/VDownLoadManagerItemMenuDialog.kt | 54 +++++ .../com/gh/vspace/shortcut/ShortcutManager.kt | 206 ++++++++++++++++++ .../shortcut/ShortcutPermissionDialog.kt | 63 ++++++ ..._game_add_shortcut_permission_content.webp | Bin 0 -> 15290 bytes .../dialog_game_add_shortcut_permission.xml | 106 +++++++++ .../dialog_game_download_manager_menu.xml | 80 +++++++ .../base/fragment/BaseBottomDialogFragment.kt | 61 ++++++ .../common/constant/EntranceConsts.java | 4 + .../gh/gamecenter/common/utils/Extensions.kt | 28 +++ .../common/utils/PermissionHelper.kt | 37 ++++ module_lib/build.gradle | 3 +- module_lib/shortcut.aar | Bin 0 -> 64577 bytes vspace-bridge | 2 +- 19 files changed, 810 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/gh/vspace/menu/VDownLoadManagerItemMenuDialog.kt create mode 100644 app/src/main/java/com/gh/vspace/shortcut/ShortcutManager.kt create mode 100644 app/src/main/java/com/gh/vspace/shortcut/ShortcutPermissionDialog.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_add_shortcut_permission_content.webp create mode 100644 app/src/main/res/layout/dialog_game_add_shortcut_permission.xml create mode 100644 app/src/main/res/layout/dialog_game_download_manager_menu.xml create mode 100644 module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseBottomDialogFragment.kt create mode 100644 module_lib/shortcut.aar diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70a270edf3..2dba2904cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -136,9 +136,14 @@ android:name="com.gh.gamecenter.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:launchMode="singleTask" + android:exported="true" android:screenOrientation="portrait" android:theme="@style/AppCompatTheme.APP" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize" /> + android:windowSoftInputMode="stateAlwaysHidden|adjustResize" > + + + + { + VHelper.postOnInitialized(() -> { + if (VHelper.isInstalled(gamePackageName)) { + VHelper.launch(this, gamePackageName); + } else { + ToastUtils.showToast("应用已被卸载!"); + } + return null; + }); + }, 500); + break; case KEY_MARKET_DETAILS: redirectGameDetail(bundle.getString(KEY_DATA)); break; diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt index 46b4c74d05..47464ef912 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerAdapter.kt @@ -10,13 +10,11 @@ import android.widget.LinearLayout import android.widget.PopupWindow import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView import com.gh.common.databind.BindingAdapters -import com.gh.gamecenter.feature.exposure.ExposureEvent -import com.gh.gamecenter.feature.exposure.ExposureSource import com.gh.common.exposure.IExposable import com.gh.common.util.NewFlatLogUtils -import com.gh.gamecenter.feature.view.DownloadButton import com.gh.download.DownloadManager import com.gh.gamecenter.GameDetailActivity import com.gh.gamecenter.R @@ -25,8 +23,8 @@ import com.gh.gamecenter.common.baselist.LoadType import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.ItemViewType import com.gh.gamecenter.common.utils.* -import com.gh.gamecenter.common.viewholder.FooterViewHolder import com.gh.gamecenter.common.view.DrawableView +import com.gh.gamecenter.common.viewholder.FooterViewHolder import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.utils.CurrentActivityHolder @@ -36,8 +34,13 @@ import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.databinding.ItemVgameDownloadManagerBinding import com.gh.gamecenter.databinding.PopupHistoryOptionBinding import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.exposure.ExposureSource +import com.gh.gamecenter.feature.view.DownloadButton import com.gh.gamecenter.history.ManageOption import com.gh.gamecenter.manager.PackagesManager +import com.gh.vspace.menu.VDownLoadManagerItemMenuDialog +import com.gh.vspace.shortcut.ShortcutManager import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus import com.lightgame.utils.Utils @@ -45,6 +48,7 @@ import org.json.JSONArray class VDownloadManagerAdapter( context: Context, + private val mFragmentManager: FragmentManager, private val mViewModel: VDownloadManagerViewModel, ) : ListAdapter(context), IExposable { @@ -56,6 +60,7 @@ class VDownloadManagerAdapter( private var mPopWindow: PopupWindow? = null private var mCurrentOption = ManageOption.OPTION_MANAGER private var mPopupBinding: PopupHistoryOptionBinding? = null + private var mItemMenuDialog: VDownLoadManagerItemMenuDialog? = null var selectItems = arrayListOf() @@ -187,37 +192,29 @@ class VDownloadManagerAdapter( if (autoPause) { holder.binding.downloadBtn.performClick() } - DialogHelper.showDialog( - holder.binding.root.context, - "删除游戏", - "单机类游戏被删除将可能导致本地存档、充值数据丢失,请确认后操作(网游类游戏删除不会影响游戏存档和充值数据)", - "再等等", - "删除", - { - if (autoPause) { - holder.binding.downloadBtn.performClick() - } - }, - { - runOnIoThread { - val apk = gameEntity.getApk().firstOrNull() - mViewModel.removeItem(apk?.url, apk?.packageName) - - AppExecutor.uiExecutor.executeWithDelay({ - mViewModel.load(LoadType.REFRESH) - }, 200) - } - }, - uiModificationCallback = { - it.cancelTv.setTextColor(R.color.theme_red.toColor(it.root.context)) - it.confirmTv.setTextColor(R.color.text_subtitle.toColor(it.root.context)) - }, - extraConfig = DialogHelper.Config(centerTitle = true) - )?.setOnCancelListener { - if (autoPause) { - holder.binding.downloadBtn.performClick() - } + //还在下载中的游戏直接弹出删除对话框 + if (!mViewModel.isTypeDownloaded()) { + showDelGameDialog(holder, autoPause, gameEntity) + return@setOnLongClickListener false } + //下载完成的在玩游戏才有菜单 + if (mItemMenuDialog == null) { + mItemMenuDialog = VDownLoadManagerItemMenuDialog() + } else { + mItemMenuDialog?.dismiss() + } + mItemMenuDialog?.onAddIconToLauncherClickListener = { + //添加到桌面 + addShortcutToLauncher(holder, gameEntity) + } + mItemMenuDialog?.onClearGameDataClickListener = { + //清除游戏数据 + showCLearGameDataDialog(holder, gameEntity) + } + mItemMenuDialog?.onDeleteGameClickListener = { + showDelGameDialog(holder, autoPause, gameEntity) + } + mItemMenuDialog?.show(mFragmentManager, null) return@setOnLongClickListener false } } @@ -228,6 +225,73 @@ class VDownloadManagerAdapter( } } + /** + * 显示添加图标到桌面的对话框 + */ + private fun addShortcutToLauncher(holder: VGameItemViewHolder, gameEntity: GameEntity) { + ShortcutManager.getInstance().tryCreateShortCut(holder.binding.root.context, gameEntity) + } + + /** + * 显示清除游戏数据对话框 + */ + private fun showCLearGameDataDialog(holder: VGameItemViewHolder, gameEntity: GameEntity) { + DialogHelper.showDialog( + holder.binding.root.context, + "提示", + "清除后游戏的所有记录都将被清空,无法恢复!您确定要清除吗?", + "确定", + "取消", + confirmClickCallback = { //清除游戏数据 + mViewModel.cleanGameData(gameEntity.getUniquePackageName()) + }, + extraConfig = DialogHelper.Config(centerTitle = true) + ) + } + + /** + * 显示删除游戏的对话框 + */ + private fun showDelGameDialog( + holder: VGameItemViewHolder, + autoPause: Boolean, + gameEntity: GameEntity + ) { + DialogHelper.showDialog( + holder.binding.root.context, + "删除游戏", + "单机类游戏被删除将可能导致本地存档、充值数据丢失,请确认后操作(网游类游戏删除不会影响游戏存档和充值数据)", + "再等等", + "删除", + { + if (autoPause) { + holder.binding.downloadBtn.performClick() + } + }, + { + //删除对应的桌面快捷方式 + ShortcutManager.getInstance().removeShortcut(holder.binding.root.context, gameEntity) + runOnIoThread { + val apk = gameEntity.getApk().firstOrNull() + mViewModel.removeItem(apk?.url, apk?.packageName) + + AppExecutor.uiExecutor.executeWithDelay({ + mViewModel.load(LoadType.REFRESH) + }, 200) + } + }, + uiModificationCallback = { + it.cancelTv.setTextColor(R.color.theme_red.toColor(it.root.context)) + it.confirmTv.setTextColor(R.color.text_subtitle.toColor(it.root.context)) + }, + extraConfig = DialogHelper.Config(centerTitle = true) + )?.setOnCancelListener { + if (autoPause) { + holder.binding.downloadBtn.performClick() + } + } + } + private fun showOptionWindow() { mPopupBinding = PopupHistoryOptionBinding.inflate(LayoutInflater.from(mContext)) mPopupBinding?.root?.isFocusable = true diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt index da10742b94..6d036a1c22 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt @@ -27,6 +27,7 @@ class VDownloadManagerFragment : private val mAdapter by lazy { VDownloadManagerAdapter( requireContext(), + childFragmentManager, provideListViewModel() ) } diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt index 5ee1926e01..7d669d2586 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerViewModel.kt @@ -6,6 +6,7 @@ import com.gh.download.DownloadManager import com.gh.download.PackageObserver import com.gh.gamecenter.common.baselist.ListViewModel import com.gh.gamecenter.common.utils.toProperReadableSize +import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.NumberUtils import com.gh.gamecenter.core.utils.ToastUtils @@ -97,6 +98,12 @@ class VDownloadManagerViewModel(application: Application) : } } + fun cleanGameData(packageName: String?) { + runOnIoThread { + VHelper.cleanGameData(packageName) + } + } + @WorkerThread fun removeItem(url: String?, packageName: String?) { DownloadManager.getInstance().pause(url) diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index d983143b6f..9635ceccec 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -242,6 +242,15 @@ object VHelper { } } + @JvmStatic + fun postOnInitialized(callback: () -> Unit) { + if (mIsServiceConnected) { + callback() + } else { + mPendingAction = callback + } + } + private fun toastIfServiceConnectTimeout(timeout: Long = 3000L) { if (!mIsServiceConnected) { AppExecutor.uiExecutor.executeWithDelay({ @@ -616,6 +625,7 @@ object VHelper { /** * 启动应用 */ + @JvmStatic fun launch(context: Context, packageName: String) { Utils.log(LOG_TAG, "打开应用 $packageName") @@ -692,6 +702,31 @@ object VHelper { } } + /** + * 清除游戏数据 + */ + @JvmStatic + fun cleanGameData(packageName: String?) { + Utils.log(LOG_TAG, "清除游戏数据 $packageName") + if (packageName.isNullOrBlank()) return + val cleanGameDataClosure: () -> Unit = { + try { + val result = VirtualAppManager.get().cleanGameData(packageName) + if (result) { + updateInstalledList() + } + Utils.log(LOG_TAG, "清除游戏数据结果 -> $result") + } catch (e: Exception) { + ToastUtils.toast(e.localizedMessage ?: "") + } + } + if (mDelegateManager.isConnectAidlInterface) { + cleanGameDataClosure.invoke() + } else { + connectService(false, cleanGameDataClosure) + } + } + /** * 获取游戏最后打开的时间 * @return 最后打开的时间戳 diff --git a/app/src/main/java/com/gh/vspace/menu/VDownLoadManagerItemMenuDialog.kt b/app/src/main/java/com/gh/vspace/menu/VDownLoadManagerItemMenuDialog.kt new file mode 100644 index 0000000000..a0e8245152 --- /dev/null +++ b/app/src/main/java/com/gh/vspace/menu/VDownLoadManagerItemMenuDialog.kt @@ -0,0 +1,54 @@ +package com.gh.vspace.menu + +import android.os.Bundle +import android.view.View +import com.gh.gamecenter.R +import com.gh.gamecenter.common.base.fragment.BaseBottomDialogFragment +import com.gh.gamecenter.common.utils.setRootBackgroundDrawable +import com.gh.gamecenter.common.utils.toColor +import com.gh.gamecenter.common.utils.toDrawable +import com.gh.gamecenter.databinding.DialogGameDownloadManagerMenuBinding + +/** + * @author : liujiarui + * date : 2023/3/20 + * description : 畅玩游戏管理item菜单 + */ +class VDownLoadManagerItemMenuDialog : + BaseBottomDialogFragment() { + + var onAddIconToLauncherClickListener: (() -> Unit)? = null + var onClearGameDataClickListener: (() -> Unit)? = null + var onDeleteGameClickListener: (() -> Unit)? = null + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mBinding.addIconToDesktopBtn.setOnClickListener { + dismissAllowingStateLoss() + onAddIconToLauncherClickListener?.invoke() + } + mBinding.clearGameDataBtn.setOnClickListener { + dismissAllowingStateLoss() + onClearGameDataClickListener?.invoke() + } + mBinding.uninstallGameBtn.setOnClickListener { + dismissAllowingStateLoss() + onDeleteGameClickListener?.invoke() + } + mBinding.cancelBtn.setOnClickListener { + dismissAllowingStateLoss() + } + } + + override fun onDarkModeChanged() { + super.onDarkModeChanged() + mBinding.run { + root.setRootBackgroundDrawable(R.drawable.background_shape_white_radius_12_top_only) + cancelBtn.background = R.drawable.bg_shape_f5_radius_999.toDrawable(requireContext()) + dialogTitleTv.setTextColor(R.color.text_title.toColor(requireContext())) + cancelBtn.setTextColor(R.color.text_subtitle.toColor(requireContext())) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/vspace/shortcut/ShortcutManager.kt b/app/src/main/java/com/gh/vspace/shortcut/ShortcutManager.kt new file mode 100644 index 0000000000..a472b8ca17 --- /dev/null +++ b/app/src/main/java/com/gh/vspace/shortcut/ShortcutManager.kt @@ -0,0 +1,206 @@ +package com.gh.vspace.shortcut + +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Matrix +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.fragment.app.FragmentActivity +import com.gh.gamecenter.MainActivity +import com.gh.gamecenter.common.callback.BiCallback +import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.exposure.meta.MetaUtil +import com.gh.gamecenter.common.utils.ImageUtils +import com.gh.gamecenter.common.utils.PermissionHelper +import com.gh.gamecenter.core.runOnUiThread +import com.gh.gamecenter.core.utils.ToastUtils +import com.gh.gamecenter.feature.entity.GameEntity +import com.halo.assistant.HaloApp +import com.lg.vspace.VirtualAppManager +import com.muugi.shortcut.core.Executor +import com.muugi.shortcut.core.Shortcut +import com.muugi.shortcut.core.ShortcutAction + +/** + * @author : liujiarui + * date : 2023/3/20 + * description : 动态创建快捷方式管理类 + */ +class ShortcutManager private constructor() { + + private val mDelegateManager by lazy { VirtualAppManager.get() } + + private val mShortcutAction: ShortcutAction by lazy { + object : ShortcutAction() { + override fun showPermissionDialog(context: Context, check: Int, executor: Executor) { + runOnUiThread { + ShortcutPermissionDialog(context, executor).show() + } + } + + override fun onCreateAction( + requestPinShortcut: Boolean, + check: Int, + executor: Executor + ) { + if (requestPinShortcut) { + ToastUtils.showToast("桌面图标创建成功~") + } else { + ToastUtils.showToast("创建快捷方式失败") + } + } + + override fun onUpdateAction(updatePinShortcut: Boolean) { + if (updatePinShortcut) { + ToastUtils.showToast("桌面图标更新成功~") + } else { + ToastUtils.showToast("更新快捷方式失败") + } + } + } + } + + private val mCallback: Shortcut.Callback by lazy { + object : Shortcut.Callback { + override fun onAsyncCreate(id: String, label: String) { + //ToastUtils.showToast("桌面图标创建成功~") + } + } + } + + + /** + * 创建快捷方式 + */ + fun tryCreateShortCut(context: Context, gameEntity: GameEntity) { + val activity = context as? FragmentActivity ?: return + if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) { + PermissionHelper.checkShortcutPermission(activity, + onGrantedCallback = { + createShortcut(context, gameEntity) + }, + onDeniedCallback = { + ShortcutPermissionDialog(context).show() + }) + } else { + ShortcutPermissionDialog(context).show() + } + } + + /** + * 创建快捷方式 + */ + private fun createShortcut(context: Context, gameEntity: GameEntity) { + val gameId = gameEntity.id + val gameName = gameEntity.name ?: "" + val gameIcon = gameEntity.icon ?: "" + val dynamicShortcuts = ShortcutManagerCompat.getShortcuts(context, ShortcutManagerCompat.FLAG_MATCH_PINNED) + val shortcutExists = dynamicShortcuts.find { it.id == gameId } + if (shortcutExists != null) { + ShortcutManagerCompat.enableShortcuts( + context, listOf(shortcutExists) + ) + ToastUtils.showToast("桌面图标已创建,无需重复!") + return + } + ImageUtils.getBitmap(gameIcon, object : BiCallback { + override fun onFirst(first: Bitmap) { + // 压缩图片 + val bitmap = compressImage(first) + val shortcutInfoIntent = getGameIntent(context, gameEntity) + shortcutInfoIntent.run { + val info = ShortcutInfoCompat.Builder(context, gameId) + .setIcon(IconCompat.createWithBitmap(bitmap)) + .setShortLabel(gameName) + //.setAlwaysBadged() // 设置图标角标为应用角标 + .setIntent(this) + .build() + // 创建快捷方式 + Shortcut.singleInstance.requestPinShortcut( + context = context, + shortcutInfoCompat = info, + updateIfExit = false, + fixHwOreo = true, + shortcutAction = mShortcutAction + ) + } + } + + override fun onSecond(second: Boolean) { + ToastUtils.showToast("创建快捷方式失败") + } + }) + } + + /** + * 动态删除快捷方式 + * 暂时只能在原生系统禁用快捷方式 + */ + fun removeShortcut(context: Context, gameEntity: GameEntity) { + val gameId = gameEntity.id + val gameName = gameEntity.name ?: "" + val dynamicShortcuts = ShortcutManagerCompat.getShortcuts(context, ShortcutManagerCompat.FLAG_MATCH_PINNED) + val shortcutExists = dynamicShortcuts.find { it.id == gameId } + if (shortcutExists != null) { + ShortcutManagerCompat.disableShortcuts( + context, listOf(gameId), "$gameName 已经卸载" + ) + ShortcutManagerCompat.removeLongLivedShortcuts(context, listOf(gameId)) + } + } + + /** + * 获取游戏快捷方式跳转Intent + * 直接启动游戏 + */ + private fun getIntent(gameEntity: GameEntity): Intent { + val intent = mDelegateManager.getStartGameIntent( + gameEntity.getUniquePackageName(), + gameEntity.id, + gameEntity.name ?: "unknown", + MetaUtil.getBase64EncodedAndroidId(), + HaloApp.getInstance().gid, + com.gh.gamecenter.BuildConfig.VERSION_NAME, + HaloApp.getInstance().channel + ) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + return intent + } + + /** + * 获取游戏快捷方式跳转Intent + * 先启动光环助手,然后跳转游戏 + */ + private fun getGameIntent(context: Context, gameEntity: GameEntity): Intent { + val intent = Intent(context, MainActivity::class.java) + intent.action = Intent.ACTION_VIEW + intent.putExtra(EntranceConsts.KEY_REQUIRE_REDIRECT, true) + intent.putExtra(EntranceConsts.KEY_TO, EntranceConsts.HOST_LAUNCH_VM_GAME) + intent.putExtra(EntranceConsts.KEY_GAME_PKG, gameEntity.getUniquePackageName()) + return intent + } + + // Bitmap尺寸超过300*300就压缩 + private fun compressImage(bitmap: Bitmap): Bitmap { + return if (bitmap.byteCount > 300 * 300 * 4) { + val width = bitmap.width.toFloat() + val height = bitmap.height.toFloat() + val matrix = Matrix() + val scaleWidth = 300 / width + val scaleHeight = 300 / height + matrix.postScale(scaleWidth, scaleHeight) + Bitmap.createBitmap(bitmap, 0, 0, width.toInt(), height.toInt(), matrix, true) + } else bitmap + } + + + companion object { + private val mShortcutManager = ShortcutManager() + fun getInstance(): ShortcutManager { + Shortcut.singleInstance.addShortcutCallback(mShortcutManager.mCallback) + return mShortcutManager + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/vspace/shortcut/ShortcutPermissionDialog.kt b/app/src/main/java/com/gh/vspace/shortcut/ShortcutPermissionDialog.kt new file mode 100644 index 0000000000..e9ae5b3d2c --- /dev/null +++ b/app/src/main/java/com/gh/vspace/shortcut/ShortcutPermissionDialog.kt @@ -0,0 +1,63 @@ +package com.gh.vspace.shortcut + +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.provider.Settings +import android.view.Window +import com.gh.common.util.DirectUtils +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.DialogGameAddShortcutPermissionBinding +import com.muugi.shortcut.core.Executor + +/** + * @author : liujiarui + * date : 2023/3/20 + * description : 创建快捷方式权限弹窗 + */ +class ShortcutPermissionDialog( + context: Context, + private val mExecutor: Executor? = null +) : Dialog(context, R.style.DialogWindowTransparent) { + private lateinit var mBinding: DialogGameAddShortcutPermissionBinding + + override fun onCreate(savedInstanceState: Bundle?) { + requestWindowFeature(Window.FEATURE_NO_TITLE); + super.onCreate(savedInstanceState) + DialogGameAddShortcutPermissionBinding.inflate(layoutInflater).apply { + setContentView(root) + mBinding = this + } + initEvent() + } + + private fun initEvent() { + mBinding.closeContainer.setOnClickListener { + dismiss() + } + mBinding.goSettingTv.setOnClickListener { + jumpToSetting() + dismiss() + } + mBinding.serviceTv.setOnClickListener { + jumpToFeedback() + dismiss() + } + } + + private fun jumpToSetting() { + if (mExecutor != null) { + mExecutor.executeSetting() + return + } + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.parse("package:" + context.packageName) + context.startActivity(intent) + } + + private fun jumpToFeedback() { + DirectUtils.directToFeedback(context, "无法正常设置桌面快捷方式权限", hintType = "other") + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_add_shortcut_permission_content.webp b/app/src/main/res/drawable-xxhdpi/ic_game_add_shortcut_permission_content.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e78493e326579d831d9c4c81c569f618270b160 GIT binary patch literal 15290 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 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_game_download_manager_menu.xml b/app/src/main/res/layout/dialog_game_download_manager_menu.xml new file mode 100644 index 0000000000..e34d4f13b2 --- /dev/null +++ b/app/src/main/res/layout/dialog_game_download_manager_menu.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseBottomDialogFragment.kt b/module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseBottomDialogFragment.kt new file mode 100644 index 0000000000..6b6a1f8c51 --- /dev/null +++ b/module_common/src/main/java/com/gh/gamecenter/common/base/fragment/BaseBottomDialogFragment.kt @@ -0,0 +1,61 @@ +package com.gh.gamecenter.common.base.fragment + +import android.app.Dialog +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewbinding.ViewBinding +import com.gh.gamecenter.common.R +import com.gh.gamecenter.common.utils.getSuperClassGenericType +import com.gh.gamecenter.core.utils.DisplayUtils + +/** + * @author : liujiarui + * date : 2023/3/20 + * description : 底部弹出dialog + */ +abstract class BaseBottomDialogFragment : BaseDialogFragment() { + + protected lateinit var mBinding: T + + private fun initViewBinding(inflater: LayoutInflater): T { + return this::class.java.getSuperClassGenericType().getMethod( + "inflate", + LayoutInflater::class.java, + ViewGroup::class.java, + Boolean::class.java + ).invoke(null, inflater, null, false) as T + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + initViewBinding(inflater).apply { mBinding = this } + return mBinding.root + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val createDialog = super.onCreateDialog(savedInstanceState) + createDialog.setCanceledOnTouchOutside(true) + val window = createDialog.window + window?.setGravity(Gravity.BOTTOM) + window?.setWindowAnimations(R.style.community_publication_animation) + return createDialog + } + + override fun onStart() { + super.onStart() + val width = if (isWidthMatchParent()) DisplayUtils.getScreenWidth() else { + dialog?.window?.attributes?.width ?: ViewGroup.LayoutParams.WRAP_CONTENT + } + val height = dialog?.window?.attributes?.height ?: ViewGroup.LayoutParams.WRAP_CONTENT + dialog?.window?.setLayout(width, height) + } + + /** + * 是否宽度撑满屏幕 + */ + protected fun isWidthMatchParent(): Boolean { + return true + } +} \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java index 2b7713be0b..693b7d9ac7 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java @@ -68,6 +68,8 @@ public class EntranceConsts { public static final String HOST_GAME_RATING_DETAIL = "game_rating_detail"; public static final String HOST_HELP_AND_FEEDBACK = "help_and_feedback"; public static final String HOST_LAUNCH_SIMULATOR_GAME = "launch_simulator_game"; + + public static final String HOST_LAUNCH_VM_GAME = "launch_vm_game"; public static final String HOST_HELP_DETAIL = "help_detail"; public static final String HOST_GAME_COLLECTION_DETAIL = "game_collection_detail"; public static final String HOST_GAME_COLLECTION_SQUARE = "game_collection_square"; @@ -117,6 +119,8 @@ public class EntranceConsts { public static final String KEY_SEARCHKEY = "searchKey"; public static final String KEY_HINT = "hint"; public static final String KEY_GAME = "game"; + + public static final String KEY_GAME_PKG = "game_pkg"; public static final String KEY_GAME_ICON_URL = "gameIconUrl"; public static final String KEY_SHARECONTENT = "shareContent"; public static final String KEY_SUGGESTTYPE = "suggestType"; diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index 2e0efd018c..01746bf438 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -68,6 +68,7 @@ import okhttp3.MediaType import okhttp3.RequestBody import org.json.JSONArray import org.json.JSONObject +import java.lang.reflect.ParameterizedType import java.net.URI import java.util.* import java.util.concurrent.TimeUnit @@ -1492,4 +1493,31 @@ fun List.colorRGBToHSV(): FloatArray { fun Activity.getUniqueId(): String { return System.identityHashCode(this).toString() +} + +/** + * 通过反射,获得定义Class时声明的父类的范型参数的类型. + */ +fun Class<*>.getSuperClassGenericType(): Class { + return getSuperClassGenericType(0) +} + +/** + * 通过反射,获得定义Class时声明的父类的范型参数的类型. + * @param index 获取第几个范型参数的类型 + */ +@Suppress("UNCHECKED_CAST") +fun Class<*>.getSuperClassGenericType(index: Int): Class { + var cls: Class<*>? = this + var genType = cls?.genericSuperclass + while (genType !is ParameterizedType) { + cls = cls?.superclass + requireNotNull(cls) + genType = cls.genericSuperclass + } + val params = genType.actualTypeArguments + require(!(index >= params.size || index < 0)) + return if (params[index] !is Class<*>) { + throw IllegalArgumentException() + } else params[index] as Class } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/PermissionHelper.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/PermissionHelper.kt index 7a83808a09..d3ca8346b9 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/PermissionHelper.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/PermissionHelper.kt @@ -342,4 +342,41 @@ object PermissionHelper { } } + /** + * 检查添加到桌面快捷方式权限 + */ + @SuppressLint("CheckResult") + @JvmStatic + fun checkShortcutPermission( + context: FragmentActivity, + onGrantedCallback: EmptyCallback, + onDeniedCallback: EmptyCallback + ) { + tryWithDefaultCatch { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + onGrantedCallback.onCallback() + return + } + val rxPermission = RxPermissions(context) + rxPermission + .requestEachCombined( + Manifest.permission.INSTALL_SHORTCUT, + Manifest.permission.UNINSTALL_SHORTCUT, + ) + .subscribe { permission -> + when { + permission.granted -> { + onGrantedCallback.onCallback() + } + permission.shouldShowRequestPermissionRationale -> { + // do nothing + } + else -> { + onDeniedCallback.onCallback() + } + } + } + } + } + } \ No newline at end of file diff --git a/module_lib/build.gradle b/module_lib/build.gradle index 84042c9450..e05a76fd6f 100644 --- a/module_lib/build.gradle +++ b/module_lib/build.gradle @@ -1,2 +1,3 @@ configurations.maybeCreate("default") -artifacts.add("default", file('quick_login_android_5.9.4.aar')) \ No newline at end of file +artifacts.add("default", file('quick_login_android_5.9.4.aar')) +artifacts.add("default", file('shortcut.aar')) \ No newline at end of file diff --git a/module_lib/shortcut.aar b/module_lib/shortcut.aar new file mode 100644 index 0000000000000000000000000000000000000000..7256765360236fd481fc004dd7a8af0318d18368 GIT binary patch literal 64577 zcmV)mK%T!)O9KQ7000OG0000%0A*yk>n$z-0A?@&00jU508%b=cy#T3TXWnvlJ5KY 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 literal 0 HcmV?d00001 diff --git a/vspace-bridge b/vspace-bridge index 066641c478..b00d19b246 160000 --- a/vspace-bridge +++ b/vspace-bridge @@ -1 +1 @@ -Subproject commit 066641c4787a03366e8d490ac5b43cca4133d499 +Subproject commit b00d19b246fb06894fb840b3e4251dd71959629b