16bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen/*
26bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Copyright (C) 2014 The Android Open Source Project
36bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen *
46bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Licensed under the Apache License, Version 2.0 (the "License");
56bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * you may not use this file except in compliance with the License.
66bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * You may obtain a copy of the License at
76bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen *
86bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen *      http://www.apache.org/licenses/LICENSE-2.0
96bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen *
106bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * Unless required by applicable law or agreed to in writing, software
116bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * distributed under the License is distributed on an "AS IS" BASIS,
126bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * See the License for the specific language governing permissions and
146bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * limitations under the License.
156bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */
166bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
176bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenpackage android.net;
186bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
196bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenimport static android.os.UserHandle.PER_USER_RANGE;
206bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
216bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenimport android.os.Parcel;
226bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenimport android.os.Parcelable;
236bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
246bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenimport java.lang.IllegalArgumentException;
256bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
266bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen/**
276bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * An inclusive range of UIDs.
286bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen *
296bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen * @hide
306bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen */
316bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenpublic final class UidRange implements Parcelable {
326bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public final int start;
336bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public final int stop;
346bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
356bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public UidRange(int startUid, int stopUid) {
366bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        if (startUid < 0) throw new IllegalArgumentException("Invalid start UID.");
376bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        if (stopUid < 0) throw new IllegalArgumentException("Invalid stop UID.");
386bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        if (startUid > stopUid) throw new IllegalArgumentException("Invalid UID range.");
396bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        start = startUid;
406bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        stop  = stopUid;
416bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
426bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
436bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public static UidRange createForUser(int userId) {
446bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return new UidRange(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1);
456bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
466bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
476bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public int getStartUser() {
486bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return start / PER_USER_RANGE;
496bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
506bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
514d03abcd49af490dba3850d341b955dd72f24959Robin Lee    public boolean contains(int uid) {
524d03abcd49af490dba3850d341b955dd72f24959Robin Lee        return start <= uid && uid <= stop;
534d03abcd49af490dba3850d341b955dd72f24959Robin Lee    }
544d03abcd49af490dba3850d341b955dd72f24959Robin Lee
554d03abcd49af490dba3850d341b955dd72f24959Robin Lee    /**
564d03abcd49af490dba3850d341b955dd72f24959Robin Lee     * @return {@code true} if this range contains every UID contained by the {@param other} range.
574d03abcd49af490dba3850d341b955dd72f24959Robin Lee     */
584d03abcd49af490dba3850d341b955dd72f24959Robin Lee    public boolean containsRange(UidRange other) {
594d03abcd49af490dba3850d341b955dd72f24959Robin Lee        return start <= other.start && other.stop <= stop;
604d03abcd49af490dba3850d341b955dd72f24959Robin Lee    }
614d03abcd49af490dba3850d341b955dd72f24959Robin Lee
626bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    @Override
636bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public int hashCode() {
646bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        int result = 17;
656bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        result = 31 * result + start;
666bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        result = 31 * result + stop;
676bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return result;
686bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
696bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
706bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    @Override
716bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public boolean equals(Object o) {
726bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        if (this == o) {
736bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            return true;
746bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        }
756bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        if (o instanceof UidRange) {
766bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            UidRange other = (UidRange) o;
776bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            return start == other.start && stop == other.stop;
786bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        }
796bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return false;
806bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
816bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
826bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    @Override
836bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public String toString() {
846bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return start + "-" + stop;
856bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
866bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
876bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    // implement the Parcelable interface
886bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    @Override
896bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public int describeContents() {
906bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        return 0;
916bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
926bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
936bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    @Override
946bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public void writeToParcel(Parcel dest, int flags) {
956bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        dest.writeInt(start);
966bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        dest.writeInt(stop);
976bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
986bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
996bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public static final Creator<UidRange> CREATOR =
1006bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        new Creator<UidRange>() {
1016bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            @Override
1026bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            public UidRange createFromParcel(Parcel in) {
1036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen                int start = in.readInt();
1046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen                int stop = in.readInt();
1056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
1066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen                return new UidRange(start, stop);
1076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            }
1086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            @Override
1096bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            public UidRange[] newArray(int size) {
1106bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen                return new UidRange[size];
1116bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen            }
1126bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    };
1136bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen}
114