1 /*
2  * Copyright (C) 2018 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.app.prediction;
17 
18 import android.annotation.IntRange;
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.content.Context;
23 import android.os.Bundle;
24 import android.os.Parcel;
25 import android.os.Parcelable;
26 
27 /**
28  * Class that provides contextual information about the environment in which the app prediction is
29  * used, such as package name, UI in which the app targets are shown, and number of targets.
30  *
31  * @hide
32  */
33 @SystemApi
34 public final class AppPredictionContext implements Parcelable {
35 
36     private final int mPredictedTargetCount;
37     @NonNull
38     private final String mUiSurface;
39     @NonNull
40     private final String mPackageName;
41     @Nullable
42     private final Bundle mExtras;
43 
AppPredictionContext(@onNull String uiSurface, int numPredictedTargets, @NonNull String packageName, @Nullable Bundle extras)44     private AppPredictionContext(@NonNull String uiSurface, int numPredictedTargets,
45             @NonNull String packageName, @Nullable Bundle extras) {
46         mUiSurface = uiSurface;
47         mPredictedTargetCount = numPredictedTargets;
48         mPackageName = packageName;
49         mExtras = extras;
50     }
51 
AppPredictionContext(@onNull Parcel parcel)52     private AppPredictionContext(@NonNull Parcel parcel) {
53         mUiSurface = parcel.readString();
54         mPredictedTargetCount = parcel.readInt();
55         mPackageName = parcel.readString();
56         mExtras = parcel.readBundle();
57     }
58 
59     /**
60      * Returns the UI surface of the prediction context.
61      */
62     @NonNull
getUiSurface()63     public String getUiSurface() {
64         return mUiSurface;
65     }
66 
67     /**
68      * Returns the predicted target count
69      */
getPredictedTargetCount()70     public @IntRange(from = 0) int getPredictedTargetCount() {
71         return mPredictedTargetCount;
72     }
73 
74     /**
75      * Returns the package name of the prediction context.
76      */
77     @NonNull
getPackageName()78     public String getPackageName() {
79         return mPackageName;
80     }
81 
82     /**
83      * Returns the extras of the prediction context.
84      */
85     @Nullable
getExtras()86     public Bundle getExtras() {
87         return mExtras;
88     }
89 
90     @Override
equals(@ullable Object o)91     public boolean equals(@Nullable Object o) {
92         if (o == this) return true;
93         if (!getClass().equals(o != null ? o.getClass() : null)) return false;
94 
95         AppPredictionContext other = (AppPredictionContext) o;
96         return mPredictedTargetCount == other.mPredictedTargetCount
97                 && mUiSurface.equals(other.mUiSurface)
98                 && mPackageName.equals(other.mPackageName);
99     }
100 
101     @Override
describeContents()102     public int describeContents() {
103         return 0;
104     }
105 
106     @Override
writeToParcel(@onNull Parcel dest, int flags)107     public void writeToParcel(@NonNull Parcel dest, int flags) {
108         dest.writeString(mUiSurface);
109         dest.writeInt(mPredictedTargetCount);
110         dest.writeString(mPackageName);
111         dest.writeBundle(mExtras);
112     }
113 
114     public static final @android.annotation.NonNull Parcelable.Creator<AppPredictionContext> CREATOR =
115             new Parcelable.Creator<AppPredictionContext>() {
116                 public AppPredictionContext createFromParcel(Parcel parcel) {
117                     return new AppPredictionContext(parcel);
118                 }
119 
120                 public AppPredictionContext[] newArray(int size) {
121                     return new AppPredictionContext[size];
122                 }
123             };
124 
125     /**
126      * A builder for app prediction contexts.
127      * @hide
128      */
129     @SystemApi
130     public static final class Builder {
131 
132         @NonNull
133         private final String mPackageName;
134 
135         private int mPredictedTargetCount;
136         @Nullable
137         private String mUiSurface;
138         @Nullable
139         private Bundle mExtras;
140 
141         /**
142          * @param context The {@link Context} of the prediction client.
143          *
144          * @hide
145          */
146         @SystemApi
Builder(@onNull Context context)147         public Builder(@NonNull Context context) {
148             mPackageName = context.getPackageName();
149         }
150 
151 
152         /**
153          * Sets the number of prediction targets as a hint.
154          */
155         @NonNull
setPredictedTargetCount(@ntRangefrom = 0) int predictedTargetCount)156         public Builder setPredictedTargetCount(@IntRange(from = 0) int predictedTargetCount) {
157             mPredictedTargetCount = predictedTargetCount;
158             return this;
159         }
160 
161         /**
162          * Sets the UI surface.
163          */
164         @NonNull
setUiSurface(@onNull String uiSurface)165         public Builder setUiSurface(@NonNull String uiSurface) {
166             mUiSurface = uiSurface;
167             return this;
168         }
169 
170         /**
171          * Sets the extras.
172          */
173         @NonNull
setExtras(@ullable Bundle extras)174         public Builder setExtras(@Nullable Bundle extras) {
175             mExtras = extras;
176             return this;
177         }
178 
179         /**
180          * Builds a new context instance.
181          */
182         @NonNull
build()183         public AppPredictionContext build() {
184             return new AppPredictionContext(mUiSurface, mPredictedTargetCount, mPackageName,
185                     mExtras);
186         }
187     }
188 }
189