1 /*
2  * Copyright (C) 2020 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 
17 package com.android.launcher3.logging;
18 
19 import static java.lang.Math.max;
20 import static java.lang.Math.min;
21 
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import androidx.annotation.NonNull;
26 import androidx.annotation.Nullable;
27 import androidx.annotation.VisibleForTesting;
28 
29 
30 /**
31  * An opaque identifier used to disambiguate which logs refer to a particular instance of some
32  * UI element. Useful when there might be multiple instances simultaneously active.
33  * Obtain from InstanceIdSequence.  Clipped to range [0, INSTANCE_ID_MAX].
34  *
35  * Copy of frameworks/base/core/java/com/android/internal/logging/InstanceId.java.
36  */
37 public final class InstanceId implements Parcelable {
38     // At most 20 bits: ~1m possibilities, ~0.5% probability of collision in 100 values
39     static final int INSTANCE_ID_MAX = 1 << 20;
40 
41     private final int mId;
InstanceId(int id)42     InstanceId(int id) {
43         mId = min(max(0, id), INSTANCE_ID_MAX);
44     }
45 
InstanceId(Parcel in)46     private InstanceId(Parcel in) {
47         this(in.readInt());
48     }
49 
50     @VisibleForTesting
getId()51     public int getId() {
52         return mId;
53     }
54 
55     @NonNull
56     @Override
toString()57     public String toString() {
58         return mId + "";
59     }
60 
61     /**
62      * Create a fake instance ID for testing purposes.  Not for production use. See also
63      * InstanceIdSequenceFake, which is a testing replacement for InstanceIdSequence.
64      * @param id The ID you want to assign.
65      * @return new InstanceId.
66      */
67     @VisibleForTesting
fakeInstanceId(int id)68     public static InstanceId fakeInstanceId(int id) {
69         return new InstanceId(id);
70     }
71 
72     @Override
hashCode()73     public int hashCode() {
74         return mId;
75     }
76 
77     @Override
equals(@ullable Object obj)78     public boolean equals(@Nullable Object obj) {
79         if (!(obj instanceof InstanceId)) {
80             return false;
81         }
82         return mId == ((InstanceId) obj).mId;
83     }
84 
85     @Override
describeContents()86     public int describeContents() {
87         return 0;
88     }
89 
90     @Override
writeToParcel(Parcel out, int flags)91     public void writeToParcel(Parcel out, int flags) {
92         out.writeInt(mId);
93     }
94 
95     public static final Parcelable.Creator<InstanceId> CREATOR =
96             new Parcelable.Creator<InstanceId>() {
97                 @Override
98                 public InstanceId createFromParcel(Parcel in) {
99                     return new InstanceId(in);
100                 }
101 
102                 @Override
103                 public InstanceId[] newArray(int size) {
104                     return new InstanceId[size];
105                 }
106             };
107 
108 }
109