/* * Copyright 2014 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; import com.google.samples.apps.iosched.util.ParserUtils; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import static com.google.samples.apps.iosched.util.LogUtils.LOGW; import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag; public class Config { private static final String TAG = makeLogTag(Config.class); // Warning messages for dogfood build public static final String DOGFOOD_BUILD_WARNING_TITLE = "DOGFOOD BUILD"; public static final String DOGFOOD_BUILD_WARNING_TEXT = "Shhh! This is a pre-release build " + "of the I/O app. Don't show it around."; // Turn the hard-coded conference dates in gradle.properties into workable objects. public static final long[][] CONFERENCE_DAYS = new long[][]{ // start and end of day 1 {ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY1_START), ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY1_END)}, // start and end of day 2 {ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY2_START), ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY2_END)}, // start and end of day 3 {ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY3_START), ParserUtils.parseTime(BuildConfig.CONFERENCE_DAY3_END)}, }; public static final TimeZone CONFERENCE_TIMEZONE = TimeZone.getTimeZone(BuildConfig.INPERSON_TIMEZONE); public static final long CONFERENCE_START_MILLIS = CONFERENCE_DAYS[0][0]; public static final long CONFERENCE_END_MILLIS = CONFERENCE_DAYS[CONFERENCE_DAYS.length - 1][1]; public static final long SHOW_IO15_REQUEST_SOCIAL_PANEL_TIME = ParserUtils.parseTime( BuildConfig.SHOW_IO_REQUEST_SOCIAL_PANEL_TIME); // YouTube share URL public static final String YOUTUBE_SHARE_URL_PREFIX = "http://youtu.be/"; // Live stream captions config public static final String LIVESTREAM_CAPTIONS_DARK_THEME_URL_PARAM = "&theme=dark"; // When do we start to offer to set up the user's wifi? public static final long WIFI_SETUP_OFFER_START = (BuildConfig.DEBUG ? System.currentTimeMillis() - 1000 : CONFERENCE_START_MILLIS - TimeUnit.MILLISECONDS.convert(3L, TimeUnit.DAYS)); // Format of the youtube link to a Video Library video public static final String VIDEO_LIBRARY_URL_FMT = "https://www.youtube.com/watch?v=%s"; // Fallback URL to get a youtube video thumbnail in case one is not provided in the data // (normally it should, but this is a safety fallback if it doesn't) public static final String VIDEO_LIBRARY_FALLBACK_THUMB_URL_FMT = "http://img.youtube.com/vi/%s/default.jpg"; // Link to Google I/O Extended events presented in Explore screen public static final String IO_EXTENDED_LINK = "http://www.google.com/events/io/io-extended"; // Auto sync interval. Shouldn't be too small, or it might cause battery drain. public static final long AUTO_SYNC_INTERVAL_LONG_BEFORE_CONFERENCE = TimeUnit.MILLISECONDS.convert(6L, TimeUnit.HOURS); public static final long AUTO_SYNC_INTERVAL_AROUND_CONFERENCE = TimeUnit.MILLISECONDS.convert(2L, TimeUnit.HOURS); // Disable periodic sync after the conference and rely entirely on GCM push for syncing data. public static final long AUTO_SYNC_INTERVAL_AFTER_CONFERENCE = -1L; // How many days before the conference we consider to be "around the conference date" // for purposes of sync interval (at which point the AUTO_SYNC_INTERVAL_AROUND_CONFERENCE // interval kicks in) public static final long AUTO_SYNC_AROUND_CONFERENCE_THRESH = TimeUnit.MILLISECONDS.convert(3L, TimeUnit.DAYS); // Minimum interval between two consecutive syncs. This is a safety mechanism to throttle // syncs in case conference data gets updated too often or something else goes wrong that // causes repeated syncs. public static final long MIN_INTERVAL_BETWEEN_SYNCS = TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES); // If data is not synced in this much time, we show the "data may be stale" warning public static final long STALE_DATA_THRESHOLD_NOT_DURING_CONFERENCE = TimeUnit.MILLISECONDS.convert(2L, TimeUnit.DAYS); public static final long STALE_DATA_THRESHOLD_DURING_CONFERENCE = TimeUnit.MILLISECONDS.convert(12L, TimeUnit.HOURS); // How long we snooze the stale data notification for after the user has acted on it // (to keep from showing it repeatedly and being annoying) public static final long STALE_DATA_WARNING_SNOOZE = TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES); // Play store URL prefix public static final String PLAY_STORE_URL_PREFIX = "https://play.google.com/store/apps/details?id="; // Known session tags that induce special behaviors public interface Tags { // tag that indicates a session is a live session public static final String SESSIONS = "TYPE_SESSIONS"; // the tag category that we use to group sessions together when displaying them public static final String SESSION_GROUPING_TAG_CATEGORY = "TYPE"; // tag categories public static final String CATEGORY_THEME = "THEME"; public static final String CATEGORY_TRACK = "TRACK"; public static final String CATEGORY_TYPE = "TYPE"; public static final String CATEGORY_SEP = "_"; public static final String SPECIAL_KEYNOTE = "FLAG_KEYNOTE"; public static final String[] EXPLORE_CATEGORIES = {CATEGORY_THEME, CATEGORY_TRACK, CATEGORY_TYPE}; public static final int[] EXPLORE_CATEGORY_ALL_STRING = { R.string.all_themes, R.string.all_topics, R.string.all_types }; public static final int[] EXPLORE_CATEGORY_TITLE = { R.string.themes, R.string.topics, R.string.types }; } private static final Map<String, Integer> CATEGORY_DISPLAY_ORDERS = new HashMap<>(); static { CATEGORY_DISPLAY_ORDERS.put(Tags.CATEGORY_THEME, 0); CATEGORY_DISPLAY_ORDERS.put(Tags.CATEGORY_TRACK, 1); CATEGORY_DISPLAY_ORDERS.put(Tags.CATEGORY_TYPE, 2); } /** * Return a configured display order for the tags or zero for default. */ public static int getCategoryDisplayOrder(String category) { LOGW(TAG, "Error, category not found for the display order: " + category); Integer displayOrder = CATEGORY_DISPLAY_ORDERS.get(category); if (displayOrder == null) { return 0; } return displayOrder; } // URL prefix for web links to session pages public static final String SESSION_DETAIL_WEB_URL_PREFIX = "https://www.google.com/events/io/schedule/session/"; public static final String HTTPS = "https"; public static final String SESSION_ID_URL_QUERY_KEY = "sid"; }