3131import android .text .TextUtils ;
3232import android .util .Log ;
3333import android .view .View ;
34+ import android .widget .ImageView ;
35+ import android .widget .LinearLayout ;
3436import android .widget .TextView ;
3537import android .widget .Toast ;
3638
3739import androidx .annotation .NonNull ;
3840import androidx .annotation .Nullable ;
3941import androidx .appcompat .app .AlertDialog ;
4042import androidx .appcompat .app .AppCompatActivity ;
41- import androidx .cardview .widget .CardView ;
4243import androidx .core .app .ActivityCompat ;
4344
4445import com .budiyev .android .codescanner .CodeScanner ;
5051import com .espressif .provisioning .ESPProvisionManager ;
5152import com .espressif .provisioning .listeners .QRCodeScanListener ;
5253import com .espressif .wifi_provisioning .R ;
54+ import com .google .android .material .card .MaterialCardView ;
5355import com .wang .avi .AVLoadingIndicatorView ;
5456
5557import org .greenrobot .eventbus .EventBus ;
@@ -69,17 +71,22 @@ public class AddDeviceActivity extends AppCompatActivity {
6971 private static final int REQUEST_ENABLE_BT = 3 ;
7072
7173 private TextView tvTitle , tvBack , tvCancel ;
72- private CardView btnAddManually ;
73- private TextView txtAddManuallyBtn ;
7474 private SharedPreferences sharedPreferences ;
7575
76- private AVLoadingIndicatorView loader ;
77- private Intent intent ;
7876 private ESPDevice espDevice ;
7977 private ESPProvisionManager provisionManager ;
78+
8079 // private CameraSourcePreview cameraPreview;
8180 private CodeScanner codeScanner ;
81+ private MaterialCardView btnAddManually , btnGetPermission ;
82+ private TextView txtAddManuallyBtn ;
83+ private LinearLayout layoutQrCode , layoutPermissionErr ;
84+ private TextView tvPermissionErr ;
85+ private ImageView ivPermissionErr ;
86+ private AVLoadingIndicatorView loader ;
87+
8288 private boolean isQrCodeDataReceived = false ;
89+ private Intent intent ;
8390
8491 @ Override
8592 protected void onCreate (@ Nullable Bundle savedInstanceState ) {
@@ -165,16 +172,42 @@ public void onBackPressed() {
165172 @ Override
166173 public void onRequestPermissionsResult (int requestCode , @ NonNull String [] permissions , @ NonNull int [] grantResults ) {
167174 super .onRequestPermissionsResult (requestCode , permissions , grantResults );
175+ Log .e (TAG , "onRequestPermissionsResult , requestCode : " + requestCode );
176+
177+ if (requestCode == REQUEST_CAMERA_PERMISSION && grantResults .length > 0 ) {
178+ if (grantResults [0 ] == PackageManager .PERMISSION_DENIED ) {
179+ findViewById (R .id .scanner_view ).setVisibility (View .GONE );
180+ layoutQrCode .setVisibility (View .GONE );
181+ layoutPermissionErr .setVisibility (View .VISIBLE );
182+ tvPermissionErr .setText (R .string .error_camera_permission );
183+ ivPermissionErr .setImageResource (R .drawable .ic_no_camera_permission );
184+ } else {
185+ layoutQrCode .setVisibility (View .VISIBLE );
186+ layoutPermissionErr .setVisibility (View .GONE );
187+ openCamera ();
188+ }
189+ } else if (requestCode == REQUEST_ACCESS_FINE_LOCATION && grantResults .length > 0 ) {
168190
169- Log . d ( TAG , "onRequestPermissionsResult , requestCode : " + requestCode ) ;
170-
171- if (requestCode == REQUEST_CAMERA_PERMISSION ) {
172-
173- initialiseDetectorsAndSources () ;
174-
175- } else if ( requestCode == REQUEST_ACCESS_FINE_LOCATION ) {
191+ boolean permissionGranted = true ;
192+ for ( int grantResult : grantResults ) {
193+ if (grantResult == PackageManager . PERMISSION_DENIED ) {
194+ Log . e ( TAG , "User has denied permission" );
195+ permissionGranted = false ;
196+ }
197+ }
176198
177- initialiseDetectorsAndSources ();
199+ if (!permissionGranted ) {
200+ findViewById (R .id .scanner_view ).setVisibility (View .GONE );
201+ layoutQrCode .setVisibility (View .GONE );
202+ layoutPermissionErr .setVisibility (View .VISIBLE );
203+ tvPermissionErr .setText (R .string .error_location_permission );
204+ ivPermissionErr .setImageResource (R .drawable .ic_no_location_permission );
205+ } else {
206+ findViewById (R .id .scanner_view ).setVisibility (View .VISIBLE );
207+ layoutQrCode .setVisibility (View .VISIBLE );
208+ layoutPermissionErr .setVisibility (View .GONE );
209+ scanQrCode ();
210+ }
178211 }
179212 }
180213
@@ -244,7 +277,17 @@ public void onClick(View v) {
244277
245278 if (!bleAdapter .isEnabled ()) {
246279 Intent enableBtIntent = new Intent (BluetoothAdapter .ACTION_REQUEST_ENABLE );
247- startActivityForResult (enableBtIntent , REQUEST_ENABLE_BT );
280+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
281+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .BLUETOOTH_CONNECT ) == PackageManager .PERMISSION_GRANTED ) {
282+ startActivityForResult (enableBtIntent , REQUEST_ENABLE_BT );
283+ } else {
284+ Log .e (TAG , "BLUETOOTH_CONNECT permission is not granted." );
285+ return ;
286+ }
287+ } else {
288+ startActivityForResult (enableBtIntent , REQUEST_ENABLE_BT );
289+ }
290+
248291 } else {
249292 startProvisioningFlow ();
250293 }
@@ -267,6 +310,37 @@ public void onClick(View v) {
267310 }
268311 };
269312
313+ private View .OnClickListener btnGetPermissionClickListener = new View .OnClickListener () {
314+
315+ @ Override
316+ public void onClick (View v ) {
317+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .CAMERA ) != PackageManager .PERMISSION_GRANTED ) {
318+
319+ ActivityCompat .requestPermissions (AddDeviceActivity .this , new
320+ String []{Manifest .permission .CAMERA }, REQUEST_CAMERA_PERMISSION );
321+
322+ } else {
323+
324+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
325+
326+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED
327+ || ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .BLUETOOTH_SCAN ) != PackageManager .PERMISSION_GRANTED
328+ || ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .BLUETOOTH_CONNECT ) != PackageManager .PERMISSION_GRANTED ) {
329+
330+ ActivityCompat .requestPermissions (AddDeviceActivity .this , new String []{Manifest .permission .ACCESS_FINE_LOCATION ,
331+ Manifest .permission .BLUETOOTH_SCAN ,
332+ Manifest .permission .BLUETOOTH_CONNECT }, REQUEST_ACCESS_FINE_LOCATION );
333+ }
334+ } else {
335+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
336+ ActivityCompat .requestPermissions (AddDeviceActivity .this , new
337+ String []{Manifest .permission .ACCESS_FINE_LOCATION }, REQUEST_ACCESS_FINE_LOCATION );
338+ }
339+ }
340+ }
341+ }
342+ };
343+
270344 private void initViews () {
271345
272346 tvTitle = findViewById (R .id .main_toolbar_title );
@@ -282,49 +356,56 @@ private void initViews() {
282356 codeScanner = new CodeScanner (this , scannerView );
283357
284358// cameraPreview = findViewById(R.id.preview);
285- btnAddManually = findViewById (R .id .btn_add_device_manually );
286- txtAddManuallyBtn = findViewById (R .id .text_btn );
287359 loader = findViewById (R .id .loader );
360+ layoutQrCode = findViewById (R .id .layout_qr_code_txt );
361+ layoutPermissionErr = findViewById (R .id .layout_permission_error );
362+ tvPermissionErr = findViewById (R .id .tv_permission_error );
363+ ivPermissionErr = findViewById (R .id .iv_permission_error );
288364
365+ btnAddManually = findViewById (R .id .btn_add_device_manually );
366+ txtAddManuallyBtn = btnAddManually .findViewById (R .id .text_btn );
289367 txtAddManuallyBtn .setText (R .string .btn_no_qr_code );
290368 btnAddManually .setOnClickListener (btnAddManuallyClickListener );
291369
292- initialiseDetectorsAndSources ( );
293- }
294-
295- private void initialiseDetectorsAndSources () {
370+ btnGetPermission = findViewById ( R . id . btn_get_permission );
371+ TextView btnPermissionText = btnGetPermission . findViewById ( R . id . text_btn );
372+ btnPermissionText . setText ( R . string . btn_get_permission );
373+ btnGetPermission . setOnClickListener ( btnGetPermissionClickListener );
296374
297- if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .CAMERA ) == PackageManager .PERMISSION_GRANTED
298- && ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_FINE_LOCATION ) == PackageManager .PERMISSION_GRANTED
299- && ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_COARSE_LOCATION ) == PackageManager .PERMISSION_GRANTED ) {
300-
301- provisionManager .scanQRCode (codeScanner , qrCodeScanListener );
302- // cameraPreview.setVisibility(View.VISIBLE);
303- findViewById (R .id .scanner_view ).setVisibility (View .VISIBLE );
304-
305- if (codeScanner != null ) {
306- codeScanner .startPreview ();
307- }
375+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .CAMERA ) == PackageManager .PERMISSION_GRANTED ) {
376+ openCamera ();
308377 } else {
309- Log . e ( TAG , "All permissions are not granted." );
310- askForPermissions ( );
378+ ActivityCompat . requestPermissions ( AddDeviceActivity . this , new
379+ String []{ Manifest . permission . CAMERA }, REQUEST_CAMERA_PERMISSION );
311380 }
312381 }
313382
314- private void askForPermissions () {
315-
316- if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .CAMERA ) != PackageManager .PERMISSION_GRANTED ) {
317-
318- ActivityCompat .requestPermissions (AddDeviceActivity .this , new String []{Manifest .permission .CAMERA }, REQUEST_CAMERA_PERMISSION );
383+ private void openCamera () {
384+ findViewById (R .id .scanner_view ).setVisibility (View .VISIBLE );
385+ if (codeScanner != null ) {
386+ codeScanner .startPreview ();
387+ }
388+ scanQrCode ();
389+ }
319390
320- } else if ( ActivityCompat . checkSelfPermission ( this , Manifest . permission . ACCESS_FINE_LOCATION ) != PackageManager . PERMISSION_GRANTED ) {
391+ private void scanQrCode ( ) {
321392
322- ActivityCompat .requestPermissions (AddDeviceActivity .this , new
323- String []{Manifest .permission .ACCESS_FINE_LOCATION }, REQUEST_ACCESS_FINE_LOCATION );
324- } else if (ActivityCompat .checkSelfPermission (this , Manifest .permission .ACCESS_COARSE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
325-
326- ActivityCompat .requestPermissions (AddDeviceActivity .this , new
327- String []{Manifest .permission .ACCESS_COARSE_LOCATION }, REQUEST_ACCESS_FINE_LOCATION );
393+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
394+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .ACCESS_FINE_LOCATION ) == PackageManager .PERMISSION_GRANTED
395+ && ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .BLUETOOTH_SCAN ) == PackageManager .PERMISSION_GRANTED
396+ && ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .BLUETOOTH_CONNECT ) == PackageManager .PERMISSION_GRANTED ) {
397+ provisionManager .scanQRCode (codeScanner , qrCodeScanListener );
398+ } else {
399+ ActivityCompat .requestPermissions (AddDeviceActivity .this , new
400+ String []{Manifest .permission .ACCESS_FINE_LOCATION , Manifest .permission .BLUETOOTH_SCAN , Manifest .permission .BLUETOOTH_CONNECT }, REQUEST_ACCESS_FINE_LOCATION );
401+ }
402+ } else {
403+ if (ActivityCompat .checkSelfPermission (AddDeviceActivity .this , Manifest .permission .ACCESS_FINE_LOCATION ) == PackageManager .PERMISSION_GRANTED ) {
404+ provisionManager .scanQRCode (codeScanner , qrCodeScanListener );
405+ } else {
406+ ActivityCompat .requestPermissions (AddDeviceActivity .this , new
407+ String []{Manifest .permission .ACCESS_FINE_LOCATION }, REQUEST_ACCESS_FINE_LOCATION );
408+ }
328409 }
329410 }
330411
0 commit comments