Skip to content

Commit

Permalink
Merge pull request #114 from PhenoApps/dev
Browse files Browse the repository at this point in the history
v1.3.1
  • Loading branch information
trife authored Apr 12, 2022
2 parents 1bf4bb4 + ef5b44b commit ce1ce8f
Show file tree
Hide file tree
Showing 10 changed files with 157 additions and 42 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ android {
//link square api has minimum requirement of 21
minSdkVersion 21
targetSdkVersion 31
versionCode 9
versionCode 10
versionName "1.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
Expand Down
8 changes: 6 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.phenoapps.prospector.activities

import android.app.Activity
import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.github.appintro.AppIntro
Expand All @@ -16,14 +17,27 @@ class IntroActivity : AppIntro() {

setResult(Activity.RESULT_OK)

askForPermissions(arrayOf(android.Manifest.permission.CAMERA,
android.Manifest.permission.BLUETOOTH,
android.Manifest.permission.BLUETOOTH_ADMIN,
android.Manifest.permission.INTERNET,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE), slideNumber = 1, required = false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
askForPermissions(arrayOf(android.Manifest.permission.CAMERA,
android.Manifest.permission.BLUETOOTH_SCAN,
android.Manifest.permission.BLUETOOTH_CONNECT,
android.Manifest.permission.BLUETOOTH,
android.Manifest.permission.BLUETOOTH_ADMIN,
android.Manifest.permission.INTERNET,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE), slideNumber = 1, required = false)
} else {
askForPermissions(arrayOf(android.Manifest.permission.CAMERA,
android.Manifest.permission.BLUETOOTH,
android.Manifest.permission.BLUETOOTH_ADMIN,
android.Manifest.permission.INTERNET,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE), slideNumber = 1, required = false)
}

addSlide(AppIntroFragment.newInstance(
title = getString(R.string.accept_permissions),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ import LED_FRAMES
import android.Manifest
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.content.Intent
import android.location.LocationManager
import android.os.*
import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
Expand Down Expand Up @@ -79,6 +82,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
private var mConfirmFactoryResetDialog: AlertDialog? = null
private var mFirstDeleteDatabaseDialog: AlertDialog? = null
private var mSecondDeleteDatabaseDialog: AlertDialog? = null
private var mAskLocationEnableDialog: AlertDialog? = null

private val mPrefs by lazy {
PreferenceManager.getDefaultSharedPreferences(this)
Expand All @@ -88,7 +92,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
KeyUtil(this)
}

private val enableBluetoothLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
private val startActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

startDeviceConnection()

Expand Down Expand Up @@ -191,6 +195,13 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
}
.create()

mAskLocationEnableDialog = AlertDialog.Builder(this)
.setTitle(R.string.dialog_ask_location)
.setPositiveButton(android.R.string.ok) { dialog, _ ->
dialog.dismiss()
}
.create()

val prefs = PreferenceManager.getDefaultSharedPreferences(this)

prefs.edit().putBoolean(FIRST_CONNECT_ERROR_ON_LOAD, true).apply()
Expand All @@ -206,6 +217,26 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
startConnectionWatcher()
}

private fun askForLocation(success: () -> Unit) {

mAskLocationEnableDialog?.let { dialog ->

if (!dialog.isShowing) {

mAskLocationEnableDialog = AlertDialog.Builder(this)
.setTitle(R.string.dialog_ask_location)
.setPositiveButton(android.R.string.ok) { d, _ ->
success()
d.dismiss()
}
.setNegativeButton(android.R.string.no) { d, _ ->
d.dismiss()
}
.show()
}
}
}

fun askDeleteDatabase(success: () -> Unit) {

mFirstDeleteDatabaseDialog?.let { firstDialog ->
Expand Down Expand Up @@ -338,13 +369,46 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {

if (!BluetoothAdapter.getDefaultAdapter().isEnabled) {

enableBluetoothLauncher.launch(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE))
startActivityLauncher.launch(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE))

} else {

startDeviceConnection()

}

val lm: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
var gps = false
var net = false

try {

gps = lm.isProviderEnabled(LocationManager.GPS_PROVIDER)

} catch (ex: java.lang.Exception) {

ex.printStackTrace()

}

try {

net = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

} catch (e: java.lang.Exception) {

e.printStackTrace()

}

if (!(net || gps)) {

askForLocation {

startActivityLauncher.launch(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))

}
}
}
}

Expand Down Expand Up @@ -592,7 +656,8 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
private fun stopDeviceConnection() {
launch {
withContext(Dispatchers.IO) {
sDeviceViewModel?.disconnect(this@MainActivity)
if (sDeviceViewModel?.isConnected() == true)
sDeviceViewModel?.disconnect(this@MainActivity)

}
}
Expand All @@ -606,6 +671,9 @@ class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
mAskChangeOperatorDialog?.dismiss()
mAskForOperatorDialog?.dismiss()
mConfirmFactoryResetDialog?.dismiss()
mFirstDeleteDatabaseDialog?.dismiss()
mSecondDeleteDatabaseDialog?.dismiss()
mAskLocationEnableDialog?.dismiss()

mConnectionHandlerThread.quit()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.Build
import android.os.IBinder
import androidx.core.app.ActivityCompat
import androidx.lifecycle.LiveData
Expand Down Expand Up @@ -54,6 +55,8 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na
//track if device is currently connected
private var mConnected = false

private var mConnectionStarting = false

//track if we have the ref data ready (need this before scanning)
private var mRefDataReady = false

Expand Down Expand Up @@ -92,8 +95,22 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na
mBluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
val adapter = mBluetoothManager?.adapter
val scanner = adapter?.bluetoothLeScanner
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
val connect = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
} else {
true
}
val scan = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED
} else {
true
}

val fine = ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED

val coarse = ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED

if (fine && coarse && connect && scan) {

scanner?.startScan(object: ScanCallback() {

Expand All @@ -106,7 +123,7 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na

val nanoName = getStringPref(context, SharedPreferencesKeys.DeviceFilter, "NIR")

device.name?.let { name ->
result.scanRecord?.deviceName?.let { name ->

if (name.contains(nanoName)) {

Expand All @@ -116,6 +133,8 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na

val nanoDevice = NanoDevice(device, result.rssi, record.bytes)

mConnectionStarting = true

if (sdk.connect(nanoDevice.nanoMac)) {

scanner.stopScan(this)
Expand Down Expand Up @@ -150,25 +169,25 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na

override suspend fun connect(context: Context) {

buildServiceConnection(context).also { conn ->
if (!mConnectionStarting) {

mServiceConnection = conn
buildServiceConnection(context).also { conn ->

val gattService = Intent(context, ISCNIRScanSDK::class.java)
mServiceConnection = conn

context.bindService(gattService, conn, Context.BIND_AUTO_CREATE)
val gattService = Intent(context, ISCNIRScanSDK::class.java)

mNanoReceiver = InnoSpectraBase(this).also {
it.register(context)
context.bindService(gattService, conn, Context.BIND_AUTO_CREATE)

mNanoReceiver = InnoSpectraBase(this).also {
it.register(context)
}
}
}
}

override fun disconnect(context: Context): Int {

mNanoSdk?.sdk?.disconnect()
mNanoSdk?.sdk?.close()

try {
mServiceConnection?.let { conn ->

Expand All @@ -179,12 +198,15 @@ class InnoSpectraViewModel @Inject constructor() : ViewModel(), Spectrometer, Na
e.printStackTrace()
}

mNanoSdk?.sdk?.disconnect()
mNanoSdk?.sdk?.close()
mNanoReceiver?.unregister(context)

refreshConfigs()
mConnected = false
mRefDataReady = false
mBluetoothDevice = null
mConnectionStarting = false

return 1
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
package org.phenoapps.prospector.fragments

import android.os.Build
import android.os.Bundle
import android.util.Base64.NO_WRAP
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.appcompat.view.ContextThemeWrapper
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.preference.ListPreference
import androidx.preference.PreferenceManager
import com.ISCSDK.ISCNIRScanSDK
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.WithFragmentBindings
Expand All @@ -27,9 +21,6 @@ import org.phenoapps.prospector.data.models.Experiment
import org.phenoapps.prospector.data.viewmodels.ExperimentViewModel
import org.phenoapps.prospector.data.viewmodels.devices.InnoSpectraViewModel
import org.phenoapps.prospector.databinding.FragmentNewExperimentBinding
import org.phenoapps.prospector.utils.observeOnce
import java.nio.charset.StandardCharsets
import java.util.*

/**
* A simple data collection fragment that creates experiment models and inserts them into the db.
Expand Down Expand Up @@ -80,6 +71,9 @@ class NewExperimentFragment : Fragment(), CoroutineScope by MainScope() {
setupScanConfigs()
View.VISIBLE
} else View.GONE
mBinding?.fragNewExpLoadingTv?.visibility = if (position == DeviceIndex.NANO.ordinal) {
View.VISIBLE
} else View.GONE
}

override fun onNothingSelected(parent: AdapterView<*>?) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,13 +213,16 @@ class ScanListFragment : ConnectionFragment(R.layout.fragment_scan_list), Corout

sDeviceScope.launch {

insertScan(mSampleName, frames)
withContext(Dispatchers.IO) {

activity?.runOnUiThread {
dialogInterface.dismiss()
checkAudioTriggers()
loadGraph()
mIsScanning = false
insertScan(mSampleName, frames)

activity?.runOnUiThread {
dialogInterface.dismiss()
checkAudioTriggers()
loadGraph()
mIsScanning = false
}
}
}
}
Expand Down Expand Up @@ -782,4 +785,10 @@ class ScanListFragment : ConnectionFragment(R.layout.fragment_scan_list), Corout
(activity as? MainActivity)?.setToolbar(R.id.action_nav_data)

}

override fun onPause() {
super.onPause()

sDeviceScope.cancel()
}
}
Loading

0 comments on commit ce1ce8f

Please sign in to comment.