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 }