/* * Copyright 2010 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.android.apps.iosched.util; import android.app.Activity; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.LevelListDrawable; import android.net.Uri; import android.os.Bundle; import android.text.Html; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.format.DateUtils; import android.text.method.LinkMovementMethod; import android.text.style.StyleSpan; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; import org.agilespain.kitaos.R; import java.util.Formatter; import java.util.Locale; import java.util.TimeZone; class UIUtils { /** * Time zone to use when formatting all session times. To always use the * phone local time, use {@link java.util.TimeZone#getDefault()}. */ private static final TimeZone CONFERENCE_TIME_ZONE = TimeZone.getTimeZone("America/Los_Angeles"); public static final long CONFERENCE_START_MILLIS = ParserUtils.parseTime( "2010-05-19T09:00:00.000-07:00"); private static final long CONFERENCE_END_MILLIS = ParserUtils.parseTime( "2010-05-20T17:30:00.000-07:00"); public static final Uri CONFERENCE_URL = Uri.parse("http://code.google.com/events/io/2010/"); /** * Flags used with {@link android.text.format.DateUtils#formatDateRange}. */ private static final int TIME_FLAGS = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_WEEKDAY; private static final int BRIGHTNESS_THRESHOLD = 150; /** * {@link StringBuilder} used for formatting time block. */ private static final StringBuilder sBuilder = new StringBuilder(50); /** * {@link java.util.Formatter} used for formatting time block. */ private static Formatter sFormatter = new Formatter(sBuilder, Locale.getDefault()); private static final StyleSpan sBoldSpan = new StyleSpan(Typeface.BOLD); public static void setTitleBarColor(View titleBarView, int color) { final ViewGroup titleBar = (ViewGroup) titleBarView; titleBar.setBackgroundColor(color); /* * Calculate the brightness of the titlebar color, based on the commonly known * brightness formula: * * http://en.wikipedia.org/wiki/HSV_color_space%23Lightness */ int brColor = (30 * Color.red(color) + 59 * Color.green(color) + 11 * Color.blue(color)) / 100; if (brColor > BRIGHTNESS_THRESHOLD) { // ((TextView) titleBar.findViewById(R.id.title_text)).setTextColor( // titleBar.getContext().getResources().getColor(R.color.title_text_alt)); // Iterate through all children of the titlebar and if they're a LevelListDrawable, // set their level to 1 (alternate). // TODO: find a less hacky way of doing this. titleBar.post(new Runnable() { public void run() { final int childCount = titleBar.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = titleBar.getChildAt(i); if (child instanceof ImageButton) { final ImageButton childButton = (ImageButton) child; if (childButton.getDrawable() != null && childButton.getDrawable() instanceof LevelListDrawable) { childButton.getDrawable().setLevel(1); } } } } }); } } /** * Invoke "search" action, triggering a default search. */ public static void goSearch(Activity activity) { activity.startSearch(null, false, Bundle.EMPTY, false); } // /** // * Format and return the given {@link Blocks} and {@link Rooms} values using // * {@link #CONFERENCE_TIME_ZONE}. // */ // public static String formatSessionSubtitle(long blockStart, long blockEnd, // String roomName, Context context) { // TimeZone.setDefault(CONFERENCE_TIME_ZONE); // // // NOTE: There is an efficient version of formatDateRange in Eclair and // // beyond that allows you to recycle a StringBuilder. // final CharSequence timeString = DateUtils.formatDateRange(context, // blockStart, blockEnd, TIME_FLAGS); // // return "TODO subtitulo"; //// return context.getString(R.string.session_subtitle, timeString, roomName); // } /** * Populate the given {@link android.widget.TextView} with the requested text, formatting * through {@link android.text.Html#fromHtml(String)} when applicable. Also sets * {@link android.widget.TextView#setMovementMethod} so inline links are handled. */ public static void setTextMaybeHtml(TextView view, String text) { if (text.contains("<") && text.contains(">")) { view.setText(Html.fromHtml(text)); view.setMovementMethod(LinkMovementMethod.getInstance()); } else { view.setText(text); } } public static void setSessionTitleColor(long blockStart, long blockEnd, TextView title, TextView subtitle) { long currentTimeMillis = System.currentTimeMillis(); int colorId = android.R.color.primary_text_light; int subColorId = android.R.color.secondary_text_light; if (currentTimeMillis > blockEnd && currentTimeMillis < CONFERENCE_END_MILLIS) { colorId = subColorId = R.color.session_foreground_past; } final Resources res = title.getResources(); title.setTextColor(res.getColor(colorId)); subtitle.setTextColor(res.getColor(subColorId)); } /** * Given a snippet string with matching segments surrounded by curly * braces, turn those areas into bold spans, removing the curly braces. */ public static Spannable buildStyledSnippet(String snippet) { final SpannableStringBuilder builder = new SpannableStringBuilder(snippet); // Walk through string, inserting bold snippet spans int startIndex = -1, endIndex = -1, delta = 0; while ((startIndex = snippet.indexOf('{', endIndex)) != -1) { endIndex = snippet.indexOf('}', startIndex); // Remove braces from both sides builder.delete(startIndex - delta, startIndex - delta + 1); builder.delete(endIndex - delta - 1, endIndex - delta); // Insert bold style builder.setSpan(sBoldSpan, startIndex - delta, endIndex - delta - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); delta += 2; } return builder; } }