11d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi/*
21d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * Copyright (C) 2016 The Android Open Source Project
31d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi *
41d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * Licensed under the Apache License, Version 2.0 (the "License");
51d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * you may not use this file except in compliance with the License.
61d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * You may obtain a copy of the License at
71d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi *
81d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi *      http://www.apache.org/licenses/LICENSE-2.0
91d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi *
101d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * Unless required by applicable law or agreed to in writing, software
111d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * distributed under the License is distributed on an "AS IS" BASIS,
121d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * See the License for the specific language governing permissions and
141d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * limitations under the License.
151d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi */
161d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
171d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshipackage android.hardware.location;
181d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
191d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
201d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshiimport android.annotation.SystemApi;
211d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshiimport android.os.Parcel;
221d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshiimport android.os.Parcelable;
23b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshiimport android.util.Log;
241d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
251d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi/**
261d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi * @hide
271d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi */
281d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi@SystemApi
291d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshipublic class NanoAppFilter {
301d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
31b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi    private static final String TAG = "NanoAppFilter";
32b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi
331d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    // The appId, can be set to APP_ID_ANY
341d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private long mAppId;
351d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
361d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    // Version to filter apps
371d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private int mAppVersion;
381d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
391d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    // filtering spec for version
401d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private int mVersionRestrictionMask;
411d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
421d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    // If APP_ID is any, then a match is performef with the vendor mask
431d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private long mAppIdVendorMask;
441d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
451d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    // Id of the context hub this instance is expected on
461d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private int mContextHubId;
471d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
481d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
491d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * Flag indicating any version. With this flag set, all versions shall match provided version.
501d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
511d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int FLAGS_VERSION_ANY = -1;
521d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
531d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * If this flag is set, only versions strictly greater than the version specified shall match.
541d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
551d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int FLAGS_VERSION_GREAT_THAN  = 2;
561d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
571d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * If this flag is set, only versions strictly less than the version specified shall match.
581d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
591d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int FLAGS_VERSION_LESS_THAN   = 4;
60b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi    /**
61b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi     * If this flag is set, only versions strictly equal to the
62b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi     * version specified shall match.
63b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi     */
641d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int FLAGS_VERSION_STRICTLY_EQUAL = 8;
651d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
661d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
671d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * If this flag is set, only versions strictly equal to the version specified shall match.
681d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
691d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int APP_ANY = -1;
701d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
711d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
721d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * If this flag is set, all vendors shall match.
731d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
741d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int VENDOR_ANY = -1;
751d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
761d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
771d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * If this flag is set, any hub shall match.
781d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
791d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final int HUB_ANY = -1;
801d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
811d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private NanoAppFilter(Parcel in) {
821d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppId = in.readLong();
831d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppVersion = in.readInt();
841d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mVersionRestrictionMask = in.readInt();
851d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppIdVendorMask = in.readInt();
861d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
871d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
881d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public int describeContents() {
891d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        return 0;
901d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
911d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
921d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public void writeToParcel(Parcel out, int flags) {
931d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
941d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        out.writeLong(mAppId);
951d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        out.writeInt(mAppVersion);
961d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        out.writeInt(mVersionRestrictionMask);
971d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        out.writeLong(mAppIdVendorMask);
981d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
991d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
1001d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
1011d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * Create a filter
1021d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     *
1031d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * @param appId       application id
1041d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * @param appVersion  application version
1051d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * @param versionMask version
1061d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * @param vendorMask  vendor
1071d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
1081d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public NanoAppFilter(long appId, int appVersion, int versionMask, long vendorMask) {
1091d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppId = appId;
1101d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppVersion = appVersion;
1111d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mVersionRestrictionMask = versionMask;
1121d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        mAppIdVendorMask = vendorMask;
1131d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
1141d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
1151d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    private boolean versionsMatch(int versionRestrictionMask, int expected, int actual){
1161d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        // some refactoring of version restriction mask is needed, until then, return all
1171d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        return true;
1181d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
1191d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    /**
1209ff7d2235427b211344fa58b608424805a21aa24Peng Xu     * Test match method.
1211d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     *
1229ff7d2235427b211344fa58b608424805a21aa24Peng Xu     * @param info nano app instance info
1231d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     *
1241d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     * @return true if this is a match, false otherwise
1251d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi     */
1261d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public boolean testMatch(NanoAppInstanceInfo info) {
127b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi        return (mContextHubId == HUB_ANY || info.getContexthubId() == mContextHubId) &&
1281d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi                (mAppId == APP_ANY || info.getAppId() == mAppId) &&
129b741e3b374e7eebf96e2104dec5caccf723b2a39Ashutosh Joshi                (versionsMatch(mVersionRestrictionMask, mAppVersion, info.getAppVersion()));
1301d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    }
1311d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
1321d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    public static final Parcelable.Creator<NanoAppFilter> CREATOR
1331d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi            = new Parcelable.Creator<NanoAppFilter>() {
1341d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        public NanoAppFilter createFromParcel(Parcel in) {
1351d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi            return new NanoAppFilter(in);
1361d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        }
1371d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi
1381d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        public NanoAppFilter[] newArray(int size) {
1391d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi            return new NanoAppFilter[size];
1401d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi        }
1411d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi    };
1421d1ac5409597ef668e52c6f27293eaf9af575e33Ashutosh Joshi}
143