URI: 
       tMerge pull request #3624 from bauerj/zxing-integration - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a95534bb0c7bd8b4f00436e08832c67a825a38dc
   DIR parent a492cfe1a8aa9ff34639681fd08f2f32f5a221b7
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat, 30 Dec 2017 20:43:35 +0100
       
       Merge pull request #3624 from bauerj/zxing-integration
       
       Bundle QR scanner with Android app
       Diffstat:
         A gui/kivy/data/java-classes/org/ele… |      48 +++++++++++++++++++++++++++++++
         M gui/kivy/main_window.py             |      43 +++++++------------------------
         M gui/kivy/tools/buildozer.spec       |       9 +++++++--
       
       3 files changed, 65 insertions(+), 35 deletions(-)
       ---
   DIR diff --git a/gui/kivy/data/java-classes/org/electrum/qr/SimpleScannerActivity.java b/gui/kivy/data/java-classes/org/electrum/qr/SimpleScannerActivity.java
       t@@ -0,0 +1,48 @@
       +package org.electrum.qr;
       +
       +import android.app.Activity;
       +import android.os.Bundle;
       +import android.util.Log;
       +import android.content.Intent;
       +
       +import java.util.Arrays;
       +
       +import me.dm7.barcodescanner.zxing.ZXingScannerView;
       +
       +import com.google.zxing.Result;
       +import com.google.zxing.BarcodeFormat;
       +
       +public class SimpleScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
       +    private ZXingScannerView mScannerView;
       +    final String TAG = "org.electrum.SimpleScannerActivity";
       +
       +    @Override
       +    public void onCreate(Bundle state) {
       +        super.onCreate(state);
       +        mScannerView = new ZXingScannerView(this);   // Programmatically initialize the scanner view
       +        mScannerView.setFormats(Arrays.asList(BarcodeFormat.QR_CODE));
       +        setContentView(mScannerView);                // Set the scanner view as the content view
       +    }
       +
       +    @Override
       +    public void onResume() {
       +        super.onResume();
       +        mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
       +        mScannerView.startCamera();          // Start camera on resume
       +    }
       +
       +    @Override
       +    public void onPause() {
       +        super.onPause();
       +        mScannerView.stopCamera();           // Stop camera on pause
       +    }
       +
       +    @Override
       +    public void handleResult(Result rawResult) {
       +        Intent resultIntent = new Intent();
       +        resultIntent.putExtra("text", rawResult.getText());
       +        resultIntent.putExtra("format", rawResult.getBarcodeFormat().toString());
       +        setResult(Activity.RESULT_OK, resultIntent);
       +        this.finish();
       +    }
       +}
   DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -384,45 +384,22 @@ class ElectrumWindow(App):
            def scan_qr(self, on_complete):
                if platform != 'android':
                    return
       -        from jnius import autoclass
       +        from jnius import autoclass, cast
                from android import activity
                PythonActivity = autoclass('org.kivy.android.PythonActivity')
       +        SimpleScannerActivity = autoclass("org.electrum.qr.SimpleScannerActivity")
                Intent = autoclass('android.content.Intent')
       -        intent = Intent("com.google.zxing.client.android.SCAN")
       -        intent.putExtra("SCAN_MODE", "QR_CODE_MODE")
       -        def on_qr_result(requestCode, resultCode, intent):
       -            if requestCode == 0:
       -                if resultCode == -1: # RESULT_OK:
       -                    contents = intent.getStringExtra("SCAN_RESULT")
       -                    if intent.getStringExtra("SCAN_RESULT_FORMAT") == 'QR_CODE':
       -                        on_complete(contents)
       -                    else:
       -                        self.show_error("wrong format " + intent.getStringExtra("SCAN_RESULT_FORMAT"))
       -        activity.bind(on_activity_result=on_qr_result)
       -        try:
       -            PythonActivity.mActivity.startActivityForResult(intent, 0)
       -        except:
       -            self.show_error(_('Could not start Barcode Scanner.') + ' ' + _('Please install the Barcode Scanner app from ZXing'))
       +        intent = Intent(PythonActivity.mActivity, SimpleScannerActivity)
        
       -    def scan_qr_zxing(self, on_complete):
       -        # uses zxing embedded lib
       -        if platform != 'android':
       -            return
       -        from jnius import autoclass
       -        from android import activity
       -        PythonActivity = autoclass('org.kivy.android.PythonActivity')
       -        IntentIntegrator = autoclass('com.google.zxing.integration.android.IntentIntegrator')
       -        integrator = IntentIntegrator(PythonActivity.mActivity)
                def on_qr_result(requestCode, resultCode, intent):
       -            if requestCode == 0:
       -                if resultCode == -1: # RESULT_OK:
       -                    contents = intent.getStringExtra("SCAN_RESULT")
       -                    if intent.getStringExtra("SCAN_RESULT_FORMAT") == 'QR_CODE':
       -                        on_complete(contents)
       -                    else:
       -                        self.show_error("wrong format " + intent.getStringExtra("SCAN_RESULT_FORMAT"))
       +            if resultCode == -1:  # RESULT_OK:
       +                #  this doesn't work due to some bug in jnius:
       +                # contents = intent.getStringExtra("text")
       +                String = autoclass("java.lang.String")
       +                contents = intent.getStringExtra(String("text"))
       +                on_complete(contents)
                activity.bind(on_activity_result=on_qr_result)
       -        integrator.initiateScan()
       +        PythonActivity.mActivity.startActivityForResult(intent, 0)
        
            def do_share(self, data, title):
                if platform != 'android':
   DIR diff --git a/gui/kivy/tools/buildozer.spec b/gui/kivy/tools/buildozer.spec
       t@@ -52,7 +52,8 @@ fullscreen = False
        #
        
        # (list) Permissions
       -android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE
       +android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, CAMERA
       +
        # (int) Android API to use
        #android.api = 14
        
       t@@ -86,7 +87,11 @@ android.ndk_path = /opt/crystax-ndk-10.3.2
        
        # (list) List of Java files to add to the android project (can be java or a
        # directory containing the files)
       -#android.add_src =
       +android.add_src = gui/kivy/data/java-classes/
       +
       +android.gradle_dependencies = me.dm7.barcodescanner:zxing:1.9.8
       +
       +android.add_activities = org.electrum.qr.SimpleScannerActivity
        
        # (str) python-for-android branch to use, if not master, useful to try
        # not yet merged features.