diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 885c2b3..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a68bb0a..e119821 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,12 +4,20 @@ plugins { } android { + signingConfigs { + debug { + storeFile file('/home/gogacoder/AndroidStudioProjects/keychain/key.jks') + storePassword '123456' + keyPassword '123456' + keyAlias 'key0' + } + } namespace 'com.listerk.helible' compileSdk 34 defaultConfig { applicationId "com.listerk.helible" - minSdk 31 + minSdk 30 targetSdk 34 versionCode 1 versionName "1.0" diff --git a/app/debug/output-metadata.json b/app/debug/output-metadata.json new file mode 100644 index 0000000..c142ade --- /dev/null +++ b/app/debug/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.listerk.helible", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-debug.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b0adb6d..878542a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,10 +2,18 @@ - + + + + + + + - + , private val gotoControlBtn: Button) : RecyclerView.Adapter() { @@ -41,9 +42,9 @@ class BleDeviceAdapter(private val devices: List, private val gotoCon } class BleDeviceViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { - val cardView = itemView.rootView - val nameView = itemView.findViewById(R.id.deviceName) - val addressView = itemView.findViewById(R.id.deviceAddress) - val rssiView = itemView.findViewById(R.id.deviceRssi) + val cardView: View = itemView.rootView + val nameView: TextView = itemView.findViewById(R.id.deviceName) + val addressView: TextView = itemView.findViewById(R.id.deviceAddress) + val rssiView: ImageView = itemView.findViewById(R.id.deviceRssi) } } diff --git a/app/src/main/java/com/listerk/helible/ControlActivity.kt b/app/src/main/java/com/listerk/helible/ControlActivity.kt index 2470d74..9b7447d 100644 --- a/app/src/main/java/com/listerk/helible/ControlActivity.kt +++ b/app/src/main/java/com/listerk/helible/ControlActivity.kt @@ -28,8 +28,7 @@ class ControlActivity : AppCompatActivity() { sliderR1.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { sliderR1Value = progress - val val_text = getString(R.string.r_slider_text, 1, progress) - sliderR1ValueText.text = val_text + sliderR1ValueText.text = getString(R.string.r_slider_text, 1, progress) } override fun onStartTrackingTouch(p0: SeekBar?) {} override fun onStopTrackingTouch(p0: SeekBar?) {} @@ -38,8 +37,7 @@ class ControlActivity : AppCompatActivity() { sliderR2.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { sliderR2Value = progress - val val_text = getString(R.string.r_slider_text, 2, progress) - sliderR2ValueText.text = val_text + sliderR2ValueText.text = getString(R.string.r_slider_text, 2, progress) } override fun onStartTrackingTouch(p0: SeekBar?) {} override fun onStopTrackingTouch(p0: SeekBar?) {} @@ -48,8 +46,7 @@ class ControlActivity : AppCompatActivity() { sliderR3.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { sliderR3Value = progress - val val_text = getString(R.string.r_slider_text, 3, progress) - sliderR3ValueText.text = val_text + sliderR3ValueText.text = getString(R.string.r_slider_text, 3, progress) } override fun onStartTrackingTouch(p0: SeekBar?) {} override fun onStopTrackingTouch(p0: SeekBar?) {} diff --git a/app/src/main/java/com/listerk/helible/MainActivity.kt b/app/src/main/java/com/listerk/helible/MainActivity.kt index a8fc630..e6d1195 100644 --- a/app/src/main/java/com/listerk/helible/MainActivity.kt +++ b/app/src/main/java/com/listerk/helible/MainActivity.kt @@ -1,6 +1,7 @@ package com.listerk.helible import android.Manifest +import android.annotation.SuppressLint import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothManager import android.bluetooth.le.BluetoothLeScanner @@ -13,16 +14,17 @@ import android.graphics.drawable.Animatable import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.os.Handler import android.util.Log +//import android.os.Handler import android.view.View import android.widget.Button import android.widget.ImageView -import androidx.annotation.RequiresApi +//import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +@SuppressLint("MissingPermission") class MainActivity : AppCompatActivity() { private val bluetoothAdapter: BluetoothAdapter by lazy { val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager @@ -31,7 +33,7 @@ class MainActivity : AppCompatActivity() { private val bleScanner: BluetoothLeScanner by lazy { bluetoothAdapter.bluetoothLeScanner } - + private val requiredPermissions: MutableSet = mutableSetOf(Manifest.permission.BLUETOOTH_SCAN) private val foundDevices = mutableListOf() private val leScanCallback: ScanCallback = object : ScanCallback() { @@ -39,6 +41,7 @@ class MainActivity : AppCompatActivity() { super.onScanResult(callbackType, result) val bleDevicesView = findViewById(R.id.bleDevicesView) val loader = findViewById(R.id.bleDevicesLoader) + if (result.device.name.isNullOrBlank()) { return } @@ -48,7 +51,7 @@ class MainActivity : AppCompatActivity() { loader.visibility = View.GONE } - var deviceIndex = foundDevices.indexOfFirst { it.address == result.device.address } + var deviceIndex: Int = foundDevices.indexOfFirst { it.address == result.device.address } if (deviceIndex < 0) { deviceIndex = foundDevices.size foundDevices.add(BleDevice(result.device.name, result.device.address, result.rssi)) @@ -76,23 +79,62 @@ class MainActivity : AppCompatActivity() { bleDevicesView.layoutManager = LinearLayoutManager(this) bleDevicesView.adapter = BleDeviceAdapter(foundDevices, gotoControlButton) bleDevicesView.itemAnimator = null + + if (ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) + { + Log.e("StartActivity", "We have denied permissions") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + { + ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.BLUETOOTH_CONNECT), 2) + return + } + } + + /*if(Build.VERSION.SDK_INT < 31) { + requiredPermissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION) + requiredPermissions.add(android.Manifest.permission.ACCESS_COARSE_LOCATION) + requiredPermissions.add(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION) + } + requestPermissions()*/ } override fun onResume() { super.onResume() - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), 1) - } else { + /*if (!hasNecessaryPermissions()) { + requestPermissions() + } else {*/ bleScanner.startScan(leScanCallback) - } + //} } override fun onPause() { super.onPause() - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), 1) - } else { + /*if (!hasNecessaryPermissions()) { + requestPermissions() + } else {*/ bleScanner.stopScan(leScanCallback) + //} + } + + private fun hasNecessaryPermissions(): Boolean + { + for (it in requiredPermissions) { + if (ActivityCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED) { + Log.i("ScanActivity", "Permission isn't allowed: $it") + return false + } + } + return true + } + private fun requestPermissions() + { + Log.i("ScanActivity", "Trying to request permissions: $requiredPermissions") + ActivityCompat.requestPermissions(this@MainActivity, requiredPermissions.toTypedArray(), 1) + if(!hasNecessaryPermissions()) + { + Log.e("ScanActivity", "Failed to get all permissions") + } else { + Log.i("ScanActivity", "App got permissions: $requiredPermissions") } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8eb95a2..b919055 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -22,10 +22,11 @@ android:id="@+id/bleDevicesView" android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/devicesTitle" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="12dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/devicesTitle" tools:listitem="@layout/item_ble_device" /> + app:layout_constraintTop_toBottomOf="@id/bleDevicesView" />