package com.smartisanos.sidebar.util; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import com.smartisanos.sidebar.SidebarApplication; import java.io.IOException; import java.io.InputStream; import java.util.Calendar; public class CalendarIcon { private final static String CALENDAR_DAY_PREFIX = "calendar/"; private final static String CALENDAR_BG = "calendar/bg.png"; private final static String CALENDAR_FLIP = "calendar/flip.png"; private final static String CALENDAR_RING = "calendar/ring.png"; private static int calendar_back_size = 192; private static int calendar_day_offsetx = 45; private static int calendar_day_offsety = 72; private static int calendar_day_w = 102; private static int calendar_day_h = 78; private static int mCurrentDay = -1; private static Bitmap mCalendarIcon; private static Bitmap mOldIcon; public static void generateIcon() { int currentDay = getCurrentDay(); if (mCalendarIcon == null) { mCalendarIcon = createComposedBitmap(currentDay); } else { if (mCurrentDay != currentDay) { mOldIcon = mCalendarIcon; mCalendarIcon = createComposedBitmap(currentDay); } } } public static void releaseOldIcon() { if (mOldIcon != null) { mOldIcon.recycle(); mOldIcon = null; } } public static Bitmap getCalendarIconBitmap() { generateIcon(); return mCalendarIcon; } private static Bitmap createComposedBitmap(int currentDay) { Bitmap bgBitmap = getBitmap(CALENDAR_BG); Bitmap ringBitmap = getBitmap(CALENDAR_RING); Bitmap flipBitmap = getBitmap(CALENDAR_FLIP); String image = getDayImageName(currentDay); Bitmap day = getBitmap(image); Bitmap newBitmap = Bitmap.createBitmap(calendar_back_size, calendar_back_size, bgBitmap.getConfig()); Canvas canvas = new Canvas(newBitmap); Paint p = new Paint(); p.setAntiAlias(true); p.setFilterBitmap(true); canvas.drawBitmap(bgBitmap, new Rect(0, 0, bgBitmap.getWidth(), bgBitmap.getHeight()), new RectF(0, 0, calendar_back_size, calendar_back_size), p); canvas.drawBitmap(flipBitmap, new Rect(0, 0, flipBitmap.getWidth(), flipBitmap.getHeight()), new RectF(0, 0, calendar_back_size, calendar_back_size), p); canvas.drawBitmap(ringBitmap, new Rect(0, 0, ringBitmap.getWidth(), ringBitmap.getHeight()), new RectF(0, 0, calendar_back_size, calendar_back_size), p); canvas.drawBitmap(day, new Rect(0, 0, day.getWidth(), day.getHeight()), new RectF(calendar_day_offsetx, calendar_day_offsety, calendar_day_offsetx + calendar_day_w, calendar_day_offsety + calendar_day_h), p); bgBitmap.recycle(); ringBitmap.recycle(); flipBitmap.recycle(); day.recycle(); return newBitmap; } private static int getCurrentDay() { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); int day = calendar.get(Calendar.DAY_OF_MONTH); return day; } private static String getDayImageName(int day) { return CALENDAR_DAY_PREFIX + (day - 1) + ".png"; } private static Bitmap getBitmap(String path) { Bitmap bmap = null; try { AssetManager manager = SidebarApplication.getInstance().getAssets(); InputStream is = manager.open(path);; bmap = BitmapFactory.decodeStream(is); } catch (IOException e) { e.printStackTrace(); } return bmap; } }