Back to project page Android-MonthCalendarWidget.
The source code is released under:
Apache License
If you think the Android project Android-MonthCalendarWidget listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/* * Copyright 2013 Google Inc./*from ww w.j a va2 s .com*/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.monthcalendarwidget; import android.annotation.TargetApi; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.format.DateFormat; import android.view.View; import android.widget.RemoteViews; import java.text.DateFormatSymbols; import java.util.Calendar; public class MonthCalendarWidget extends AppWidgetProvider { private static final String ACTION_PREVIOUS_MONTH = "com.example.android.monthcalendarwidget.action.PREVIOUS_MONTH"; private static final String ACTION_NEXT_MONTH = "com.example.android.monthcalendarwidget.action.NEXT_MONTH"; private static final String ACTION_RESET_MONTH = "com.example.android.monthcalendarwidget.action.RESET_MONTH"; private static final String PREF_MONTH = "month"; private static final String PREF_YEAR = "year"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); for (int appWidgetId : appWidgetIds) { drawWidget(context, appWidgetId); } } private void redrawWidgets(Context context) { int[] appWidgetIds = AppWidgetManager.getInstance(context).getAppWidgetIds( new ComponentName(context, MonthCalendarWidget.class)); for (int appWidgetId : appWidgetIds) { drawWidget(context, appWidgetId); } } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); String action = intent.getAction(); if (ACTION_PREVIOUS_MONTH.equals(action)) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); Calendar cal = Calendar.getInstance(); int thisMonth = sp.getInt(PREF_MONTH, cal.get(Calendar.MONTH)); int thisYear = sp.getInt(PREF_YEAR, cal.get(Calendar.YEAR)); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.MONTH, thisMonth); cal.set(Calendar.YEAR, thisYear); cal.add(Calendar.MONTH, -1); sp.edit() .putInt(PREF_MONTH, cal.get(Calendar.MONTH)) .putInt(PREF_YEAR, cal.get(Calendar.YEAR)) .apply(); redrawWidgets(context); } else if (ACTION_NEXT_MONTH.equals(action)) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); Calendar cal = Calendar.getInstance(); int thisMonth = sp.getInt(PREF_MONTH, cal.get(Calendar.MONTH)); int thisYear = sp.getInt(PREF_YEAR, cal.get(Calendar.YEAR)); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.MONTH, thisMonth); cal.set(Calendar.YEAR, thisYear); cal.add(Calendar.MONTH, 1); sp.edit() .putInt(PREF_MONTH, cal.get(Calendar.MONTH)) .putInt(PREF_YEAR, cal.get(Calendar.YEAR)) .apply(); redrawWidgets(context); } else if (ACTION_RESET_MONTH.equals(action)) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); sp.edit().remove(PREF_MONTH).remove(PREF_YEAR).apply(); redrawWidgets(context); } } @Override @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); drawWidget(context, appWidgetId); } private void drawWidget(Context context, int appWidgetId) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); Resources res = context.getResources(); Bundle widgetOptions = appWidgetManager.getAppWidgetOptions(appWidgetId); boolean shortMonthName = false; boolean mini = false; int numWeeks = 6; if (widgetOptions != null) { int minWidthDp = widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); int minHeightDp = widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); shortMonthName = minWidthDp <= res.getInteger(R.integer.max_width_short_month_label_dp); mini = minHeightDp <= res.getInteger(R.integer.max_height_mini_view_dp); if (mini) { numWeeks = minHeightDp <= res.getInteger(R.integer.max_height_mini_view_1_row_dp) ? 1 : 2; } } SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget); Calendar cal = Calendar.getInstance(); int today = cal.get(Calendar.DAY_OF_YEAR); int todayYear = cal.get(Calendar.YEAR); int thisMonth; if (!mini) { thisMonth = sp.getInt(PREF_MONTH, cal.get(Calendar.MONTH)); int thisYear = sp.getInt(PREF_YEAR, cal.get(Calendar.YEAR)); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.MONTH, thisMonth); cal.set(Calendar.YEAR, thisYear); } else { thisMonth = cal.get(Calendar.MONTH); } rv.setTextViewText(R.id.month_label, DateFormat.format( shortMonthName ? "MMM yy" : "MMMM yyyy", cal)); if (!mini) { cal.set(Calendar.DAY_OF_MONTH, 1); int monthStartDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); cal.add(Calendar.DAY_OF_MONTH, 1 - monthStartDayOfWeek); } else { int todayDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); cal.add(Calendar.DAY_OF_MONTH, 1 - todayDayOfWeek); } rv.removeAllViews(R.id.calendar); RemoteViews headerRowRv = new RemoteViews(context.getPackageName(), R.layout.row_header); DateFormatSymbols dfs = DateFormatSymbols.getInstance(); String[] weekdays = dfs.getShortWeekdays(); for (int day = Calendar.SUNDAY; day <= Calendar.SATURDAY; day++) { RemoteViews dayRv = new RemoteViews(context.getPackageName(), R.layout.cell_header); dayRv.setTextViewText(android.R.id.text1, weekdays[day]); headerRowRv.addView(R.id.row_container, dayRv); } rv.addView(R.id.calendar, headerRowRv); for (int week = 0; week < numWeeks; week++) { RemoteViews rowRv = new RemoteViews(context.getPackageName(), R.layout.row_week); for (int day = 0; day < 7; day++) { boolean inMonth = cal.get(Calendar.MONTH) == thisMonth; boolean inYear = cal.get(Calendar.YEAR) == todayYear; boolean isToday = inYear && inMonth && (cal.get(Calendar.DAY_OF_YEAR) == today); boolean isFirstOfMonth = cal.get(Calendar.DAY_OF_MONTH) == 1; int cellLayoutResId = R.layout.cell_day; if (isToday) { cellLayoutResId = R.layout.cell_today; } else if (inMonth) { cellLayoutResId = R.layout.cell_day_this_month; } RemoteViews cellRv = new RemoteViews(context.getPackageName(), cellLayoutResId); cellRv.setTextViewText(android.R.id.text1, Integer.toString(cal.get(Calendar.DAY_OF_MONTH))); if (isFirstOfMonth) { cellRv.setTextViewText(R.id.month_label, DateFormat.format("MMM", cal)); } rowRv.addView(R.id.row_container, cellRv); cal.add(Calendar.DAY_OF_MONTH, 1); } rv.addView(R.id.calendar, rowRv); } rv.setViewVisibility(R.id.prev_month_button, mini ? View.GONE : View.VISIBLE); rv.setOnClickPendingIntent(R.id.prev_month_button, PendingIntent.getBroadcast(context, 0, new Intent(context, MonthCalendarWidget.class) .setAction(ACTION_PREVIOUS_MONTH), PendingIntent.FLAG_UPDATE_CURRENT)); rv.setViewVisibility(R.id.next_month_button, mini ? View.GONE : View.VISIBLE); rv.setOnClickPendingIntent(R.id.next_month_button, PendingIntent.getBroadcast(context, 0, new Intent(context, MonthCalendarWidget.class) .setAction(ACTION_NEXT_MONTH), PendingIntent.FLAG_UPDATE_CURRENT)); rv.setOnClickPendingIntent(R.id.month_label, PendingIntent.getBroadcast(context, 0, new Intent(context, MonthCalendarWidget.class) .setAction(ACTION_RESET_MONTH), PendingIntent.FLAG_UPDATE_CURRENT)); rv.setViewVisibility(R.id.month_bar, numWeeks <= 1 ? View.GONE : View.VISIBLE); appWidgetManager.updateAppWidget(appWidgetId, rv); } }