Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.device.nfc; | |
| 6 | |
| 7 import android.nfc.NdefMessage; | |
| 8 import android.nfc.NdefRecord; | |
| 9 import android.os.Build; | |
| 10 | |
| 11 import org.chromium.base.Log; | |
| 12 import org.chromium.mojom.device.nfc.NfcMessage; | |
| 13 import org.chromium.mojom.device.nfc.NfcRecord; | |
| 14 import org.chromium.mojom.device.nfc.NfcRecordType; | |
| 15 | |
| 16 import java.io.UnsupportedEncodingException; | |
| 17 import java.util.ArrayList; | |
| 18 import java.util.List; | |
| 19 | |
| 20 /** | |
| 21 * Utility class that provides convesion between Android NdefMessage | |
| 22 * and mojo NfcMessage data structures. | |
| 23 */ | |
| 24 public final class NfcTypeConverter { | |
| 25 private static final String TAG = "NfcTypeConverter"; | |
| 26 private static final String DOMAIN = "w3.org"; | |
| 27 private static final String TYPE = "webnfc"; | |
| 28 private static final String WEBNFC_URN = DOMAIN + ":" + TYPE; | |
| 29 private static final String TEXT_MIME = "text/plain"; | |
| 30 private static final String JSON_MIME = "application/json"; | |
| 31 private static final String CHARSET_UTF8 = ";charset=UTF-8"; | |
| 32 private static final String CHARSET_UTF16 = ";charset=UTF-16"; | |
| 33 | |
| 34 /** | |
| 35 * Converts mojo NfcMessage to android.nfc.NdefMessage | |
| 36 */ | |
| 37 public static NdefMessage toNdefMessage(NfcMessage message) throws InvalidNf cMessageException { | |
| 38 if (message == null || message.data.length == 0) throw new InvalidNfcMes sageException(); | |
|
dcheng
2016/08/16 06:27:20
Should this be <= 0?
shalamov
2016/08/16 12:47:15
According to java specification, array length guar
dcheng
2016/08/16 20:50:08
OK, the Java types aren't clear to me. Is there so
| |
| 39 | |
| 40 try { | |
| 41 List<NdefRecord> records = new ArrayList<NdefRecord>(); | |
| 42 for (int i = 0; i < message.data.length; ++i) { | |
| 43 records.add(toNdefRecord(message.data[i])); | |
| 44 } | |
| 45 records.add(NdefRecord.createExternal(DOMAIN, TYPE, message.url.getB ytes("UTF-8"))); | |
| 46 NdefRecord[] ndefRecords = new NdefRecord[records.size()]; | |
| 47 records.toArray(ndefRecords); | |
| 48 return new NdefMessage(ndefRecords); | |
| 49 } catch (UnsupportedEncodingException | InvalidNfcMessageException | |
| 50 | IllegalArgumentException e) { | |
| 51 throw new InvalidNfcMessageException(); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 /** | |
| 56 * Returns charset of mojo NfcRecord. Only applicable for URL and TEXT recor ds. | |
| 57 * If charset cannot be determined, UTF-8 charset is used by default. | |
| 58 */ | |
| 59 private static String getCharset(NfcRecord record) { | |
| 60 if (record.mediaType.endsWith(CHARSET_UTF8)) return "UTF-8"; | |
|
dcheng
2016/08/16 06:27:20
Can we add some comments to the mojom? What is a m
shalamov
2016/08/16 12:47:15
Added comment to mojom.
dcheng
2016/08/16 20:50:08
OK, I think similar comments would help for some o
| |
| 61 | |
| 62 // When 16bit WTF::String data is converted to bytearray, it is in LE by te order, without | |
| 63 // BOM. By default, Android interprets UTF-16 charset without BOM as UTF -16BE, thus, use | |
| 64 // UTF-16LE as encoding for text data. | |
| 65 | |
| 66 if (record.mediaType.endsWith(CHARSET_UTF16)) return "UTF-16LE"; | |
| 67 | |
| 68 Log.w(TAG, "Unknown charset, defaulting to UTF-8."); | |
| 69 return "UTF-8"; | |
| 70 } | |
| 71 | |
| 72 /** | |
| 73 * Converts mojo NfcRecord to android.nfc.NdefRecord | |
| 74 */ | |
| 75 private static NdefRecord toNdefRecord(NfcRecord record) throws InvalidNfcMe ssageException, | |
| 76 IllegalArgum entException, | |
| 77 UnsupportedE ncodingException { | |
| 78 switch (record.recordType) { | |
| 79 case NfcRecordType.URL: | |
| 80 return NdefRecord.createUri(new String(record.data, getCharset(r ecord))); | |
| 81 case NfcRecordType.TEXT: | |
| 82 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | |
| 83 return NdefRecord.createTextRecord( | |
| 84 "en-US", new String(record.data, getCharset(record)) ); | |
| 85 } else { | |
| 86 return NdefRecord.createMime(TEXT_MIME, record.data); | |
| 87 } | |
| 88 case NfcRecordType.JSON: | |
| 89 case NfcRecordType.OPAQUE_RECORD: | |
| 90 return NdefRecord.createMime(record.mediaType, record.data); | |
| 91 default: | |
| 92 throw new InvalidNfcMessageException(); | |
| 93 } | |
| 94 } | |
| 95 } | |
| OLD | NEW |