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