From 96aefe8738c3e394f6daff8980e52c79ac248588 Mon Sep 17 00:00:00 2001 From: ritoseo Date: Fri, 11 Apr 2025 17:05:15 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=AC=EB=AA=A8=EC=BB=A8=20=EB=84=A4?= =?UTF-8?q?=ED=8A=B8=EC=9B=8C=ED=81=AC=20=EC=84=A4=EC=A0=95=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=81=EC=9A=A9=20setProperty=EB=A1=9C=20?= =?UTF-8?q?=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC=20=EC=83=81=ED=83=9C,=20ac?= =?UTF-8?q?count=20=EC=83=81=ED=83=9C=20=EC=84=A4=EC=A0=95=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 7 + .../com/tutpro/baresip/plus/BaresipService.kt | 41 ++- .../com/tutpro/baresip/plus/MainActivity.kt | 288 ++++++++++++++++++ .../baresip/plus/NetworkSettingActivity.kt | 70 +++++ .../tutpro/baresip/plus/UaSpinnerAdapter.kt | 11 +- .../kotlin/com/tutpro/baresip/plus/Utils.kt | 61 +++- app/src/main/res/drawable/calls_large.xml | 5 + app/src/main/res/layout/activity_main.xml | 192 +++++++++++- .../res/layout/activity_network_setting.xml | 71 +++++ 9 files changed, 727 insertions(+), 19 deletions(-) create mode 100644 app/src/main/kotlin/com/tutpro/baresip/plus/NetworkSettingActivity.kt create mode 100644 app/src/main/res/drawable/calls_large.xml create mode 100644 app/src/main/res/layout/activity_network_setting.xml 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"> + + + + + + + + + + + + + + + + + + + + + + + +