react-native-mytatva-rn-sdk 1.2.43 → 1.2.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/mytatvarnsdk/activity/ConnectSensorActivity.kt +23 -6
- package/android/src/main/java/com/mytatvarnsdk/activity/HelpActivity.kt +118 -59
- package/android/src/main/java/com/mytatvarnsdk/activity/PermissionActivity.kt +384 -321
- package/android/src/main/java/com/mytatvarnsdk/activity/PlaceSensorActivity.kt +50 -1
- package/android/src/main/java/com/mytatvarnsdk/activity/PlaceTransmitterActivity.kt +13 -5
- package/android/src/main/java/com/mytatvarnsdk/activity/SearchTransmitterActivity.kt +72 -52
- package/android/src/main/java/com/mytatvarnsdk/activity/SensorConnectSuccessActivity.kt +52 -1
- package/android/src/main/java/com/mytatvarnsdk/activity/StartCGMActivity.kt +53 -1
- package/package.json +1 -1
|
@@ -29,337 +29,400 @@ import androidx.core.graphics.drawable.toDrawable
|
|
|
29
29
|
import androidx.core.view.ViewCompat
|
|
30
30
|
import androidx.core.view.WindowInsetsCompat
|
|
31
31
|
import cgmblelib.utils.ConstantsLibrary
|
|
32
|
+
import com.facebook.react.bridge.Arguments
|
|
33
|
+
import com.facebook.react.bridge.CatalystInstance
|
|
34
|
+
import com.facebook.react.bridge.WritableMap
|
|
35
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
36
|
+
import com.mytatvarnsdk.CgmTrackyLibModule
|
|
32
37
|
import com.mytatvarnsdk.base.BasePermissionActivity
|
|
33
38
|
import com.mytatvarnsdk.databinding.ActivityPermissionBinding
|
|
34
39
|
import com.mytatvarnsdk.databinding.BluetoothDialogBottomsheetBinding
|
|
35
40
|
import com.mytatvarnsdk.databinding.ExitDialogBottomsheetBinding
|
|
41
|
+
import org.json.JSONObject
|
|
36
42
|
|
|
37
43
|
class PermissionActivity : BasePermissionActivity() {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
private val REQUEST_ENABLE_BT = 1
|
|
43
|
-
private val bluetoothAdapter: BluetoothAdapter? by lazy {
|
|
44
|
-
BluetoothAdapter.getDefaultAdapter()
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
override fun onCreate(savedInstanceState: Bundle?) {
|
|
48
|
-
super.onCreate(savedInstanceState)
|
|
49
|
-
binding = ActivityPermissionBinding.inflate(layoutInflater)
|
|
50
|
-
|
|
51
|
-
enableEdgeToEdge()
|
|
52
|
-
ViewCompat.setOnApplyWindowInsetsListener(binding.rlPopBottom) { v, insets ->
|
|
53
|
-
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
54
|
-
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
|
55
|
-
insets
|
|
56
|
-
}
|
|
57
|
-
setContentView(binding.root)
|
|
58
|
-
|
|
59
|
-
initialize()
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
override fun getPermission(): Array<out Array<out String?>?>? {
|
|
63
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
64
|
-
return arrayOf<Array<String?>?>(ConstantsLibrary.BLUETOOTH_S)
|
|
65
|
-
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
66
|
-
return arrayOf<Array<String?>?>(
|
|
67
|
-
ConstantsLibrary.LOCAL_PERMISSION,
|
|
68
|
-
ConstantsLibrary.BACKGROUND_LOCATION_Q
|
|
69
|
-
)
|
|
70
|
-
} else {
|
|
71
|
-
return arrayOf<Array<String?>?>(ConstantsLibrary.LOCAL_PERMISSION)
|
|
72
|
-
}
|
|
73
|
-
}
|
|
44
|
+
private lateinit var binding: ActivityPermissionBinding
|
|
45
|
+
private val LOCATION_REQUEST_CODE = 101
|
|
46
|
+
private val BLUETOOTH_REQUEST_CODE = 102
|
|
74
47
|
|
|
75
|
-
|
|
76
|
-
|
|
48
|
+
private val REQUEST_ENABLE_BT = 1
|
|
49
|
+
private val bluetoothAdapter: BluetoothAdapter? by lazy {
|
|
50
|
+
BluetoothAdapter.getDefaultAdapter()
|
|
51
|
+
}
|
|
52
|
+
private val reactContext = CgmTrackyLibModule.mReactContext
|
|
77
53
|
|
|
78
|
-
|
|
79
|
-
|
|
54
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
55
|
+
super.onCreate(savedInstanceState)
|
|
56
|
+
binding = ActivityPermissionBinding.inflate(layoutInflater)
|
|
80
57
|
|
|
81
|
-
|
|
82
|
-
|
|
58
|
+
enableEdgeToEdge()
|
|
59
|
+
ViewCompat.setOnApplyWindowInsetsListener(binding.rlPopBottom) { v, insets ->
|
|
60
|
+
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
61
|
+
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
|
62
|
+
insets
|
|
63
|
+
}
|
|
64
|
+
setContentView(binding.root)
|
|
83
65
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
val connectPermission = ContextCompat.checkSelfPermission(
|
|
87
|
-
context,
|
|
88
|
-
android.Manifest.permission.BLUETOOTH_CONNECT
|
|
89
|
-
) == PackageManager.PERMISSION_GRANTED
|
|
66
|
+
initialize()
|
|
67
|
+
}
|
|
90
68
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
69
|
+
override fun getPermission(): Array<out Array<out String?>?>? {
|
|
70
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
71
|
+
return arrayOf<Array<String?>?>(ConstantsLibrary.BLUETOOTH_S)
|
|
72
|
+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
73
|
+
return arrayOf<Array<String?>?>(
|
|
74
|
+
ConstantsLibrary.LOCAL_PERMISSION,
|
|
75
|
+
ConstantsLibrary.BACKGROUND_LOCATION_Q
|
|
76
|
+
)
|
|
77
|
+
} else {
|
|
78
|
+
return arrayOf<Array<String?>?>(ConstantsLibrary.LOCAL_PERMISSION)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
95
81
|
|
|
96
|
-
|
|
97
|
-
} else {
|
|
98
|
-
// For Android 11 and below, permission is granted at install time
|
|
99
|
-
true
|
|
82
|
+
override fun onPermissionRequestSuccess() {
|
|
100
83
|
}
|
|
101
|
-
}
|
|
102
84
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
context,
|
|
106
|
-
android.Manifest.permission.ACCESS_FINE_LOCATION
|
|
107
|
-
) == PackageManager.PERMISSION_GRANTED
|
|
85
|
+
override fun onPermissionRequestFail(vararg permission: String?) {
|
|
86
|
+
}
|
|
108
87
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
android.Manifest.permission.ACCESS_COARSE_LOCATION
|
|
112
|
-
) == PackageManager.PERMISSION_GRANTED
|
|
88
|
+
override fun onPermissionRequestFailForever(vararg permission: String?) {
|
|
89
|
+
}
|
|
113
90
|
|
|
114
|
-
|
|
115
|
-
|
|
91
|
+
fun isBluetoothPermissionGranted(context: Context): Boolean {
|
|
92
|
+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
93
|
+
val connectPermission = ContextCompat.checkSelfPermission(
|
|
94
|
+
context,
|
|
95
|
+
android.Manifest.permission.BLUETOOTH_CONNECT
|
|
96
|
+
) == PackageManager.PERMISSION_GRANTED
|
|
116
97
|
|
|
98
|
+
val scanPermission = ContextCompat.checkSelfPermission(
|
|
99
|
+
context,
|
|
100
|
+
android.Manifest.permission.BLUETOOTH_SCAN
|
|
101
|
+
) == PackageManager.PERMISSION_GRANTED
|
|
117
102
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
103
|
+
connectPermission && scanPermission
|
|
104
|
+
} else {
|
|
105
|
+
// For Android 11 and below, permission is granted at install time
|
|
106
|
+
true
|
|
107
|
+
}
|
|
122
108
|
}
|
|
123
109
|
|
|
124
|
-
|
|
110
|
+
fun isLocationPermissionGranted(context: Context): Boolean {
|
|
111
|
+
val fineLocationGranted = ContextCompat.checkSelfPermission(
|
|
112
|
+
context,
|
|
113
|
+
android.Manifest.permission.ACCESS_FINE_LOCATION
|
|
114
|
+
) == PackageManager.PERMISSION_GRANTED
|
|
125
115
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
116
|
+
val coarseLocationGranted = ContextCompat.checkSelfPermission(
|
|
117
|
+
context,
|
|
118
|
+
android.Manifest.permission.ACCESS_COARSE_LOCATION
|
|
119
|
+
) == PackageManager.PERMISSION_GRANTED
|
|
131
120
|
|
|
132
|
-
|
|
133
|
-
if (isChecked) {
|
|
134
|
-
requestLocationPermission()
|
|
135
|
-
}
|
|
121
|
+
return fineLocationGranted || coarseLocationGranted
|
|
136
122
|
}
|
|
137
123
|
|
|
138
|
-
binding.commonButton.btnProceed.setOnClickListener {
|
|
139
|
-
startActivity(
|
|
140
|
-
Intent(this@PermissionActivity, SearchTransmitterActivity::class.java).putExtra(
|
|
141
|
-
"IsForReconnect",
|
|
142
|
-
intent.getBooleanExtra("IsForReconnect", false)
|
|
143
|
-
)
|
|
144
|
-
)
|
|
145
|
-
finish()
|
|
146
|
-
}
|
|
147
124
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
125
|
+
@SuppressLint("MissingPermission")
|
|
126
|
+
private fun initialize() {
|
|
127
|
+
sendDataToRN("", "cgm_permissions_page_landing")
|
|
151
128
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
)
|
|
156
|
-
}
|
|
129
|
+
bluetoothAdapter?.let {
|
|
130
|
+
binding.switchBluetooth.isChecked = isBluetoothPermissionGranted(this) && it.isEnabled
|
|
131
|
+
}
|
|
157
132
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
133
|
+
binding.switchLocation.isChecked = isLocationPermissionGranted(this)
|
|
134
|
+
|
|
135
|
+
binding.switchBluetooth.setOnCheckedChangeListener { _, isChecked ->
|
|
136
|
+
if (isChecked) {
|
|
137
|
+
requestBluetoothPermission()
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
binding.switchLocation.setOnCheckedChangeListener { _, isChecked ->
|
|
142
|
+
if (isChecked) {
|
|
143
|
+
requestLocationPermission()
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
binding.commonButton.btnProceed.setOnClickListener {
|
|
148
|
+
val jsonObject = JSONObject()
|
|
149
|
+
jsonObject.put("bluetooth_toggle_status", "ON")
|
|
150
|
+
jsonObject.put("location_toggle_status", "ON")
|
|
151
|
+
sendDataToRN(jsonObject.toString(), "cgm_permissions_proceed_clicked")
|
|
152
|
+
|
|
153
|
+
startActivity(
|
|
154
|
+
Intent(this@PermissionActivity, SearchTransmitterActivity::class.java).putExtra(
|
|
155
|
+
"IsForReconnect",
|
|
156
|
+
intent.getBooleanExtra("IsForReconnect", false)
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
finish()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
binding.toolbar.btnWhatsapp.setOnClickListener {
|
|
163
|
+
startActivity(
|
|
164
|
+
Intent(this, HelpActivity::class.java)
|
|
165
|
+
.putExtra("ScreenName", "Permission Screen")
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
binding.toolbar.btnWatchDemo.setOnClickListener {
|
|
170
|
+
sendDataToRN("", "cgm_watch_demo_clicked")
|
|
171
|
+
|
|
172
|
+
startActivity(
|
|
173
|
+
Intent(this, VideoActivity::class.java).putExtra("VideoId", "r5Zemc4R044")
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
binding.tvKnowMore.setOnClickListener {
|
|
178
|
+
openBluetoothDialog()
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
binding.toolbar.btnClose.setOnClickListener {
|
|
182
|
+
openExitDialog()
|
|
183
|
+
}
|
|
161
184
|
|
|
162
|
-
|
|
163
|
-
|
|
185
|
+
val callback: OnBackPressedCallback = object : OnBackPressedCallback(true) {
|
|
186
|
+
override fun handleOnBackPressed() {
|
|
187
|
+
openExitDialog()
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
onBackPressedDispatcher.addCallback(this, callback)
|
|
164
191
|
}
|
|
165
192
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
193
|
+
private fun sendDataToRN(data: String, status: String) {
|
|
194
|
+
if (reactContext != null) {
|
|
195
|
+
try {
|
|
196
|
+
val catalystInstance: CatalystInstance = reactContext.catalystInstance
|
|
197
|
+
val module = catalystInstance.getNativeModule(CgmTrackyLibModule::class.java)
|
|
198
|
+
|
|
199
|
+
if (module == null) {
|
|
200
|
+
sendDataToRNDirectly(data, status)
|
|
201
|
+
Log.d("sendDataToRN: ", "Module null")
|
|
202
|
+
} else {
|
|
203
|
+
module.sendDataToReact(data, status, "cgmDeviceEvent")
|
|
204
|
+
Log.d("sendDataToRN: ", "Module is not null")
|
|
205
|
+
}
|
|
206
|
+
} catch (e: Exception) {
|
|
207
|
+
Log.e("sendDataToRN: Error ", e.message.toString())
|
|
208
|
+
}
|
|
209
|
+
} else {
|
|
210
|
+
Log.e("TrackyActivity", "ReactApplicationContext is null")
|
|
211
|
+
}
|
|
170
212
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
binding.tvKnowMore.setOnClickListener {
|
|
187
|
-
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
|
|
188
|
-
data = Uri.fromParts("package", packageName, null)
|
|
189
|
-
}
|
|
190
|
-
startActivity(intent)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
private fun sendDataToRNDirectly(data: String, status: String) {
|
|
216
|
+
try {
|
|
217
|
+
val map: WritableMap = Arguments.createMap().apply {
|
|
218
|
+
putString("data", data)
|
|
219
|
+
putString("status", status)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
reactContext?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
223
|
+
?.emit("cgmDeviceEvent", map)
|
|
224
|
+
} catch (e: Exception) {
|
|
225
|
+
Log.e("sendDataToRNDirectly", "Error sending data to React", e)
|
|
226
|
+
}
|
|
191
227
|
}
|
|
192
228
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
})
|
|
229
|
+
private fun openBluetoothDialog() {
|
|
230
|
+
val binding = BluetoothDialogBottomsheetBinding.inflate(layoutInflater)
|
|
196
231
|
|
|
197
|
-
|
|
198
|
-
|
|
232
|
+
val dialog = Dialog(this)
|
|
233
|
+
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
|
|
234
|
+
dialog.setContentView(binding.root)
|
|
199
235
|
|
|
200
|
-
|
|
201
|
-
|
|
236
|
+
val window = dialog.window
|
|
237
|
+
window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
|
238
|
+
window?.setGravity(Gravity.BOTTOM)
|
|
239
|
+
window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
|
|
202
240
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
241
|
+
binding.tvKnowMore.setOnClickListener {
|
|
242
|
+
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
|
|
243
|
+
data = Uri.fromParts("package", packageName, null)
|
|
244
|
+
}
|
|
245
|
+
startActivity(intent)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
binding.closeButton.setOnClickListener(View.OnClickListener { v: View? ->
|
|
249
|
+
dialog.dismiss()
|
|
250
|
+
})
|
|
206
251
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
window?.setGravity(Gravity.BOTTOM)
|
|
210
|
-
window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
|
|
252
|
+
dialog.show()
|
|
253
|
+
}
|
|
211
254
|
|
|
212
|
-
|
|
255
|
+
private fun openExitDialog() {
|
|
256
|
+
val binding = ExitDialogBottomsheetBinding.inflate(layoutInflater)
|
|
213
257
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
})
|
|
258
|
+
val dialog = Dialog(this)
|
|
259
|
+
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
|
|
260
|
+
dialog.setContentView(binding.root)
|
|
218
261
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
262
|
+
val window = dialog.window
|
|
263
|
+
window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
|
264
|
+
window?.setGravity(Gravity.BOTTOM)
|
|
265
|
+
window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
|
|
222
266
|
|
|
223
|
-
|
|
224
|
-
dialog.dismiss()
|
|
225
|
-
})
|
|
267
|
+
binding.btnExit.tvProceed.text = "Exit"
|
|
226
268
|
|
|
227
|
-
|
|
228
|
-
|
|
269
|
+
binding.btnExit.root.setOnClickListener(View.OnClickListener { v: View? ->
|
|
270
|
+
finish()
|
|
271
|
+
dialog.dismiss()
|
|
272
|
+
})
|
|
229
273
|
|
|
274
|
+
binding.btnCancel.root.setOnClickListener(View.OnClickListener { v: View? ->
|
|
275
|
+
dialog.dismiss()
|
|
276
|
+
})
|
|
230
277
|
|
|
231
|
-
|
|
232
|
-
|
|
278
|
+
binding.closeButton.setOnClickListener(View.OnClickListener { v: View? ->
|
|
279
|
+
dialog.dismiss()
|
|
280
|
+
})
|
|
233
281
|
|
|
234
|
-
|
|
235
|
-
onForegroundLocationGranted()
|
|
236
|
-
} else {
|
|
237
|
-
ActivityCompat.requestPermissions(
|
|
238
|
-
this,
|
|
239
|
-
locationPermissions,
|
|
240
|
-
LOCATION_REQUEST_CODE
|
|
241
|
-
)
|
|
282
|
+
dialog.show()
|
|
242
283
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
if (rationaleNeeded) {
|
|
258
|
-
showPermissionRationale(
|
|
259
|
-
title = "Location Permission Needed",
|
|
260
|
-
message = "We need location access for Bluetooth scanning.",
|
|
261
|
-
onProceed = {
|
|
262
|
-
ActivityCompat.requestPermissions(this, permissionArray, LOCATION_REQUEST_CODE)
|
|
263
|
-
}
|
|
264
|
-
)
|
|
265
|
-
} else {
|
|
266
|
-
ActivityCompat.requestPermissions(this, permissionArray, LOCATION_REQUEST_CODE)
|
|
267
|
-
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
private fun requestForegroundLocationPermission() {
|
|
287
|
+
val locationPermissions = PermissionUtils.LOCAL_PERMISSION
|
|
288
|
+
|
|
289
|
+
if (hasPermissions(locationPermissions)) {
|
|
290
|
+
onForegroundLocationGranted()
|
|
291
|
+
} else {
|
|
292
|
+
ActivityCompat.requestPermissions(
|
|
293
|
+
this,
|
|
294
|
+
locationPermissions,
|
|
295
|
+
LOCATION_REQUEST_CODE
|
|
296
|
+
)
|
|
297
|
+
}
|
|
268
298
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
299
|
+
|
|
300
|
+
private fun requestLocationPermission() {
|
|
301
|
+
val permissions = mutableListOf(*PermissionUtils.LOCAL_PERMISSION)
|
|
302
|
+
|
|
303
|
+
val permissionArray = permissions.toTypedArray()
|
|
304
|
+
|
|
305
|
+
if (hasPermissions(permissionArray)) {
|
|
306
|
+
onLocationPermissionGranted()
|
|
307
|
+
} else {
|
|
308
|
+
val rationaleNeeded = permissionArray.any {
|
|
309
|
+
ActivityCompat.shouldShowRequestPermissionRationale(this, it)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (rationaleNeeded) {
|
|
313
|
+
showPermissionRationale(
|
|
314
|
+
title = "Location Permission Needed",
|
|
315
|
+
message = "We need location access for Bluetooth scanning.",
|
|
316
|
+
onProceed = {
|
|
317
|
+
ActivityCompat.requestPermissions(
|
|
318
|
+
this,
|
|
319
|
+
permissionArray,
|
|
320
|
+
LOCATION_REQUEST_CODE
|
|
321
|
+
)
|
|
322
|
+
}
|
|
323
|
+
)
|
|
324
|
+
} else {
|
|
325
|
+
ActivityCompat.requestPermissions(this, permissionArray, LOCATION_REQUEST_CODE)
|
|
326
|
+
}
|
|
281
327
|
}
|
|
328
|
+
}
|
|
282
329
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
330
|
+
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
|
|
331
|
+
private fun requestBluetoothPermission() {
|
|
332
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
333
|
+
val permissions = PermissionUtils.BLUETOOTH_S
|
|
334
|
+
|
|
335
|
+
if (hasPermissions(permissions)) {
|
|
336
|
+
onBluetoothPermissionGranted()
|
|
337
|
+
} else {
|
|
338
|
+
val rationaleNeeded = permissions.any {
|
|
339
|
+
ActivityCompat.shouldShowRequestPermissionRationale(this, it)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (rationaleNeeded) {
|
|
343
|
+
showPermissionRationale(
|
|
344
|
+
title = "Bluetooth Permission Needed",
|
|
345
|
+
message = "We need Bluetooth access to connect your device.",
|
|
346
|
+
onProceed = {
|
|
347
|
+
ActivityCompat.requestPermissions(
|
|
348
|
+
this,
|
|
349
|
+
permissions,
|
|
350
|
+
BLUETOOTH_REQUEST_CODE
|
|
351
|
+
)
|
|
352
|
+
}
|
|
353
|
+
)
|
|
354
|
+
} else {
|
|
355
|
+
ActivityCompat.requestPermissions(this, permissions, BLUETOOTH_REQUEST_CODE)
|
|
356
|
+
}
|
|
289
357
|
}
|
|
290
|
-
)
|
|
291
358
|
} else {
|
|
292
|
-
|
|
359
|
+
onBluetoothPermissionGranted()
|
|
293
360
|
}
|
|
294
|
-
}
|
|
295
|
-
} else {
|
|
296
|
-
onBluetoothPermissionGranted()
|
|
297
361
|
}
|
|
298
|
-
}
|
|
299
362
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
363
|
+
private fun showPermissionRationale(title: String, message: String, onProceed: () -> Unit) {
|
|
364
|
+
AlertDialog.Builder(this)
|
|
365
|
+
.setTitle(title)
|
|
366
|
+
.setMessage(message)
|
|
367
|
+
.setPositiveButton("OK") { _, _ -> onProceed() }
|
|
368
|
+
.setNegativeButton("Cancel", null)
|
|
369
|
+
.show()
|
|
370
|
+
}
|
|
308
371
|
|
|
309
372
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
373
|
+
private fun hasPermissions(permissions: Array<String>): Boolean {
|
|
374
|
+
return permissions.all {
|
|
375
|
+
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
|
|
376
|
+
}
|
|
313
377
|
}
|
|
314
|
-
}
|
|
315
378
|
|
|
316
|
-
|
|
317
|
-
|
|
379
|
+
private fun areAllPermissionsGranted(): Boolean {
|
|
380
|
+
val requiredPermissions = mutableListOf<String>()
|
|
318
381
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
382
|
+
// Add Bluetooth permissions
|
|
383
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
384
|
+
requiredPermissions.addAll(PermissionUtils.BLUETOOTH_S)
|
|
385
|
+
}
|
|
323
386
|
|
|
324
|
-
|
|
325
|
-
|
|
387
|
+
// Add location permissions
|
|
388
|
+
requiredPermissions.addAll(PermissionUtils.LOCAL_PERMISSION)
|
|
326
389
|
|
|
327
|
-
|
|
328
|
-
|
|
390
|
+
return requiredPermissions.all {
|
|
391
|
+
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
|
|
392
|
+
}
|
|
329
393
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
394
|
+
|
|
395
|
+
private fun updateProceedButtonState() {
|
|
396
|
+
if (areAllPermissionsGranted() && bluetoothAdapter!!.isEnabled) {
|
|
397
|
+
binding.commonButton.btnProceed.alpha = 1f
|
|
398
|
+
binding.commonButton.btnProceed.isEnabled = true
|
|
399
|
+
} else {
|
|
400
|
+
binding.commonButton.btnProceed.alpha = 0.5f
|
|
401
|
+
binding.commonButton.btnProceed.isEnabled = false
|
|
402
|
+
}
|
|
339
403
|
}
|
|
340
|
-
}
|
|
341
404
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
405
|
+
private fun onForegroundLocationGranted() {
|
|
406
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
|
|
407
|
+
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
|
|
408
|
+
!= PackageManager.PERMISSION_GRANTED
|
|
409
|
+
) {
|
|
410
|
+
onLocationPermissionGranted()
|
|
411
|
+
} else {
|
|
412
|
+
Log.d("Permission", "All location permissions granted")
|
|
413
|
+
}
|
|
350
414
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
when (requestCode) {
|
|
415
|
+
|
|
416
|
+
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
|
|
417
|
+
override fun onRequestPermissionsResult(
|
|
418
|
+
requestCode: Int,
|
|
419
|
+
permissions: Array<out String>,
|
|
420
|
+
grantResults: IntArray
|
|
421
|
+
) {
|
|
422
|
+
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
|
423
|
+
val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
|
|
424
|
+
|
|
425
|
+
when (requestCode) {
|
|
363
426
|
// LOCATION_REQUEST_CODE -> {
|
|
364
427
|
// if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
|
|
365
428
|
// onForegroundLocationGranted()
|
|
@@ -368,71 +431,71 @@ class PermissionActivity : BasePermissionActivity() {
|
|
|
368
431
|
// }
|
|
369
432
|
// }
|
|
370
433
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
434
|
+
LOCATION_REQUEST_CODE -> {
|
|
435
|
+
if (allGranted) {
|
|
436
|
+
onLocationPermissionGranted()
|
|
437
|
+
}
|
|
438
|
+
}
|
|
376
439
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
440
|
+
BLUETOOTH_REQUEST_CODE -> {
|
|
441
|
+
if (allGranted) {
|
|
442
|
+
onBluetoothPermissionGranted()
|
|
443
|
+
}
|
|
444
|
+
}
|
|
380
445
|
}
|
|
381
|
-
|
|
446
|
+
updateProceedButtonState()
|
|
382
447
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
updateProceedButtonState()
|
|
388
|
-
// Start location-based action
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
|
|
392
|
-
private fun onBluetoothPermissionGranted() {
|
|
393
|
-
if (bluetoothAdapter == null) {
|
|
394
|
-
Toast.makeText(this, "Bluetooth not supported", Toast.LENGTH_SHORT).show()
|
|
395
|
-
} else {
|
|
396
|
-
if (!bluetoothAdapter!!.isEnabled) {
|
|
397
|
-
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
|
|
398
|
-
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
|
|
399
|
-
}
|
|
448
|
+
|
|
449
|
+
private fun onLocationPermissionGranted() {
|
|
450
|
+
updateProceedButtonState()
|
|
451
|
+
// Start location-based action
|
|
400
452
|
}
|
|
401
453
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
454
|
+
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
|
|
455
|
+
private fun onBluetoothPermissionGranted() {
|
|
456
|
+
if (bluetoothAdapter == null) {
|
|
457
|
+
Toast.makeText(this, "Bluetooth not supported", Toast.LENGTH_SHORT).show()
|
|
458
|
+
} else {
|
|
459
|
+
if (!bluetoothAdapter!!.isEnabled) {
|
|
460
|
+
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
|
|
461
|
+
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
|
|
462
|
+
}
|
|
463
|
+
}
|
|
405
464
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
465
|
+
updateProceedButtonState()
|
|
466
|
+
// Start Bluetooth device scan or connect
|
|
467
|
+
}
|
|
410
468
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
if (requestCode == REQUEST_ENABLE_BT) {
|
|
414
|
-
if (resultCode == RESULT_OK) {
|
|
469
|
+
override fun onResume() {
|
|
470
|
+
super.onResume()
|
|
415
471
|
updateProceedButtonState()
|
|
416
|
-
}
|
|
417
472
|
}
|
|
418
|
-
|
|
473
|
+
|
|
474
|
+
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
475
|
+
super.onActivityResult(requestCode, resultCode, data)
|
|
476
|
+
if (requestCode == REQUEST_ENABLE_BT) {
|
|
477
|
+
if (resultCode == RESULT_OK) {
|
|
478
|
+
updateProceedButtonState()
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
419
482
|
}
|
|
420
483
|
|
|
421
484
|
object PermissionUtils {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
485
|
+
@RequiresApi(Build.VERSION_CODES.S)
|
|
486
|
+
val BLUETOOTH_S = arrayOf(
|
|
487
|
+
Manifest.permission.BLUETOOTH_ADVERTISE,
|
|
488
|
+
Manifest.permission.BLUETOOTH_CONNECT,
|
|
489
|
+
Manifest.permission.BLUETOOTH_SCAN
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
val LOCAL_PERMISSION = arrayOf(
|
|
493
|
+
Manifest.permission.ACCESS_FINE_LOCATION,
|
|
494
|
+
Manifest.permission.ACCESS_COARSE_LOCATION
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
val CAMERA_PERMISSION = arrayOf(
|
|
499
|
+
Manifest.permission.CAMERA
|
|
500
|
+
)
|
|
438
501
|
}
|