1 /*
2  * Copyright (C) 2021 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.systemui.flags
18 
19 import android.os.Parcel
20 import android.os.Parcelable
21 
22 interface Flag<T> : Parcelable {
23     val id: Int
24     val default: T
25     val resourceOverride: Int
26 
27     override fun describeContents() = 0
28 
29     fun hasResourceOverride(): Boolean {
30         return resourceOverride != -1
31     }
32 }
33 
34 // Consider using the "parcelize" kotlin library.
35 
36 data class BooleanFlag @JvmOverloads constructor(
37     override val id: Int,
38     override val default: Boolean = false,
39     override val resourceOverride: Int = -1
40 ) : Flag<Boolean> {
41 
42     companion object {
43         @JvmField
44         val CREATOR = object : Parcelable.Creator<BooleanFlag> {
45             override fun createFromParcel(parcel: Parcel) = BooleanFlag(parcel)
46             override fun newArray(size: Int) = arrayOfNulls<BooleanFlag>(size)
47         }
48     }
49 
50     private constructor(parcel: Parcel) : this(
51         id = parcel.readInt(),
52         default = parcel.readBoolean()
53     )
54 
55     override fun writeToParcel(parcel: Parcel, flags: Int) {
56         parcel.writeInt(id)
57         parcel.writeBoolean(default)
58     }
59 }
60 
61 data class StringFlag @JvmOverloads constructor(
62     override val id: Int,
63     override val default: String = "",
64     override val resourceOverride: Int = -1
65 ) : Flag<String> {
66     companion object {
67         @JvmField
68         val CREATOR = object : Parcelable.Creator<StringFlag> {
69             override fun createFromParcel(parcel: Parcel) = StringFlag(parcel)
70             override fun newArray(size: Int) = arrayOfNulls<StringFlag>(size)
71         }
72     }
73 
74     private constructor(parcel: Parcel) : this(
75         id = parcel.readInt(),
76         default = parcel.readString() ?: ""
77     )
78 
79     override fun writeToParcel(parcel: Parcel, flags: Int) {
80         parcel.writeInt(id)
81         parcel.writeString(default)
82     }
83 }
84 
85 data class IntFlag @JvmOverloads constructor(
86     override val id: Int,
87     override val default: Int = 0,
88     override val resourceOverride: Int = -1
89 ) : Flag<Int> {
90 
91     companion object {
92         @JvmField
93         val CREATOR = object : Parcelable.Creator<IntFlag> {
94             override fun createFromParcel(parcel: Parcel) = IntFlag(parcel)
95             override fun newArray(size: Int) = arrayOfNulls<IntFlag>(size)
96         }
97     }
98 
99     private constructor(parcel: Parcel) : this(
100         id = parcel.readInt(),
101         default = parcel.readInt()
102     )
103 
104     override fun writeToParcel(parcel: Parcel, flags: Int) {
105         parcel.writeInt(id)
106         parcel.writeInt(default)
107     }
108 }
109 
110 data class LongFlag @JvmOverloads constructor(
111     override val id: Int,
112     override val default: Long = 0,
113     override val resourceOverride: Int = -1
114 ) : Flag<Long> {
115 
116     companion object {
117         @JvmField
118         val CREATOR = object : Parcelable.Creator<LongFlag> {
119             override fun createFromParcel(parcel: Parcel) = LongFlag(parcel)
120             override fun newArray(size: Int) = arrayOfNulls<LongFlag>(size)
121         }
122     }
123 
124     private constructor(parcel: Parcel) : this(
125         id = parcel.readInt(),
126         default = parcel.readLong()
127     )
128 
129     override fun writeToParcel(parcel: Parcel, flags: Int) {
130         parcel.writeInt(id)
131         parcel.writeLong(default)
132     }
133 }
134 
135 data class FloatFlag @JvmOverloads constructor(
136     override val id: Int,
137     override val default: Float = 0f,
138     override val resourceOverride: Int = -1
139 ) : Flag<Float> {
140 
141     companion object {
142         @JvmField
143         val CREATOR = object : Parcelable.Creator<FloatFlag> {
144             override fun createFromParcel(parcel: Parcel) = FloatFlag(parcel)
145             override fun newArray(size: Int) = arrayOfNulls<FloatFlag>(size)
146         }
147     }
148 
149     private constructor(parcel: Parcel) : this(
150         id = parcel.readInt(),
151         default = parcel.readFloat()
152     )
153 
154     override fun writeToParcel(parcel: Parcel, flags: Int) {
155         parcel.writeInt(id)
156         parcel.writeFloat(default)
157     }
158 }
159 
160 data class DoubleFlag @JvmOverloads constructor(
161     override val id: Int,
162     override val default: Double = 0.0,
163     override val resourceOverride: Int = -1
164 ) : Flag<Double> {
165 
166     companion object {
167         @JvmField
168         val CREATOR = object : Parcelable.Creator<DoubleFlag> {
169             override fun createFromParcel(parcel: Parcel) = DoubleFlag(parcel)
170             override fun newArray(size: Int) = arrayOfNulls<DoubleFlag>(size)
171         }
172     }
173 
174     private constructor(parcel: Parcel) : this(
175         id = parcel.readInt(),
176         default = parcel.readDouble()
177     )
178 
179     override fun writeToParcel(parcel: Parcel, flags: Int) {
180         parcel.writeInt(id)
181         parcel.writeDouble(default)
182     }
183 }