/* * Copyright (C) 2014 AChep@xda <artemchep@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package com.achep.base.dashboard; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; import com.achep.acdisplay.R; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class DashboardCategory implements Parcelable, List<DashboardTile> { /** * Default value for {@link com.achep.base.dashboard.DashboardCategory#id DashboardCategory.id} * indicating that no identifier value is set. All other values (including those below -1) * are valid. */ public static final int CAT_ID_UNDEFINED = -1; /** * Identifier for this tile, to correlate with a new list when * it is updated. The default value is * {@link com.achep.base.dashboard.DashboardTile#TILE_ID_UNDEFINED}, meaning no id. */ public long id = CAT_ID_UNDEFINED; /** * Resource ID of title of the category that is shown to the user. */ public int titleRes; /** * Title of the category that is shown to the user. */ public CharSequence title; /** * List of the category's children */ public final List<DashboardTile> tiles = new ArrayList<>(); public DashboardCategory(Context context, AttributeSet attrs) { TypedArray sa = context.obtainStyledAttributes(attrs, R.styleable.DashboardTile); id = sa.getResourceId(R.styleable.DashboardTile_dashboard_id, CAT_ID_UNDEFINED); TypedValue tv = sa.peekValue(R.styleable.DashboardTile_dashboard_title); if (tv != null && tv.type == TypedValue.TYPE_STRING) { if (tv.resourceId != 0) { titleRes = tv.resourceId; } else { title = tv.string; } } sa.recycle(); } /** * Return the currently set title. If {@link #titleRes} is set, * this resource is loaded from <var>res</var> and stored in {@link #title}. */ public CharSequence getTitle(Resources res) { if (titleRes != 0) { title = res.getText(titleRes); titleRes = 0; } return title; } /** * {@inheritDoc} */ @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof DashboardCategory)) return false; DashboardCategory dc = (DashboardCategory) o; return new EqualsBuilder() .append(id, dc.id) .append(titleRes, dc.titleRes) .append(title, dc.title) .append(tiles, dc.tiles) .isEquals(); } /** * {@inheritDoc} */ @Override public int hashCode() { return new HashCodeBuilder(153, 11) .append(id) .append(titleRes) .append(title) .append(tiles) .toHashCode(); } //-- PARCELABLE IMPLEMENTATION -------------------------------------------- public static final Creator<DashboardCategory> CREATOR = new Creator<DashboardCategory>() { public DashboardCategory createFromParcel(Parcel source) { return new DashboardCategory(source); } public DashboardCategory[] newArray(int size) { return new DashboardCategory[size]; } }; private DashboardCategory(Parcel in) { titleRes = in.readInt(); title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); final int count = in.readInt(); for (int n = 0; n < count; n++) { DashboardTile tile = DashboardTile.CREATOR.createFromParcel(in); tiles.add(tile); } } /** * {@inheritDoc} */ @Override public int describeContents() { return 0; } /** * {@inheritDoc} */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(titleRes); TextUtils.writeToParcel(title, dest, flags); final int count = tiles.size(); dest.writeInt(count); for (int n = 0; n < count; n++) { DashboardTile tile = tiles.get(n); tile.writeToParcel(dest, flags); } } //-- LIST IMPLEMENTATION -------------------------------------------------- /** * {@inheritDoc} */ @Override public void add(int location, DashboardTile object) { tiles.add(location, object); } /** * {@inheritDoc} */ @Override public boolean add(DashboardTile object) { return tiles.add(object); } /** * {@inheritDoc} */ @Override public boolean addAll(int location, @NonNull Collection<? extends DashboardTile> collection) { return tiles.addAll(location, collection); } /** * {@inheritDoc} */ @Override public boolean addAll(@NonNull Collection<? extends DashboardTile> collection) { return tiles.addAll(collection); } /** * {@inheritDoc} */ @Override public void clear() { tiles.clear(); } /** * {@inheritDoc} */ @Override public boolean contains(Object object) { return tiles.contains(object); } /** * {@inheritDoc} */ @Override public boolean containsAll(@NonNull Collection<?> collection) { return tiles.containsAll(collection); } /** * {@inheritDoc} */ @Override public DashboardTile get(int location) { return tiles.get(location); } /** * {@inheritDoc} */ @Override public int indexOf(Object object) { return tiles.indexOf(object); } /** * {@inheritDoc} */ @Override public boolean isEmpty() { return tiles.isEmpty(); } /** * {@inheritDoc} */ @NonNull @Override public Iterator<DashboardTile> iterator() { return tiles.iterator(); } /** * {@inheritDoc} */ @Override public int lastIndexOf(Object object) { return tiles.lastIndexOf(object); } /** * {@inheritDoc} */ @NonNull @Override public ListIterator<DashboardTile> listIterator() { return tiles.listIterator(); } /** * {@inheritDoc} */ @NonNull @Override public ListIterator<DashboardTile> listIterator(int location) { return tiles.listIterator(location); } /** * {@inheritDoc} */ @Override public DashboardTile remove(int location) { return tiles.remove(location); } /** * {@inheritDoc} */ @Override public boolean remove(Object object) { return tiles.remove(object); } /** * {@inheritDoc} */ @Override public boolean removeAll(@NonNull Collection<?> collection) { return tiles.removeAll(collection); } /** * {@inheritDoc} */ @Override public boolean retainAll(@NonNull Collection<?> collection) { return tiles.retainAll(collection); } /** * {@inheritDoc} */ @Override public DashboardTile set(int location, DashboardTile object) { return tiles.set(location, object); } /** * {@inheritDoc} */ @Override public int size() { return tiles.size(); } /** * {@inheritDoc} */ @NonNull @Override public List<DashboardTile> subList(int start, int end) { return tiles.subList(start, end); } /** * {@inheritDoc} */ @NonNull @Override public Object[] toArray() { return tiles.toArray(); } /** * {@inheritDoc} */ @SuppressWarnings("SuspiciousToArrayCall") @NonNull @Override public <T> T[] toArray(@NonNull T[] array) { return tiles.toArray(array); } }