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);
}
}
}