diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 440a7eb..5daf56d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -163,6 +163,13 @@
android:label="@string/about_title_plus"
android:parentActivityName=".MainActivity">
+
+
+
+
0) {
val ua = uas[0]
+ val account = ua.account
val call = ua.currentCall()
var sipaddr = ua.account.aor
sipaddr = sipaddr.removePrefix("sip:")
@@ -804,6 +820,24 @@ class BaresipService: Service() {
Utils.propertySet("sys.ritosip.sip.status", "unregistered")
}
+ if(account != null) {
+ Utils.propertySet("sys.ritosip.account.display_name", account.nickName)
+ Utils.propertySet("sys.ritosip.account.account_name", account.authUser)
+ Utils.propertySet("sys.ritosip.account.server_address", account.host())
+ Utils.propertySet("sys.ritosip.account.prefer_transport", preferTransport)
+ if(account.mediaEnc.startsWith("srtp", ignoreCase = true)) {
+ Utils.propertySet(
+ "sys.ritosip.account.media_encryption",
+ "srtp"
+ )
+ } else {
+ Utils.propertySet(
+ "sys.ritosip.account.media_encryption",
+ "none"
+ )
+ }
+ }
+
if (call != null) {
callExist = true
var audioMute = "unmute"
@@ -2446,6 +2480,7 @@ class BaresipService: Service() {
var callAnswerMode = "auto"
var audioInputDevice = "usb"
var useDisplaySplitMode = false
+ var totalDurationSeconds = 0
var displaySplitMode = DISPLAY_SPLIT_MODE_원거리_최대_근거리_우하단
var farViewDisplayId = 1
var nearViewDisplayId = 2
diff --git a/app/src/main/kotlin/com/tutpro/baresip/plus/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/plus/MainActivity.kt
index c4c18be..bef2699 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/plus/MainActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/plus/MainActivity.kt
@@ -13,6 +13,7 @@ import android.content.Intent.ACTION_DIAL
import android.content.Intent.ACTION_VIEW
import android.content.pm.PackageManager
import android.content.res.Configuration
+import android.graphics.Rect
import android.hardware.display.DisplayManager
import android.media.AudioManager
import android.media.MediaActionSound
@@ -21,6 +22,7 @@ import android.os.*
import android.os.StrictMode.VmPolicy
import android.provider.DocumentsContract
import android.provider.MediaStore
+import android.provider.MediaStore.Audio.Radio
import android.text.InputType
import android.text.TextWatcher
import android.util.TypedValue
@@ -53,6 +55,7 @@ import java.text.SimpleDateFormat
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.*
+import kotlin.collections.HashMap
import kotlin.system.exitProcess
@@ -132,6 +135,10 @@ class MainActivity : AppCompatActivity() {
private lateinit var dialogImgBtn1: AppCompatButton
private lateinit var dialogImgBtn2: AppCompatButton
+ private lateinit var callStartButton: AppCompatButton
+ private lateinit var callHistoryButton: AppCompatButton
+ private lateinit var settingButton: AppCompatButton
+
private var callHandler: Handler = Handler(Looper.getMainLooper())
private var callRunnable: Runnable? = null
private var downloadsInputUri: Uri? = null
@@ -157,6 +164,185 @@ class MainActivity : AppCompatActivity() {
}
}
+ private fun setDpadNavigation(
+ view: View,
+ upView: View? = null,
+ downView: View? = null
+ ) {
+ view.setOnKeyListener { _, keyCode, event ->
+ if (event.action == KeyEvent.ACTION_DOWN) {
+ when (keyCode) {
+ KeyEvent.KEYCODE_DPAD_UP -> {
+ upView?.requestFocus()
+ true
+ }
+ KeyEvent.KEYCODE_DPAD_DOWN -> {
+ downView?.requestFocus()
+ true
+ }
+ else -> false
+ }
+ } else {
+ false
+ }
+ }
+ }
+
+ lateinit var navUpList : HashMap
+ lateinit var navDownList : HashMap
+
+ override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+ if(!isKeyboardVisible) {
+ val currentFocusView = currentFocus
+ if(event.action == KeyEvent.ACTION_UP) {
+ println("pokaRITO pokachip z. " + event)
+ if(event.keyCode == KeyEvent.KEYCODE_DPAD_UP) {
+ if(navUpList.contains(currentFocusView)) {
+ val view = navUpList.get(currentFocusView)!!
+ if(view.isVisible) {
+ view.requestFocus()
+ return false
+ } else {
+ if(currentFocusView == binding.btnApply) {
+ binding.radioDhcp.requestFocus()
+ return false
+ }
+ }
+ }
+ }
+ else if(event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
+ println("pokaRITO pokachip k. " + currentFocusView)
+ if(binding.radioStatic.isFocused) {
+ println("pokaRITO pokachip radioStatic focused")
+ }
+ if(navDownList.contains(currentFocusView)) {
+ println("pokaRITO pokachip zz. " + currentFocusView)
+ val view = navDownList.get(currentFocusView)!!
+ if(view.isVisible) {
+ println("pokaRITO pokachip zzz. " + view)
+ view.requestFocus()
+ return false
+ }
+ } else if(currentFocusView is RadioButton) {
+ println("pokaRITO pokachip rr. " + currentFocusView)
+ }
+
+ } else if(event.keyCode == KeyEvent.KEYCODE_ENTER) {
+ if(currentFocusView == binding.editIp ||
+ currentFocusView == binding.editGateway ||
+ currentFocusView == binding.editNetmask ||
+ currentFocusView == binding.editDns) {
+ if(imm.isActive) {
+ imm.showSoftInput(currentFocusView, InputMethodManager.SHOW_IMPLICIT)
+ imm.restartInput(currentFocusView)
+ return true
+ }
+ }
+ }
+ } else if(event.action == KeyEvent.ACTION_DOWN) {
+ if(event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN || event.keyCode == KeyEvent.KEYCODE_DPAD_UP) {
+ var found = false
+ if(navUpList.contains(currentFocusView) || navDownList.contains(currentFocusView)) {
+ found = true
+ }
+
+ if(found) {
+ return true
+ }
+ } else if(event.keyCode == KeyEvent.KEYCODE_ENTER) {
+ if(currentFocusView == binding.editIp ||
+ currentFocusView == binding.editGateway ||
+ currentFocusView == binding.editNetmask ||
+ currentFocusView == binding.editDns) {
+ return true
+ }
+ }
+ }
+ } else {
+// if(event.keyCode == KeyEvent.KEYCODE_BACK) {
+// val currentFocusView = currentFocus
+// if(currentFocusView != null) {
+// imm.hideSoftInputFromWindow(currentFocusView.windowToken, 0)
+// }
+// }
+ }
+
+
+// if (event.action == KeyEvent.ACTION_UP && event.keyCode == KeyEvent.KEYCODE_BACK) {
+// val currentFocusView = currentFocus
+// println("pokaRITO pokachip 0")
+// if (currentFocusView is EditText) {
+// println("pokaRITO pokachip 1")
+// // 키보드가 내려간 후 300ms 뒤에 포커스를 재설정
+// Handler(Looper.getMainLooper()).postDelayed({
+// currentFocusView.requestFocus()
+// }, 300)
+// }
+// }
+ return super.dispatchKeyEvent(event)
+ }
+ private var isKeyboardVisible = false
+
+ private fun setupKeyboardVisibilityListener() {
+ val rootView = findViewById(android.R.id.content)
+ rootView.viewTreeObserver.addOnGlobalLayoutListener {
+ val rect = Rect()
+ rootView.getWindowVisibleDisplayFrame(rect)
+ val screenHeight = rootView.rootView.height
+
+ val keypadHeight = screenHeight - rect.bottom
+
+ val visible = keypadHeight > screenHeight * 0.15 // 키보드 올라옴 판단 기준
+
+ if (isKeyboardVisible && !visible) {
+ // 🔻 키보드가 막 내려간 순간!
+ onKeyboardHidden()
+ }
+
+ isKeyboardVisible = visible
+ }
+ }
+
+ private fun onKeyboardHidden() {
+ println( "키보드가 내려갔습니다!")
+
+// val currentFocusView = currentFocus
+// if(currentFocusView != null) {
+// println( "hideSoftInputFromWindow : " + currentFocusView)
+// imm.hideSoftInputFromWindow(currentFocusView.windowToken, 0)
+// imm.restartInput(currentFocusView)
+// currentFocusView.clearFocus()
+// currentFocusView.invalidate()
+// currentFocusView.requestFocus()
+// }
+// Handler(Looper.getMainLooper()).postDelayed({
+// findViewById(R.id.editIp).requestFocus()
+// findViewById(R.id.editDns).requestFocus()
+// }, 100) // 지연은 상황 따라 조정
+ }
+
+ private fun updateFieldsVisibility() {
+ val isStatic = binding.radioStatic.isChecked
+ val visibility = if (isStatic) View.VISIBLE else View.GONE
+ binding.editIp.visibility = visibility
+ binding.editNetmask.visibility = visibility
+ binding.editGateway.visibility = visibility
+ binding.editDns.visibility = visibility
+ }
+
+ fun showCustomToast(context: Context, message: String) {
+ val inflater = LayoutInflater.from(context)
+ val layout: View = inflater.inflate(R.layout.custom_toast, null)
+
+ val textView: TextView = layout.findViewById(R.id.toast_text)
+ textView.text = message
+
+ val toast = Toast(context)
+ toast.duration = Toast.LENGTH_LONG
+ toast.view = layout
+ toast.show()
+ }
+
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
@@ -204,6 +390,8 @@ class MainActivity : AppCompatActivity() {
WindowInsetsCompat.CONSUMED
}
+ setupKeyboardVisibilityListener()
+
// Must be done after view has been created
this.setShowWhenLocked(true)
this.setTurnScreenOn( true)
@@ -248,6 +436,25 @@ class MainActivity : AppCompatActivity() {
}
dialogImgBtn2 = binding.dialogButtonImg2
+ callStartButton = binding.callStartBtn
+ callStartButton.setOnClickListener {
+ callVideoButton.performClick()
+ }
+ //callHistoryButton = binding.callHistoryBtn
+ settingButton = binding.settingBtn
+ settingButton.setOnClickListener {
+// val i = Intent(this, NetworkSettingActivity::class.java)
+// i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or
+// Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
+// startActivity(i)
+
+// binding.baseButtonLayout.visibility = View.INVISIBLE
+// binding.mainActivityLayout.visibility = View.INVISIBLE
+// binding.defaultLayout.visibility = View.INVISIBLE
+ binding.networkSettingLayout.visibility = View.VISIBLE
+ binding.radioDhcp.requestFocus()
+ }
+
BaresipService.supportedCameras = Utils.supportedCameras(applicationContext).isNotEmpty()
@@ -256,6 +463,87 @@ class MainActivity : AppCompatActivity() {
am = getSystemService(AUDIO_SERVICE) as AudioManager
kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
+ binding.editIp.setOnClickListener {
+ imm.showSoftInput(it, InputMethodManager.SHOW_IMPLICIT)
+ }
+ binding.editNetmask.setOnClickListener {
+ imm.showSoftInput(it, InputMethodManager.SHOW_IMPLICIT)
+ }
+ binding.editGateway.setOnClickListener {
+ imm.showSoftInput(it, InputMethodManager.SHOW_IMPLICIT)
+ }
+ binding.editDns.setOnClickListener {
+ imm.showSoftInput(it, InputMethodManager.SHOW_IMPLICIT)
+ }
+ navUpList = HashMap()
+ navDownList = HashMap()
+
+ navUpList.put(binding.editIp, binding.radioStatic)
+ navUpList.put(binding.editNetmask, binding.editIp)
+ navUpList.put(binding.editGateway, binding.editNetmask)
+ navUpList.put(binding.editDns, binding.editGateway)
+ navUpList.put(binding.btnApply, binding.editDns)
+ //navUpList.put(binding.btnApply, binding.radioDhcp)
+
+ navDownList.put(binding.radioStatic, binding.editIp)
+ navDownList.put(binding.editIp, binding.editNetmask)
+ navDownList.put(binding.editNetmask, binding.editGateway)
+ navDownList.put(binding.editGateway, binding.editDns)
+ navDownList.put(binding.editDns, binding.btnApply)
+ navDownList.put(binding.radioDhcp, binding.btnApply)
+
+// setDpadNavigation(binding.editIp, downView = binding.editNetmask)
+// setDpadNavigation(binding.editNetmask, upView = binding.editIp, downView = binding.editGateway)
+// setDpadNavigation(binding.editGateway, upView = binding.editNetmask, downView = binding.editDns)
+// setDpadNavigation(binding.editDns, upView = binding.editGateway, downView = binding.btnApply)
+// setDpadNavigation(binding.radioStatic, downView = binding.editIp)
+
+ binding.btnApply.setOnClickListener { _ ->
+ if(binding.radioDhcp.isChecked) {
+ val params: HashMap = HashMap()
+ params.put("IPV4TYPE", "DHCP")
+ params.put("DEVTYPE", "ETHERNET")
+ Utils.sendRequestToFactory(applicationContext, "Ipv4", params)
+// Toast.makeText(
+// applicationContext,
+// "DHCP 적용되었습니다.",
+// Toast.LENGTH_SHORT
+// ).show()
+ showCustomToast(applicationContext, "DHCP 적용되었습니다.")
+ binding.networkSettingLayout.visibility = View.INVISIBLE
+ } else {
+ val params: HashMap = HashMap()
+ params.put("IPV4TYPE", "STATIC")
+ params.put("DEVTYPE", "ETHERNET")
+ params.put("ADDRESS", binding.editIp.text.toString())
+ params.put("NETMASK", binding.editNetmask.text.toString())
+ params.put("GATEWAY", binding.editGateway.text.toString())
+ params.put("DNS", binding.editDns.text.toString())
+ Utils.sendRequestToFactory(applicationContext, "Ipv4", params)
+// Toast.makeText(
+// applicationContext,
+// "STATIC 적용되었습니다.",
+// Toast.LENGTH_SHORT
+// ).show()
+ showCustomToast(applicationContext, "STATIC 적용되었습니다.")
+ binding.networkSettingLayout.visibility = View.INVISIBLE
+ }
+ }
+
+ binding.btnCancel.setOnClickListener { _ ->
+ binding.networkSettingLayout.visibility = View.INVISIBLE
+ }
+
+ updateFieldsVisibility()
+
+ val radioGroup = findViewById(R.id.radioGroup)
+ radioGroup.setOnCheckedChangeListener { _, checkedId ->
+ val selected = findViewById(checkedId)
+ selected.requestFocus()
+ updateFieldsVisibility()
+ }
+
+
serviceEventObserver = Observer {
val event = it.getContentIfNotHandled()
Log.d(TAG, "Observed event $event")
diff --git a/app/src/main/kotlin/com/tutpro/baresip/plus/NetworkSettingActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/plus/NetworkSettingActivity.kt
new file mode 100644
index 0000000..fb3e2e3
--- /dev/null
+++ b/app/src/main/kotlin/com/tutpro/baresip/plus/NetworkSettingActivity.kt
@@ -0,0 +1,70 @@
+package com.tutpro.baresip.plus
+
+import android.os.Bundle
+import android.view.View
+import android.widget.*
+import androidx.appcompat.app.AppCompatActivity
+
+class NetworkSettingActivity : AppCompatActivity() {
+
+ private lateinit var radioDhcp: RadioButton
+ private lateinit var radioStatic: RadioButton
+ private lateinit var editIp: EditText
+ private lateinit var editNetmask: EditText
+ private lateinit var editGateway: EditText
+ private lateinit var editDns: EditText
+ private lateinit var btnApply: Button
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_network_setting)
+
+ radioDhcp = findViewById(R.id.radioDhcp)
+ radioStatic = findViewById(R.id.radioStatic)
+ editIp = findViewById(R.id.editIp)
+ editNetmask = findViewById(R.id.editNetmask)
+ editGateway = findViewById(R.id.editGateway)
+ editDns = findViewById(R.id.editDns)
+ btnApply = findViewById(R.id.btnApply)
+
+ updateFieldsVisibility()
+
+ val radioGroup = findViewById(R.id.radioGroup)
+ radioGroup.setOnCheckedChangeListener { _, _ ->
+ updateFieldsVisibility()
+ }
+
+ btnApply.setOnClickListener {
+ applyNetworkSettings()
+ }
+ }
+
+ private fun updateFieldsVisibility() {
+ val isStatic = radioStatic.isChecked
+ val visibility = if (isStatic) View.VISIBLE else View.GONE
+ editIp.visibility = visibility
+ editNetmask.visibility = visibility
+ editGateway.visibility = visibility
+ editDns.visibility = visibility
+ }
+
+ private fun applyNetworkSettings() {
+ if (radioDhcp.isChecked) {
+ Toast.makeText(this, "DHCP 설정 적용", Toast.LENGTH_SHORT).show()
+ // TODO: DHCP 설정 로직 추가
+ } else {
+ val ip = editIp.text.toString()
+ val netmask = editNetmask.text.toString()
+ val gateway = editGateway.text.toString()
+ val dns = editDns.text.toString()
+
+ if (ip.isBlank() || netmask.isBlank() || gateway.isBlank() || dns.isBlank()) {
+ Toast.makeText(this, "모든 STATIC 필드를 입력해 주세요.", Toast.LENGTH_SHORT).show()
+ return
+ }
+
+ Toast.makeText(this, "STATIC 설정 적용:\n$ip / $netmask / $gateway / $dns", Toast.LENGTH_SHORT).show()
+ // TODO: Static 설정 로직 추가
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/plus/UaSpinnerAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/plus/UaSpinnerAdapter.kt
index 1715d8f..6552043 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/plus/UaSpinnerAdapter.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/plus/UaSpinnerAdapter.kt
@@ -46,11 +46,20 @@ class UaSpinnerAdapter(cxt: Context, private val uas: ArrayList) :
ua.account.nickName + "(${ua.account.aor.split(":")[1]})"
else
ua.account.aor.split(":")[1]
- viewHolder.textView.textSize = 17f
+
+ //viewHolder.textView.textSize = 17f
+ viewHolder.textView.textSize = 30f // modified by ritoseo - aorSpinner 글씨 크기 변경
if (BaresipService.uas.size > 1 && ua.calls().isNotEmpty())
viewHolder.textView.setTypeface(null, Typeface.BOLD)
viewHolder.imageView.setImageResource(ua.status)
+ /* modified by ritoseo - aorSpinner 상태 아이콘 크기 변경 */
+ val imgLayout = viewHolder.imageView.layoutParams
+ imgLayout.width = 45
+ imgLayout.height = 45
+ viewHolder.imageView.layoutParams = imgLayout
+ /* --------------------------------------------------- */
+
return rowView
}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/plus/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/plus/Utils.kt
index 25f0eb0..7e82907 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/plus/Utils.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/plus/Utils.kt
@@ -14,12 +14,12 @@ import android.graphics.Bitmap.createScaledBitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Color
-import android.media.AudioAttributes
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.hardware.camera2.CameraMetadata.LENS_FACING_BACK
import android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT
+import android.media.AudioAttributes
import android.media.AudioDeviceInfo
import android.media.AudioManager
import android.media.MediaPlayer
@@ -30,7 +30,6 @@ import android.net.wifi.WifiManager
import android.os.Build
import android.os.Bundle
import android.os.Environment
-import android.os.Process
import android.provider.DocumentsContract
import android.provider.MediaStore
import android.provider.OpenableColumns
@@ -1264,7 +1263,26 @@ object Utils {
propertySet("sys.rito.audio.input.device", dev)
//val process = Runtime.getRuntime().exec("ritosysc shell-order=killall audioserver")
val process = Runtime.getRuntime().exec("ritosysc shell-order=killall android.hardware.audio.service")
- //val process = Runtime.getRuntime().exec("ritosysc shell-order=service call audio 11 i32 1 i32 3")
+ process.waitFor()
+ process.destroy()
+ }
+
+ fun checkNetworkIpType() {
+ val process = Runtime.getRuntime().exec("ritosysc shell-order=rm /mnt/obb/ip_static;grep STATIC /data/misc/ethernet/ipconfig.txt && touch /mnt/obb/ip_static")
+ process.waitFor()
+ process.destroy()
+
+ if(File("/mnt/obb/ip_static").exists()) {
+ propertySet("sys.ritosip.ipv4.iptype", "static")
+ } else {
+ propertySet("sys.ritosip.ipv4.iptype", "dhcp")
+ }
+ }
+
+ fun save(dev : String) {
+ propertySet("sys.rito.audio.input.device", dev)
+ //val process = Runtime.getRuntime().exec("ritosysc shell-order=killall audioserver")
+ val process = Runtime.getRuntime().exec("ritosysc shell-order=killall android.hardware.audio.service")
process.waitFor()
process.destroy()
}
@@ -1313,6 +1331,14 @@ object Utils {
return "plugout"
}
+ fun fileContainsString(filePath: String, keyword: String): Boolean {
+ val file = File(filePath)
+ if (!file.exists()) return false
+
+ return file.useLines { lines ->
+ lines.any { it.contains(keyword) }
+ }
+ }
fun getEthernetInfo(context: Context): MutableMap {
val netInfo = mutableMapOf()
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
@@ -1351,10 +1377,18 @@ object Utils {
netInfo["ip"] = ip
// Subnet Mask (Netmask)
- val prefixLength = it.linkAddresses[0].prefixLength
- val netmask = calculateNetmask(prefixLength)
- Log.w("Network", "Netmask: $netmask")
- netInfo["netmask"] = netmask
+ it.linkAddresses.forEach {linkAddress ->
+ if (linkAddress.address is Inet4Address) {
+ val prefixLength = linkAddress.prefixLength
+ val netmask = calculateNetmask(prefixLength)
+ Log.d("Network", "IPv4 netmask: $netmask")
+ netInfo["netmask"] = netmask
+ }
+ }
+// val prefixLength = it.linkAddresses[0].prefixLength
+// val netmask = calculateNetmask(prefixLength)
+// Log.w("Network", "Netmask: $netmask, prefixLength : ${prefixLength}")
+ //netInfo["netmask"] = netmask
}
}
}
@@ -1379,6 +1413,19 @@ object Utils {
).joinToString(".")
}
+ fun sendRequestToFactory(context: Context, request: String, params: Map) {
+ val intent = Intent("kr.co.rito.factory.setting").apply {
+ setPackage("kr.co.rito.factory")
+ putExtra("TYPE", request)
+ for ((key, value) in params) {
+ putExtra(key, value)
+ }
+ }
+
+ context.sendBroadcast(intent)
+ }
+
+
external fun openSerial(strDev: String, baudrate: Int): Int // by ritoseo
external fun readSerial(devHandle:Int, buffer: ByteArray, size: Int): Int // by ritoseo
external fun writeSerial(devHandle:Int, buffer: ByteArray, size: Int): Int // by ritoseo
diff --git a/app/src/main/res/drawable/calls_large.xml b/app/src/main/res/drawable/calls_large.xml
new file mode 100644
index 0000000..140e1f9
--- /dev/null
+++ b/app/src/main/res/drawable/calls_large.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 16f9e71..436b09e 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -26,6 +26,68 @@
android:layout_marginBottom="0dp"
android:background="#00000000">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:textSize="24sp">
+ android:textColorHint="@color/colorSecondaryDark"
+ android:textSize="42sp">
@@ -515,8 +577,7 @@
android:id="@+id/dialogLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:visibility="invisible"
- tools:visibility="visible">
+ android:visibility="invisible">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_network_setting.xml b/app/src/main/res/layout/activity_network_setting.xml
new file mode 100644
index 0000000..93ef9ed
--- /dev/null
+++ b/app/src/main/res/layout/activity_network_setting.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+