• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (C) 2017 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 android.ext.services.notification;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 import android.text.TextUtils;
22 import android.util.Log;
23 
24 import androidx.annotation.VisibleForTesting;
25 
26 import org.xmlpull.v1.XmlPullParser;
27 import org.xmlpull.v1.XmlSerializer;
28 
29 import java.io.IOException;
30 
31 public final class ChannelImpressions implements Parcelable {
32     private static final String TAG = "ExtAssistant.CI";
33     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
34 
35     static final float DEFAULT_DISMISS_TO_VIEW_RATIO_LIMIT = .8f;
36     static final int DEFAULT_STREAK_LIMIT = 2;
37     static final String ATT_DISMISSALS = "dismisses";
38     static final String ATT_VIEWS = "views";
39     static final String ATT_STREAK = "streak";
40     static final String ATT_SENT = "sent";
41     static final String ATT_INTERRUPTIVE = "interruptive";
42 
43     private int mDismissals = 0;
44     private int mViews = 0;
45     private int mStreak = 0;
46 
47     private float mDismissToViewRatioLimit;
48     private int mStreakLimit;
49 
ChannelImpressions()50     public ChannelImpressions() {
51         mDismissToViewRatioLimit = DEFAULT_DISMISS_TO_VIEW_RATIO_LIMIT;
52         mStreakLimit = DEFAULT_STREAK_LIMIT;
53     }
54 
ChannelImpressions(Parcel in)55     protected ChannelImpressions(Parcel in) {
56         mDismissals = in.readInt();
57         mViews = in.readInt();
58         mStreak = in.readInt();
59         mDismissToViewRatioLimit = in.readFloat();
60         mStreakLimit = in.readInt();
61     }
62 
getStreak()63     public int getStreak() {
64         return mStreak;
65     }
66 
getDismissals()67     public int getDismissals() {
68         return mDismissals;
69     }
70 
getViews()71     public int getViews() {
72         return mViews;
73     }
74 
incrementDismissals()75     public void incrementDismissals() {
76         mDismissals++;
77         mStreak++;
78     }
79 
updateThresholds(float dismissToViewRatioLimit, int streakLimit)80     void updateThresholds(float dismissToViewRatioLimit, int streakLimit) {
81         mDismissToViewRatioLimit = dismissToViewRatioLimit;
82         mStreakLimit = streakLimit;
83     }
84 
append(ChannelImpressions additionalImpressions)85     public void append(ChannelImpressions additionalImpressions) {
86         if (additionalImpressions != null) {
87             mViews += additionalImpressions.getViews();
88             mStreak += additionalImpressions.getStreak();
89             mDismissals += additionalImpressions.getDismissals();
90         }
91     }
92 
incrementViews()93     public void incrementViews() {
94         mViews++;
95     }
96 
resetStreak()97     public void resetStreak() {
98         mStreak = 0;
99     }
100 
shouldTriggerBlock()101     public boolean shouldTriggerBlock() {
102         if (getViews() == 0) {
103             return false;
104         }
105         if (DEBUG) {
106             Log.d(TAG, "should trigger? " + getDismissals() + " " + getViews() + " " + getStreak());
107         }
108         return ((float) getDismissals() / getViews()) > mDismissToViewRatioLimit
109                 && getStreak() > mStreakLimit;
110     }
111 
112     @Override
writeToParcel(Parcel dest, int flags)113     public void writeToParcel(Parcel dest, int flags) {
114         dest.writeInt(mDismissals);
115         dest.writeInt(mViews);
116         dest.writeInt(mStreak);
117         dest.writeFloat(mDismissToViewRatioLimit);
118         dest.writeInt(mStreakLimit);
119     }
120 
121     @Override
describeContents()122     public int describeContents() {
123         return 0;
124     }
125 
126     public static final Creator<ChannelImpressions> CREATOR = new Creator<ChannelImpressions>() {
127         @Override
128         public ChannelImpressions createFromParcel(Parcel in) {
129             return new ChannelImpressions(in);
130         }
131 
132         @Override
133         public ChannelImpressions[] newArray(int size) {
134             return new ChannelImpressions[size];
135         }
136     };
137 
138     @Override
equals(Object o)139     public boolean equals(Object o) {
140         if (this == o) return true;
141         if (o == null || getClass() != o.getClass()) return false;
142 
143         ChannelImpressions that = (ChannelImpressions) o;
144 
145         if (mDismissals != that.mDismissals) return false;
146         if (mViews != that.mViews) return false;
147         return mStreak == that.mStreak;
148     }
149 
150     @Override
hashCode()151     public int hashCode() {
152         int result = mDismissals;
153         result = 31 * result + mViews;
154         result = 31 * result + mStreak;
155         return result;
156     }
157 
158     @Override
toString()159     public String toString() {
160         final StringBuilder sb = new StringBuilder("ChannelImpressions{");
161         sb.append("mDismissals=").append(mDismissals);
162         sb.append(", mViews=").append(mViews);
163         sb.append(", mStreak=").append(mStreak);
164         sb.append(", thresholds=(").append(mDismissToViewRatioLimit);
165         sb.append(",").append(mStreakLimit);
166         sb.append(")}");
167         return sb.toString();
168     }
169 }
170