ChannelImpressions.java revision f8c53678cb0af08a8048393afb0db6d5c5bc7ec7
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
17package android.ext.services.notification;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.util.Log;
22
23public final class ChannelImpressions implements Parcelable {
24    private static final String TAG = "ExtAssistant.CI";
25    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
26
27    static final double DISMISS_TO_VIEW_RATIO_LIMIT = .8;
28    static final int STREAK_LIMIT = 2;
29
30    private int mDismissals = 0;
31    private int mViews = 0;
32    private int mStreak = 0;
33
34    public ChannelImpressions() {
35    }
36
37    public ChannelImpressions(int dismissals, int views) {
38        mDismissals = dismissals;
39        mViews = views;
40    }
41
42    protected ChannelImpressions(Parcel in) {
43        mDismissals = in.readInt();
44        mViews = in.readInt();
45        mStreak = in.readInt();
46    }
47
48    public int getStreak() {
49        return mStreak;
50    }
51
52    public int getDismissals() {
53        return mDismissals;
54    }
55
56    public int getViews() {
57        return mViews;
58    }
59
60    public void incrementDismissals() {
61        mDismissals++;
62        mStreak++;
63    }
64
65    public void incrementViews() {
66        mViews++;
67    }
68
69    public void resetStreak() {
70        mStreak = 0;
71    }
72
73    public boolean shouldTriggerBlock() {
74        if (getViews() == 0) {
75            return false;
76        }
77        if (DEBUG) {
78            Log.d(TAG, "should trigger? " + getDismissals() + " " + getViews() + " " + getStreak());
79        }
80        return ((double) getDismissals() / getViews()) > DISMISS_TO_VIEW_RATIO_LIMIT
81                && getStreak() > STREAK_LIMIT;
82    }
83
84    @Override
85    public void writeToParcel(Parcel dest, int flags) {
86        dest.writeInt(mDismissals);
87        dest.writeInt(mViews);
88        dest.writeInt(mStreak);
89    }
90
91    @Override
92    public int describeContents() {
93        return 0;
94    }
95
96    public static final Creator<ChannelImpressions> CREATOR = new Creator<ChannelImpressions>() {
97        @Override
98        public ChannelImpressions createFromParcel(Parcel in) {
99            return new ChannelImpressions(in);
100        }
101
102        @Override
103        public ChannelImpressions[] newArray(int size) {
104            return new ChannelImpressions[size];
105        }
106    };
107
108    @Override
109    public boolean equals(Object o) {
110        if (this == o) return true;
111        if (o == null || getClass() != o.getClass()) return false;
112
113        ChannelImpressions that = (ChannelImpressions) o;
114
115        if (mDismissals != that.mDismissals) return false;
116        if (mViews != that.mViews) return false;
117        return mStreak == that.mStreak;
118    }
119
120    @Override
121    public int hashCode() {
122        int result = mDismissals;
123        result = 31 * result + mViews;
124        result = 31 * result + mStreak;
125        return result;
126    }
127
128    @Override
129    public String toString() {
130        final StringBuilder sb = new StringBuilder("ChannelImpressions{");
131        sb.append("mDismissals=").append(mDismissals);
132        sb.append(", mViews=").append(mViews);
133        sb.append(", mStreak=").append(mStreak);
134        sb.append('}');
135        return sb.toString();
136    }
137}
138