1b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro/* 2b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Copyright 2017 The Android Open Source Project 3b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 4b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 5b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * you may not use this file except in compliance with the License. 6b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * You may obtain a copy of the License at 7b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 8b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 9b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 10b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Unless required by applicable law or agreed to in writing, software 11b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 12b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * See the License for the specific language governing permissions and 14b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * limitations under the License. 15b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 16b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguropackage android.hardware.location; 17b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 18f2b6f014a7c44f5828dfee88d6f3592fa50b64e4Arthur Ishiguroimport android.annotation.SystemApi; 19b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport android.os.Parcel; 20b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguroimport android.os.Parcelable; 21b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 22b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro/** 23b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * A class describing messages send to or from nanoapps through the Context Hub Service. 24b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 25b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * The basis of the class is in the IContextHub.hal ContextHubMsg definition. 26b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 27b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @hide 28b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 29f2b6f014a7c44f5828dfee88d6f3592fa50b64e4Arthur Ishiguro@SystemApi 30b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguropublic final class NanoAppMessage implements Parcelable { 311d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro private static final int DEBUG_LOG_NUM_BYTES = 16; 32b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private long mNanoAppId; 33b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private int mMessageType; 34b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private byte[] mMessageBody; 35b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private boolean mIsBroadcasted; 36b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 37b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private NanoAppMessage( 38b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro long nanoAppId, int messageType, byte[] messageBody, boolean broadcasted) { 39b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppId = nanoAppId; 40b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mMessageType = messageType; 41b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mMessageBody = messageBody; 42b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mIsBroadcasted = broadcasted; 43b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 44b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 45b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 46b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Creates a NanoAppMessage object to send to a nanoapp. 47b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 48b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * This factory method can be used to generate a NanoAppMessage object to be used in 49b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * the ContextHubClient.sendMessageToNanoApp API. 50b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 51b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param targetNanoAppId the ID of the nanoapp to send the message to 52b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param messageType the nanoapp-dependent message type 53b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param messageBody the byte array message contents 54b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 55b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the NanoAppMessage object 56b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 57b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public static NanoAppMessage createMessageToNanoApp( 58b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro long targetNanoAppId, int messageType, byte[] messageBody) { 59b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppMessage( 60b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro targetNanoAppId, messageType, messageBody, false /* broadcasted */); 61b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 62b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 63b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 64b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * Creates a NanoAppMessage object sent from a nanoapp. 65b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 66b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * This factory method is intended only to be used by the Context Hub Service when delivering 67b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * messages from a nanoapp to clients. 68b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 69b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param sourceNanoAppId the ID of the nanoapp that the message was sent from 70b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param messageType the nanoapp-dependent message type 71b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param messageBody the byte array message contents 72b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @param broadcasted {@code true} if the message was broadcasted, {@code false} otherwise 73b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * 74b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the NanoAppMessage object 75b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 76b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public static NanoAppMessage createMessageFromNanoApp( 77b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro long sourceNanoAppId, int messageType, byte[] messageBody, boolean broadcasted) { 78b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppMessage(sourceNanoAppId, messageType, messageBody, broadcasted); 79b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 80b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 81b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 82b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the ID of the source or destination nanoapp 83b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 84b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public long getNanoAppId() { 85b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mNanoAppId; 86b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 87b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 88b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 89b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the type of the message that is nanoapp-dependent 90b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 91b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public int getMessageType() { 92b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mMessageType; 93b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 94b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 95b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 96b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return the byte array contents of the message 97b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 98b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public byte[] getMessageBody() { 99b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mMessageBody; 100b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 101b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 102b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro /** 103b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro * @return {@code true} if the message is broadcasted, {@code false} otherwise 104b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro */ 105b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public boolean isBroadcastMessage() { 106b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return mIsBroadcasted; 107b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 108b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 109b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro private NanoAppMessage(Parcel in) { 110b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mNanoAppId = in.readLong(); 111b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mIsBroadcasted = (in.readInt() == 1); 112b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mMessageType = in.readInt(); 113b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 114b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro int msgSize = in.readInt(); 115b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro mMessageBody = new byte[msgSize]; 116b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro in.readByteArray(mMessageBody); 117b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 118b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 119b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 120b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public int describeContents() { 121b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return 0; 122b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 123b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 124b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 125b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public void writeToParcel(Parcel out, int flags) { 126b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeLong(mNanoAppId); 127b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeInt(mIsBroadcasted ? 1 : 0); 128b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeInt(mMessageType); 129b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 130b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeInt(mMessageBody.length); 131b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro out.writeByteArray(mMessageBody); 132b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 133b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 134b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public static final Creator<NanoAppMessage> CREATOR = 135b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro new Creator<NanoAppMessage>() { 136b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 137b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public NanoAppMessage createFromParcel(Parcel in) { 138b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppMessage(in); 139b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 140b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro 141b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro @Override 142b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro public NanoAppMessage[] newArray(int size) { 143b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro return new NanoAppMessage[size]; 144b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro } 145b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro }; 1461d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro 1471d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro @Override 1481d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro public String toString() { 1491d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro int length = mMessageBody.length; 1501d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro 1511d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro String ret = "NanoAppMessage[type = " + mMessageType + ", length = " + mMessageBody.length 1521d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro + " bytes, " + (mIsBroadcasted ? "broadcast" : "unicast") + ", nanoapp = 0x" 1531d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro + Long.toHexString(mNanoAppId) + "]("; 1541d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro if (length > 0) { 1551d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro ret += "data = 0x"; 1561d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro } 1571d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro for (int i = 0; i < Math.min(length, DEBUG_LOG_NUM_BYTES); i++) { 1581d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro ret += Byte.toHexString(mMessageBody[i], true /* upperCase */); 1591d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro 1601d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro if ((i + 1) % 4 == 0) { 1611d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro ret += " "; 1621d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro } 1631d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro } 1641d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro if (length > DEBUG_LOG_NUM_BYTES) { 1651d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro ret += "..."; 1661d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro } 1671d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro ret += ")"; 1681d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro 1691d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro return ret; 1701d3b23cb9bf809383c784ccbdf7a086bffa5e5ecArthur Ishiguro } 171b9ae7bd8389deeb4abbe034dc97f151c60c13044Arthur Ishiguro} 172