package com.adaptavant.setmore.widget;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
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.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;
import com.adaptavant.setmore.R;
import com.adaptavant.setmore.service.WidgetService;
import com.adaptavant.setmore.ui.CreateAppointmentActivity;
import com.adaptavant.setmore.ui.StartActivity;
import com.adaptavant.setmore.util.GlobalVariables;
public class SetmoreWidgetProvider extends AppWidgetProvider {
public static final String TAG = "SetmoreWidget";
public static final String WIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
public static final String EXTRA_LIST_VIEW_ROW_NUMBER = "com.adaptavant.setmore.widget.EXTRA_LIST_VIEW_ROW_NUMBER";
int mListViewAppID;
private PendingIntent createUpdateIntent(Context mContext) {
Intent intent = new Intent(WIDGET_UPDATE);
PendingIntent lPendingIntent = PendingIntent.getBroadcast(mContext, 22, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return lPendingIntent;
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.e(TAG, "Action Recieved updating widget");
// Toast.makeText(context, "updating widget", Toast.LENGTH_LONG).show();
AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
ComponentName widgetComponent = new ComponentName(context.getPackageName(), this.getClass().getName());
int[] widgetId = widgetManager.getAppWidgetIds(widgetComponent);
int widgetNum = widgetId.length;
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.setmore_widget_design);
// if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
// AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, 1000, createUpdateIntent(context));
// }
// //update widget
// else if (intent.getAction().equals(WIDGET_UPDATE)) {
// for (int i = 0; i < widgetNum; i++) {
// views.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());
// widgetManager.updateAppWidget(widgetId[i], views);
// }
// }
// for (int i = 0; i < widgetNum; i++) {
// AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
// int appWidgetIds[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, SetmoreWidgetProvider.class));
// appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.ListView_Widget);
// }
AppWidgetManager lAppWidgetManager = AppWidgetManager.getInstance(context);
int appWidgetIds[] = lAppWidgetManager.getAppWidgetIds(new ComponentName(context, SetmoreWidgetProvider.class));
lAppWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.ListView_Widget);
for (int i = 0; i < widgetNum; i++) {
views.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());
widgetManager.updateAppWidget(widgetId[i], views);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
ComponentName thisWidget = new ComponentName(context, SetmoreWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
GlobalVariables.APP_WIDGET_MANAGER = appWidgetManager;
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = updateWidgetListView(context, widgetId);
Intent lIntent = new Intent(context , CreateAppointmentActivity.class);
lIntent.putExtra("lEditAppt", false);
PendingIntent lCreateApptIntent = PendingIntent.getActivity(context, 0, lIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.firstButton, lCreateApptIntent);
remoteViews.setTextViewText(R.id.widget_date, new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss", Locale.ENGLISH).format(new Date()).toUpperCase());
Intent lLauchApp = new Intent(context , StartActivity.class);
PendingIntent lStartactivity = PendingIntent.getActivity(context, 0, lLauchApp, 0);
remoteViews.setOnClickPendingIntent(R.id.widget_header, lStartactivity);
remoteViews.setPendingIntentTemplate(R.id.ListView_Widget, lStartactivity);
appWidgetManager.updateAppWidget(widgetId,remoteViews);
}
}
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
private RemoteViews updateWidgetListView(Context context, int appWidgetId) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.setmore_widget_design);
Intent lListIntent = new Intent(context, WidgetService.class);
lListIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
lListIntent.setData(Uri.parse( lListIntent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(appWidgetId, R.id.ListView_Widget, lListIntent);
remoteViews.setEmptyView(R.id.ListView_Widget, R.id.empty_view);
mListViewAppID = appWidgetId;
// Intent lLauchApp2 = new Intent(context , StartActivity.class);
// PendingIntent lStartactivity2 = PendingIntent.getActivity(context, 0, lLauchApp2, 0);
// remoteViews.setOnClickFillInIntent(R.id.ListView_Widget, lStartactivity2);
return remoteViews;
}
}
ListProvider
package com.adaptavant.setmore.widget;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import org.apache.commons.lang3.StringEscapeUtils;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.text.Html;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService.RemoteViewsFactory;
import com.adaptavant.setmore.R;
import com.adaptavant.setmore.util.AppointmentUtility;
import com.adaptavant.setmore.util.CommonUtilities;
import com.adaptavant.setmore.util.GlobalVariables;
import com.adaptavant.setmore.util.LogCat;
public class ListProvider implements RemoteViewsFactory {
private Context mContext = null;
private int appWidgetId;
String TAG = "ListProvider";
List<HashMap<String , Object>> mAppointmentList, mAppointmentListDuplicate;
SharedPreferences mPreference;
public ListProvider(Context context, Intent intent) {
this.mContext = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
GlobalVariables.APP_WIDGET_ID = appWidgetId;
mPreference = GlobalVariables.getSharedPreference(mContext);
populateListItem();
}
private void populateListItem() {
Calendar lcalendar = Calendar.getInstance(Locale.ENGLISH);
String lDate = new SimpleDateFormat("dd", Locale.ENGLISH).format(lcalendar.getTime());
String lStartDate = new SimpleDateFormat("MMM dd yyyy H:mm:ss" , Locale.ENGLISH).format(lcalendar.getTime());
String lEndDate = new SimpleDateFormat("MMM dd yyyy H:mm:ss", Locale.ENGLISH).format(new Date(new Date((lcalendar.get(Calendar.MONTH )+1)+"/"+lDate+"/"+lcalendar.get(Calendar.YEAR)+ " 23:59:59").getTime()));
setAppointmentToView(lStartDate, lEndDate);
}
@Override
public int getCount() {
LogCat.infoLog(TAG, "count - "+mAppointmentList.size());
return mAppointmentList.size();
}
@Override
public long getItemId(int position) {
return position;
}
/*
* Similar to getView of Adapter where instead of Viewwe return RemoteViews
*/
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews lRemoteView = new RemoteViews(mContext.getPackageName(), R.layout.appointment_row_new);
HashMap<String, Object> lApptDetailMap = mAppointmentList.get(position);
int lStatTime = Integer.parseInt((String)lApptDetailMap.get("startTime"));
int lCustomerID = R.id.appointment_row_customer_name;
int lApptTimeID = R.id.appointment_row_time;
int lServiceNameID = R.id.appointment_row_service_name;
int lServiceCodeID = R.id.service_color_code;
int lApptStatusID = R.id.appointment_row_status;
int lServiceDurationID = R.id.appointment_row_session;
int lApptRowLayoutID = R.id.appointment_row_layout;
String lAppCustomCost = (String) (lApptDetailMap.containsKey("apptCost") && lApptDetailMap.get("apptCost") != null ? lApptDetailMap.get("apptCost"):"");
String lDisplayCost = (String) (lAppCustomCost != null && !lAppCustomCost.equals("") ? lAppCustomCost : lApptDetailMap.get("servicecost"));
long lMillisecond = 0;
try {
lMillisecond = Long.parseLong((String) lApptDetailMap.get("startTimeLong"));
} catch (Exception e) {
e.printStackTrace();
}
lRemoteView.setTextColor(lCustomerID, Color.parseColor("#30383E"));
lRemoteView.setTextColor(lApptTimeID, Color.parseColor("#30383E"));
lRemoteView.setTextViewText(lCustomerID, StringEscapeUtils.unescapeHtml4((String)lApptDetailMap.get("resourcename")).trim().toString());
lRemoteView.setTextViewText(lServiceNameID, StringEscapeUtils.unescapeHtml4((String)lApptDetailMap.get("servicename")) +", "
+Html.fromHtml(mPreference.getString(GlobalVariables.CURRENCY_SYMBOL, "$"))+StringEscapeUtils.unescapeHtml4(lDisplayCost));
lRemoteView.setTextViewText(lApptTimeID, StringEscapeUtils.unescapeHtml4(CommonUtilities.convertMinToTime(lStatTime)));
int lDuration = Integer.parseInt(lApptDetailMap.get("endTime").toString()) - Integer.parseInt(lApptDetailMap.get("startTime").toString());
try{
lRemoteView.setViewVisibility(lServiceCodeID, View.VISIBLE);
lRemoteView.setInt(lServiceCodeID, "setBackgroundColor", Color.parseColor("#"+(String) lApptDetailMap.get("serviceColorCode")));
}catch(Exception e){
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
long lOffset = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) ;
long lCurrentTime = new Date().getTime() + lOffset;
if(lCurrentTime < lMillisecond || lApptDetailMap.get("apptcustomerkey").equals("slotBlocker")) {
lRemoteView.setImageViewResource(lApptStatusID, R.drawable.appt_vr_line);
} else {
lRemoteView.setImageViewResource(lApptStatusID, R.drawable.complete_appt_tick);
}
String lDurationString="";
if (lDuration>=60) {
int lHr = lDuration/60;
int lMin = lDuration%60;
if(lMin==0 && lHr==1){
lDurationString= lHr+"hr";
}else if(lMin==1 && lHr==1){
lDurationString= lHr+"hr "+lMin+"Min";
}else if(lMin>1 && lHr==1){
lDurationString= lHr+"hr "+lMin+"Mins";
}else if(lMin==1 && lHr>1){
lDurationString= lHr+"hrs "+lMin+"Min";
}else{
lDurationString= lHr+"hrs "+lMin+"Mins";
}
lRemoteView.setTextViewText(lServiceDurationID, lDurationString);
} else {
lRemoteView.setTextViewText(lServiceDurationID, lDuration+" Mins");
}
Intent fillInIntent = new Intent();
fillInIntent.putExtra(SetmoreWidgetProvider.EXTRA_LIST_VIEW_ROW_NUMBER, position);
lRemoteView.setOnClickFillInIntent(lApptRowLayoutID, fillInIntent);
return lRemoteView;
}
@Override
public RemoteViews getLoadingView() {
return new RemoteViews(mContext.getPackageName(), R.layout.loading_layout);
}
@Override
public int getViewTypeCount() {
LogCat.infoLog(TAG, "size - "+mAppointmentList.size());
return mAppointmentList.size();
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public void onCreate() {
// populateListItem();
}
@Override
public void onDataSetChanged() {
populateListItem();
}
@Override
public void onDestroy() {}
public void setAppointmentToView(String startdate , String enddate) {
LogCat.infoLog(TAG, "startdate - "+startdate);
LogCat.infoLog(TAG, "enddate - "+enddate);
SimpleDateFormat lFormatter = new SimpleDateFormat("MMM dd yyyy ", Locale.ENGLISH);
SimpleDateFormat lFormatterWithTime = new SimpleDateFormat("MMM dd yyyy H:mm:ss", Locale.ENGLISH);
try {
Calendar cal = Calendar.getInstance(Locale.ENGLISH);
long lOffset = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) ;
long lStartMilliSecond = lFormatterWithTime.parse(startdate).getTime() + lOffset;
long lEndMilliSecond = lFormatterWithTime.parse(enddate).getTime() +lOffset;
mAppointmentList = new AppointmentUtility().getAppointmentsByDateRange(mContext, lStartMilliSecond, lEndMilliSecond);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//我无法在onRecieve中获得点击列表项目位置...当我点击列表时...没有出现在onRecieve ...我在做什么错误我不确定... plz帮我发现...我为此浪费了2天...我发布了我所使用的课程... PLZ尽快回复...点击工作......但无法跟踪哪个可能,/ p>