Subversion Repositories AndroidProjects

Rev

Rev 354 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.minimalistclock;

import java.util.Calendar;
import java.util.Locale;
import java.util.Random;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.util.TypedValue;
import android.widget.RemoteViews;
import android.widget.Toast;

public class MinimalistClockWidgetProvider extends AppWidgetProvider
{
        private static final String ACTION_CLICK = "ACTION_CLICK";

        public static String MY_WIDGET_UPDATE = "MY_OWN_WIDGET_UPDATE";

        public static AlarmManager mAlarmManager = null;
        public static PendingIntent mPendingIntent = null;
       
        //private static Typeface mFont = null;

        @Override
        public void onReceive(Context context, Intent intent)
        {
                super.onReceive(context, intent);

                if (MY_WIDGET_UPDATE.equals(intent.getAction()))
                {
                        //Toast.makeText(context, "onReceiver()", Toast.LENGTH_LONG).show();
                        Bundle extras = intent.getExtras();
                        if(extras!=null)
                        {
                                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), MinimalistClockWidgetProvider.class.getName());
                            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);

                            onUpdate(context, appWidgetManager, appWidgetIds);
                        }
                }
        }
       
        @Override
        public void onDeleted(Context context, int[] appWidgetIds)
        {
                //super.onDeleted(context, appWidgetIds);
                Toast.makeText(context, "onDeleted()", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onDisabled(Context context)
        {
                //super.onDisabled(context);
                if (mAlarmManager != null)
                {
                        mAlarmManager.cancel(mPendingIntent);
                }
                Toast.makeText(context, "onDisabled()", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onEnabled(Context context)
        {
                // TODO Auto-generated method stub
                //super.onEnabled(context);
                Toast.makeText(context, "onEnabled()", Toast.LENGTH_LONG).show();
               
                //RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
                /*if (mFont == null)
                {
                        mFont = Typeface.createFromAsset(context.getAssets(), "fonts/helvetica_light.ttf");
                }*/

        }

        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
        {
                // TODO Auto-generated method stub
                super.onUpdate(context, appWidgetManager, appWidgetIds);
               

                final int N = appWidgetIds.length;
                for (int i=0; i<N; i++)
                {
                        int appWidgetId = appWidgetIds[i];
                        AppWidgetProviderInfo info = appWidgetManager.getAppWidgetInfo(appWidgetId);
                        updateAppWidget(context, appWidgetManager, appWidgetId, info);

                        //Toast.makeText(context, "onUpdate(): " + String.valueOf(i) + " : " +  String.valueOf(appWidgetId), Toast.LENGTH_LONG).show();
                }
        }
       
        public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, AppWidgetProviderInfo info)
        {
                // Create some random data
                int number = (new Random().nextInt(100));

                RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
                Log.w("WidgetExample", String.valueOf(number));
                // Set the text
               
                Calendar cal = Calendar.getInstance();
                int hours = cal.get(Calendar.HOUR_OF_DAY);
                int minutes = cal.get(Calendar.MINUTE);
                //int seconds = cal.get(Calendar.SECOND);
                int day = cal.get(Calendar.DAY_OF_MONTH);
                int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 1;
                //String day_of_week = cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault());
               
                // TODO: localize
                String days[] =
                {
                        "So",
                        "Mo",
                        "Di",
                        "Mi",
                        "Do",
                        "Fr",
                        "Sa"
                };
               
                int month = cal.get(Calendar.MONTH) + 1;
               
                String next_alarm = Settings.System.getString(context.getContentResolver(), Settings.System.NEXT_ALARM_FORMATTED);
               
                if (next_alarm.equalsIgnoreCase(""))
                        next_alarm = "(Kein Alarm)";
               
                //remoteViews.setTextViewText(R.id.update, String.valueOf(hours) + ":" + String.valueOf(minutes) + ":" + String.valueOf(seconds));
                //if (mFont != null)
                {
                        remoteViews.setImageViewBitmap(R.id.timeview, buildTimeView(context, String.format("%d:%02d", hours, minutes)));
                        remoteViews.setImageViewBitmap(R.id.dateview, buildDateView(context, String.format("%s %02d/%02d", days[day_of_week], day, month), next_alarm));
                }
               
                LaunchAlarmClock(context, remoteViews);
               
                /*else
                {
                        Toast.makeText(context, "Blargh", Toast.LENGTH_LONG).show();
                }*/


                // Register an onClickListener
                //Intent intent = new Intent(context, MinimalistClockWidgetProvider.class);

                //intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
                //intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

                //PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                //remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
                appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
               
/*              String currentTime = formatter.format(new Date());
                strWidgetText = currentTime;

                RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.hellowidget_layout);
                updateViews.setTextViewText(R.id.widgettext, "[" + String.valueOf(appWidgetId) + "]" + strWidgetText);
                appWidgetManager.updateAppWidget(appWidgetId, updateViews);*/


                //Toast.makeText(context, "updateAppWidget(): " + String.valueOf(appWidgetId) + "\n"/* + strWidgetText*/, Toast.LENGTH_LONG).show();
        }
       
    public static Bitmap buildTimeView(Context context, String time)
    {
        //int bitmapWidth = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, info.minWidth, context.getResources().getDisplayMetrics());
        //int bitmapHeight = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, info.minHeight, context.getResources().getDisplayMetrics());
        int bitmapWidth = (int)(250.0f * context.getResources().getDisplayMetrics().density);
        int bitmapHeight = (int)(74.0f * context.getResources().getDisplayMetrics().density);
       
        /*Toast.makeText(context, "bitmapWidth=" + String.valueOf(bitmapWidth)
                        + " bitmapHeight=" + String.valueOf(bitmapHeight) +
                        " density=" + String.valueOf(context.getResources().getDisplayMetrics().density), Toast.LENGTH_LONG).show();*/

       
            Bitmap myBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas myCanvas = new Canvas(myBitmap);
           
            Paint fontPaint = new Paint();
            Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/helvetica_light.ttf");
            fontPaint.setAntiAlias(true);
            fontPaint.setSubpixelText(true);
            fontPaint.setTypeface(font);
            fontPaint.setStyle(Paint.Style.FILL);
            fontPaint.setColor(Color.WHITE);
            fontPaint.setShadowLayer(2,2,2, 0xAA111111);
            //float fontSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 74, context.getResources().getDisplayMetrics());
            float fontSize = 80.0f * (context.getResources().getDisplayMetrics().density);
           
            fontPaint.setTextSize(fontSize);   
            fontPaint.setTextAlign(Align.CENTER);
           
            Rect bounds = new Rect();
            fontPaint.getTextBounds(time, 0, time.length(), bounds);
           
            myCanvas.drawText(time, bitmapWidth/2.0f, bitmapHeight - (bitmapHeight - bounds.height())/2, fontPaint);
           
            /*Paint test = new Paint();
            test.setColor(Color.RED);
            test.setStyle(Style.STROKE);           
            myCanvas.drawPaint(test);*/


            return myBitmap;
    }
   
    public static Bitmap buildDateView(Context context, String date, String alarm)
    {
        int bitmapWidth = (int)(120.0f * context.getResources().getDisplayMetrics().density);
        int bitmapHeight = (int)(74.0f * context.getResources().getDisplayMetrics().density);
       
        /*Toast.makeText(context, "bitmapWidth=" + String.valueOf(bitmapWidth)
                        + " bitmapHeight=" + String.valueOf(bitmapHeight) +
                        " density=" + String.valueOf(context.getResources().getDisplayMetrics().density), Toast.LENGTH_LONG).show();*/

       
            Bitmap myBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas myCanvas = new Canvas(myBitmap);
            Paint fontPaint = new Paint();
            Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/helvetica_light.ttf");
            fontPaint.setAntiAlias(true);
            fontPaint.setSubpixelText(true);
            fontPaint.setTypeface(font);
            fontPaint.setStyle(Paint.Style.FILL);
            fontPaint.setColor(0xFFADF700);
            fontPaint.setShadowLayer(2,2,2, 0xAA111111);
            float fontSize = 20.0f * (context.getResources().getDisplayMetrics().density);
           
            fontPaint.setTextSize(fontSize);   
            fontPaint.setTextAlign(Align.CENTER);
            myCanvas.drawText(date, bitmapWidth/2.0f, bitmapHeight / 2.0f - 10.0f, fontPaint);
           
            fontSize = 14.0f * (context.getResources().getDisplayMetrics().density);       
            fontPaint.setTextSize(fontSize);
           
            Rect bounds = new Rect();
            fontPaint.getTextBounds(alarm, 0, alarm.length(), bounds);
            int alarmTextHeight = bounds.height();
            int alarmTextWidth = bounds.width();

            Bitmap alarmClock = BitmapFactory.decodeResource(context.getResources(), R.drawable.clock);
           
            int alarmClockSize = alarmTextHeight;
           
            myCanvas.drawText(alarm, bitmapWidth/2.0f + alarmClockSize / 2.0f + 8.0f, bitmapHeight / 2.0f + alarmTextHeight + 20.0f, fontPaint);
           
            Paint linePaint = new Paint();
            linePaint.setStyle(Paint.Style.STROKE);
            linePaint.setColor(0xFFADF700);
           
            myCanvas.drawLine(30, bitmapHeight/2.0f, bitmapWidth-30, bitmapHeight/2.0f, linePaint);
            //myCanvas.drawPaint(paint);
           

            Paint bitmapPaint = new Paint();
            Rect src = new Rect();
            src.set(0, 0, alarmClock.getWidth(), alarmClock.getHeight());
            Rect dst = new Rect();
            dst.left = bitmapWidth / 2 - alarmTextWidth / 2 - 10;
            dst.top = (bitmapHeight / 2 + alarmTextHeight - alarmClockSize / 2 + 12);
            dst.right = dst.left + alarmClockSize;
            dst.bottom = dst.top + alarmClockSize;
            myCanvas.drawBitmap(alarmClock, src, dst, null);
            //myCanvas.drawBitmap(alarmClock, 10, 10, null);
           
            /*Paint test = new Paint();
            test.setColor(Color.CYAN);
            test.setStyle(Style.STROKE);           
            myCanvas.drawPaint(test);*/

           
            return myBitmap;
    }

        public static void SaveAlarmManager(AlarmManager alarmManager, PendingIntent pendingIntent)
        {
                mAlarmManager = alarmManager;
                mPendingIntent = pendingIntent;
        }
       
        public static void LaunchAlarmClock(Context context, RemoteViews remoteViews)
        {
                PackageManager packageManager = context.getPackageManager();
                Intent alarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);

                // Verify clock implementation
                String clockImpls[][] =
                {
                        {"Standar Alarm Clock2", "com.google.android.deskclock", "com.android.deskclock.AlarmClock"},
                        {"HTC Alarm Clock", "com.htc.android.worldclock", "com.htc.android.worldclock.WorldClockTabControl" },
                    {"Standar Alarm Clock", "com.android.deskclock", "com.android.deskclock.AlarmClock"},
                    {"Froyo Nexus Alarm Clock", "com.google.android.deskclock", "com.android.deskclock.DeskClock"},
                    {"Moto Blur Alarm Clock", "com.motorola.blur.alarmclock",  "com.motorola.blur.alarmclock.AlarmClock"},
                    {"Samsung Galaxy Clock", "com.sec.android.app.clockpackage","com.sec.android.app.clockpackage.ClockPackage"}                   
                };

                boolean foundClockImpl = false;

                for(int i=0; i<clockImpls.length; i++)
                {
                    String vendor = clockImpls[i][0];
                    String packageName = clockImpls[i][1];
                    String className = clockImpls[i][2];
                    try
                    {
                        ComponentName cn = new ComponentName(packageName, className);
                        ActivityInfo aInfo = packageManager.getActivityInfo(cn, PackageManager.GET_META_DATA);
                        alarmClockIntent.setComponent(cn);
                        //debug("Found " + vendor + " --> " + packageName + "/" + className);
                        foundClockImpl = true;
                    }
                    catch (NameNotFoundException e)
                    {
                        //debug(vendor + " does not exists");
                    }
                }

                if (foundClockImpl)
                {
                    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, alarmClockIntent, 0);
                        // add pending intent to your component
                        // ....
                   
                    remoteViews.setOnClickPendingIntent(R.id.layout, pendingIntent);
                //AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
                }
        }

}