Home | History | Annotate | Download | only in alarmclock
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.alarmclock;
     18 
     19 import android.appwidget.AppWidgetManager;
     20 import android.content.Context;
     21 import android.content.res.Configuration;
     22 import android.content.res.Resources;
     23 import android.os.Bundle;
     24 import android.util.Log;
     25 import android.util.TypedValue;
     26 import android.widget.RemoteViews;
     27 import android.widget.RemoteViews.RemoteView;
     28 import android.widget.TextClock;
     29 
     30 import com.android.deskclock.R;
     31 import com.android.deskclock.Utils;
     32 
     33 public class WidgetUtils {
     34     static final String TAG = "WidgetUtils";
     35 
     36     public static void setClockSize(Context context, RemoteViews clock, float scale) {
     37         float fontSize = context.getResources().getDimension(R.dimen.widget_big_font_size);
     38         clock.setTextViewTextSize(
     39                 R.id.the_clock, TypedValue.COMPLEX_UNIT_PX, fontSize * scale);
     40     }
     41 
     42     // Calculate the scale factor of the fonts in the widget
     43     public static float getScaleRatio(Context context, Bundle options, int id) {
     44         if (options == null) {
     45             AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
     46             if (widgetManager == null) {
     47                 // no manager , do no scaling
     48                 return 1f;
     49             }
     50             options = widgetManager.getAppWidgetOptions(id);
     51         }
     52         if (options != null) {
     53             int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
     54             if (minWidth == 0) {
     55                 // No data , do no scaling
     56                 return 1f;
     57             }
     58             Resources res = context.getResources();
     59             float density = res.getDisplayMetrics().density;
     60             float ratio = (density * minWidth) / res.getDimension(R.dimen.min_digital_widget_width);
     61             // Check if the height could introduce a font size constraint
     62             int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
     63             if (minHeight > 0 && (density * minHeight)
     64                     < res.getDimension(R.dimen.min_digital_widget_height)) {
     65                 ratio = Math.min(ratio, getHeightScaleRatio(context, options, id));
     66             }
     67             return (ratio > 1) ? 1 : ratio;
     68         }
     69         return 1;
     70     }
     71 
     72     // Calculate the scale factor of the fonts in the list of  the widget using the widget height
     73     private static float getHeightScaleRatio(Context context, Bundle options, int id) {
     74         if (options == null) {
     75             AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
     76             if (widgetManager == null) {
     77                 // no manager , do no scaling
     78                 return 1f;
     79             }
     80             options = widgetManager.getAppWidgetOptions(id);
     81         }
     82         if (options != null) {
     83             int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
     84             if (minHeight == 0) {
     85                 // No data , do no scaling
     86                 return 1f;
     87             }
     88             Resources res = context.getResources();
     89             float density = res.getDisplayMetrics().density;
     90             // Estimate height of date text box - 1.35 roughly approximates the text box padding
     91             float lblBox = 1.35f * res.getDimension(R.dimen.label_font_size);
     92             // Ensure divisor for ratio is positive number
     93             if (res.getDimension(R.dimen.min_digital_widget_height) - lblBox > 0) {
     94                 float ratio = ((density * minHeight) - lblBox)
     95                         / (res.getDimension(R.dimen.min_digital_widget_height) - lblBox);
     96                 return (ratio > 1) ? 1 : ratio;
     97             }
     98         }
     99         return 1;
    100     }
    101 
    102 
    103     // Decide if to show the list of world clock.
    104     // Check to see if the widget size is big enough, if it is return true.
    105     public static boolean showList(Context context, int id, float scale) {
    106         AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
    107         if (widgetManager == null) {
    108             // no manager to make the calculation, show the list anyway
    109             return true;
    110         }
    111         Bundle options = widgetManager.getAppWidgetOptions(id);
    112         if (options == null) {
    113             // no data to make the calculation, show the list anyway
    114             return true;
    115         }
    116         Resources res = context.getResources();
    117         String whichHeight = res.getConfiguration().orientation ==
    118                 Configuration.ORIENTATION_PORTRAIT
    119                 ? AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT
    120                 : AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT;
    121         int height = options.getInt(whichHeight);
    122         if (height == 0) {
    123             // no data to make the calculation, show the list anyway
    124             return true;
    125         }
    126         float density = res.getDisplayMetrics().density;
    127         // Estimate height of date text box
    128         float lblBox = 1.35f * res.getDimension(R.dimen.label_font_size);
    129         float neededSize = res.getDimension(R.dimen.digital_widget_list_min_fixed_height) +
    130                 2 * lblBox +
    131                 scale * res.getDimension(R.dimen.digital_widget_list_min_scaled_height);
    132         return ((density * height) > neededSize);
    133     }
    134 
    135     /***
    136      * Set the format of the time on the clock accrding to the locale
    137      * @param clock - view to format
    138      * @param amPmFontSize - size of am/pm label, zero size means no am/om label
    139      * @param clockId - id of TextClock view as defined in the clock's layout.
    140      */
    141     public static void setTimeFormat(RemoteViews clock, int amPmFontSize, int clockId) {
    142         if (clock != null) {
    143             // Set the best format for 12 hours mode according to the locale
    144             clock.setCharSequence(clockId, "setFormat12Hour", Utils.get12ModeFormat(amPmFontSize));
    145             // Set the best format for 24 hours mode according to the locale
    146             clock.setCharSequence(clockId, "setFormat24Hour", Utils.get24ModeFormat());
    147         }
    148     }
    149 }
    150 
    151