1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.cts.verifier.nfc.tech;
18 
19 import android.nfc.Tag;
20 import android.nfc.tech.MifareUltralight;
21 
22 import java.io.IOException;
23 import java.util.Arrays;
24 import java.util.Random;
25 
26 /**
27  * {@link TagTester} for MIFARE Ultralight tags. It writes random bytes to the
28  * tag's first user page and verifies that it matches when scanned later.
29  */
30 public class MifareUltralightTagTester implements TagTester {
31 
32     private static final int USER_PAGE_OFFSET = 5;
33 
34     private static final int NUM_PAGES = 4;
35 
36     @Override
isTestableTag(Tag tag)37     public boolean isTestableTag(Tag tag) {
38         if (tag != null) {
39             for (String tech : tag.getTechList()) {
40                 if (tech.equals(MifareUltralight.class.getName())) {
41                     return true;
42                 }
43             }
44         }
45         return false;
46     }
47 
48     @Override
writeTag(Tag tag)49     public TagVerifier writeTag(Tag tag) throws IOException {
50         Random random = new Random();
51         MifareUltralight ultralight = MifareUltralight.get(tag);
52         ultralight.connect();
53 
54         final byte[] fourPages = new byte[NUM_PAGES * MifareUltralight.PAGE_SIZE];
55         byte[] onePage = new byte[MifareUltralight.PAGE_SIZE];
56         for (int i = 0; i < NUM_PAGES; i++) {
57             random.nextBytes(onePage);
58             System.arraycopy(onePage, 0, fourPages, i * onePage.length, onePage.length);
59             ultralight.writePage(USER_PAGE_OFFSET + i, onePage);
60         }
61 
62         final CharSequence expectedContent = NfcUtils.displayByteArray(fourPages);
63 
64         return new TagVerifier() {
65             @Override
66             public Result verifyTag(Tag tag) throws IOException {
67                 MifareUltralight ultralight = MifareUltralight.get(tag);
68                 if (ultralight != null) {
69                     ultralight.connect();
70                     byte[] actualFourPages = ultralight.readPages(USER_PAGE_OFFSET);
71                     CharSequence actualContent = NfcUtils.displayByteArray(actualFourPages);
72                     return new Result(expectedContent, actualContent,
73                             Arrays.equals(fourPages, actualFourPages));
74                 } else {
75                     return new Result(expectedContent, null, false);
76                 }
77             }
78         };
79     }
80 }
81