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