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