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 }