ZenModeConfig.java revision 99f963ea04d7a86219ece00c356f3f6bce33b6d6
1056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock/** 2056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * Copyright (c) 2014, The Android Open Source Project 3056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * 4056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * you may not use this file except in compliance with the License. 6056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * You may obtain a copy of the License at 7056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * 8056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * 10056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * Unless required by applicable law or agreed to in writing, software 11056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * See the License for the specific language governing permissions and 14056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * limitations under the License. 15056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock */ 16056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 17056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockpackage android.service.notification; 18056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 193b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockimport android.content.ComponentName; 203b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockimport android.net.Uri; 21056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport android.os.Parcel; 22056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport android.os.Parcelable; 23056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport android.text.TextUtils; 24056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 25056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport org.xmlpull.v1.XmlPullParser; 26056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport org.xmlpull.v1.XmlPullParserException; 27056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport org.xmlpull.v1.XmlSerializer; 28056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 29056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport java.io.IOException; 303b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockimport java.util.ArrayList; 313b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlockimport java.util.Arrays; 32056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockimport java.util.Objects; 33056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 34056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock/** 35056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * Persisted configuration for zen mode. 36056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * 37056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock * @hide 38056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock */ 39056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlockpublic class ZenModeConfig implements Parcelable { 40056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 41056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static final String SLEEP_MODE_NIGHTS = "nights"; 42056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static final String SLEEP_MODE_WEEKNIGHTS = "weeknights"; 43056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 4499f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public static final int SOURCE_ANYONE = 0; 4599f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public static final int SOURCE_CONTACT = 1; 4699f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public static final int SOURCE_STAR = 2; 4799f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public static final int MAX_SOURCE = SOURCE_STAR; 4899f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren 49056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final int XML_VERSION = 1; 50056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String ZEN_TAG = "zen"; 51056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String ZEN_ATT_VERSION = "version"; 52056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String ALLOW_TAG = "allow"; 53056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String ALLOW_ATT_CALLS = "calls"; 54056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String ALLOW_ATT_MESSAGES = "messages"; 5599f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren private static final String ALLOW_ATT_FROM = "from"; 56056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_TAG = "sleep"; 57056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_ATT_MODE = "mode"; 58056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 59056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_ATT_START_HR = "startHour"; 60056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_ATT_START_MIN = "startMin"; 61056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_ATT_END_HR = "endHour"; 62056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static final String SLEEP_ATT_END_MIN = "endMin"; 63056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 643b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock private static final String CONDITION_TAG = "condition"; 653b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock private static final String CONDITION_ATT_COMPONENT = "component"; 663b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock private static final String CONDITION_ATT_ID = "id"; 673b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 68056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public boolean allowCalls; 69056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public boolean allowMessages; 7099f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public int allowFrom = SOURCE_ANYONE; 71056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 72056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public String sleepMode; 73056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int sleepStartHour; 74056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int sleepStartMinute; 75056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int sleepEndHour; 76056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int sleepEndMinute; 773b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock public ComponentName[] conditionComponents; 783b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock public Uri[] conditionIds; 79056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 80056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public ZenModeConfig() { } 81056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 82056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public ZenModeConfig(Parcel source) { 83056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock allowCalls = source.readInt() == 1; 84056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock allowMessages = source.readInt() == 1; 85056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (source.readInt() == 1) { 86056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock sleepMode = source.readString(); 87056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 88056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock sleepStartHour = source.readInt(); 89056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock sleepStartMinute = source.readInt(); 90056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock sleepEndHour = source.readInt(); 91056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock sleepEndMinute = source.readInt(); 923b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock int len = source.readInt(); 933b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (len > 0) { 943b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock conditionComponents = new ComponentName[len]; 953b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock source.readTypedArray(conditionComponents, ComponentName.CREATOR); 963b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 973b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock len = source.readInt(); 983b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (len > 0) { 993b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock conditionIds = new Uri[len]; 1003b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock source.readTypedArray(conditionIds, Uri.CREATOR); 1013b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 10299f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren allowFrom = source.readInt(); 103056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 104056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 105056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 106056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public void writeToParcel(Parcel dest, int flags) { 107056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(allowCalls ? 1 : 0); 108056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(allowMessages ? 1 : 0); 109056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (sleepMode != null) { 110056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(1); 111056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeString(sleepMode); 112056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } else { 113056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(0); 114056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 115056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(sleepStartHour); 116056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(sleepStartMinute); 117056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(sleepEndHour); 118056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock dest.writeInt(sleepEndMinute); 1193b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (conditionComponents != null && conditionComponents.length > 0) { 1203b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeInt(conditionComponents.length); 1213b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeTypedArray(conditionComponents, 0); 1223b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } else { 1233b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeInt(0); 1243b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 1253b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (conditionIds != null && conditionIds.length > 0) { 1263b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeInt(conditionIds.length); 1273b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeTypedArray(conditionIds, 0); 1283b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } else { 1293b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock dest.writeInt(0); 1303b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 13199f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren dest.writeInt(allowFrom); 132056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 133056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 134056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 135056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public String toString() { 136056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return new StringBuilder(ZenModeConfig.class.getSimpleName()).append('[') 137056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append("allowCalls=").append(allowCalls) 138056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append(",allowMessages=").append(allowMessages) 13999f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren .append(",allowFrom=").append(sourceToString(allowFrom)) 140056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append(",sleepMode=").append(sleepMode) 141056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append(",sleepStart=").append(sleepStartHour).append('.').append(sleepStartMinute) 142056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append(",sleepEnd=").append(sleepEndHour).append('.').append(sleepEndMinute) 1433b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock .append(",conditionComponents=") 1443b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock .append(conditionComponents == null ? null : TextUtils.join(",", conditionComponents)) 1453b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock .append(",conditionIds=") 1463b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock .append(conditionIds == null ? null : TextUtils.join(",", conditionIds)) 147056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock .append(']').toString(); 148056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 149056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 15099f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren public static String sourceToString(int source) { 15199f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren switch (source) { 15299f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren case SOURCE_ANYONE: 15399f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren return "anyone"; 15499f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren case SOURCE_CONTACT: 15599f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren return "contacts"; 15699f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren case SOURCE_STAR: 15799f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren return "stars"; 15899f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren default: 15999f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren return "UNKNOWN"; 16099f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren } 16199f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren } 16299f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren 163056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 164056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public boolean equals(Object o) { 165056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (!(o instanceof ZenModeConfig)) return false; 166056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (o == this) return true; 167056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final ZenModeConfig other = (ZenModeConfig) o; 168056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return other.allowCalls == allowCalls 169056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && other.allowMessages == allowMessages 17099f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren && other.allowFrom == allowFrom 171056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && Objects.equals(other.sleepMode, sleepMode) 172056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && other.sleepStartHour == sleepStartHour 173056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && other.sleepStartMinute == sleepStartMinute 174056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && other.sleepEndHour == sleepEndHour 1753b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock && other.sleepEndMinute == sleepEndMinute 1763b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock && Objects.deepEquals(other.conditionComponents, conditionComponents) 1773b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock && Objects.deepEquals(other.conditionIds, conditionIds); 178056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 179056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 180056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 181056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int hashCode() { 18299f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren return Objects.hash(allowCalls, allowMessages, allowFrom, sleepMode, 18399f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren sleepStartHour, sleepStartMinute, sleepEndHour, sleepEndMinute, 1843b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock Arrays.hashCode(conditionComponents), Arrays.hashCode(conditionIds)); 185056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 186056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 187056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public boolean isValid() { 188056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return isValidHour(sleepStartHour) && isValidMinute(sleepStartMinute) 189056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && isValidHour(sleepEndHour) && isValidMinute(sleepEndMinute) 190056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock && (sleepMode == null || sleepMode.equals(SLEEP_MODE_NIGHTS) 191056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock || sleepMode.equals(SLEEP_MODE_WEEKNIGHTS)); 192056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 193056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 194056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static ZenModeConfig readXml(XmlPullParser parser) 195056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock throws XmlPullParserException, IOException { 196056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock int type = parser.getEventType(); 197056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (type != XmlPullParser.START_TAG) return null; 198056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock String tag = parser.getName(); 199056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (!ZEN_TAG.equals(tag)) return null; 200056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final ZenModeConfig rt = new ZenModeConfig(); 201056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final int version = Integer.parseInt(parser.getAttributeValue(null, ZEN_ATT_VERSION)); 2023b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final ArrayList<ComponentName> conditionComponents = new ArrayList<ComponentName>(); 2033b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final ArrayList<Uri> conditionIds = new ArrayList<Uri>(); 204056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) { 205056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock tag = parser.getName(); 2063b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (type == XmlPullParser.END_TAG && ZEN_TAG.equals(tag)) { 2073b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (!conditionComponents.isEmpty()) { 2083b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock rt.conditionComponents = conditionComponents 2093b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock .toArray(new ComponentName[conditionComponents.size()]); 2103b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock rt.conditionIds = conditionIds.toArray(new Uri[conditionIds.size()]); 2113b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 2123b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock return rt; 2133b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 214056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (type == XmlPullParser.START_TAG) { 215056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (ALLOW_TAG.equals(tag)) { 216056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.allowCalls = safeBoolean(parser, ALLOW_ATT_CALLS, false); 217056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.allowMessages = safeBoolean(parser, ALLOW_ATT_MESSAGES, false); 21899f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren rt.allowFrom = safeInt(parser, ALLOW_ATT_FROM, SOURCE_ANYONE); 21999f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren if (rt.allowFrom < SOURCE_ANYONE || rt.allowFrom > MAX_SOURCE) { 22099f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren throw new IndexOutOfBoundsException("bad source in config:" + rt.allowFrom); 22199f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren } 222056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } else if (SLEEP_TAG.equals(tag)) { 223056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final String mode = parser.getAttributeValue(null, SLEEP_ATT_MODE); 224056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.sleepMode = (SLEEP_MODE_NIGHTS.equals(mode) 225056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock || SLEEP_MODE_WEEKNIGHTS.equals(mode)) ? mode : null; 226056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final int startHour = safeInt(parser, SLEEP_ATT_START_HR, 0); 227056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final int startMinute = safeInt(parser, SLEEP_ATT_START_MIN, 0); 228056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final int endHour = safeInt(parser, SLEEP_ATT_END_HR, 0); 229056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final int endMinute = safeInt(parser, SLEEP_ATT_END_MIN, 0); 230056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.sleepStartHour = isValidHour(startHour) ? startHour : 0; 231056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.sleepStartMinute = isValidMinute(startMinute) ? startMinute : 0; 232056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.sleepEndHour = isValidHour(endHour) ? endHour : 0; 233056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock rt.sleepEndMinute = isValidMinute(endMinute) ? endMinute : 0; 2343b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } else if (CONDITION_TAG.equals(tag)) { 2353b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final ComponentName component = 2363b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock safeComponentName(parser, CONDITION_ATT_COMPONENT); 2373b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final Uri conditionId = safeUri(parser, CONDITION_ATT_ID); 2383b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (component != null && conditionId != null) { 2393b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock conditionComponents.add(component); 2403b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock conditionIds.add(conditionId); 2413b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 242056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 243056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 244056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 2453b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock throw new IllegalStateException("Failed to reach END_DOCUMENT"); 246056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 247056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 248056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public void writeXml(XmlSerializer out) throws IOException { 249056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.startTag(null, ZEN_TAG); 250056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, ZEN_ATT_VERSION, Integer.toString(XML_VERSION)); 251056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 252056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.startTag(null, ALLOW_TAG); 253056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, ALLOW_ATT_CALLS, Boolean.toString(allowCalls)); 254056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, ALLOW_ATT_MESSAGES, Boolean.toString(allowMessages)); 25599f963ea04d7a86219ece00c356f3f6bce33b6d6Chris Wren out.attribute(null, ALLOW_ATT_FROM, Integer.toString(allowFrom)); 256056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.endTag(null, ALLOW_TAG); 257056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 258056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.startTag(null, SLEEP_TAG); 259056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (sleepMode != null) { 260056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, SLEEP_ATT_MODE, sleepMode); 261056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 262056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, SLEEP_ATT_START_HR, Integer.toString(sleepStartHour)); 263056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, SLEEP_ATT_START_MIN, Integer.toString(sleepStartMinute)); 264056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, SLEEP_ATT_END_HR, Integer.toString(sleepEndHour)); 265056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.attribute(null, SLEEP_ATT_END_MIN, Integer.toString(sleepEndMinute)); 266056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.endTag(null, SLEEP_TAG); 267056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 2683b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (conditionComponents != null && conditionIds != null 2693b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock && conditionComponents.length == conditionIds.length) { 2703b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock for (int i = 0; i < conditionComponents.length; i++) { 2713b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock out.startTag(null, CONDITION_TAG); 2723b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock out.attribute(null, CONDITION_ATT_COMPONENT, 2733b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock conditionComponents[i].flattenToString()); 2743b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock out.attribute(null, CONDITION_ATT_ID, conditionIds[i].toString()); 2753b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock out.endTag(null, CONDITION_TAG); 2763b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 2773b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 278056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock out.endTag(null, ZEN_TAG); 279056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 280056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 281056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static boolean isValidHour(int val) { 282056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return val >= 0 && val < 24; 283056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 284056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 285056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static boolean isValidMinute(int val) { 286056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return val >= 0 && val < 60; 287056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 288056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 289056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { 290056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final String val = parser.getAttributeValue(null, att); 291056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (TextUtils.isEmpty(val)) return defValue; 292056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return Boolean.valueOf(val); 293056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 294056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 295056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock private static int safeInt(XmlPullParser parser, String att, int defValue) { 296056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final String val = parser.getAttributeValue(null, att); 297056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock if (TextUtils.isEmpty(val)) return defValue; 298056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return Integer.valueOf(val); 299056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 300056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 3013b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock private static ComponentName safeComponentName(XmlPullParser parser, String att) { 3023b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final String val = parser.getAttributeValue(null, att); 3033b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (TextUtils.isEmpty(val)) return null; 3043b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock return ComponentName.unflattenFromString(val); 3053b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 3063b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 3073b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock private static Uri safeUri(XmlPullParser parser, String att) { 3083b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock final String val = parser.getAttributeValue(null, att); 3093b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock if (TextUtils.isEmpty(val)) return null; 3103b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock return Uri.parse(val); 3113b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock } 3123b98b3f1f85aff0c84ebef4dd497c146d1b4d248John Spurlock 313056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 314056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public int describeContents() { 315056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return 0; 316056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 317056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 318056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public ZenModeConfig copy() { 319056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock final Parcel parcel = Parcel.obtain(); 320056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock try { 321056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock writeToParcel(parcel, 0); 322056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock parcel.setDataPosition(0); 323056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return new ZenModeConfig(parcel); 324056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } finally { 325056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock parcel.recycle(); 326056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 327056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 328056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 329056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public static final Parcelable.Creator<ZenModeConfig> CREATOR 330056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock = new Parcelable.Creator<ZenModeConfig>() { 331056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 332056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public ZenModeConfig createFromParcel(Parcel source) { 333056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return new ZenModeConfig(source); 334056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 335056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock 336056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock @Override 337056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock public ZenModeConfig[] newArray(int size) { 338056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock return new ZenModeConfig[size]; 339056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock } 340056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock }; 341056c519df1dfb8fdc57daddfdf09bc0e1ffddac4John Spurlock} 342