From 1df58041a291d451438f67366c7c1605f2461fa9 Mon Sep 17 00:00:00 2001 From: Norbel Ambanumben Date: Sat, 18 Jan 2025 20:04:06 +0100 Subject: feat: replace `mlkit` with `zxing` --- .../activities/scanner/ScannerActivity.java | 183 --------------------- .../fragments/ProviderSelectionFragment.java | 37 +++-- 2 files changed, 22 insertions(+), 198 deletions(-) delete mode 100644 app/src/main/java/se/leap/bitmaskclient/providersetup/activities/scanner/ScannerActivity.java (limited to 'app/src/main/java/se') diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/scanner/ScannerActivity.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/scanner/ScannerActivity.java deleted file mode 100644 index 1d828d8c..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/scanner/ScannerActivity.java +++ /dev/null @@ -1,183 +0,0 @@ -package se.leap.bitmaskclient.providersetup.activities.scanner; - -import static androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM; -import static androidx.camera.core.ImageAnalysis.COORDINATE_SYSTEM_VIEW_REFERENCED; - -import android.Manifest; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.util.Log; -import android.view.Gravity; -import android.view.MenuItem; -import android.widget.Toast; - -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.camera.mlkit.vision.MlKitAnalyzer; -import androidx.camera.view.LifecycleCameraController; -import androidx.camera.view.PreviewView; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.core.content.res.ResourcesCompat; - -import com.google.mlkit.vision.barcode.BarcodeScanner; -import com.google.mlkit.vision.barcode.BarcodeScannerOptions; -import com.google.mlkit.vision.barcode.BarcodeScanning; -import com.google.mlkit.vision.barcode.common.Barcode; - -import java.util.Collections; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import se.leap.bitmaskclient.BuildConfig; -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.base.models.Introducer; -import se.leap.bitmaskclient.base.utils.ViewHelper; -import se.leap.bitmaskclient.base.views.ActionBarTitle; -import se.leap.bitmaskclient.databinding.AScannerBinding; - -public class ScannerActivity extends AppCompatActivity { - public static final String INVITE_CODE = "invite_code"; - private static final String TAG = ScannerActivity.class.getSimpleName(); - private static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.CAMERA}; - private static final int REQUEST_CODE_PERMISSIONS = 1; - - private AScannerBinding binding; - private BarcodeScanner barcodeScanner; - private ExecutorService cameraExecutor; - - public static Intent newIntent(Context context) { - return new Intent(context, ScannerActivity.class); - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding = AScannerBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - setupActionBar(); - if (allPermissionsGranted()) { - startCamera(); - } else { - ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS); - } - cameraExecutor = Executors.newSingleThreadExecutor(); - - } - - private void setupActionBar() { - setSupportActionBar(binding.toolbar); - final ActionBar actionBar = getSupportActionBar(); - Context context = actionBar.getThemedContext(); - actionBar.setDisplayOptions(DISPLAY_SHOW_CUSTOM); - - ActionBarTitle actionBarTitle = new ActionBarTitle(context); - actionBarTitle.setTitleCaps(BuildConfig.actionbar_capitalize_title); - actionBarTitle.setTitle(getString(R.string.scan_qr_code)); - - final Drawable upArrow = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_back, getTheme()); - actionBar.setHomeAsUpIndicator(upArrow); - - actionBar.setDisplayHomeAsUpEnabled(true); - ViewHelper.setActivityBarColor(this, R.color.bg_setup_status_bar, R.color.bg_setup_action_bar, R.color.colorActionBarTitleFont); - @ColorInt int titleColor = ContextCompat.getColor(context, R.color.colorActionBarTitleFont); - actionBarTitle.setTitleTextColor(titleColor); - - actionBarTitle.setCentered(BuildConfig.actionbar_center_title); - actionBarTitle.setSingleBoldTitle(); - if (BuildConfig.actionbar_center_title) { - ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER); - actionBar.setCustomView(actionBarTitle, params); - } else { - actionBar.setCustomView(actionBarTitle); - } - } - - private void startCamera() { - var cameraController = new LifecycleCameraController(getBaseContext()); - var previewView = binding.previewView; - - var options = new BarcodeScannerOptions.Builder().setBarcodeFormats(Barcode.FORMAT_QR_CODE).build(); - barcodeScanner = BarcodeScanning.getClient(options); - - var mlKitAnalyzer = new MlKitAnalyzer( - Collections.singletonList(barcodeScanner), - COORDINATE_SYSTEM_VIEW_REFERENCED, - ContextCompat.getMainExecutor(this), - result -> handleQrResult(result, previewView) - ); - - cameraController.setImageAnalysisAnalyzer(ContextCompat.getMainExecutor(this), mlKitAnalyzer); - - cameraController.bindToLifecycle(this); - previewView.setController(cameraController); - } - - private void handleQrResult(MlKitAnalyzer.Result result, PreviewView previewView) { - var barcodeResults = result.getValue(barcodeScanner); - if ((barcodeResults == null) || (barcodeResults.isEmpty()) || (barcodeResults.get(0) == null)) { - previewView.getOverlay().clear(); - previewView.setOnTouchListener((v, event) -> false); //no-op - return; - } - try { - Introducer introducer = Introducer.fromUrl(barcodeResults.get(0).getRawValue()); - if (introducer.validate()) { - setResult(RESULT_OK, new Intent().putExtra(INVITE_CODE, introducer)); - } else { - Toast.makeText(this, R.string.invalid_code, Toast.LENGTH_SHORT).show(); - } - } catch (Exception e) { - Log.e(TAG, "Introducer error: " + e.getMessage()); - Toast.makeText(this, R.string.invalid_code, Toast.LENGTH_SHORT).show(); - } - previewView.setOnTouchListener((v, event) -> false); //no-op - previewView.getOverlay().clear(); - - finish(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - cameraExecutor.shutdown(); - barcodeScanner.close(); - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - private boolean allPermissionsGranted() { - for (String permission : REQUIRED_PERMISSIONS) { - if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { - return false; - } - } - return true; - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_CODE_PERMISSIONS) { - if (allPermissionsGranted()) { - startCamera(); - } else { - Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show(); - finish(); - } - } - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java index e4302be5..3a75925e 100644 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java @@ -3,8 +3,6 @@ package se.leap.bitmaskclient.providersetup.fragments; import static se.leap.bitmaskclient.providersetup.fragments.viewmodel.ProviderSelectionViewModel.ADD_PROVIDER; import static se.leap.bitmaskclient.providersetup.fragments.viewmodel.ProviderSelectionViewModel.INVITE_CODE_PROVIDER; -import android.app.Activity; -import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.text.Editable; @@ -15,11 +13,13 @@ import android.view.ViewGroup; import android.widget.RadioButton; import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import com.journeyapps.barcodescanner.ScanContract; +import com.journeyapps.barcodescanner.ScanOptions; + import java.util.ArrayList; import se.leap.bitmaskclient.R; @@ -28,13 +28,12 @@ import se.leap.bitmaskclient.base.models.Provider; import se.leap.bitmaskclient.base.utils.ViewHelper; import se.leap.bitmaskclient.databinding.FProviderSelectionBinding; import se.leap.bitmaskclient.providersetup.activities.CancelCallback; -import se.leap.bitmaskclient.providersetup.activities.scanner.ScannerActivity; import se.leap.bitmaskclient.providersetup.fragments.viewmodel.ProviderSelectionViewModel; import se.leap.bitmaskclient.providersetup.fragments.viewmodel.ProviderSelectionViewModelFactory; public class ProviderSelectionFragment extends BaseSetupFragment implements CancelCallback { - private ActivityResultLauncher scannerActivityResultLauncher; + private ActivityResultLauncher scannerActivityResultLauncher; private ProviderSelectionViewModel viewModel; private ArrayList radioButtons; @@ -55,15 +54,17 @@ public class ProviderSelectionFragment extends BaseSetupFragment implements Canc new ProviderSelectionViewModelFactory( getContext().getApplicationContext().getAssets())). get(ProviderSelectionViewModel.class); - scannerActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { - if (result.getResultCode() == Activity.RESULT_OK) { - Intent data = result.getData(); - if (data != null) { - Introducer introducer = data.getParcelableExtra(ScannerActivity.INVITE_CODE); - binding.editCustomProvider.setText(introducer.toUrl()); - } - } - }); + + scannerActivityResultLauncher = registerForActivityResult(new ScanContract(), result -> { + if(result.getContents() != null) { + try { + Introducer introducer = Introducer.fromUrl(result.getContents()); + binding.editCustomProvider.setText(introducer.toUrl()); + } catch (Exception e) { + //binding.editCustomProvider.setText(result.getContents()); + } + } + }); } @Override @@ -107,7 +108,13 @@ public class ProviderSelectionFragment extends BaseSetupFragment implements Canc } private void initQrScanner() { - binding.btnQrScanner.setOnClickListener(v -> scannerActivityResultLauncher.launch(ScannerActivity.newIntent(getContext()))); + binding.btnQrScanner.setOnClickListener(v -> { + ScanOptions options = new ScanOptions(); + options.setBeepEnabled(false); + options.setBarcodeImageEnabled(true); + options.setOrientationLocked(false); + scannerActivityResultLauncher.launch(options); + }); } -- cgit v1.2.3