Compare commits
11 Commits
android-71
...
android-72
Author | SHA1 | Date | |
---|---|---|---|
32b1f38aa8 | |||
aa6afb0cfe | |||
832a2fcc69 | |||
958bed4545 | |||
0c688b0bf5 | |||
7e2bd395bc | |||
19053ab631 | |||
6481f4e937 | |||
d1deff6b07 | |||
e8aaab2fc1 | |||
21b133de40 |
@ -1,3 +1,11 @@
|
|||||||
|
| Pull Request | Commit | Title | Author | Merged? |
|
||||||
|
|----|----|----|----|----|
|
||||||
|
|
||||||
|
|
||||||
|
End of merge log. You can find the original README.md below the break.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||||
SPDX-License-Identifier: GPL-2.0-or-later
|
SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
@ -307,21 +307,6 @@ object NativeLibrary {
|
|||||||
*/
|
*/
|
||||||
external fun isPaused(): Boolean
|
external fun isPaused(): Boolean
|
||||||
|
|
||||||
/**
|
|
||||||
* Mutes emulation sound
|
|
||||||
*/
|
|
||||||
external fun muteAudio(): Boolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unmutes emulation sound
|
|
||||||
*/
|
|
||||||
external fun unmuteAudio(): Boolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if emulation audio is muted.
|
|
||||||
*/
|
|
||||||
external fun isMuted(): Boolean
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the performance stats for the current game
|
* Returns the performance stats for the current game
|
||||||
*/
|
*/
|
||||||
|
@ -332,7 +332,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
pictureInPictureActions.add(pauseRemoteAction)
|
pictureInPictureActions.add(pauseRemoteAction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NativeLibrary.isMuted()) {
|
if (BooleanSetting.AUDIO_MUTED.boolean) {
|
||||||
val unmuteIcon = Icon.createWithResource(
|
val unmuteIcon = Icon.createWithResource(
|
||||||
this@EmulationActivity,
|
this@EmulationActivity,
|
||||||
R.drawable.ic_pip_unmute
|
R.drawable.ic_pip_unmute
|
||||||
@ -389,9 +389,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation()
|
if (!NativeLibrary.isPaused()) NativeLibrary.pauseEmulation()
|
||||||
}
|
}
|
||||||
if (intent.action == actionUnmute) {
|
if (intent.action == actionUnmute) {
|
||||||
if (NativeLibrary.isMuted()) NativeLibrary.unmuteAudio()
|
if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false)
|
||||||
} else if (intent.action == actionMute) {
|
} else if (intent.action == actionMute) {
|
||||||
if (!NativeLibrary.isMuted()) NativeLibrary.muteAudio()
|
if (!BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(true)
|
||||||
}
|
}
|
||||||
buildPictureInPictureParams()
|
buildPictureInPictureParams()
|
||||||
}
|
}
|
||||||
@ -417,7 +417,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
|||||||
} catch (ignored: Exception) {
|
} catch (ignored: Exception) {
|
||||||
}
|
}
|
||||||
// Always resume audio, since there is no UI button
|
// Always resume audio, since there is no UI button
|
||||||
if (NativeLibrary.isMuted()) NativeLibrary.unmuteAudio()
|
if (BooleanSetting.AUDIO_MUTED.boolean) BooleanSetting.AUDIO_MUTED.setBoolean(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
package org.yuzu.yuzu_emu.adapters
|
package org.yuzu.yuzu_emu.adapters
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.drawable.BitmapDrawable
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.drawable.LayerDrawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
@ -15,7 +16,10 @@ import android.widget.Toast
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.content.pm.ShortcutInfoCompat
|
import androidx.core.content.pm.ShortcutInfoCompat
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import androidx.core.graphics.drawable.IconCompat
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
|
import androidx.core.graphics.drawable.toBitmap
|
||||||
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
@ -87,11 +91,24 @@ class GameAdapter(private val activity: AppCompatActivity) :
|
|||||||
action = Intent.ACTION_VIEW
|
action = Intent.ACTION_VIEW
|
||||||
data = Uri.parse(holder.game.path)
|
data = Uri.parse(holder.game.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val layerDrawable = ResourcesCompat.getDrawable(
|
||||||
|
YuzuApplication.appContext.resources,
|
||||||
|
R.drawable.shortcut,
|
||||||
|
null
|
||||||
|
) as LayerDrawable
|
||||||
|
layerDrawable.setDrawableByLayerId(
|
||||||
|
R.id.shortcut_foreground,
|
||||||
|
GameIconUtils.getGameIcon(holder.game).toDrawable(YuzuApplication.appContext.resources)
|
||||||
|
)
|
||||||
|
val inset = YuzuApplication.appContext.resources
|
||||||
|
.getDimensionPixelSize(R.dimen.icon_inset)
|
||||||
|
layerDrawable.setLayerInset(1, inset, inset, inset, inset)
|
||||||
val shortcut = ShortcutInfoCompat.Builder(YuzuApplication.appContext, holder.game.path)
|
val shortcut = ShortcutInfoCompat.Builder(YuzuApplication.appContext, holder.game.path)
|
||||||
.setShortLabel(holder.game.title)
|
.setShortLabel(holder.game.title)
|
||||||
.setIcon(
|
.setIcon(
|
||||||
IconCompat.createWithBitmap(
|
IconCompat.createWithAdaptiveBitmap(
|
||||||
(holder.binding.imageGameScreen.drawable as BitmapDrawable).bitmap
|
layerDrawable.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.setIntent(openIntent)
|
.setIntent(openIntent)
|
||||||
|
@ -10,6 +10,7 @@ enum class BooleanSetting(
|
|||||||
override val category: Settings.Category,
|
override val category: Settings.Category,
|
||||||
override val androidDefault: Boolean? = null
|
override val androidDefault: Boolean? = null
|
||||||
) : AbstractBooleanSetting {
|
) : AbstractBooleanSetting {
|
||||||
|
AUDIO_MUTED("audio_muted", Settings.Category.Audio),
|
||||||
CPU_DEBUG_MODE("cpu_debug_mode", Settings.Category.Cpu),
|
CPU_DEBUG_MODE("cpu_debug_mode", Settings.Category.Cpu),
|
||||||
FASTMEM("cpuopt_fastmem", Settings.Category.Cpu),
|
FASTMEM("cpuopt_fastmem", Settings.Category.Cpu),
|
||||||
FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives", Settings.Category.Cpu),
|
FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives", Settings.Category.Cpu),
|
||||||
|
@ -6,9 +6,11 @@ package org.yuzu.yuzu_emu.utils
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import androidx.core.graphics.drawable.toBitmap
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.decode.DataSource
|
import coil.decode.DataSource
|
||||||
|
import coil.executeBlocking
|
||||||
import coil.fetch.DrawableResult
|
import coil.fetch.DrawableResult
|
||||||
import coil.fetch.FetchResult
|
import coil.fetch.FetchResult
|
||||||
import coil.fetch.Fetcher
|
import coil.fetch.Fetcher
|
||||||
@ -74,4 +76,13 @@ object GameIconUtils {
|
|||||||
.build()
|
.build()
|
||||||
imageLoader.enqueue(request)
|
imageLoader.enqueue(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getGameIcon(game: Game): Bitmap {
|
||||||
|
val request = ImageRequest.Builder(YuzuApplication.appContext)
|
||||||
|
.data(game)
|
||||||
|
.error(R.drawable.default_icon)
|
||||||
|
.build()
|
||||||
|
return imageLoader.executeBlocking(request)
|
||||||
|
.drawable!!.toBitmap(config = Bitmap.Config.ARGB_8888)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,9 +262,6 @@ public:
|
|||||||
Core::SystemResultStatus InitializeEmulation(const std::string& filepath) {
|
Core::SystemResultStatus InitializeEmulation(const std::string& filepath) {
|
||||||
std::scoped_lock lock(m_mutex);
|
std::scoped_lock lock(m_mutex);
|
||||||
|
|
||||||
// Loads the configuration.
|
|
||||||
Config{};
|
|
||||||
|
|
||||||
// Create the render window.
|
// Create the render window.
|
||||||
m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window,
|
m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window,
|
||||||
m_vulkan_library);
|
m_vulkan_library);
|
||||||
@ -330,12 +327,13 @@ public:
|
|||||||
m_system.ShutdownMainProcess();
|
m_system.ShutdownMainProcess();
|
||||||
m_detached_tasks.WaitForAllTasks();
|
m_detached_tasks.WaitForAllTasks();
|
||||||
m_load_result = Core::SystemResultStatus::ErrorNotInitialized;
|
m_load_result = Core::SystemResultStatus::ErrorNotInitialized;
|
||||||
|
m_window.reset();
|
||||||
|
OnEmulationStopped(Core::SystemResultStatus::Success);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tear down the render window.
|
// Tear down the render window.
|
||||||
m_window.reset();
|
m_window.reset();
|
||||||
|
|
||||||
OnEmulationStopped(m_load_result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PauseEmulation() {
|
void PauseEmulation() {
|
||||||
@ -672,18 +670,6 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass claz
|
|||||||
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_muteAduio(JNIEnv* env, jclass clazz) {
|
|
||||||
Settings::values.audio_muted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_unmuteAudio(JNIEnv* env, jclass clazz) {
|
|
||||||
Settings::values.audio_muted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isMuted(JNIEnv* env, jclass clazz) {
|
|
||||||
return static_cast<jboolean>(Settings::values.audio_muted.GetValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly(JNIEnv* env, jclass clazz) {
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isHandheldOnly(JNIEnv* env, jclass clazz) {
|
||||||
return EmulationSession::GetInstance().IsHandheldOnly();
|
return EmulationSession::GetInstance().IsHandheldOnly();
|
||||||
}
|
}
|
||||||
|
11
src/android/app/src/main/res/drawable/shortcut.xml
Normal file
11
src/android/app/src/main/res/drawable/shortcut.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item>
|
||||||
|
<color android:color="@android:color/white" />
|
||||||
|
</item>
|
||||||
|
<item android:id="@+id/shortcut_foreground">
|
||||||
|
<bitmap android:src="@drawable/default_icon" />
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</layer-list>
|
@ -27,7 +27,7 @@
|
|||||||
app:nullable="true" />
|
app:nullable="true" />
|
||||||
<argument
|
<argument
|
||||||
android:name="menuTag"
|
android:name="menuTag"
|
||||||
app:argType="string" />
|
app:argType="org.yuzu.yuzu_emu.features.settings.model.Settings$MenuTag" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<action
|
<action
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<dimen name="spacing_refresh_end">72dp</dimen>
|
<dimen name="spacing_refresh_end">72dp</dimen>
|
||||||
<dimen name="menu_width">256dp</dimen>
|
<dimen name="menu_width">256dp</dimen>
|
||||||
<dimen name="card_width">165dp</dimen>
|
<dimen name="card_width">165dp</dimen>
|
||||||
|
<dimen name="icon_inset">24dp</dimen>
|
||||||
|
|
||||||
<dimen name="dialog_margin">20dp</dimen>
|
<dimen name="dialog_margin">20dp</dimen>
|
||||||
<dimen name="elevated_app_bar">3dp</dimen>
|
<dimen name="elevated_app_bar">3dp</dimen>
|
||||||
|
Reference in New Issue
Block a user