Loading src/com/android/settings/wifi/qrcode/QrCodeGenerator.java +17 −1 Original line number Diff line number Diff line Loading @@ -20,10 +20,16 @@ import android.graphics.Bitmap; import android.graphics.Color; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import java.nio.charset.CharsetEncoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public final class QrCodeGenerator { /** * Generates a barcode image with {@code contents}. Loading @@ -34,8 +40,13 @@ public final class QrCodeGenerator { */ public static Bitmap encodeQrCode(String contents, int size) throws WriterException, IllegalArgumentException { final Map<EncodeHintType, Object> hints = new HashMap<>(); if (!isIso88591(contents)) { hints.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8.name()); } final BitMatrix qrBits = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, size, size); size, size, hints); final Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565); for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { Loading @@ -44,4 +55,9 @@ public final class QrCodeGenerator { } return bitmap; } private static boolean isIso88591(String contents) { CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder(); return encoder.canEncode(contents); } } tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -128,4 +128,23 @@ public class QrCameraTest { assertThat(mQrCode).isEqualTo(googleUrl); } @Test public void testDecode_unicodePictureCaptured_QrCodeCorrectValue() { final String unicodeTest = "中文測試"; try { final Bitmap bmp = QrCodeGenerator.encodeQrCode(unicodeTest, 320); final int[] intArray = new int[bmp.getWidth() * bmp.getHeight()]; bmp.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight()); LuminanceSource source = new RGBLuminanceSource(bmp.getWidth(), bmp.getHeight(), intArray); final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); mCamera.decodeImage(bitmap); bmp.recycle(); } catch (WriterException e) { } assertThat(mQrCode).isEqualTo(unicodeTest); } } Loading
src/com/android/settings/wifi/qrcode/QrCodeGenerator.java +17 −1 Original line number Diff line number Diff line Loading @@ -20,10 +20,16 @@ import android.graphics.Bitmap; import android.graphics.Color; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import java.nio.charset.CharsetEncoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public final class QrCodeGenerator { /** * Generates a barcode image with {@code contents}. Loading @@ -34,8 +40,13 @@ public final class QrCodeGenerator { */ public static Bitmap encodeQrCode(String contents, int size) throws WriterException, IllegalArgumentException { final Map<EncodeHintType, Object> hints = new HashMap<>(); if (!isIso88591(contents)) { hints.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8.name()); } final BitMatrix qrBits = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, size, size); size, size, hints); final Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565); for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { Loading @@ -44,4 +55,9 @@ public final class QrCodeGenerator { } return bitmap; } private static boolean isIso88591(String contents) { CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder(); return encoder.canEncode(contents); } }
tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -128,4 +128,23 @@ public class QrCameraTest { assertThat(mQrCode).isEqualTo(googleUrl); } @Test public void testDecode_unicodePictureCaptured_QrCodeCorrectValue() { final String unicodeTest = "中文測試"; try { final Bitmap bmp = QrCodeGenerator.encodeQrCode(unicodeTest, 320); final int[] intArray = new int[bmp.getWidth() * bmp.getHeight()]; bmp.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight()); LuminanceSource source = new RGBLuminanceSource(bmp.getWidth(), bmp.getHeight(), intArray); final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); mCamera.decodeImage(bitmap); bmp.recycle(); } catch (WriterException e) { } assertThat(mQrCode).isEqualTo(unicodeTest); } }