Home | History | Annotate | Download | only in location
      1 /*
      2  * Copyright (C) 2016 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 package android.hardware.location;
     17 
     18 import android.annotation.SystemApi;
     19 import android.os.Parcel;
     20 import android.os.Parcelable;
     21 import android.util.Log;
     22 
     23 /** A class describing nano apps.
     24  * A nano app is a piece of executable code that can be
     25  * downloaded onto a specific architecture. These are targtted
     26  * for low power compute domains on a device.
     27  *
     28  * Nano apps are expected to be used only by bundled apps only
     29  * at this time.
     30  *
     31  * @hide
     32  */
     33 @SystemApi
     34 public class NanoApp {
     35     private final String TAG = "NanoApp";
     36 
     37     private final String UNKNOWN = "Unknown";
     38 
     39     private String mPublisher;
     40     private String mName;
     41 
     42     private int mAppId;
     43     private boolean mAppIdSet;
     44     private int mAppVersion;
     45 
     46     private int mNeededReadMemBytes;
     47     private int mNeededWriteMemBytes;
     48     private int mNeededExecMemBytes;
     49 
     50     private int[] mNeededSensors;
     51     private int[] mOutputEvents;
     52     private byte[] mAppBinary;
     53 
     54     /**
     55      * If this version of the constructor is used, the methods
     56      * {@link #setAppBinary(byte[])} and {@link #setAppId(int)} must be called
     57      * prior to passing this object to any managers.
     58      *
     59      * @see #NanoApp(int, byte[])
     60      */
     61     public NanoApp() {
     62         this(0, null);
     63         mAppIdSet = false;
     64     }
     65 
     66     /**
     67      * Initialize a NanoApp with the given id and binary.
     68      *
     69      * While this sets defaults for other fields, users will want to provide
     70      * other values for those fields in most cases.
     71      *
     72      * @see #setPublisher(String)
     73      * @see #setName(String)
     74      * @see #setAppVersion(int)
     75      * @see #setNeededReadMemBytes(int)
     76      * @see #setNeededWriteMemBytes(int)
     77      * @see #setNeededExecMemBytes(int)
     78      * @see #setNeededSensors(int[])
     79      * @see #setOutputEvents(int[])
     80      */
     81     public NanoApp(int appId, byte[] appBinary) {
     82         mPublisher = UNKNOWN;
     83         mName = UNKNOWN;
     84 
     85         mAppId = appId;
     86         mAppIdSet = true;
     87         mAppVersion = 0;
     88 
     89         mNeededReadMemBytes = 0;
     90         mNeededWriteMemBytes = 0;
     91         mNeededExecMemBytes = 0;
     92 
     93         mNeededSensors = new int[0];
     94         mOutputEvents = new int[0];
     95         mAppBinary = appBinary;
     96     }
     97 
     98     /**
     99      * Set the publisher name
    100      *
    101      * @param publisher name of the publisher of this nano app
    102      */
    103     public void setPublisher(String publisher) {
    104         mPublisher = publisher;
    105     }
    106 
    107     /**
    108      * set the name of the app
    109      *
    110      * @param name   name of the app
    111      */
    112     public void setName(String name) {
    113         mName = name;
    114     }
    115 
    116     /**
    117      * set the app identifier
    118      *
    119      * @param appId  add identifier
    120      */
    121     public void setAppId(int appId) {
    122         mAppId = appId;
    123         mAppIdSet = true;
    124     }
    125 
    126     /**
    127      * Set the app version
    128      *
    129      * @param appVersion app version
    130      */
    131     public void setAppVersion(int appVersion) {
    132         mAppVersion = appVersion;
    133     }
    134 
    135     /**
    136      * set memory needed as read only
    137      *
    138      * @param neededReadMemBytes
    139      *               read only memory needed in bytes
    140      */
    141     public void setNeededReadMemBytes(int neededReadMemBytes) {
    142         mNeededReadMemBytes = neededReadMemBytes;
    143     }
    144 
    145     /**
    146      * set writable memory needed in bytes
    147      *
    148      * @param neededWriteMemBytes
    149      *               writable memory needed in bytes
    150      */
    151     public void setNeededWriteMemBytes(int neededWriteMemBytes) {
    152         mNeededWriteMemBytes = neededWriteMemBytes;
    153     }
    154 
    155     /**
    156      * set executable memory needed
    157      *
    158      * @param neededExecMemBytes
    159      *               executable memory needed in bytes
    160      */
    161     public void setNeededExecMemBytes(int neededExecMemBytes) {
    162         mNeededExecMemBytes = neededExecMemBytes;
    163     }
    164 
    165     /**
    166      * set the sensors needed for this app
    167      *
    168      * @param neededSensors
    169      *               needed Sensors
    170      */
    171     public void setNeededSensors(int[] neededSensors) {
    172         mNeededSensors = neededSensors;
    173     }
    174 
    175     public void setOutputEvents(int[] outputEvents) {
    176         mOutputEvents = outputEvents;
    177     }
    178 
    179     /**
    180      * set output events returned by the nano app
    181      *
    182      * @param appBinary generated events
    183      */
    184     public void setAppBinary(byte[] appBinary) {
    185         mAppBinary = appBinary;
    186     }
    187 
    188 
    189     /**
    190      * get the publisher name
    191      *
    192      * @return publisher name
    193      */
    194     public String getPublisher() {
    195         return mPublisher;
    196     }
    197 
    198     /**
    199      * get the name of the app
    200      *
    201      * @return app name
    202      */
    203     public String getName() {
    204         return mName;
    205     }
    206 
    207     /**
    208      * get the identifier of the app
    209      *
    210      * @return identifier for this app
    211      */
    212     public int getAppId() {
    213         return mAppId;
    214     }
    215 
    216     /**
    217      * get the app version
    218      *
    219      * @return app version
    220      */
    221     public int getAppVersion() {
    222         return mAppVersion;
    223     }
    224 
    225     /**
    226      * get the ammount of readable memory needed by this app
    227      *
    228      * @return readable memory needed in bytes
    229      */
    230     public int getNeededReadMemBytes() {
    231         return mNeededReadMemBytes;
    232     }
    233 
    234     /**
    235      * get the ammount og writable memory needed in bytes
    236      *
    237      * @return writable memory needed in bytes
    238      */
    239     public int getNeededWriteMemBytes() {
    240         return mNeededWriteMemBytes;
    241     }
    242 
    243     /**
    244      * executable memory needed in bytes
    245      *
    246      * @return executable memory needed in bytes
    247      */
    248     public int getNeededExecMemBytes() {
    249         return mNeededExecMemBytes;
    250     }
    251 
    252     /**
    253      * get the sensors needed by this app
    254      *
    255      * @return sensors needed
    256      */
    257     public int[] getNeededSensors() {
    258         return mNeededSensors;
    259     }
    260 
    261     /**
    262      * get the events generated by this app
    263      *
    264      * @return generated events
    265      */
    266     public int[] getOutputEvents() {
    267         return mOutputEvents;
    268     }
    269 
    270     /**
    271      * get the binary for this app
    272      *
    273      * @return app binary
    274      */
    275     public byte[] getAppBinary() {
    276         return mAppBinary;
    277     }
    278 
    279     private NanoApp(Parcel in) {
    280         mPublisher = in.readString();
    281         mName = in.readString();
    282 
    283         mAppId = in.readInt();
    284         mAppVersion = in.readInt();
    285         mNeededReadMemBytes = in.readInt();
    286         mNeededWriteMemBytes = in.readInt();
    287         mNeededExecMemBytes = in.readInt();
    288 
    289         int mNeededSensorsLength = in.readInt();
    290         mNeededSensors = new int[mNeededSensorsLength];
    291         in.readIntArray(mNeededSensors);
    292 
    293         int mOutputEventsLength = in.readInt();
    294         mOutputEvents = new int[mOutputEventsLength];
    295         in.readIntArray(mOutputEvents);
    296 
    297         int binaryLength = in.readInt();
    298         mAppBinary = new byte[binaryLength];
    299         in.readByteArray(mAppBinary);
    300     }
    301 
    302     public int describeContents() {
    303         return 0;
    304     }
    305 
    306     public void writeToParcel(Parcel out, int flags) {
    307         if (mAppBinary == null) {
    308             throw new IllegalStateException("Must set non-null AppBinary for nanoapp " + mName);
    309         }
    310         if (!mAppIdSet) {
    311             throw new IllegalStateException("Must set AppId for nanoapp " + mName);
    312         }
    313 
    314         out.writeString(mPublisher);
    315         out.writeString(mName);
    316         out.writeInt(mAppId);
    317         out.writeInt(mAppVersion);
    318         out.writeInt(mNeededReadMemBytes);
    319         out.writeInt(mNeededWriteMemBytes);
    320         out.writeInt(mNeededExecMemBytes);
    321 
    322         out.writeInt(mNeededSensors.length);
    323         out.writeIntArray(mNeededSensors);
    324 
    325         out.writeInt(mOutputEvents.length);
    326         out.writeIntArray(mOutputEvents);
    327 
    328         out.writeInt(mAppBinary.length);
    329         out.writeByteArray(mAppBinary);
    330     }
    331 
    332     public static final Parcelable.Creator<NanoApp> CREATOR
    333             = new Parcelable.Creator<NanoApp>() {
    334         public NanoApp createFromParcel(Parcel in) {
    335             return new NanoApp(in);
    336         }
    337 
    338         public NanoApp[] newArray(int size) {
    339             return new NanoApp[size];
    340         }
    341     };
    342 
    343     @Override
    344     public String toString() {
    345         String retVal = "Id : " + mAppId;
    346         retVal += ", Version : " + mAppVersion;
    347         retVal += ", Name : " + mName;
    348         retVal += ", Publisher : " + mPublisher;
    349 
    350         return retVal;
    351     }
    352 }
    353