/* * Copyright (c) 2016 Google Inc. * * 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.navigation; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import com.google.samples.apps.iosched.BuildConfig; import com.google.samples.apps.iosched.R; import com.google.samples.apps.iosched.about.AboutActivity; import com.google.samples.apps.iosched.archframework.Model; import com.google.samples.apps.iosched.archframework.QueryEnum; import com.google.samples.apps.iosched.archframework.UserActionEnum; import com.google.samples.apps.iosched.debug.DebugActivity; import com.google.samples.apps.iosched.explore.ExploreIOActivity; import com.google.samples.apps.iosched.map.MapActivity; import com.google.samples.apps.iosched.myschedule.MyScheduleActivity; import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationQueryEnum; import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationUserActionEnum; import com.google.samples.apps.iosched.settings.SettingsActivity; import com.google.samples.apps.iosched.settings.SettingsUtils; import com.google.samples.apps.iosched.util.AccountUtils; import com.google.samples.apps.iosched.videolibrary.VideoLibraryActivity; /** * Determines which items to show in the {@link AppNavigationView}. */ public class NavigationModel implements Model<NavigationQueryEnum, NavigationUserActionEnum> { private Context mContext; private NavigationItemEnum[] mItems; public NavigationModel(Context context) { mContext = context; } public NavigationItemEnum[] getItems() { return mItems; } @Override public NavigationQueryEnum[] getQueries() { return NavigationQueryEnum.values(); } @Override public NavigationUserActionEnum[] getUserActions() { return NavigationUserActionEnum.values(); } @Override public void deliverUserAction(final NavigationUserActionEnum action, @Nullable final Bundle args, final UserActionCallback callback) { switch (action) { case RELOAD_ITEMS: mItems = null; populateNavigationItems(); callback.onModelUpdated(this, action); break; } } @Override public void requestData(final NavigationQueryEnum query, final DataQueryCallback callback) { switch (query) { case LOAD_ITEMS: if (mItems != null) { callback.onModelUpdated(this, query); } else { populateNavigationItems(); callback.onModelUpdated(this, query); } break; } } private void populateNavigationItems() { boolean attendeeAtVenue = SettingsUtils.isAttendeeAtVenue(mContext); boolean loggedIn = AccountUtils.hasActiveAccount(mContext); boolean debug = BuildConfig.DEBUG; NavigationItemEnum[] items = null; if (loggedIn) { if (attendeeAtVenue) { items = NavigationConfig.NAVIGATION_ITEMS_LOGGEDIN_ATTENDING; } else { items = NavigationConfig.NAVIGATION_ITEMS_LOGGEDIN_REMOTE; } } else { if (attendeeAtVenue) { items = NavigationConfig.NAVIGATION_ITEMS_LOGGEDOUT_ATTENDING; } else { items = NavigationConfig.NAVIGATION_ITEMS_LOGGEDOUT_REMOTE; } } if (debug) { items = NavigationConfig.appendItem(items, NavigationItemEnum.DEBUG); } mItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(items); } @Override public void cleanUp() { mContext = null; } /** * List of all possible navigation items. */ public enum NavigationItemEnum { MY_SCHEDULE(R.id.myschedule_nav_item, R.string.navdrawer_item_my_schedule, R.drawable.ic_navview_schedule, MyScheduleActivity.class), IO_LIVE(R.id.iolive_nav_item, R.string.navdrawer_item_io_live, R.drawable.ic_navview_live, null), EXPLORE(R.id.explore_nav_item, R.string.navdrawer_item_explore, R.drawable.ic_navview_explore, ExploreIOActivity.class, true), MAP(R.id.map_nav_item, R.string.navdrawer_item_map, R.drawable.ic_navview_map, MapActivity.class), VIDEO_LIBRARY(R.id.videos_nav_item, R.string.navdrawer_item_video_library, R.drawable.ic_navview_video_library, VideoLibraryActivity.class), SIGN_IN(R.id.signin_nav_item, R.string.navdrawer_item_sign_in, 0, null), SETTINGS(R.id.settings_nav_item, R.string.navdrawer_item_settings, R.drawable.ic_navview_settings, SettingsActivity.class), ABOUT(R.id.about_nav_item, R.string.description_about, R.drawable.ic_about, AboutActivity.class), DEBUG(R.id.debug_nav_item, R.string.navdrawer_item_debug, R.drawable.ic_navview_settings, DebugActivity.class), INVALID(12, 0, 0, null); private int id; private int titleResource; private int iconResource; private Class classToLaunch; private boolean finishCurrentActivity; NavigationItemEnum(int id, int titleResource, int iconResource, Class classToLaunch) { this(id, titleResource, iconResource, classToLaunch, false); } NavigationItemEnum(int id, int titleResource, int iconResource, Class classToLaunch, boolean finishCurrentActivity) { this.id = id; this.titleResource = titleResource; this.iconResource = iconResource; this.classToLaunch = classToLaunch; this.finishCurrentActivity = finishCurrentActivity; } public int getId() { return id; } public int getTitleResource() { return titleResource; } public int getIconResource() { return iconResource; } public Class getClassToLaunch() { return classToLaunch; } public boolean finishCurrentActivity() { return finishCurrentActivity; } public static NavigationItemEnum getById(int id) { NavigationItemEnum[] values = NavigationItemEnum.values(); for (int i = 0; i < values.length; i++) { if (values[i].getId() == id) { return values[i]; } } return INVALID; } } public enum NavigationQueryEnum implements QueryEnum { LOAD_ITEMS(0); private int id; NavigationQueryEnum(int id) { this.id = id; } @Override public int getId() { return id; } @Override public String[] getProjection() { return new String[0]; } } public enum NavigationUserActionEnum implements UserActionEnum { RELOAD_ITEMS(0); private int id; NavigationUserActionEnum(int id) { this.id = id; } @Override public int getId() { return id; } } }