1 /* 2 * Copyright (C) 2015 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.service.quicksettings; 17 18 import android.content.ComponentName; 19 import android.graphics.drawable.Icon; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 import android.os.RemoteException; 23 import android.text.TextUtils; 24 import android.util.Log; 25 26 /** 27 * A Tile holds the state of a tile that will be displayed 28 * in Quick Settings. 29 * 30 * A tile in Quick Settings exists as an icon with an accompanied label. 31 * It also may have content description for accessibility usability. 32 * The style and layout of the tile may change to match a given 33 * device. 34 */ 35 public final class Tile implements Parcelable { 36 37 private static final String TAG = "Tile"; 38 39 /** 40 * An unavailable state indicates that for some reason this tile is not currently 41 * available to the user for some reason, and will have no click action. The tile's 42 * icon will be tinted differently to reflect this state. 43 */ 44 public static final int STATE_UNAVAILABLE = 0; 45 46 /** 47 * This represents a tile that is currently in a disabled state but is still interactable. 48 * 49 * A disabled state indicates that the tile is not currently active (e.g. wifi disconnected or 50 * bluetooth disabled), but is still interactable by the user to modify this state. Tiles 51 * that have boolean states should use this to represent one of their states. The tile's 52 * icon will be tinted differently to reflect this state, but still be distinct from unavailable. 53 */ 54 public static final int STATE_INACTIVE = 1; 55 56 /** 57 * This represents a tile that is currently active. (e.g. wifi is connected, bluetooth is on, 58 * cast is casting). This is the default state. 59 */ 60 public static final int STATE_ACTIVE = 2; 61 62 private ComponentName mComponentName; 63 private Icon mIcon; 64 private CharSequence mLabel; 65 private CharSequence mContentDescription; 66 // Default to active until clients of the new API can update. 67 private int mState = STATE_ACTIVE; 68 69 private IQSService mService; 70 71 /** 72 * @hide 73 */ Tile(Parcel source)74 public Tile(Parcel source) { 75 readFromParcel(source); 76 } 77 78 /** 79 * @hide 80 */ Tile(ComponentName componentName)81 public Tile(ComponentName componentName) { 82 mComponentName = componentName; 83 } 84 85 /** 86 * @hide 87 */ setService(IQSService service)88 public void setService(IQSService service) { 89 mService = service; 90 } 91 92 /** 93 * @hide 94 */ getComponentName()95 public ComponentName getComponentName() { 96 return mComponentName; 97 } 98 99 /** 100 * @hide 101 */ getQsService()102 public IQSService getQsService() { 103 return mService; 104 } 105 106 /** 107 * The current state of the tile. 108 * 109 * @see #STATE_UNAVAILABLE 110 * @see #STATE_INACTIVE 111 * @see #STATE_ACTIVE 112 */ getState()113 public int getState() { 114 return mState; 115 } 116 117 /** 118 * Sets the current state for the tile. 119 * 120 * Does not take effect until {@link #updateTile()} is called. 121 * 122 * @param state One of {@link #STATE_UNAVAILABLE}, {@link #STATE_INACTIVE}, 123 * {@link #STATE_ACTIVE} 124 */ setState(int state)125 public void setState(int state) { 126 mState = state; 127 } 128 129 /** 130 * Gets the current icon for the tile. 131 */ getIcon()132 public Icon getIcon() { 133 return mIcon; 134 } 135 136 /** 137 * Sets the current icon for the tile. 138 * 139 * This icon is expected to be white on alpha, and may be 140 * tinted by the system to match it's theme. 141 * 142 * Does not take effect until {@link #updateTile()} is called. 143 * 144 * @param icon New icon to show. 145 */ setIcon(Icon icon)146 public void setIcon(Icon icon) { 147 this.mIcon = icon; 148 } 149 150 /** 151 * Gets the current label for the tile. 152 */ getLabel()153 public CharSequence getLabel() { 154 return mLabel; 155 } 156 157 /** 158 * Sets the current label for the tile. 159 * 160 * Does not take effect until {@link #updateTile()} is called. 161 * 162 * @param label New label to show. 163 */ setLabel(CharSequence label)164 public void setLabel(CharSequence label) { 165 this.mLabel = label; 166 } 167 168 /** 169 * Gets the current content description for the tile. 170 */ getContentDescription()171 public CharSequence getContentDescription() { 172 return mContentDescription; 173 } 174 175 /** 176 * Sets the current content description for the tile. 177 * 178 * Does not take effect until {@link #updateTile()} is called. 179 * 180 * @param contentDescription New content description to use. 181 */ setContentDescription(CharSequence contentDescription)182 public void setContentDescription(CharSequence contentDescription) { 183 this.mContentDescription = contentDescription; 184 } 185 186 @Override describeContents()187 public int describeContents() { 188 return 0; 189 } 190 191 /** 192 * Pushes the state of the Tile to Quick Settings to be displayed. 193 */ updateTile()194 public void updateTile() { 195 try { 196 mService.updateQsTile(this); 197 } catch (RemoteException e) { 198 Log.e(TAG, "Couldn't update tile"); 199 } 200 } 201 202 @Override writeToParcel(Parcel dest, int flags)203 public void writeToParcel(Parcel dest, int flags) { 204 if (mComponentName != null) { 205 dest.writeByte((byte) 1); 206 mComponentName.writeToParcel(dest, flags); 207 } else { 208 dest.writeByte((byte) 0); 209 } 210 if (mIcon != null) { 211 dest.writeByte((byte) 1); 212 mIcon.writeToParcel(dest, flags); 213 } else { 214 dest.writeByte((byte) 0); 215 } 216 dest.writeInt(mState); 217 TextUtils.writeToParcel(mLabel, dest, flags); 218 TextUtils.writeToParcel(mContentDescription, dest, flags); 219 } 220 readFromParcel(Parcel source)221 private void readFromParcel(Parcel source) { 222 if (source.readByte() != 0) { 223 mComponentName = ComponentName.CREATOR.createFromParcel(source); 224 } else { 225 mComponentName = null; 226 } 227 if (source.readByte() != 0) { 228 mIcon = Icon.CREATOR.createFromParcel(source); 229 } else { 230 mIcon = null; 231 } 232 mState = source.readInt(); 233 mLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 234 mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 235 } 236 237 public static final Creator<Tile> CREATOR = new Creator<Tile>() { 238 @Override 239 public Tile createFromParcel(Parcel source) { 240 return new Tile(source); 241 } 242 243 @Override 244 public Tile[] newArray(int size) { 245 return new Tile[size]; 246 } 247 }; 248 }