mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-06-01 02:18:46 +02:00
123 lines
4.6 KiB
Kotlin
123 lines
4.6 KiB
Kotlin
/*
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
* Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
|
*/
|
|
|
|
package emu.skyline
|
|
|
|
import android.content.ComponentName
|
|
import android.content.Intent
|
|
import android.content.pm.ShortcutInfo
|
|
import android.content.pm.ShortcutManager
|
|
import android.graphics.drawable.Icon
|
|
import android.os.Bundle
|
|
import android.view.KeyEvent
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.core.graphics.drawable.toBitmap
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
|
import com.google.android.material.snackbar.Snackbar
|
|
import emu.skyline.data.AppItem
|
|
import emu.skyline.databinding.AppDialogBinding
|
|
import emu.skyline.loader.LoaderResult
|
|
import emu.skyline.settings.SettingsActivity
|
|
|
|
/**
|
|
* This dialog is used to show extra game metadata and provide extra options such as pinning the game to the home screen
|
|
*/
|
|
class AppDialog : BottomSheetDialogFragment() {
|
|
companion object {
|
|
/**
|
|
* @param item This is used to hold the [AppItem] between instances
|
|
*/
|
|
fun newInstance(item : AppItem) : AppDialog {
|
|
val args = Bundle()
|
|
args.putSerializable("item", item)
|
|
|
|
val fragment = AppDialog()
|
|
fragment.arguments = args
|
|
return fragment
|
|
}
|
|
}
|
|
|
|
private lateinit var binding : AppDialogBinding
|
|
|
|
private val item by lazy { requireArguments().getSerializable("item")!! as AppItem }
|
|
|
|
/**
|
|
* This inflates the layout of the dialog after initial view creation
|
|
*/
|
|
override fun onCreateView(inflater : LayoutInflater, container : ViewGroup?, savedInstanceState : Bundle?) = AppDialogBinding.inflate(inflater).also { binding = it }.root
|
|
|
|
override fun onViewCreated(view : View, savedInstanceState : Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
// Set the peek height after the root view has been laid out
|
|
view.apply {
|
|
post {
|
|
val behavior = BottomSheetBehavior.from(parent as View)
|
|
behavior.peekHeight = height
|
|
}
|
|
}
|
|
|
|
val missingIcon = ContextCompat.getDrawable(requireActivity(), R.drawable.default_icon)!!.toBitmap(256, 256)
|
|
|
|
binding.gameIcon.setImageBitmap(item.icon ?: missingIcon)
|
|
binding.gameTitle.text = item.title
|
|
binding.gameVersion.text = item.version ?: item.loaderResultString(requireContext())
|
|
binding.gameTitleId.text = item.titleId
|
|
binding.gameAuthor.text = item.author
|
|
|
|
binding.gamePlay.isEnabled = item.loaderResult == LoaderResult.Success
|
|
binding.gamePlay.setOnClickListener {
|
|
startActivity(Intent(activity, EmulationActivity::class.java).apply {
|
|
putExtras(requireArguments())
|
|
})
|
|
}
|
|
|
|
binding.gameSettings.isEnabled = item.loaderResult == LoaderResult.Success
|
|
binding.gameSettings.setOnClickListener {
|
|
startActivity(Intent(activity, SettingsActivity::class.java).apply {
|
|
putExtras(requireArguments())
|
|
})
|
|
}
|
|
|
|
val shortcutManager = requireActivity().getSystemService(ShortcutManager::class.java)
|
|
binding.gamePin.isEnabled = shortcutManager.isRequestPinShortcutSupported
|
|
|
|
binding.gamePin.setOnClickListener {
|
|
val info = ShortcutInfo.Builder(context, item.title)
|
|
info.setShortLabel(item.title)
|
|
info.setActivity(ComponentName(requireContext(), EmulationActivity::class.java))
|
|
info.setIcon(Icon.createWithAdaptiveBitmap(item.icon ?: missingIcon))
|
|
|
|
val intent = Intent(context, EmulationActivity::class.java)
|
|
intent.data = item.uri
|
|
intent.action = Intent.ACTION_VIEW
|
|
|
|
info.setIntent(intent)
|
|
|
|
shortcutManager.requestPinShortcut(info.build(), null)
|
|
}
|
|
|
|
binding.gameTitleId.setOnLongClickListener {
|
|
val clipboard = requireActivity().getSystemService(android.content.Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager
|
|
clipboard.setPrimaryClip(android.content.ClipData.newPlainText("Title ID", item.titleId))
|
|
Snackbar.make(binding.root, getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT).show()
|
|
true
|
|
}
|
|
|
|
dialog?.setOnKeyListener { _, keyCode, event ->
|
|
if (keyCode == KeyEvent.KEYCODE_BUTTON_B && event.action == KeyEvent.ACTION_UP) {
|
|
dialog?.onBackPressed()
|
|
true
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
}
|
|
}
|