15c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson/* 25c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * Copyright (C) 2012 The Android Open Source Project 35c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * 45c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License"); you may not 55c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * use this file except in compliance with the License. You may obtain a copy of 65c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * the License at 75c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * 85c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * http://www.apache.org/licenses/LICENSE-2.0 95c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * 105c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * Unless required by applicable law or agreed to in writing, software 115c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 125c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 135c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * License for the specific language governing permissions and limitations under 145c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson * the License. 155c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson */ 165c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 175c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonpackage com.android.alarmclock; 185c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 195c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.app.PendingIntent; 205c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.appwidget.AppWidgetManager; 215c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.appwidget.AppWidgetProvider; 225c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.content.ComponentName; 235c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.content.Context; 245c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.content.Intent; 255c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.content.res.Resources; 265c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.net.Uri; 275c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.os.Bundle; 285c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.provider.Settings; 292c25763699ef1ec748011a5e8d4b404d60211fb9Isaac Katzenelsonimport android.text.TextUtils; 305c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.text.format.DateFormat; 315c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.util.Log; 32bdfaec3fba75927f10471e7a1f2b15a73ad801dcIsaac Katzenelsonimport android.util.TypedValue; 335c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.view.View; 345c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport android.widget.RemoteViews; 355c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 36bdfaec3fba75927f10471e7a1f2b15a73ad801dcIsaac Katzenelsonimport com.android.deskclock.Alarms; 375c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport com.android.deskclock.DeskClock; 385c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport com.android.deskclock.R; 39bdfaec3fba75927f10471e7a1f2b15a73ad801dcIsaac Katzenelsonimport com.android.deskclock.Utils; 405c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 415c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonimport java.util.Calendar; 425c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 435c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelsonpublic class DigitalAppWidgetProvider extends AppWidgetProvider { 445c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson private static final String TAG = "DigitalAppWidgetProvider"; 455c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 465c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson public DigitalAppWidgetProvider() { 475c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 485c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 495c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson @Override 505c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 515c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson for (int appWidgetId : appWidgetIds) { 5203b136413ea5d5ef92f2f1286fb177205da3b1ebItzhak Katzenelson float ratio = WidgetUtils.getScaleRatio(ctxt, null, appWidgetId); 535c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson updateClock(ctxt, appWidgetManager, appWidgetId, ratio); 54980ff50ed649b93889ec116f812260ee38d7e762Isaac Katzenelson 555c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 565c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson super.onUpdate(ctxt, appWidgetManager, appWidgetIds); 575c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 585c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 595c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson @Override 605c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, 615c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson int appWidgetId, Bundle newOptions) { 625c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson // scale the fonts of the clock to fit inside the new size 6303b136413ea5d5ef92f2f1286fb177205da3b1ebItzhak Katzenelson float ratio = WidgetUtils.getScaleRatio(context, newOptions, appWidgetId); 645c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson AppWidgetManager widgetManager = AppWidgetManager.getInstance(context); 655c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson updateClock(context, widgetManager, appWidgetId, ratio); 665c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 675c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 685c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson static ComponentName getComponentName(Context context) { 695c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson return new ComponentName(context, DigitalAppWidgetProvider.class); 705c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 715c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 725c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson private void updateClock( 735c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson Context c, AppWidgetManager appWidgetManager, int appWidgetId, float ratio) { 745c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson RemoteViews widget = new RemoteViews(c.getPackageName(), R.layout.digital_appwidget); 755c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson widget.setOnClickPendingIntent(R.id.digital_appwidget, 765c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson PendingIntent.getActivity(c, 0, new Intent(c, DeskClock.class), 0)); 775c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson refreshAlarm(c, widget); 7803b136413ea5d5ef92f2f1286fb177205da3b1ebItzhak Katzenelson WidgetUtils.setClockSize(c, widget, ratio); 795c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson final Intent intent = new Intent(c, DigitalAppWidgetService.class); 805c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 815c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 825c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson widget.setRemoteAdapter(appWidgetId, R.id.digital_appwidget_listview, intent); 835c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson widget.setPendingIntentTemplate(R.id.digital_appwidget_listview, 845c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson PendingIntent.getActivity(c, 0, new Intent(c, DeskClock.class), 0)); 855c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson appWidgetManager.notifyAppWidgetViewDataChanged( 865c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson appWidgetId, R.id.digital_appwidget_listview); 875c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson appWidgetManager.updateAppWidget(appWidgetId, widget); 885c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 895c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson 905c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson private void refreshAlarm(Context c, RemoteViews clock) { 915c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson String nextAlarm = Settings.System.getString( 925c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson c.getContentResolver(), Settings.System.NEXT_ALARM_FORMATTED); 932c25763699ef1ec748011a5e8d4b404d60211fb9Isaac Katzenelson if (!TextUtils.isEmpty(nextAlarm)) { 945c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson clock.setTextViewText(R.id.nextAlarm, 955c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson c.getString(R.string.control_set_alarm_with_existing, nextAlarm)); 965c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson clock.setViewVisibility(R.id.nextAlarm, View.VISIBLE); 975c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } else { 985c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson clock.setViewVisibility(R.id.nextAlarm, View.GONE); 995c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 1005c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson } 1015c464d35f230912053d7a5873dd6b59ca6e11852Isaac Katzenelson} 102