From b21b706fac890f3820d423d7800e5e939854302f Mon Sep 17 00:00:00 2001 From: yuqian Date: Sun, 4 Jan 2026 15:34:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=93=9D=E7=89=99=E9=99=84?= =?UTF-8?q?=E8=BF=91=E6=89=AB=E6=8F=8F=EF=BC=8Cother=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=8Cinput=20devices=E5=BC=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myphoneinfo/dashboard/HardWareFragment.kt | 98 +++++--- .../myphoneinfo/dialog/DialogBlueTooth.kt | 233 +++++++++++------- .../myphoneinfo/dialog/DialogInput.kt | 94 +++---- ...15size_style.xml => common_text_input.xml} | 8 +- .../src/main/res/layout/dialog_blue_tooth.xml | 3 + .../src/main/res/layout/dialog_input.xml | 11 +- .../src/main/res/layout/hard_bluetooth.xml | 2 +- .../src/main/res/layout/item_blue_tooth.xml | 10 +- myphoneinfo/src/main/res/values/strings.xml | 20 ++ 9 files changed, 273 insertions(+), 206 deletions(-) rename myphoneinfo/src/main/res/layout/{common_text_15size_style.xml => common_text_input.xml} (85%) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt index 9e690b8..1fd8ec2 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -1,5 +1,6 @@ package com.xyzshell.myphoneinfo.dashboard +import android.annotation.SuppressLint import android.bluetooth.BluetoothAdapter import android.content.ActivityNotFoundException import android.content.Intent @@ -43,8 +44,7 @@ class HardWareFragment : Fragment() { refreshBluetoothInfo() } else { // 显示权限被拒绝的UI -// showPermissionDeniedUI() - Toast.makeText(requireContext(), "权限被拒绝", Toast.LENGTH_SHORT).show() + Toast.makeText(requireContext(), getString(R.string.permissions_required), Toast.LENGTH_SHORT).show() } } @@ -69,14 +69,6 @@ class HardWareFragment : Fragment() { var intent = Intent(requireContext(), AnalysisActivity::class.java) startActivity(intent) } -// binding.pair2.setOnClickListener { -// dialogBlueTooth= dialogBlueTooth?: DialogBlueTooth() -// dialogBlueTooth?.show(childFragmentManager, "BlueTooth2") -// } - binding.othertext.setOnClickListener { - dialogInput = dialogInput ?: DialogInput() - dialogInput?.show(childFragmentManager, "Input") - } binding.extensionShow.setOnClickListener { dialogExtension?.show(childFragmentManager, "Extention") } @@ -97,6 +89,7 @@ class HardWareFragment : Fragment() { setMemoryInfo() setBlueToothInfo() setAudioInfo() + setInputInfo() } /** @@ -108,6 +101,34 @@ class HardWareFragment : Fragment() { binding.check3.content.text = getString(R.string.midl) } + /** + * Input信息 + * */ + private fun setInputInfo() { + val inputInfo = AndInfo.instance.input + binding.otherCheck1.content.text=getString(R.string.usb_host_support) + binding.otherCheck1.image.isSelected=inputInfo.hasUsbHostSupport() + binding.otherCheck2.content.text=getString(R.string.usb_accessory_support) + binding.otherCheck2.image.isSelected=inputInfo.hasUsbAccessorySupport() + binding.otherCheck3.content.text=getString(R.string.fingerprint) + binding.otherCheck3.image.isSelected=inputInfo.hasFingerprintSensor() + binding.otherCheck4.content.text=getString(R.string.infrared_transmitter) + binding.otherCheck4.image.isSelected=inputInfo.hasInfraredSensor() + binding.otherCheck5.content.text=getString(R.string.uwb_support) + binding.otherCheck5.image.isSelected=inputInfo.hasUwbSupport() + binding.otherCheck6.content.text=getString(R.string.nfc_support) + binding.otherCheck6.image.isSelected=inputInfo.hasNfcSupport() + binding.otherCheck7.content.text=getString(R.string.secure_nfc_support) + binding.otherCheck7.image.isSelected=inputInfo.hasSecureNfcSupport() + binding.otherCheck8.content.text=getString(R.string.gps) + binding.otherCheck8.image.isSelected=inputInfo.hasGpsSupport() + binding.othertext.setOnClickListener { + dialogInput = dialogInput ?: DialogInput() + dialogInput?.show(childFragmentManager, "Input") + } + + } + /** * memory信息 * */ @@ -298,19 +319,35 @@ class HardWareFragment : Fragment() { /** * bluetooth相关信息*/ + @SuppressLint("SuspiciousIndentation") private fun setBlueToothInfo() { val bluetoothInfo = AndInfo.instance.bluetooth//蓝牙信息 if (!bluetoothInfo.isEnabled) return binding.bluetoothLayout.showLayout.setOnClickListener { requestBluetoothPermissions() } - binding.bluetoothLayout.pair1.setOnClickListener { - showPairedDevicesDialog() - } - // 打开弹窗开始扫描,超过15s扫描超时结束,显示扫描到的列表 - binding.bluetoothLayout.pair2.setOnClickListener { - showNearByDevicesDialog() - } + //蓝牙features支持 + bluetoothInfo.getBluetoothFeatures().let { features -> + binding.bluetoothLayout.blueCheck1.content.text=getString(R.string.bluetooth_le) + binding.bluetoothLayout.blueCheck1.image.isSelected=features.bluetoothLe + binding.bluetoothLayout.blueCheck2.content.text=getString(R.string.multiple_advertisement) + binding.bluetoothLayout.blueCheck2.image.isSelected=features.multipleAdvertisement + binding.bluetoothLayout.blueCheck3.content.text=getString(R.string.offloaded_filtering) + binding.bluetoothLayout.blueCheck3.image.isSelected=features.offloadedFiltering + binding.bluetoothLayout.blueCheck4.content.text=getString(R.string.offloaded_scan_batching) + binding.bluetoothLayout.blueCheck4.image.isSelected=features.offloadedScanBatching + binding.bluetoothLayout.blueCheck01.content.text=getString(R.string.le_periodic_advertising) + binding.bluetoothLayout.blueCheck01.image.isSelected=features.lePeriodicAdvertising + binding.bluetoothLayout.blueCheck02.content.text=getString(R.string.le_extended_advertising) + binding.bluetoothLayout.blueCheck02.image.isSelected=features.leExtendedAdvertising + binding.bluetoothLayout.blueCheck03.content.text=getString(R.string.le_2m_phy_high_speed) + binding.bluetoothLayout.blueCheck03.image.isSelected=features.leCodedPhy + binding.bluetoothLayout.blueCheck04.content.text=getString(R.string.le_2m_phy_low_power) + binding.bluetoothLayout.blueCheck04.image.isSelected=features.le2MbPhy + binding.bluetoothLayout.blueCheck05.content.text=getString(R.string.le_audio_support) + binding.bluetoothLayout.blueCheck05.image.isSelected=features.leAudioSupport + } + } // 请求蓝牙权限的方法 private fun requestBluetoothPermissions() { @@ -364,7 +401,7 @@ class HardWareFragment : Fragment() { binding.bluetoothLayout.blueList.visibility = View.GONE // 更新UI文本 - binding.bluetoothLayout.showText.text = "Bluetooth is not enabled." + binding.bluetoothLayout.showText.text = getString(R.string.bluetooth_not_enabled) // 设置打开蓝牙按钮 binding.bluetoothLayout.show1.setOnClickListener { @@ -406,24 +443,13 @@ class HardWareFragment : Fragment() { * 刷新蓝牙信息 */ private fun refreshBluetoothInfo() { - val bluetoothInfo = AndInfo.instance.bluetooth - - // 更新基本信息 -// binding.blueList.tvBluetoothStatus.text = bluetoothInfo.stateText -// binding.blueList.tvBluetoothStatus.setTextColor( -// when (bluetoothInfo.state) { -// BluetoothAdapter.STATE_ON -> ContextCompat.getColor(requireContext(), R.color.success_green) -// else -> ContextCompat.getColor(requireContext(), R.color.error_red) -// } -// ) -// -// binding.blueList.tvBluetoothAdapter.text = bluetoothInfo.adapterName ?: "未知" -// binding.blueList.tvBluetoothVersion.text = bluetoothInfo.getBluetoothVersionDetails() -// binding.blueList.tvBleSupport.text = if (bluetoothInfo.isBluetoothLeSupported) "支持" else "不支持" - - // 更新已配对设备数量 -// val pairedCount = bluetoothInfo.bondedDevices.size -// binding.blueList.tvPairedCount.text = "已配对: ${pairedCount}个设备" + binding.bluetoothLayout.pair1.setOnClickListener { + showPairedDevicesDialog() + } + // 打开弹窗开始扫描,超过15s扫描超时结束,显示扫描到的列表 + binding.bluetoothLayout.pair2.setOnClickListener { + showNearByDevicesDialog() + } } /** diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogBlueTooth.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogBlueTooth.kt index a35e2ec..68a23c2 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogBlueTooth.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogBlueTooth.kt @@ -1,5 +1,6 @@ package com.xyzshell.myphoneinfo.dialog +import android.annotation.SuppressLint import android.os.Bundle import android.os.CountDownTimer import android.view.LayoutInflater @@ -9,6 +10,7 @@ import android.widget.TextView import android.widget.Toast import androidx.compose.material3.Text import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.DeviceInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment import com.xyzshell.myphoneinfo.databinding.DialogBlueToothBinding @@ -16,6 +18,7 @@ import com.xyzshell.myphoneinfo.databinding.DialogBlueToothBinding class DialogBlueTooth(val type:Int) :BaseDialogFragment(DialogBlueToothBinding::inflate){ private var isScanning = false private var scanTimer: CountDownTimer? = null + private val SCAN_DURATION = 15000 // 15秒 override fun getTitle(): String = resources.getString(R.string.bluetooth) override fun getIconRes(): Int=5 @@ -34,12 +37,13 @@ class DialogBlueTooth(val type:Int) :BaseDialogFragment( // list.add(deviceMap) // } if(type==0){// 显示已配对设备列表 + binding.progressbar.visibility=View.GONE val container = binding.view as? ViewGroup container?.let { // 遍历 list,为每个设备创建 item view if(list.isEmpty()){ it.addView(TextView(requireContext()).apply { - text = "No devices" + text = getString(R.string.no_devices) }) }else{ list.forEach { deviceMap -> @@ -60,115 +64,154 @@ class DialogBlueTooth(val type:Int) :BaseDialogFragment( } }else{// 显示扫描设备列表 -// startScanning() + startScanning() } } -// /** -// * 开始扫描设备 -// */ -// private fun startScanning() { -// if (isScanning) return -// -// val bluetoothInfo = AndInfo.instance.bluetooth -// -// // 显示扫描UI -// isScanning = true -// binding.view.visibility=View.GONE -// binding.progressbar.visibility=View.VISIBLE -// -// // 启动15秒倒计时 -// startScanTimer(scanDialog) -// -// // 开始扫描 -// try { -// // 同时扫描经典蓝牙和BLE设备 -// bluetoothInfo.scanNearbyDevices( -// onDeviceFound = { device -> -// requireActivity().runOnUiThread { -// scanDialog.addDevice(device) -// } -// }, -// onScanFinished = { -// requireActivity().runOnUiThread { -// stopScanning() -// scanDialog.scanFinished() -// } -// } -// ) -// -// // 扫描BLE设备 -// if (bluetoothInfo.isBluetoothLeSupported) { -// bluetoothInfo.scanLeDevices( -// onDeviceFound = { device -> -// requireActivity().runOnUiThread { -// scanDialog.addDevice(device) -// } -// }, -// durationMillis = SCAN_DURATION -// ) -// } -// -// } catch (e: SecurityException) { -// Toast.makeText(requireContext(), "蓝牙权限被拒绝", Toast.LENGTH_SHORT).show() -// stopScanning() -// } -// } -// -// /** -// * 启动扫描计时器 -// */ -// private fun startScanTimer(scanDialog: DialogScanDevices) { -// scanTimer = object : CountDownTimer(SCAN_DURATION, 1000) { -// override fun onTick(millisUntilFinished: Long) { -// val secondsLeft = millisUntilFinished / 1000 -// binding.blueList.tvScanStatus.text = -// "正在扫描附近设备... ${secondsLeft}秒后结束" -// -// // 更新弹窗中的倒计时 -// scanDialog.updateTimer(secondsLeft.toInt()) -// } -// -// override fun onFinish() { -// stopScanning() -// scanDialog.scanFinished() -// } -// }.start() -// } -// -// /** -// * 停止扫描 -// */ -// private fun stopScanning() { -// if (!isScanning) return -// -// isScanning = false -// -// // 停止计时器 -// scanTimer?.cancel() -// scanTimer = null -// -// // 隐藏扫描UI -// binding.blueList.scanLayout.visibility = View.GONE -// -// // 停止蓝牙扫描 -// AndInfo.instance.bluetooth.stopScan() -// } + /** + * 开始扫描设备 + */ + @SuppressLint("SuspiciousIndentation") + private fun startScanning() { + if (isScanning) return + + val bluetoothInfo = AndInfo.instance.bluetooth + + // 显示扫描UI + isScanning = true + binding.view.visibility = View.GONE + binding.progressbar.visibility = View.VISIBLE + + // 设置进度条为15秒倒计时 + binding.progressItem.max = SCAN_DURATION / 1000 // 最大值为15(秒) + binding.progressItem.progress = SCAN_DURATION / 1000 // 初始进度为15(秒) + + // 启动15秒进度条倒计时 + startProgressCountdown() + + // 开始扫描 + try { + val container = binding.view as? ViewGroup + container?.let { + var list:List = arrayListOf() + // 遍历 list,为每个设备创建 item view + // 同时扫描经典蓝牙和BLE设备 + bluetoothInfo.scanNearbyDevices( + onDeviceFound = { device -> + if (!isAdded || context == null) return@scanNearbyDevices + requireActivity().runOnUiThread { + if (!isAdded || context == null) return@runOnUiThread + // 加载 item 布局 + val itemView = LayoutInflater.from(requireContext()) + .inflate(R.layout.item_blue_tooth, it, false) + + // 设置设备信息 + val tvName = itemView.findViewById(R.id.textTitle) + val tvAddress = itemView.findViewById(R.id.textContent) + + tvName.text = device.name + tvAddress.text = device.address + // 添加到容器 + it.addView(itemView) + binding.view.visibility = View.VISIBLE + binding.progressbar.visibility = View.GONE + + } + }, + onScanFinished = { + requireActivity().runOnUiThread { + stopScanning() + } + } + ) + // 扫描BLE设备 + if (bluetoothInfo.isBluetoothLeSupported) { + bluetoothInfo.scanLeDevices( + onDeviceFound = { device -> + if (!isAdded || context == null) return@scanLeDevices + requireActivity().runOnUiThread { + if (!isAdded || context == null) return@runOnUiThread + // 加载 item 布局 + val itemView = LayoutInflater.from(requireContext()) + .inflate(R.layout.item_blue_tooth, it, false) + + // 设置设备信息 + val tvName = itemView.findViewById(R.id.textTitle) + val tvAddress = itemView.findViewById(R.id.textContent) + + tvName.text = device.name + tvAddress.text = device.address + // 添加到容器 + it.addView(itemView) + binding.view.visibility = View.VISIBLE + binding.progressbar.visibility = View.GONE + } + }, + durationMillis = SCAN_DURATION.toLong() + ) + } + + } + + + } catch (e: SecurityException) { + Toast.makeText(requireContext(), getString(R.string.permissions_required), Toast.LENGTH_SHORT).show() + stopScanning() + } + } + + /** + * 启动进度条倒计时 + */ + private fun startProgressCountdown() { + scanTimer = object : CountDownTimer(SCAN_DURATION.toLong(), 1000) { + override fun onTick(millisUntilFinished: Long) { + val secondsLeft = millisUntilFinished / 1000 + // 更新进度条(从15递减到0) + binding.progressItem.progress = secondsLeft.toInt() + } + + override fun onFinish() { + // 倒计时结束,停止扫描 + stopScanning() + binding.progressbar.visibility = View.GONE + } + }.start() + } + + /** + * 停止扫描 + */ + private fun stopScanning() { + if (!isScanning) return + + isScanning = false + + // 停止计时器 + scanTimer?.cancel() + scanTimer = null + // 重置进度条 + binding.progressItem.progress = 0 + + // 停止蓝牙扫描 + AndInfo.instance.bluetooth.stopScan() + } + override fun onNegativeClick() { super.onNegativeClick() -// stopScanning() + stopScanning() } override fun onPositiveClick() { super.onPositiveClick() -// stopScanning() + stopScanning() } override fun onPause() { super.onPause() // 停止扫描 -// stopScanning() + stopScanning() } } \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogInput.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogInput.kt index ca37c60..6d11727 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogInput.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogInput.kt @@ -1,13 +1,14 @@ package com.xyzshell.myphoneinfo.dialog -import android.graphics.Typeface import android.os.Bundle -import android.text.SpannableString -import android.text.style.StyleSpan +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.InputInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment -import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding import com.xyzshell.myphoneinfo.databinding.DialogInputBinding class DialogInput :BaseDialogFragment(DialogInputBinding::inflate){ @@ -19,57 +20,40 @@ class DialogInput :BaseDialogFragment(DialogInputBinding::in override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.text1.textTitle.text = "input_mt_wrapper" - binding.text1.textContent.text = "Input Device 1:\n" + - "input_mt_wrapper\n" + - "Descriptor:\n" + - "a988c03908bee014d816\n" + - "71ffdd909090304130b5\n" + - "Generation: 14\n" + - "Location: built-in\n" + - "Keyboard Type:\n" + - "non-alphabetic\n" + - "Has Vibrator: false\n" + - "Has mic: false\n" + - "Sources: 0x1103\n" + - "(keyboard touchscreen)\n" + - "AXISX:\n" + - "source=0x1002 min=0.0\n" + - "max=719.0 flat=0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXISY:\n" + - "source=0x1002 min=0.0\n" + - "max=1559.0 flat=0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXIS PRESSURE:\n" + - "source-0x1002 min=0.0\n" + - "max=1.0 flat=0.0 fuzz=0.0\n" + - "resolution=0.0\n" + - "AXIS_SIZE:\n" + - "source=0x1002 min=0.0\n" + - "max=1.0 flat=0.0 fuzz=0.0\n" + - "resolution=0.0\n" + - "AXIS TOUCH_MAJOR:\n" + - "source=0x1002 min=0.0\n" + - "max=1718.1385 flat=0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXISTOUCH_MINOR:\n" + - "source=0x1002 min=0.0\n" + - "max=1718.1385 flat=0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXIS TOOL MAJOR:\n" + - "source=0×1002 min=0.0\n" + - "max=1718.1385 flat=0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXIS TOOL MINOR:\n" + - "source=0x1002 min=0.0\n" + - "max=1718.1385 flat-0.0\n" + - "fuzz=0.0 resolution=0.0\n" + - "AXIS_ORIENTATION:\n" + - "source=0x1002\n" + - "min=-1.5707964\n" + - "max=1.5707964 flat=0.0\n" + - "fuzz=0.0 resolution=0.0" + val info= AndInfo.instance.input + val inputDevices = info.getInputDevices() + val container = binding.container as? ViewGroup + container?.let{ + if(inputDevices.isEmpty()){ + it.addView(TextView(requireContext()).apply { + text = getString(R.string.no_devices) + }) + }else{ + inputDevices.forEach { device -> + val view= LayoutInflater.from(requireContext()).inflate(R.layout.common_text_input,it,false) + view.findViewById(R.id.textTitle).text = device.name + val sb = StringBuilder() + sb.append("Input Device ${device.id} :${device.name}\n") + if(device.descriptor!=null){ + sb.append("Descriptor: ${device.descriptor}\n") + } + sb.append("Vendor Id: ${device.vendorId}\n") + sb.append("Product Id: ${device.productId}\n") + sb.append("Enabled: ${device.isEnabled}\n") + sb.append("Keyboard Type: ${InputInfo.InputDeviceInfo.keyboardTypeToString[device.keyboardType] ?: device.keyboardType.toString()}\n") + sb.append("Has Vibrator: ${device.hasVibrator}\n") + sb.append("Has Microphone: ${device.hasMicrophone}\n") + if(device.sources!=null){ + sb.append("Sources: ${device.sources}\n") + } + + + view.findViewById(R.id.textContent).text =sb + + it.addView(view) + } + } + } } override fun onNegativeClick() { diff --git a/myphoneinfo/src/main/res/layout/common_text_15size_style.xml b/myphoneinfo/src/main/res/layout/common_text_input.xml similarity index 85% rename from myphoneinfo/src/main/res/layout/common_text_15size_style.xml rename to myphoneinfo/src/main/res/layout/common_text_input.xml index e41cf8a..8e9c062 100644 --- a/myphoneinfo/src/main/res/layout/common_text_15size_style.xml +++ b/myphoneinfo/src/main/res/layout/common_text_input.xml @@ -12,16 +12,16 @@ android:layout_width="150dp" android:layout_height="wrap_content" android:text="@string/model" - android:textSize="15sp" + android:textSize="12sp" android:textStyle="bold" /> + android:textColor="@color/right_color" + android:textSize="12sp" /> \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/dialog_blue_tooth.xml b/myphoneinfo/src/main/res/layout/dialog_blue_tooth.xml index f581db5..fdf6e6c 100644 --- a/myphoneinfo/src/main/res/layout/dialog_blue_tooth.xml +++ b/myphoneinfo/src/main/res/layout/dialog_blue_tooth.xml @@ -21,10 +21,13 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" + android:visibility="gone" android:orientation="vertical"> - - - - - - - - + android:orientation="vertical"/> diff --git a/myphoneinfo/src/main/res/layout/hard_bluetooth.xml b/myphoneinfo/src/main/res/layout/hard_bluetooth.xml index a389a9c..808d9eb 100644 --- a/myphoneinfo/src/main/res/layout/hard_bluetooth.xml +++ b/myphoneinfo/src/main/res/layout/hard_bluetooth.xml @@ -73,7 +73,7 @@ android:id="@+id/blueList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:visibility="gone" + android:visibility="visible" android:orientation="vertical"> - \ No newline at end of file diff --git a/myphoneinfo/src/main/res/values/strings.xml b/myphoneinfo/src/main/res/values/strings.xml index 2d1844f..7996e99 100644 --- a/myphoneinfo/src/main/res/values/strings.xml +++ b/myphoneinfo/src/main/res/values/strings.xml @@ -301,4 +301,24 @@ Autofocus modes Scene modes Scanning... + No devices + Bluetooth permission denied. + Bluetooth is not enabled. + Bluetooth LE (Low Energy) + Multiple advertisement + Offloaded filtering + Offloaded scan batching + LE Periodic Advertising + LE Extended Advertising + LE 2M PHY (high speed) + LE Coded PHY (long range) + LE Audio support + USB host support + USB accessory support + Infrared transmitter + UWB support + NFC support + Secure NFC support + GPS + \ No newline at end of file