/* * Copyright 2015 Google Inc. All rights reserved. * * 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 com.google.samples.apps.iosched.explore; import android.os.Parcel; import android.os.Parcelable; import com.google.samples.apps.iosched.Config; import java.util.Collections; import java.util.HashSet; import java.util.Set; import static com.google.samples.apps.iosched.util.LogUtils.LOGE; import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag; /** * Class responsible for storing, managing and retrieving Tag filters used in {@link * ExploreSessionsActivity}. */ public class TagFilterHolder implements Parcelable { public static final int CATEGORY_THEME = 0; public static final int CATEGORY_TYPE = 1; public static final int CATEGORY_TRACK = 2; public static final int CATEGORY_INVALID = -1; private static final String TAG = makeLogTag(TagFilterHolder.class); private final Set<String> mSelectedFilters; private final int[] mCategories; private boolean mShowLiveStreamedSessions; TagFilterHolder() { mSelectedFilters = new HashSet<>(); mCategories = new int[3]; mCategories[CATEGORY_THEME] = 0; mCategories[CATEGORY_TYPE] = 0; mCategories[CATEGORY_TRACK] = 0; } /** * @param tagId The tagId to check in the filter * @return boolean Return a boolean indicating that the tagId is present. */ public boolean contains(String tagId) { return mSelectedFilters.contains(tagId); } /** * Add a tagId to the set of filters. Use the category to update the count of the specific * category. * * @param tagId The tagId to be included in the filter. * @param category The category associated with the given tagId. * @return boolean Returns a boolean to indicate whether the operation was successful. */ public boolean add(String tagId, String category) { if (isCategoryValid(category)) { boolean added = mSelectedFilters.add(tagId); if (added) { mCategories[categoryId(category)]++; } return added; } else { return false; } } /** * @param tagId Tag to be remove from the filter set. * @param category The category of the tag being removed. * @return boolean Returns a boolean to indicate whether the operation was successful. */ public boolean remove(String tagId, String category) { if (isCategoryValid(category)) { boolean removed = mSelectedFilters.remove(tagId); if (removed) { mCategories[categoryId(category)]--; } return removed; } else { return false; } } /** * @return String[] containing all the tags from all the categories. */ public String[] toStringArray() { return mSelectedFilters.toArray(new String[mSelectedFilters.size()]); } /** * @return An unmodifiable set with all the filters. */ public Set<String> getSelectedFilters() { return Collections.unmodifiableSet(mSelectedFilters); } /** * Method that returns the number of categories that are in use by this instance. At least 1 and * at most 3 categories can be returned by this method. * <p/> * Example: 1. If there are 2 topics and 1 theme the result would be 2 indicating that two * categories are in use by this filter. 2. If there are 2 topics, 2 themes and 3 types then the * result would be 3 to indicate the non-zero presence of each category. * * @return categoryCount Return the number of non categories in this instance. */ public int getCategoryCount() { return Math.max(1, (mCategories[CATEGORY_THEME] > 0 ? 1 : 0) + (mCategories[CATEGORY_TYPE] > 0 ? 1 : 0) + (mCategories[CATEGORY_TRACK] > 0 ? 1 : 0)); } /** * @return Returns whether the collection is empty */ public boolean isEmpty() { return mSelectedFilters.isEmpty(); } /** * @return Returns the number of filters currently in use. */ public int size() { return mSelectedFilters.size(); } /** * @param show Set a boolean to indicate whether live streamed sessions should be shown */ public void setShowLiveStreamedSessions(boolean show) { this.mShowLiveStreamedSessions = show; } /** * @return Returns whether a live streamed sessions shown be shown. */ public boolean isShowLiveStreamedSessions() { return mShowLiveStreamedSessions; } /** * @param category The category to look up. * @return Return the number of entries for the given category. */ public int getCountByCategory(String category) { if (isCategoryValid(category)) { return mCategories[categoryId(category)]; } else { return 0; } } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStringArray(mSelectedFilters.toArray(new String[mSelectedFilters.size()])); dest.writeIntArray(mCategories); dest.writeInt(mShowLiveStreamedSessions ? 1 : 0); } /** * @param category Must be one of {@link Config.Tags#CATEGORY_THEME}, {@link * Config.Tags#CATEGORY_TYPE} or{@link Config.Tags#CATEGORY_TRACK}. To verify if * the {@code category is valid}, call {@link #isCategoryValid(String)}. * @return the id of the {@code category}, or {@link #CATEGORY_INVALID}, if the {@code category} * isn't valid. */ private static int categoryId(String category) { switch (category) { case Config.Tags.CATEGORY_THEME: return TagFilterHolder.CATEGORY_THEME; case Config.Tags.CATEGORY_TYPE: return TagFilterHolder.CATEGORY_TYPE; case Config.Tags.CATEGORY_TRACK: return TagFilterHolder.CATEGORY_TRACK; default: LOGE(TAG, "Invalid category found " + category); return TagFilterHolder.CATEGORY_INVALID; } } private static boolean isCategoryValid(String category) { switch (category) { case Config.Tags.CATEGORY_THEME: case Config.Tags.CATEGORY_TYPE: case Config.Tags.CATEGORY_TRACK: return true; default: LOGE(TAG, "Invalid category found " + category); return false; } } public static final Creator CREATOR = new Creator() { public TagFilterHolder createFromParcel(Parcel in) { TagFilterHolder holder = new TagFilterHolder(); String[] filters = in.createStringArray(); Collections.addAll(holder.mSelectedFilters, filters); int[] categories = in.createIntArray(); System.arraycopy(categories, 0, holder.mCategories, 0, categories.length); holder.mShowLiveStreamedSessions = in.readInt() == 1; return holder; } public TagFilterHolder[] newArray(int size) { return new TagFilterHolder[size]; } }; }