1 /* 2 * Copyright (C) 2014 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.nfc; 18 19 import android.util.proto.ProtoOutputStream; 20 21 import java.util.Objects; 22 23 /** 24 * Parameters for enabling NFC tag discovery and polling, 25 * and host card emulation. 26 */ 27 public final class NfcDiscoveryParameters { 28 29 public static class Builder { 30 31 private NfcDiscoveryParameters mParameters; 32 Builder()33 private Builder() { 34 mParameters = new NfcDiscoveryParameters(); 35 } 36 setTechMask(int techMask)37 public NfcDiscoveryParameters.Builder setTechMask(int techMask) { 38 mParameters.mTechMask = techMask; 39 return this; 40 } 41 setEnableLowPowerDiscovery(boolean enable)42 public NfcDiscoveryParameters.Builder setEnableLowPowerDiscovery(boolean enable) { 43 mParameters.mEnableLowPowerDiscovery = enable; 44 return this; 45 } 46 setEnableReaderMode(boolean enable)47 public NfcDiscoveryParameters.Builder setEnableReaderMode(boolean enable) { 48 mParameters.mEnableReaderMode = enable; 49 50 if (enable) { 51 mParameters.mEnableLowPowerDiscovery = false; 52 } 53 54 return this; 55 } 56 setEnableHostRouting(boolean enable)57 public NfcDiscoveryParameters.Builder setEnableHostRouting(boolean enable) { 58 mParameters.mEnableHostRouting = enable; 59 return this; 60 } 61 setTechAPollingLoopAnnotation(byte[] annotation)62 public NfcDiscoveryParameters.Builder setTechAPollingLoopAnnotation(byte[] annotation) { 63 mParameters.mTechAPollingLoopAnnotation = annotation; 64 return this; 65 } 66 build()67 public NfcDiscoveryParameters build() { 68 return mParameters; 69 } 70 } 71 72 static final int NFC_POLL_DEFAULT = -1; 73 74 // NOTE: when adding a new field, don't forget to update equals(), hashCode() 75 // and toString() below 76 private int mTechMask = 0; 77 private boolean mEnableLowPowerDiscovery = true; 78 private boolean mEnableReaderMode = false; 79 private boolean mEnableHostRouting = false; 80 private byte[] mTechAPollingLoopAnnotation = null; 81 NfcDiscoveryParameters()82 public NfcDiscoveryParameters() {} 83 getTechMask()84 public int getTechMask() { 85 return mTechMask; 86 } 87 shouldEnableLowPowerDiscovery()88 public boolean shouldEnableLowPowerDiscovery() { 89 return mEnableLowPowerDiscovery; 90 } 91 shouldEnableReaderMode()92 public boolean shouldEnableReaderMode() { 93 return mEnableReaderMode; 94 } 95 shouldEnableHostRouting()96 public boolean shouldEnableHostRouting() { 97 return mEnableHostRouting; 98 } 99 shouldEnableDiscovery()100 public boolean shouldEnableDiscovery() { 101 return mTechMask != 0 || mEnableHostRouting; 102 } 103 techAPollingLoopAnnotation()104 public byte[] techAPollingLoopAnnotation() { 105 return mTechAPollingLoopAnnotation; 106 } 107 108 @Override hashCode()109 public int hashCode() { 110 return Objects.hash(mTechMask, mEnableLowPowerDiscovery, mEnableReaderMode, mEnableHostRouting); 111 } 112 113 @Override equals(Object obj)114 public boolean equals(Object obj) { 115 if (obj == this) { 116 return true; 117 } 118 119 if ((obj == null) || (obj.getClass() != this.getClass())) { 120 return false; 121 } 122 NfcDiscoveryParameters params = (NfcDiscoveryParameters) obj; 123 return mTechMask == params.mTechMask && 124 (mEnableLowPowerDiscovery == params.mEnableLowPowerDiscovery) && 125 (mEnableReaderMode == params.mEnableReaderMode) && 126 (mEnableHostRouting == params.mEnableHostRouting); 127 } 128 129 @Override toString()130 public String toString() { 131 StringBuilder sb = new StringBuilder(); 132 if (mTechMask == NFC_POLL_DEFAULT) { 133 sb.append("mTechMask: default\n"); 134 } else { 135 sb.append("mTechMask: " + Integer.toString(mTechMask) + "\n"); 136 } 137 sb.append("mEnableLPD: " + Boolean.toString(mEnableLowPowerDiscovery) + "\n"); 138 sb.append("mEnableReader: " + Boolean.toString(mEnableReaderMode) + "\n"); 139 sb.append("mEnableHostRouting: " + Boolean.toString(mEnableHostRouting) + "\n"); 140 return sb.toString(); 141 } 142 143 /** Dumps DiscoveryParamsProto for debugging. */ dumpDebug(ProtoOutputStream proto)144 void dumpDebug(ProtoOutputStream proto) { 145 proto.write(DiscoveryParamsProto.TECH_MASK, mTechMask); 146 proto.write(DiscoveryParamsProto.ENABLE_LPD, mEnableLowPowerDiscovery); 147 proto.write(DiscoveryParamsProto.ENABLE_READER, mEnableReaderMode); 148 proto.write(DiscoveryParamsProto.ENABLE_HOST_ROUTING, mEnableHostRouting); 149 } 150 newBuilder()151 public static NfcDiscoveryParameters.Builder newBuilder() { 152 return new Builder(); 153 } 154 getDefaultInstance()155 public static NfcDiscoveryParameters getDefaultInstance() { 156 return new NfcDiscoveryParameters(); 157 } 158 getNfcOffParameters()159 public static NfcDiscoveryParameters getNfcOffParameters() { 160 return new NfcDiscoveryParameters(); 161 } 162 } 163