/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.app; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.os.ParcelUuid; import android.os.RemoteException; import android.text.TextUtils; import android.util.Log; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.UUID; /** @hide */ public class NotificationGroup implements Parcelable { private static final String TAG = "NotificationGroup"; private String mName; private int mNameResId; private UUID mUuid; private Set<String> mPackages = new HashSet<String>(); private boolean mDirty; public static final Parcelable.Creator<NotificationGroup> CREATOR = new Parcelable.Creator<NotificationGroup>() { public NotificationGroup createFromParcel(Parcel in) { return new NotificationGroup(in); } @Override public NotificationGroup[] newArray(int size) { return new NotificationGroup[size]; } }; public NotificationGroup(String name) { this(name, -1, null); } public NotificationGroup(String name, int nameResId, UUID uuid) { mName = name; mNameResId = nameResId; mUuid = (uuid != null) ? uuid : UUID.randomUUID(); mDirty = uuid == null; } private NotificationGroup(Parcel in) { readFromParcel(in); } @Override public String toString() { return getName(); } public String getName() { return mName; } public void setName(String name) { mName = name; mNameResId = -1; mDirty = true; } public UUID getUuid() { return mUuid; } public void addPackage(String pkg) { mPackages.add(pkg); mDirty = true; } public String[] getPackages() { return mPackages.toArray(new String[mPackages.size()]); } public void removePackage(String pkg) { mPackages.remove(pkg); mDirty = true; } public boolean hasPackage(String pkg) { return mPackages.contains(pkg); } public boolean isDirty() { return mDirty; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mName); dest.writeInt(mNameResId); dest.writeInt(mDirty ? 1 : 0); new ParcelUuid(mUuid).writeToParcel(dest, 0); dest.writeStringArray(getPackages()); } public void readFromParcel(Parcel in) { mName = in.readString(); mNameResId = in.readInt(); mDirty = in.readInt() != 0; mUuid = ParcelUuid.CREATOR.createFromParcel(in).getUuid(); mPackages.addAll(Arrays.asList(in.readStringArray())); } public void getXmlString(StringBuilder builder, Context context) { builder.append("<notificationGroup "); if (mNameResId > 0) { builder.append("nameres=\""); builder.append(context.getResources().getResourceEntryName(mNameResId)); } else { builder.append("name=\""); builder.append(TextUtils.htmlEncode(getName())); } builder.append("\" uuid=\""); builder.append(TextUtils.htmlEncode(getUuid().toString())); builder.append("\">\n"); for (String pkg : mPackages) { builder.append("<package>" + TextUtils.htmlEncode(pkg) + "</package>\n"); } builder.append("</notificationGroup>\n"); mDirty = false; } public static NotificationGroup fromXml(XmlPullParser xpp, Context context) throws XmlPullParserException, IOException { String value = xpp.getAttributeValue(null, "nameres"); int nameResId = -1; String name = null; UUID uuid = null; if (value != null) { nameResId = context.getResources().getIdentifier(value, "string", "android"); if (nameResId > 0) { name = context.getResources().getString(nameResId); } } if (name == null) { name = xpp.getAttributeValue(null, "name"); } value = xpp.getAttributeValue(null, "uuid"); if (value != null) { try { uuid = UUID.fromString(value); } catch (IllegalArgumentException e) { Log.w(TAG, "UUID not recognized for " + name + ", using new one."); } } NotificationGroup notificationGroup = new NotificationGroup(name, nameResId, uuid); int event = xpp.next(); while (event != XmlPullParser.END_TAG || !xpp.getName().equals("notificationGroup")) { if (event == XmlPullParser.START_TAG) { if (xpp.getName().equals("package")) { String pkg = xpp.nextText(); notificationGroup.addPackage(pkg); } } event = xpp.next(); } /* we just loaded from XML, no need to save */ notificationGroup.mDirty = false; return notificationGroup; } }