mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-10-06 00:02:44 +02:00
Compare commits
2 Commits
b6199aea34
...
netplay
Author | SHA1 | Date | |
---|---|---|---|
|
52d4728987 | ||
|
c1401c7ffc |
@@ -4,6 +4,7 @@
|
||||
|
||||
package org.yuzu.yuzu_emu.dialogs
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
@@ -35,6 +36,10 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
private lateinit var chatAdapter: ChatAdapter
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
// TODO(alekpop, crueter): Top drawer for message notifications, perhaps use system notifs?
|
||||
// TODO(alekpop, crueter): Context menu actions for chat users
|
||||
// TODO(alekpop, crueter): Block users (depends on the above)
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = DialogChatBinding.inflate(LayoutInflater.from(context))
|
||||
@@ -47,7 +52,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
|
||||
handler.post {
|
||||
chatAdapter.notifyDataSetChanged()
|
||||
binding.chatRecyclerView.post {
|
||||
@@ -76,6 +80,7 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
|
||||
super.dismiss()
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun sendMessage(message: String) {
|
||||
val username = NetPlayManager.getUsername(context)
|
||||
NetPlayManager.netPlaySendMessage(message)
|
||||
|
@@ -5,15 +5,18 @@ package org.yuzu.yuzu_emu.dialogs
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.Editable
|
||||
import android.text.TextWatcher
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.Button
|
||||
import android.widget.EditText
|
||||
import android.widget.PopupMenu
|
||||
import android.widget.Toast
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -21,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerConnectBinding
|
||||
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerLobbyBinding
|
||||
@@ -28,9 +32,10 @@ import org.yuzu.yuzu_emu.databinding.DialogMultiplayerRoomBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemBanListBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemButtonNetplayBinding
|
||||
import org.yuzu.yuzu_emu.databinding.ItemTextNetplayBinding
|
||||
import org.yuzu.yuzu_emu.utils.CompatUtils
|
||||
import org.yuzu.yuzu_emu.network.NetPlayManager
|
||||
import org.yuzu.yuzu_emu.utils.CompatUtils
|
||||
import org.yuzu.yuzu_emu.utils.GameHelper
|
||||
import java.net.InetAddress
|
||||
|
||||
class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
private lateinit var adapter: NetPlayAdapter
|
||||
@@ -43,7 +48,8 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
behavior.skipCollapsed =
|
||||
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
when {
|
||||
NetPlayManager.netPlayIsJoined() -> DialogMultiplayerLobbyBinding.inflate(layoutInflater)
|
||||
@@ -63,12 +69,14 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
|
||||
refreshAdapterItems()
|
||||
|
||||
btnModeration.visibility = if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
|
||||
btnModeration.visibility =
|
||||
if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
|
||||
btnModeration.setOnClickListener {
|
||||
showModerationDialog()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else -> {
|
||||
DialogMultiplayerConnectBinding.inflate(layoutInflater).apply {
|
||||
setContentView(root)
|
||||
@@ -117,17 +125,21 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Disable context menu for self and if not moderator
|
||||
inner class NetPlayAdapter : RecyclerView.Adapter<NetPlayAdapter.NetPlayViewHolder>() {
|
||||
val netPlayItems = mutableListOf<NetPlayItems>()
|
||||
|
||||
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
|
||||
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
|
||||
View.OnClickListener {
|
||||
init {
|
||||
itemView.setOnClickListener(this)
|
||||
}
|
||||
|
||||
abstract fun bind(item: NetPlayItems)
|
||||
}
|
||||
|
||||
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) : NetPlayViewHolder(binding.root) {
|
||||
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) :
|
||||
NetPlayViewHolder(binding.root) {
|
||||
private lateinit var netPlayItem: NetPlayItems
|
||||
|
||||
override fun onClick(clicked: View) {}
|
||||
@@ -149,7 +161,8 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) : NetPlayViewHolder(binding.root) {
|
||||
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) :
|
||||
NetPlayViewHolder(binding.root) {
|
||||
private lateinit var netPlayItems: NetPlayItems
|
||||
private val isModerator = NetPlayManager.netPlayIsModerator()
|
||||
|
||||
@@ -193,11 +206,35 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
val infos = NetPlayManager.netPlayRoomInfo()
|
||||
if (infos.isNotEmpty()) {
|
||||
val roomInfo = infos[0].split("|")
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_TEXT, roomInfo[0], NetPlayItems.TYPE_TEXT))
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_COUNT, "${infos.size - 1}/${roomInfo[1]}", NetPlayItems.TYPE_TEXT))
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_SEPARATOR, "", NetPlayItems.TYPE_SEPARATOR))
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_TEXT,
|
||||
roomInfo[0],
|
||||
NetPlayItems.TYPE_TEXT
|
||||
)
|
||||
)
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_COUNT,
|
||||
"${infos.size - 1}/${roomInfo[1]}",
|
||||
NetPlayItems.TYPE_TEXT
|
||||
)
|
||||
)
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_SEPARATOR,
|
||||
"",
|
||||
NetPlayItems.TYPE_SEPARATOR
|
||||
)
|
||||
)
|
||||
for (i in 1 until infos.size) {
|
||||
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_MEMBER, infos[i], NetPlayItems.TYPE_BUTTON))
|
||||
netPlayItems.add(
|
||||
NetPlayItems(
|
||||
NetPlayItems.MULTIPLAYER_ROOM_MEMBER,
|
||||
infos[i],
|
||||
NetPlayItems.TYPE_BUTTON
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -207,12 +244,33 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NetPlayViewHolder {
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
return when (viewType) {
|
||||
NetPlayItems.TYPE_TEXT -> TextViewHolder(ItemTextNetplayBinding.inflate(inflater, parent, false))
|
||||
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(ItemButtonNetplayBinding.inflate(inflater, parent, false))
|
||||
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(inflater.inflate(R.layout.item_separator_netplay, parent, false)) {
|
||||
NetPlayItems.TYPE_TEXT -> TextViewHolder(
|
||||
ItemTextNetplayBinding.inflate(
|
||||
inflater,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(
|
||||
ItemButtonNetplayBinding.inflate(
|
||||
inflater,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(
|
||||
inflater.inflate(
|
||||
R.layout.item_separator_netplay,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
) {
|
||||
override fun bind(item: NetPlayItems) {}
|
||||
override fun onClick(clicked: View) {}
|
||||
}
|
||||
|
||||
else -> throw IllegalStateException("Unsupported view type")
|
||||
}
|
||||
}
|
||||
@@ -237,14 +295,54 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
}
|
||||
}
|
||||
|
||||
abstract class TextValidatorWatcher(
|
||||
private val btnConfirm: Button,
|
||||
private val view: EditText,
|
||||
private val errorMessage: String
|
||||
) : TextWatcher {
|
||||
|
||||
companion object {
|
||||
val validStates: HashMap<EditText, Boolean> = hashMapOf()
|
||||
}
|
||||
abstract fun validate(s: String): Boolean
|
||||
|
||||
override fun beforeTextChanged(
|
||||
s: CharSequence?,
|
||||
start: Int,
|
||||
count: Int,
|
||||
after: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun onTextChanged(
|
||||
s: CharSequence?,
|
||||
start: Int,
|
||||
before: Int,
|
||||
count: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
val input = s.toString()
|
||||
val isValid = validate(input)
|
||||
view.error = if (isValid) null else errorMessage
|
||||
|
||||
validStates.put(view, isValid)
|
||||
btnConfirm.isEnabled = !validStates.containsValue(false)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Properly handle getting banned (both during and in future connects)
|
||||
private fun showNetPlayInputDialog(isCreateRoom: Boolean) {
|
||||
val activity = CompatUtils.findActivity(context)
|
||||
val dialog = BottomSheetDialog(activity)
|
||||
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
val validStates: HashMap<EditText, Boolean> = hashMapOf()
|
||||
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||
dialog.behavior.skipCollapsed =
|
||||
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
|
||||
val binding = DialogMultiplayerRoomBinding.inflate(LayoutInflater.from(activity))
|
||||
dialog.setContentView(binding.root)
|
||||
@@ -254,93 +352,177 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
else R.string.multiplayer_join_room
|
||||
)
|
||||
|
||||
binding.ipAddress.setText(
|
||||
if (isCreateRoom) NetPlayManager.getIpAddressByWifi(activity)
|
||||
else NetPlayManager.getRoomAddress(activity)
|
||||
)
|
||||
// setup listeners etc
|
||||
val roomNameWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm, // TODO(alekpop, crueter): Figure out a better way to deal with this?
|
||||
binding.roomName,
|
||||
context.getString(
|
||||
R.string.multiplayer_room_name_error
|
||||
)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.length in 3..20
|
||||
}
|
||||
}
|
||||
|
||||
val preferredWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.dropdownPreferredGameName,
|
||||
context.getString(R.string.multiplayer_required)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.isNotEmpty()
|
||||
}
|
||||
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
super.afterTextChanged(s)
|
||||
|
||||
// special case: remove dropdown arrow
|
||||
val input = s.toString()
|
||||
binding.preferredGameName.isEndIconVisible = validate(input)
|
||||
}
|
||||
}
|
||||
|
||||
val ipWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.ipAddress,
|
||||
context.getString(R.string.multiplayer_ip_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return try {
|
||||
InetAddress.getByName(s)
|
||||
s.length >= 7
|
||||
} catch (_: Exception) {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val usernameWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.username,
|
||||
context.getString(R.string.multiplayer_username_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.length >= 5
|
||||
}
|
||||
}
|
||||
|
||||
val portWatcher = object : TextValidatorWatcher(
|
||||
binding.btnConfirm,
|
||||
binding.ipPort,
|
||||
context.getString(R.string.multiplayer_port_error)
|
||||
) {
|
||||
override fun validate(s: String): Boolean {
|
||||
return s.toIntOrNull() in 1..65535
|
||||
}
|
||||
}
|
||||
|
||||
if (isCreateRoom) {
|
||||
binding.roomName.addTextChangedListener(roomNameWatcher)
|
||||
binding.dropdownPreferredGameName.addTextChangedListener(preferredWatcher)
|
||||
|
||||
binding.dropdownPreferredGameName.apply {
|
||||
setAdapter(
|
||||
ArrayAdapter(
|
||||
activity,
|
||||
R.layout.dropdown_item,
|
||||
gameNameList.map { it[0] }
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
binding.ipAddress.addTextChangedListener(ipWatcher)
|
||||
binding.ipPort.addTextChangedListener(portWatcher)
|
||||
binding.username.addTextChangedListener(usernameWatcher)
|
||||
|
||||
binding.ipPort.setText(NetPlayManager.getRoomPort(activity))
|
||||
binding.username.setText(NetPlayManager.getUsername(activity))
|
||||
|
||||
binding.dropdownPreferredGameName.apply {
|
||||
setAdapter(
|
||||
ArrayAdapter(
|
||||
activity,
|
||||
R.layout.dropdown_item,
|
||||
gameNameList.map { it[0] }
|
||||
)
|
||||
)
|
||||
// manually trigger text listeners
|
||||
if (isCreateRoom) {
|
||||
roomNameWatcher.afterTextChanged(binding.roomName.text)
|
||||
preferredWatcher.afterTextChanged(binding.dropdownPreferredGameName.text)
|
||||
}
|
||||
|
||||
ipWatcher.afterTextChanged(binding.ipAddress.text)
|
||||
portWatcher.afterTextChanged(binding.ipPort.text)
|
||||
usernameWatcher.afterTextChanged(binding.username.text)
|
||||
|
||||
binding.preferredGameName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.roomName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersContainer.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
|
||||
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, binding.maxPlayers.value.toInt())
|
||||
binding.maxPlayersLabel.text = context.getString(
|
||||
R.string.multiplayer_max_players_value,
|
||||
binding.maxPlayers.value.toInt()
|
||||
)
|
||||
|
||||
binding.maxPlayers.addOnChangeListener { _, value, _ ->
|
||||
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, value.toInt())
|
||||
binding.maxPlayersLabel.text =
|
||||
context.getString(R.string.multiplayer_max_players_value, value.toInt())
|
||||
}
|
||||
|
||||
// TODO(alekpop, crueter): Room descriptions
|
||||
// TODO(alekpop, crueter): Public room creation
|
||||
// TODO(alekpop, crueter): Preview preferred games
|
||||
binding.btnConfirm.setOnClickListener {
|
||||
binding.btnConfirm.isEnabled = false
|
||||
binding.btnConfirm.text = activity.getString(R.string.disabled_button_text)
|
||||
binding.btnConfirm.text =
|
||||
activity.getString(
|
||||
if (isCreateRoom) R.string.multiplayer_creating
|
||||
else R.string.multiplayer_joining
|
||||
)
|
||||
|
||||
// We don't need to worry about validation because it's already been done.
|
||||
val ipAddress = binding.ipAddress.text.toString()
|
||||
val username = binding.username.text.toString()
|
||||
val portStr = binding.ipPort.text.toString()
|
||||
val preferredGameName = binding.dropdownPreferredGameName.text.toString()
|
||||
val preferredGameId = gameIdList[gameNameList.indexOfFirst { it[0] == preferredGameName }][0]
|
||||
val password = binding.password.text.toString()
|
||||
val port = portStr.toIntOrNull() ?: run {
|
||||
Toast.makeText(activity, R.string.multiplayer_port_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
return@setOnClickListener
|
||||
}
|
||||
val port = portStr.toInt()
|
||||
val roomName = binding.roomName.text.toString()
|
||||
val maxPlayers = binding.maxPlayers.value.toInt()
|
||||
|
||||
if (isCreateRoom && (roomName.length !in 3..20)) {
|
||||
Toast.makeText(activity, R.string.multiplayer_room_name_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
return@setOnClickListener
|
||||
}
|
||||
val preferredGameName = binding.dropdownPreferredGameName.text.toString()
|
||||
val preferredIdx = gameNameList.indexOfFirst { it[0] == preferredGameName }
|
||||
val preferredGameId = if (preferredIdx == -1) 0 else gameIdList[preferredIdx][0]
|
||||
|
||||
if (isCreateRoom && preferredGameName.isEmpty()) {
|
||||
Toast.makeText(activity, R.string.multiplayer_preferred_game_name_invalid, Toast.LENGTH_LONG).show();
|
||||
binding.btnConfirm.isEnabled = false
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
return@setOnClickListener
|
||||
}
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
val result = if (isCreateRoom) {
|
||||
NetPlayManager.netPlayCreateRoom(
|
||||
ipAddress,
|
||||
port,
|
||||
username,
|
||||
preferredGameName,
|
||||
preferredGameId,
|
||||
password,
|
||||
roomName,
|
||||
maxPlayers
|
||||
)
|
||||
} else {
|
||||
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
|
||||
}
|
||||
|
||||
if (ipAddress.length < 7 || username.length < 5) {
|
||||
Toast.makeText(activity, R.string.multiplayer_input_invalid, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
} else {
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
val result = if (isCreateRoom) {
|
||||
NetPlayManager.netPlayCreateRoom(ipAddress, port, username, preferredGameName, preferredGameId, password, roomName, maxPlayers)
|
||||
} else {
|
||||
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
|
||||
}
|
||||
|
||||
if (result == 0) {
|
||||
NetPlayManager.setUsername(activity, username)
|
||||
NetPlayManager.setRoomPort(activity, portStr)
|
||||
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
|
||||
Toast.makeText(
|
||||
YuzuApplication.appContext,
|
||||
if (isCreateRoom) R.string.multiplayer_create_room_success
|
||||
else R.string.multiplayer_join_room_success,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
dialog.dismiss()
|
||||
} else {
|
||||
Toast.makeText(activity, R.string.multiplayer_could_not_connect, Toast.LENGTH_LONG).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
|
||||
}
|
||||
if (result == 0) {
|
||||
// TODO(alekpop, crueter): These need to be moved as settings, editable in a tab
|
||||
NetPlayManager.setUsername(activity, username)
|
||||
NetPlayManager.setRoomPort(activity, portStr)
|
||||
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
|
||||
Toast.makeText(
|
||||
YuzuApplication.appContext,
|
||||
if (isCreateRoom) R.string.multiplayer_create_room_success
|
||||
else R.string.multiplayer_join_room_success,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
dialog.dismiss()
|
||||
} else {
|
||||
Toast.makeText(
|
||||
activity,
|
||||
R.string.multiplayer_could_not_connect,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
binding.btnConfirm.isEnabled = true
|
||||
binding.btnConfirm.text = activity.getString(R.string.ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -399,13 +581,15 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val binding = ItemBanListBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false)
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)
|
||||
return ViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val isUsername = position < usernameBans.size
|
||||
val item = if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
|
||||
val item =
|
||||
if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
|
||||
|
||||
holder.binding.apply {
|
||||
banText.text = item
|
||||
|
@@ -8,7 +8,10 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||
enum class StringSetting(override val key: String) : AbstractStringSetting {
|
||||
DRIVER_PATH("driver_path"),
|
||||
DEVICE_NAME("device_name"),
|
||||
|
||||
// TODO(crueter, alekpop): Netplay/settings needs to be properly worked into settings
|
||||
WEB_TOKEN("yuzu_token"),
|
||||
WEB_USERNAME("yuzu_username"),
|
||||
;
|
||||
|
||||
override fun getString(needsGlobal: Boolean): String = NativeConfig.getString(key, needsGlobal)
|
||||
|
@@ -7,15 +7,13 @@ import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.wifi.WifiManager
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.format.Formatter
|
||||
import android.widget.Toast
|
||||
import androidx.preference.PreferenceManager
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.YuzuApplication
|
||||
import org.yuzu.yuzu_emu.dialogs.ChatMessage
|
||||
import java.net.Inet4Address
|
||||
|
||||
@@ -213,6 +211,7 @@ object NetPlayManager {
|
||||
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
if (!isChatOpen) {
|
||||
// TODO(alekpop, crueter): Improve this, potentially a drawer at the top?
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
@@ -71,7 +71,8 @@
|
||||
android:id="@+id/dropdown_preferred_game_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="none" />
|
||||
android:inputType="none"
|
||||
/>
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
|
@@ -145,7 +145,6 @@
|
||||
<string name="multiplayer_join_room_success">تم الانضمام!</string>
|
||||
<string name="multiplayer_create_room_failed">فشل الإنشاء!</string>
|
||||
<string name="multiplayer_join_room_failed">فشل الانضمام!</string>
|
||||
<string name="multiplayer_input_invalid">عنوان أو اسم غير صالح!</string>
|
||||
<string name="multiplayer_port_invalid">منفذ غير صالح!</string>
|
||||
<string name="multiplayer_exit_room">مغادرة الغرفة</string>
|
||||
<string name="multiplayer_network_error">خطأ في الشبكة</string>
|
||||
@@ -177,8 +176,7 @@
|
||||
<string name="multiplayer_kick_member">طرد</string>
|
||||
<string name="multiplayer_chat_input_hint">إرسال رسالة...</string>
|
||||
<string name="multiplayer_password">كلمة المرور</string>
|
||||
<string name="original_button_text">انضمام</string>
|
||||
<string name="disabled_button_text">جاري الانضمام...</string>
|
||||
<string name="multiplayer_joining">جاري الانضمام...</string>
|
||||
<string name="multiplayer_room_name">اسم الغرفة</string>
|
||||
<string name="multiplayer_room_name_invalid">الاسم يجب أن يكون بين 3 و20 حرفاً</string>
|
||||
<string name="multiplayer_max_players">الحد الأقصى (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">بە سەرکەوتوویی بەشداریکرا!</string>
|
||||
<string name="multiplayer_create_room_failed">دروستکردنی ژوور شکستی هێنا!</string>
|
||||
<string name="multiplayer_join_room_failed">بەشداریکردن شکستی هێنا!</string>
|
||||
<string name="multiplayer_input_invalid">ناونیشانی نادروست یان ناو زۆر کورتە!</string>
|
||||
<string name="multiplayer_port_invalid">پۆرتی نادروست!</string>
|
||||
<string name="multiplayer_exit_room">دەرچوون لە ژوور</string>
|
||||
<string name="multiplayer_network_error">هەڵەی تۆڕ</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">لابردن</string>
|
||||
<string name="multiplayer_chat_input_hint">ناردنی نامە...</string>
|
||||
<string name="multiplayer_password">تێپەڕەوشە</string>
|
||||
<string name="original_button_text">بەشداریکردن</string>
|
||||
<string name="disabled_button_text">لە پڕۆسەی بەشداریکردن...</string>
|
||||
<string name="multiplayer_joining">لە پڕۆسەی بەشداریکردن...</string>
|
||||
<string name="multiplayer_room_name">ناوی ژوور</string>
|
||||
<string name="multiplayer_room_name_invalid">ناوی ژوور دەبێت لەنێوان ٣ بۆ ٢٠ پیت بێت</string>
|
||||
<string name="multiplayer_max_players">زۆرترین یاریکەر (١٦)</string>
|
||||
|
@@ -140,7 +140,6 @@
|
||||
<string name="multiplayer_join_room_success">Úspěšné připojení</string>
|
||||
<string name="multiplayer_create_room_failed">Chyba při vytváření</string>
|
||||
<string name="multiplayer_join_room_failed">Chyba při připojování</string>
|
||||
<string name="multiplayer_input_invalid">Neplatná adresa nebo jméno</string>
|
||||
<string name="multiplayer_port_invalid">Neplatný port</string>
|
||||
<string name="multiplayer_exit_room">Opustit místnost</string>
|
||||
<string name="multiplayer_network_error">Chyba sítě</string>
|
||||
@@ -172,8 +171,7 @@
|
||||
<string name="multiplayer_kick_member">Vyhodit</string>
|
||||
<string name="multiplayer_chat_input_hint">Zpráva…</string>
|
||||
<string name="multiplayer_password">Heslo</string>
|
||||
<string name="original_button_text">Připojit</string>
|
||||
<string name="disabled_button_text">Připojování…</string>
|
||||
<string name="multiplayer_joining">Připojování…</string>
|
||||
<string name="multiplayer_room_name">Název místnosti</string>
|
||||
<string name="multiplayer_room_name_invalid">Název musí mít 3-20 znaků</string>
|
||||
<string name="multiplayer_max_players">Max hráčů (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Beitritt erfolgreich</string>
|
||||
<string name="multiplayer_create_room_failed">Fehler beim Erstellen</string>
|
||||
<string name="multiplayer_join_room_failed">Fehler beim Beitreten</string>
|
||||
<string name="multiplayer_input_invalid">Ungültige Eingabe</string>
|
||||
<string name="multiplayer_port_invalid">Ungültiger Port</string>
|
||||
<string name="multiplayer_exit_room">Raum verlassen</string>
|
||||
<string name="multiplayer_network_error">Netzwerkfehler</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Kicken</string>
|
||||
<string name="multiplayer_chat_input_hint">Nachricht senden…</string>
|
||||
<string name="multiplayer_password">Passwort</string>
|
||||
<string name="original_button_text">Beitreten</string>
|
||||
<string name="disabled_button_text">Beitritt läuft…</string>
|
||||
<string name="multiplayer_joining">Beitritt läuft…</string>
|
||||
<string name="multiplayer_room_name">Raumname</string>
|
||||
<string name="multiplayer_room_name_invalid">Name: 3-20 Zeichen</string>
|
||||
<string name="multiplayer_max_players">Max Spieler (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Unido a sala</string>
|
||||
<string name="multiplayer_create_room_failed">Error al crear sala</string>
|
||||
<string name="multiplayer_join_room_failed">Error al unirse</string>
|
||||
<string name="multiplayer_input_invalid">Dirección o nombre inválido</string>
|
||||
<string name="multiplayer_port_invalid">Puerto inválido</string>
|
||||
<string name="multiplayer_exit_room">Salir</string>
|
||||
<string name="multiplayer_network_error">Error de red</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Expulsar</string>
|
||||
<string name="multiplayer_chat_input_hint">Enviar mensaje...</string>
|
||||
<string name="multiplayer_password">Contraseña</string>
|
||||
<string name="original_button_text">Unirse</string>
|
||||
<string name="disabled_button_text">Uniéndose...</string>
|
||||
<string name="multiplayer_joining">Uniéndose...</string>
|
||||
<string name="multiplayer_room_name">Nombre de sala</string>
|
||||
<string name="multiplayer_room_name_invalid">Nombre inválido (3-20 caracteres)</string>
|
||||
<string name="multiplayer_max_players">Máx. jugadores (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">با موفقیت به اتاق پیوستید!</string>
|
||||
<string name="multiplayer_create_room_failed">ایجاد اتاق ناموفق بود!</string>
|
||||
<string name="multiplayer_join_room_failed">پیوستن به اتاق ناموفق بود!</string>
|
||||
<string name="multiplayer_input_invalid">آدرس نامعتبر یا نام کوتاه است!</string>
|
||||
<string name="multiplayer_port_invalid">پورت نامعتبر است!</string>
|
||||
<string name="multiplayer_exit_room">خروج از اتاق</string>
|
||||
<string name="multiplayer_network_error">خطای شبکه</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">اخراج</string>
|
||||
<string name="multiplayer_chat_input_hint">ارسال پیام...</string>
|
||||
<string name="multiplayer_password">رمز عبور</string>
|
||||
<string name="original_button_text">پیوستن</string>
|
||||
<string name="disabled_button_text">در حال پیوستن...</string>
|
||||
<string name="multiplayer_joining">در حال پیوستن...</string>
|
||||
<string name="multiplayer_room_name">نام اتاق</string>
|
||||
<string name="multiplayer_room_name_invalid">نام اتاق باید بین 3 تا 20 کاراکتر باشد</string>
|
||||
<string name="multiplayer_max_players">حداکثر بازیکنان (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Rejoint</string>
|
||||
<string name="multiplayer_create_room_failed">Échec création</string>
|
||||
<string name="multiplayer_join_room_failed">Échec connexion</string>
|
||||
<string name="multiplayer_input_invalid">IP/nom invalide</string>
|
||||
<string name="multiplayer_port_invalid">Port invalide</string>
|
||||
<string name="multiplayer_exit_room">Quitter</string>
|
||||
<string name="multiplayer_network_error">Erreur réseau</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Expulser</string>
|
||||
<string name="multiplayer_chat_input_hint">Message...</string>
|
||||
<string name="multiplayer_password">Mot de passe</string>
|
||||
<string name="original_button_text">Rejoindre</string>
|
||||
<string name="disabled_button_text">Connexion...</string>
|
||||
<string name="multiplayer_joining">Connexion...</string>
|
||||
<string name="multiplayer_room_name">Nom salon</string>
|
||||
<string name="multiplayer_room_name_invalid">Nom invalide (3-20 caractères)</string>
|
||||
<string name="multiplayer_max_players">Joueurs max (16)</string>
|
||||
|
@@ -142,7 +142,6 @@
|
||||
<string name="multiplayer_join_room_success">הצטרפת לחדר בהצלחה!</string>
|
||||
<string name="multiplayer_create_room_failed">יצירת חדר נכשלה!</string>
|
||||
<string name="multiplayer_join_room_failed">הצטרפות לחדר נכשלה!</string>
|
||||
<string name="multiplayer_input_invalid">כתובת לא תקינה או שם קצר מדי!</string>
|
||||
<string name="multiplayer_port_invalid">פורט לא תקין!</string>
|
||||
<string name="multiplayer_exit_room">צא מהחדר</string>
|
||||
<string name="multiplayer_network_error">שגיאת רשת</string>
|
||||
@@ -174,8 +173,7 @@
|
||||
<string name="multiplayer_kick_member">הסר משתמש</string>
|
||||
<string name="multiplayer_chat_input_hint">שלח הודעה...</string>
|
||||
<string name="multiplayer_password">סיסמה</string>
|
||||
<string name="original_button_text">הצטרף</string>
|
||||
<string name="disabled_button_text">מצטרף...</string>
|
||||
<string name="multiplayer_joining">מצטרף...</string>
|
||||
<string name="multiplayer_room_name">שם חדר</string>
|
||||
<string name="multiplayer_room_name_invalid">שם חדר חייב להיות בין 3-20 תווים</string>
|
||||
<string name="multiplayer_max_players">משתמשים מרביים (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Sikeres csatlakozás</string>
|
||||
<string name="multiplayer_create_room_failed">Szoba létrehozása sikertelen</string>
|
||||
<string name="multiplayer_join_room_failed">Csatlakozás sikertelen</string>
|
||||
<string name="multiplayer_input_invalid">Érvénytelen cím vagy név</string>
|
||||
<string name="multiplayer_port_invalid">Érvénytelen port</string>
|
||||
<string name="multiplayer_exit_room">Kilépés</string>
|
||||
<string name="multiplayer_network_error">Hálózati hiba</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Kirúgás</string>
|
||||
<string name="multiplayer_chat_input_hint">Üzenet küldése…</string>
|
||||
<string name="multiplayer_password">Jelszó</string>
|
||||
<string name="original_button_text">Csatlakozás</string>
|
||||
<string name="disabled_button_text">Csatlakozás…</string>
|
||||
<string name="multiplayer_joining">Csatlakozás…</string>
|
||||
<string name="multiplayer_room_name">Szoba név</string>
|
||||
<string name="multiplayer_room_name_invalid">A szoba neve 3-20 karakter hosszú legyen</string>
|
||||
<string name="multiplayer_max_players">Max játékosok (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Berhasil bergabung dengan ruang!</string>
|
||||
<string name="multiplayer_create_room_failed">Gagal membuat ruang!</string>
|
||||
<string name="multiplayer_join_room_failed">Gagal bergabung dengan ruang!</string>
|
||||
<string name="multiplayer_input_invalid">Alamat tidak valid atau nama terlalu pendek!</string>
|
||||
<string name="multiplayer_port_invalid">Port tidak valid!</string>
|
||||
<string name="multiplayer_exit_room">Keluar Ruang</string>
|
||||
<string name="multiplayer_network_error">Error jaringan</string>
|
||||
@@ -171,10 +170,9 @@
|
||||
<string name="multiplayer_member_banned">%1$s dilarang</string>
|
||||
<string name="multiplayer_address_unbanned">Alamat diizinkan</string>
|
||||
<string name="multiplayer_kick_member">Kick Anggota</string>
|
||||
<string name="multiplayer_chat_input_hint">Kirim pesan……</string>
|
||||
<string name="multiplayer_chat_input_hint">Kirim pesan…</string>
|
||||
<string name="multiplayer_password">Password</string>
|
||||
<string name="original_button_text">Gabung</string>
|
||||
<string name="disabled_button_text">Bergabung...</string>
|
||||
<string name="multiplayer_joining">Bergabung...</string>
|
||||
<string name="multiplayer_room_name">Nama Ruang</string>
|
||||
<string name="multiplayer_room_name_invalid">Nama ruang harus antara 3 dan 20 karakter</string>
|
||||
<string name="multiplayer_max_players">Maks Pemain (16)</string>
|
||||
@@ -184,7 +182,7 @@
|
||||
<string name="multiplayer_ip_copied">Alamat IP disalin ke clipboard</string>
|
||||
<string name="multiplayer_server_address">Alamat Server</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Ketik pesan……</string>
|
||||
<string name="type_message">Ketik pesan…</string>
|
||||
<string name="send">Kirim</string>
|
||||
<string name="send_message">Kirim Pesan</string>
|
||||
<string name="multiplayer_moderation">Moderasi</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Unito alla stanza</string>
|
||||
<string name="multiplayer_create_room_failed">Errore creazione stanza</string>
|
||||
<string name="multiplayer_join_room_failed">Errore unione</string>
|
||||
<string name="multiplayer_input_invalid">Indirizzo o nome non valido</string>
|
||||
<string name="multiplayer_port_invalid">Porta non valida</string>
|
||||
<string name="multiplayer_exit_room">Esci</string>
|
||||
<string name="multiplayer_network_error">Errore rete</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Kick</string>
|
||||
<string name="multiplayer_chat_input_hint">Messaggio…</string>
|
||||
<string name="multiplayer_password">Password</string>
|
||||
<string name="original_button_text">Unisciti</string>
|
||||
<string name="disabled_button_text">Unione in corso…</string>
|
||||
<string name="multiplayer_joining">Unione in corso…</string>
|
||||
<string name="multiplayer_room_name">Nome stanza</string>
|
||||
<string name="multiplayer_room_name_invalid">Nome tra 3-20 caratteri</string>
|
||||
<string name="multiplayer_max_players">Max giocatori (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">参加成功</string>
|
||||
<string name="multiplayer_create_room_failed">ルーム作成失敗</string>
|
||||
<string name="multiplayer_join_room_failed">参加失敗</string>
|
||||
<string name="multiplayer_input_invalid">無効な入力</string>
|
||||
<string name="multiplayer_port_invalid">無効なポート</string>
|
||||
<string name="multiplayer_exit_room">退出</string>
|
||||
<string name="multiplayer_network_error">ネットワークエラー</string>
|
||||
@@ -171,10 +170,9 @@
|
||||
<string name="multiplayer_member_banned">%1$sをBAN</string>
|
||||
<string name="multiplayer_address_unbanned">BAN解除</string>
|
||||
<string name="multiplayer_kick_member">キック</string>
|
||||
<string name="multiplayer_chat_input_hint">メッセージを送信……</string>
|
||||
<string name="multiplayer_chat_input_hint">メッセージを送信…</string>
|
||||
<string name="multiplayer_password">パスワード</string>
|
||||
<string name="original_button_text">参加</string>
|
||||
<string name="disabled_button_text">参加中...</string>
|
||||
<string name="multiplayer_joining">参加中...</string>
|
||||
<string name="multiplayer_room_name">ルーム名</string>
|
||||
<string name="multiplayer_room_name_invalid">ルーム名は3-20文字</string>
|
||||
<string name="multiplayer_max_players">最大人数 (16)</string>
|
||||
@@ -184,7 +182,7 @@
|
||||
<string name="multiplayer_ip_copied">IPコピー済み</string>
|
||||
<string name="multiplayer_server_address">サーバーアドレス</string>
|
||||
<string name="chat">チャット</string>
|
||||
<string name="type_message">メッセージ入力……</string>
|
||||
<string name="type_message">メッセージ入力…</string>
|
||||
<string name="send">送信</string>
|
||||
<string name="send_message">メッセージ送信</string>
|
||||
<string name="multiplayer_moderation">管理</string>
|
||||
|
@@ -140,7 +140,6 @@
|
||||
<string name="multiplayer_join_room_success">참여 성공</string>
|
||||
<string name="multiplayer_create_room_failed">방 생성 실패</string>
|
||||
<string name="multiplayer_join_room_failed">참여 실패</string>
|
||||
<string name="multiplayer_input_invalid">잘못된 주소 또는 이름</string>
|
||||
<string name="multiplayer_port_invalid">잘못된 포트</string>
|
||||
<string name="multiplayer_exit_room">방 나가기</string>
|
||||
<string name="multiplayer_network_error">네트워크 오류</string>
|
||||
@@ -172,8 +171,7 @@
|
||||
<string name="multiplayer_kick_member">추방</string>
|
||||
<string name="multiplayer_chat_input_hint">메시지 입력...</string>
|
||||
<string name="multiplayer_password">비밀번호</string>
|
||||
<string name="original_button_text">참여</string>
|
||||
<string name="disabled_button_text">참여 중...</string>
|
||||
<string name="multiplayer_joining">참여 중...</string>
|
||||
<string name="multiplayer_room_name">방 이름</string>
|
||||
<string name="multiplayer_room_name_invalid">방 이름(3-20자)</string>
|
||||
<string name="multiplayer_max_players">최대 인원 (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Ble med i rom</string>
|
||||
<string name="multiplayer_create_room_failed">Kunne ikke opprette rom</string>
|
||||
<string name="multiplayer_join_room_failed">Kunne ikke bli med</string>
|
||||
<string name="multiplayer_input_invalid">Ugyldig adresse eller navn</string>
|
||||
<string name="multiplayer_port_invalid">Ugyldig port</string>
|
||||
<string name="multiplayer_exit_room">Forlat rom</string>
|
||||
<string name="multiplayer_network_error">Nettverksfeil</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Spark ut</string>
|
||||
<string name="multiplayer_chat_input_hint">Send melding...</string>
|
||||
<string name="multiplayer_password">Passord</string>
|
||||
<string name="original_button_text">Bli med</string>
|
||||
<string name="disabled_button_text">Blir med...</string>
|
||||
<string name="multiplayer_joining">Blir med...</string>
|
||||
<string name="multiplayer_room_name">Romnavn</string>
|
||||
<string name="multiplayer_room_name_invalid">Romnavn må være 3-20 tegn</string>
|
||||
<string name="multiplayer_max_players">Maks spillere (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Dołączono do pokoju!</string>
|
||||
<string name="multiplayer_create_room_failed">Błąd tworzenia pokoju!</string>
|
||||
<string name="multiplayer_join_room_failed">Błąd dołączania do pokoju!</string>
|
||||
<string name="multiplayer_input_invalid">Nieprawidłowy adres lub nazwa!</string>
|
||||
<string name="multiplayer_port_invalid">Nieprawidłowy port!</string>
|
||||
<string name="multiplayer_exit_room">Opuść pokój</string>
|
||||
<string name="multiplayer_network_error">Błąd sieci</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Wyrzuć</string>
|
||||
<string name="multiplayer_chat_input_hint">Wyślij wiadomość…</string>
|
||||
<string name="multiplayer_password">Hasło</string>
|
||||
<string name="original_button_text">Dołącz</string>
|
||||
<string name="disabled_button_text">Dołączanie…</string>
|
||||
<string name="multiplayer_joining">Dołączanie…</string>
|
||||
<string name="multiplayer_room_name">Nazwa pokoju</string>
|
||||
<string name="multiplayer_room_name_invalid">Nazwa pokoju musi mieć 3-20 znaków</string>
|
||||
<string name="multiplayer_max_players">Maks. graczy (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Entrou na sala</string>
|
||||
<string name="multiplayer_create_room_failed">Falha ao criar sala</string>
|
||||
<string name="multiplayer_join_room_failed">Falha ao entrar</string>
|
||||
<string name="multiplayer_input_invalid">Endereço ou nome inválido</string>
|
||||
<string name="multiplayer_port_invalid">Porta inválida</string>
|
||||
<string name="multiplayer_exit_room">Sair da sala</string>
|
||||
<string name="multiplayer_network_error">Erro de rede</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Remover</string>
|
||||
<string name="multiplayer_chat_input_hint">Enviar mensagem...</string>
|
||||
<string name="multiplayer_password">Senha</string>
|
||||
<string name="original_button_text">Entrar</string>
|
||||
<string name="disabled_button_text">Entrando...</string>
|
||||
<string name="multiplayer_joining">Entrando...</string>
|
||||
<string name="multiplayer_room_name">Nome da sala</string>
|
||||
<string name="multiplayer_room_name_invalid">Nome deve ter 3 a 20 caracteres</string>
|
||||
<string name="multiplayer_max_players">Máx. jogadores (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Entrou na sala.</string>
|
||||
<string name="multiplayer_create_room_failed">Falha ao criar.</string>
|
||||
<string name="multiplayer_join_room_failed">Falha ao entrar.</string>
|
||||
<string name="multiplayer_input_invalid">IP/nome inválido.</string>
|
||||
<string name="multiplayer_port_invalid">Porta inválida.</string>
|
||||
<string name="multiplayer_exit_room">Sair</string>
|
||||
<string name="multiplayer_network_error">Erro de rede.</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Expulsar</string>
|
||||
<string name="multiplayer_chat_input_hint">Mensagem...</string>
|
||||
<string name="multiplayer_password">Senha</string>
|
||||
<string name="original_button_text">Entrar</string>
|
||||
<string name="disabled_button_text">Entrando...</string>
|
||||
<string name="multiplayer_joining">Entrando...</string>
|
||||
<string name="multiplayer_room_name">Nome da Sala</string>
|
||||
<string name="multiplayer_room_name_invalid">Nome inválido (3-20 caracteres).</string>
|
||||
<string name="multiplayer_max_players">Máx. Jogadores (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Подключение успешно</string>
|
||||
<string name="multiplayer_create_room_failed">Ошибка создания</string>
|
||||
<string name="multiplayer_join_room_failed">Ошибка подключения</string>
|
||||
<string name="multiplayer_input_invalid">Неверный адрес или имя</string>
|
||||
<string name="multiplayer_port_invalid">Неверный порт</string>
|
||||
<string name="multiplayer_exit_room">Выйти</string>
|
||||
<string name="multiplayer_network_error">Ошибка сети</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Кикнуть</string>
|
||||
<string name="multiplayer_chat_input_hint">Сообщение...</string>
|
||||
<string name="multiplayer_password">Пароль</string>
|
||||
<string name="original_button_text">Подключиться</string>
|
||||
<string name="disabled_button_text">Подключение...</string>
|
||||
<string name="multiplayer_joining">Подключение...</string>
|
||||
<string name="multiplayer_room_name">Название комнаты</string>
|
||||
<string name="multiplayer_room_name_invalid">Название: 3-20 символов</string>
|
||||
<string name="multiplayer_max_players">Макс. игроков (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Приєднано до кімнати</string>
|
||||
<string name="multiplayer_create_room_failed">Помилка створення</string>
|
||||
<string name="multiplayer_join_room_failed">Помилка приєднання</string>
|
||||
<string name="multiplayer_input_invalid">Невірні дані</string>
|
||||
<string name="multiplayer_port_invalid">Невірний порт</string>
|
||||
<string name="multiplayer_exit_room">Вийти</string>
|
||||
<string name="multiplayer_network_error">Помилка мережі</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Вигнати</string>
|
||||
<string name="multiplayer_chat_input_hint">Повідомлення...</string>
|
||||
<string name="multiplayer_password">Пароль</string>
|
||||
<string name="original_button_text">Приєднатися</string>
|
||||
<string name="disabled_button_text">Приєднання...</string>
|
||||
<string name="multiplayer_joining">Приєднання...</string>
|
||||
<string name="multiplayer_room_name">Назва кімнати</string>
|
||||
<string name="multiplayer_room_name_invalid">Невірна назва</string>
|
||||
<string name="multiplayer_max_players">Макс. гравців (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">Tham gia phòng thành công!</string>
|
||||
<string name="multiplayer_create_room_failed">Lỗi tạo phòng!</string>
|
||||
<string name="multiplayer_join_room_failed">Lỗi tham gia phòng!</string>
|
||||
<string name="multiplayer_input_invalid">Địa chỉ hoặc tên không hợp lệ!</string>
|
||||
<string name="multiplayer_port_invalid">Cổng không hợp lệ!</string>
|
||||
<string name="multiplayer_exit_room">Thoát phòng</string>
|
||||
<string name="multiplayer_network_error">Lỗi mạng</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">Đá thành viên</string>
|
||||
<string name="multiplayer_chat_input_hint">Nhập tin nhắn...</string>
|
||||
<string name="multiplayer_password">Mật khẩu</string>
|
||||
<string name="original_button_text">Tham gia</string>
|
||||
<string name="disabled_button_text">Đang tham gia...</string>
|
||||
<string name="multiplayer_joining">Đang tham gia...</string>
|
||||
<string name="multiplayer_room_name">Tên phòng</string>
|
||||
<string name="multiplayer_room_name_invalid">Tên phòng từ 3-20 ký tự</string>
|
||||
<string name="multiplayer_max_players">Tối đa (16)</string>
|
||||
|
@@ -141,7 +141,6 @@
|
||||
<string name="multiplayer_join_room_success">加入成功</string>
|
||||
<string name="multiplayer_create_room_failed">创建失败</string>
|
||||
<string name="multiplayer_join_room_failed">加入失败</string>
|
||||
<string name="multiplayer_input_invalid">地址无效或名称过短</string>
|
||||
<string name="multiplayer_port_invalid">端口无效</string>
|
||||
<string name="multiplayer_exit_room">退出房间</string>
|
||||
<string name="multiplayer_network_error">网络错误</string>
|
||||
@@ -173,8 +172,7 @@
|
||||
<string name="multiplayer_kick_member">踢出</string>
|
||||
<string name="multiplayer_chat_input_hint">发送消息...</string>
|
||||
<string name="multiplayer_password">密码</string>
|
||||
<string name="original_button_text">加入</string>
|
||||
<string name="disabled_button_text">加入中...</string>
|
||||
<string name="multiplayer_joining">加入中...</string>
|
||||
<string name="multiplayer_room_name">房间名称</string>
|
||||
<string name="multiplayer_room_name_invalid">名称需3-20字符</string>
|
||||
<string name="multiplayer_max_players">最大人数(16)</string>
|
||||
|
@@ -146,7 +146,6 @@
|
||||
<string name="multiplayer_join_room_success">成功加入房間!</string>
|
||||
<string name="multiplayer_create_room_failed">房間建立失敗!</string>
|
||||
<string name="multiplayer_join_room_failed">加入房間失敗!</string>
|
||||
<string name="multiplayer_input_invalid">無效的位址或名稱過短!</string>
|
||||
<string name="multiplayer_port_invalid">無效的埠號!</string>
|
||||
<string name="multiplayer_exit_room">離開房間</string>
|
||||
<string name="multiplayer_network_error">網路錯誤</string>
|
||||
@@ -176,10 +175,9 @@
|
||||
<string name="multiplayer_member_banned">%1$s 已封鎖</string>
|
||||
<string name="multiplayer_address_unbanned">位址已解封</string>
|
||||
<string name="multiplayer_kick_member">踢出成員</string>
|
||||
<string name="multiplayer_chat_input_hint">輸入訊息……</string>
|
||||
<string name="multiplayer_chat_input_hint">輸入訊息…</string>
|
||||
<string name="multiplayer_password">密碼</string>
|
||||
<string name="original_button_text">加入</string>
|
||||
<string name="disabled_button_text">加入中...</string>
|
||||
<string name="multiplayer_joining">加入中...</string>
|
||||
<string name="multiplayer_room_name">房間名稱</string>
|
||||
<string name="multiplayer_room_name_invalid">房間名稱需為3-20字元</string>
|
||||
<string name="multiplayer_max_players">最大玩家數(16)</string>
|
||||
@@ -189,7 +187,7 @@
|
||||
<string name="multiplayer_ip_copied">IP位址已複製</string>
|
||||
<string name="multiplayer_server_address">伺服器位址</string>
|
||||
<string name="chat">聊天</string>
|
||||
<string name="type_message">輸入訊息……</string>
|
||||
<string name="type_message">輸入訊息…</string>
|
||||
<string name="send">傳送</string>
|
||||
<string name="send_message">傳送訊息</string>
|
||||
<string name="multiplayer_moderation">管理</string>
|
||||
|
@@ -111,17 +111,18 @@
|
||||
<string name="multiplayer_username">Username</string>
|
||||
<string name="multiplayer_ip_address">IP Address</string>
|
||||
<string name="multiplayer_ip_port">Port</string>
|
||||
<string name="multiplayer_create_room_success">Room created successfully!</string>
|
||||
<string name="multiplayer_join_room_success">Join the room successfully!</string>
|
||||
<string name="multiplayer_create_room_failed">Failed to create room!</string>
|
||||
<string name="multiplayer_join_room_failed">Failed to join room!</string>
|
||||
<string name="multiplayer_input_invalid">Invalid address or name is too short!</string>
|
||||
<string name="multiplayer_create_room_success">Room created successfully</string>
|
||||
<string name="multiplayer_join_room_success">Joined room successfully</string>
|
||||
<string name="multiplayer_create_room_failed">Failed to create room</string>
|
||||
<string name="multiplayer_join_room_failed">Failed to join room</string>
|
||||
<string name="multiplayer_name_invalid">Name is too short</string>
|
||||
<string name="multiplayer_address_invalid">Invalid address</string>
|
||||
<string name="multiplayer_port_invalid">Invalid port!</string>
|
||||
<string name="multiplayer_exit_room">Exit Room</string>
|
||||
<string name="multiplayer_network_error">Network error</string>
|
||||
<string name="multiplayer_lost_connection">Lost connection</string>
|
||||
<string name="multiplayer_name_collision">Name collision</string>
|
||||
<string name="multiplayer_mac_collision">Mac collision</string>
|
||||
<string name="multiplayer_mac_collision">MAC Address collision</string>
|
||||
<string name="multiplayer_console_id_collision">Console ID collision</string>
|
||||
<string name="multiplayer_wrong_version">Wrong version</string>
|
||||
<string name="multiplayer_wrong_password">Wrong password</string>
|
||||
@@ -133,7 +134,7 @@
|
||||
<string name="multiplayer_already_in_room">Already in room</string>
|
||||
<string name="multiplayer_create_room_error">Create room error</string>
|
||||
<string name="multiplayer_host_kicked">Host kicked</string>
|
||||
<string name="multiplayer_unknown_error">unknown error</string>
|
||||
<string name="multiplayer_unknown_error">Unknown error</string>
|
||||
<string name="multiplayer_room_uninitialized">Room uninitialized</string>
|
||||
<string name="multiplayer_room_idle">Room idle</string>
|
||||
<string name="multiplayer_room_joining">Room joining</string>
|
||||
@@ -143,12 +144,12 @@
|
||||
<string name="multiplayer_member_leave">%1$s left</string>
|
||||
<string name="multiplayer_member_kicked">%1$s kicked</string>
|
||||
<string name="multiplayer_member_banned">%1$s banned</string>
|
||||
<string name="multiplayer_address_unbanned">address unbanned</string>
|
||||
<string name="multiplayer_address_unbanned">Address unbanned</string>
|
||||
<string name="multiplayer_kick_member">Kick Out</string>
|
||||
<string name="multiplayer_chat_input_hint">Send messages……</string>
|
||||
<string name="multiplayer_chat_input_hint">Send messages…</string>
|
||||
<string name="multiplayer_password">Password</string>
|
||||
<string name="original_button_text">Join</string>
|
||||
<string name="disabled_button_text">Joining...</string>
|
||||
<string name="multiplayer_joining">Joining…</string>
|
||||
<string name="multiplayer_creating">Creating…</string>
|
||||
<string name="multiplayer_room_name">Room Name</string>
|
||||
<string name="multiplayer_room_name_invalid">Room name must be between 3 and 20 characters</string>
|
||||
<string name="multiplayer_max_players">Max Players (16)</string>
|
||||
@@ -158,7 +159,7 @@
|
||||
<string name="multiplayer_ip_copied">IP Address copied to clipboard</string>
|
||||
<string name="multiplayer_server_address">Server Address</string>
|
||||
<string name="chat">Chat</string>
|
||||
<string name="type_message">Type message……</string>
|
||||
<string name="type_message">Type message…</string>
|
||||
<string name="send">Send</string>
|
||||
<string name="send_message">Send Message</string>
|
||||
<string name="multiplayer_moderation">Moderation</string>
|
||||
@@ -184,11 +185,17 @@
|
||||
<string name="multiplayer_preferred_game_name">Preferred Game</string>
|
||||
<string name="multiplayer_no_game">No Games Found</string>
|
||||
<string name="multiplayer_preferred_game_name_invalid">You must choose a Preferred Game to host a room.</string>
|
||||
<string name="multiplayer_room_name_error">Must be between 3 and 20 characters</string>
|
||||
<string name="multiplayer_required">Required</string>
|
||||
<string name="multiplayer_ip_error">Invalid IP format</string>
|
||||
<string name="multiplayer_username_error">Must be at least 5 characters</string>
|
||||
<string name="multiplayer_port_error">Must be between 1 and 65535</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="ok">Ok</string>
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="room_list">Room List</string>
|
||||
|
||||
|
||||
<!-- Setup strings -->
|
||||
<string name="welcome">Welcome!</string>
|
||||
<string name="welcome_description">Learn how to setup <b>eden</b> and jump into emulation.</string>
|
||||
|
Reference in New Issue
Block a user