From 717f236dce3ed571e9a61fcce86d8a37a7f7bc1b Mon Sep 17 00:00:00 2001 From: Purushottam Kushwaha Date: Tue, 30 Jan 2018 20:35:46 +0530 Subject: [PATCH] wpadebug: Add support for QR Code scanning and display via zxing Enhance wpadebug application to support scanning and displaying of QR codes. This depends on a third-party source: zxing (https://github.com/zxing/zxing). Shell command to launch scanner/viewer via wpadebug is: >adb root >adb shell Scanner: >am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeScannerActivity Viewer: >am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeDisplayActivity QR code string input/output file would be generated in '/sdcard/wpadebug_qrdata.txt' in the device. Signed-off-by: Jouni Malinen --- wpadebug/AndroidManifest.xml | 9 ++ wpadebug/README | 13 +++ wpadebug/res/layout/qrcode.xml | 13 +++ .../w1/fi/wpadebug/QrCodeDisplayActivity.java | 109 ++++++++++++++++++ .../w1/fi/wpadebug/QrCodeScannerActivity.java | 75 ++++++++++++ 5 files changed, 219 insertions(+) create mode 100644 wpadebug/res/layout/qrcode.xml create mode 100644 wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java create mode 100644 wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java diff --git a/wpadebug/AndroidManifest.xml b/wpadebug/AndroidManifest.xml index 9f3ca68a8..f72a65369 100644 --- a/wpadebug/AndroidManifest.xml +++ b/wpadebug/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -45,6 +46,14 @@ android:label="Credential" android:parentActivityName="w1.fi.wpadebug.WpaCredActivity"> + + + + + + + \ No newline at end of file diff --git a/wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java b/wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java new file mode 100644 index 000000000..10c9c0144 --- /dev/null +++ b/wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java @@ -0,0 +1,109 @@ +/* + * wpadebug - wpa_supplicant and Wi-Fi debugging app for Android + * Copyright (c) 2018, The Linux Foundation + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +package w1.fi.wpadebug; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.widget.ImageView; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; + +public class QrCodeDisplayActivity extends Activity { + + private static final String TAG = "wpadebug"; + private static final String FILE_NAME = "wpadebug_qrdata.txt"; + private ImageView imageView; + + // Below set of configs are used for QR code display window + private final static int WHITE = 0xFFFFFFFF; + private final static int BLACK = 0xFF000000; + private final static int WIDTH = 400; + private final static int HEIGHT = 400; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // create imageview for this and attach to this activity. + setContentView(R.layout.qrcode); + imageView = (ImageView) findViewById(R.id.qrCode); + String str = readFromFile(FILE_NAME); + + //Encode and launch qrcode now + try { + Bitmap bitmap = (TextUtils.isEmpty(str)) ? null : encodeAsBitmap(str); + if (bitmap != null) { + imageView.setImageBitmap(bitmap); + } else { + Log.e(TAG, "Failed to generate bitmap for uri=" + str); + finish(); + } + } catch (WriterException e) { + e.printStackTrace(); + finish(); + } + } + + private Bitmap encodeAsBitmap(String str) throws WriterException { + BitMatrix result; + try { + result = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, null); + } catch (IllegalArgumentException iae) { + // Unsupported format + return null; + } + + int width = result.getWidth(); + int height = result.getHeight(); + int[] pixels = new int[width * height]; + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; + } + } + + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + return bitmap; + } + + private String readFromFile(String filePath) { + try { + FileInputStream fis = new FileInputStream(new File("/sdcard", filePath)); + BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line; + while(( line = br.readLine()) != null ) { + sb.append( line ); + sb.append( '\n' ); + } + return sb.toString(); + } + catch (FileNotFoundException e) { + Log.e(TAG, "File not found: " + e.toString()); + } catch (IOException e) { + Log.e(TAG, "Can not read file: " + e.toString()); + } + + return null; + } +} diff --git a/wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java b/wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java new file mode 100644 index 000000000..0c31553e7 --- /dev/null +++ b/wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java @@ -0,0 +1,75 @@ +/* + * wpadebug - wpa_supplicant and Wi-Fi debugging app for Android + * Copyright (c) 2018, The Linux Foundation + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +package w1.fi.wpadebug; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; + +public class QrCodeScannerActivity extends Activity { + + private static final String TAG = "wpadebug"; + private static final String RESULT = "SCAN_RESULT"; + private static final String FILE_NAME = "wpadebug_qrdata.txt"; + private static final String ACTION = "com.google.zxing.client.android.SCAN"; + + private static final int QRCODE = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = new Intent(); + intent.setAction(ACTION); + try { + startActivityForResult(intent, QRCODE); + } catch (ActivityNotFoundException e) { + Log.e(TAG, "No QR code scanner found with name=" + ACTION); + Toast.makeText(QrCodeScannerActivity.this, "QR code scanner not found", Toast.LENGTH_SHORT).show(); + finish(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == QRCODE && resultCode == RESULT_OK) { + writeToFile(data.getStringExtra(RESULT)); + finish(); + } + } + + public void writeToFile(String data) + { + File file = new File("/sdcard", FILE_NAME); + try + { + file.createNewFile(); + FileOutputStream fOut = new FileOutputStream(file); + OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); + myOutWriter.append(data); + + myOutWriter.close(); + + fOut.flush(); + fOut.close(); + } + catch (IOException e) + { + Log.e(TAG, "File write failed: " + e.toString()); + } + } +}