package cn.scau.scautreasure.helper;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.widget.RemoteViews;
import org.androidannotations.annotations.App;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.res.StringArrayRes;
import org.androidannotations.annotations.sharedpreferences.Pref;
import java.util.ArrayList;
import java.util.List;
import cn.scau.scautreasure.AppConstant;
import cn.scau.scautreasure.AppContext;
import cn.scau.scautreasure.R;
import cn.scau.scautreasure.WidgetProvider;
import cn.scau.scautreasure.model.ClassModel;
import cn.scau.scautreasure.util.DateUtil;
/**
* 桌面小插件 辅助类;
*
* User: special
* Date: 13-9-11
* Time: 下午10:46
* Mail: specialcyci@gmail.com
*/
@EBean
public class WidgetHelper {
@App
AppContext app;
@Pref
cn.scau.scautreasure.AppConfig_ config;
@Bean
ClassHelper classHelper;
@Bean
DateUtil dateUtil;
@Bean
CalendarHelper calendarHelper;
@StringArrayRes
String[] widget_background;
private RemoteViews remoteViews;
private ArrayList<RemoteViews> clsRemoteViews;
private int[] tabViews = new int[]{
R.id.tv_mon,R.id.tv_tue,R.id.tv_wed,R.id.tv_thu,
R.id.tv_fri,R.id.tv_sat,R.id.tv_sun
};
private static int TYPE_TITLE = 1;
private static int TYPE_ITEM = 2;
private static int TYPE_TAB = 3;
public void setUpViews(){
int currentDay = dateUtil.getDayOfWeek();
showDayClassTableView(currentDay);
}
public void showDayClassTableView(int day){
buildRemoteViews();
setBackground();
setWeekTextAndTipsText();
setUpRemoteViewsClickIntent();
buildClassTableViews(day);
updateClassRemoteViews(0,clsRemoteViews.size());
setSelectedTabView(day);
updateRemoteViews();
}
private void buildRemoteViews(){
remoteViews = new RemoteViews(app.getPackageName(),R.layout.widget);
}
private void setWeekTextAndTipsText(){
int week = classHelper.getSchoolWeek();
String eventTips = calendarHelper.getTodayEventTitle();
String weekTips = app.getString(R.string.widget_week_start) + week
+ app.getString(R.string.widget_week_end);
remoteViews.setTextViewText(R.id.tv_week,weekTips);
remoteViews.setTextViewText(R.id.tv_calendar,eventTips);
setTextViewFontColorWithConfig(R.id.tv_week, TYPE_TITLE);
setTextViewFontColorWithConfig(R.id.tv_calendar, TYPE_TITLE);
}
/**
* set background by user settings;
*/
private void setBackground() {
int index = getStringArrayMatchIndex(widget_background,config.widgetBackground().get());
switch (index){
case 0:
setBackgroundResource(R.id.layout_widget, 0);
remoteViews.setInt(R.id.layout_panel, "setBackgroundResource", 0);
break;
case 1:
setBackgroundResource(R.id.layout_widget, R.drawable.widget_background);
remoteViews.setInt(R.id.layout_panel, "setBackgroundColor", 0x4e000000);
break;
}
}
private int getStringArrayMatchIndex(String[] stringArray, String want){
for (int i = 0; i < stringArray.length; i++){
if (want.equals(stringArray[i]))
return i;
}
return 0;
}
/**
* set up the click event intent pending for button;
*/
private void setUpRemoteViewsClickIntent(){
buildAndSetPendingIntent(R.id.layout_classtable, AppConstant.INTENT_CONFIGURE);
buildAndSetPendingIntent(R.id.iv_settings, AppConstant.INTENT_SETTINGS);
buildAndSetPendingIntent(tabViews[0], AppConstant.INTENT_MONDAY);
buildAndSetPendingIntent(tabViews[1], AppConstant.INTENT_TUESDAY);
buildAndSetPendingIntent(tabViews[2], AppConstant.INTENT_WEDNESDAY);
buildAndSetPendingIntent(tabViews[3], AppConstant.INTENT_THURDAY);
buildAndSetPendingIntent(tabViews[4], AppConstant.INTENT_FRIDAY);
buildAndSetPendingIntent(tabViews[5], AppConstant.INTENT_SATURDAY);
buildAndSetPendingIntent(tabViews[6], AppConstant.INTENT_SUNDAY);
}
/**
* help to build the peding intent;
* @param viewId
* @param actionName
*/
private void buildAndSetPendingIntent(int viewId,String actionName){
Intent intent = new Intent(actionName);
PendingIntent pendingIntent = PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(viewId, pendingIntent);
}
/**
* build up a class table views accroding the classlist;
* @param day
*/
private void buildClassTableViews(int day){
clsRemoteViews = new ArrayList<RemoteViews>();
List<ClassModel> clsList = classHelper.getDayLessonWithParams(day);
for (ClassModel cls : clsList){
RemoteViews clsRemoteViews = buildClassRemoteViews(cls);
this.clsRemoteViews.add(clsRemoteViews);
}
}
private RemoteViews buildClassRemoteViews(ClassModel cls){
RemoteViews clsRemoteViews = new RemoteViews(app.getPackageName(),R.layout.widget_item);
clsRemoteViews.setTextViewText(R.id.tv_classname,cls.getClassname());
clsRemoteViews.setTextViewText(R.id.tv_nodes,cls.getNode());
clsRemoteViews.setTextViewText(R.id.tv_place,cls.getLocation());
setTextViewFontColorWithConfig(clsRemoteViews,R.id.tv_classname, TYPE_ITEM);
setTextViewFontColorWithConfig(clsRemoteViews,R.id.tv_nodes, TYPE_ITEM);
setTextViewFontColorWithConfig(clsRemoteViews,R.id.tv_place, TYPE_ITEM);
return clsRemoteViews;
}
/**
* add the class remoteviews to appwidget;
*
* @param startClassIndex start index in the clsRemoteViews;
* @param endClassIndex end index in the clsRemoteViews;
*/
private void updateClassRemoteViews(int startClassIndex,int endClassIndex){
remoteViews.removeAllViews(R.id.layout_classtable);
List<RemoteViews> wantRemoteViews = clsRemoteViews.subList(startClassIndex,endClassIndex);
for (RemoteViews rv : wantRemoteViews)
remoteViews.addView(R.id.layout_classtable,rv);
}
private void setSelectedTabView(int selectedIndex){
selectedIndex-- ;
for (int currentIndex = 0 ; currentIndex < tabViews.length; currentIndex++){
setTextViewBottomDrawableBy(currentIndex,selectedIndex);
setTextViewFontColorWithConfig(tabViews[currentIndex], TYPE_TAB);
}
}
private void setTextViewBottomDrawableBy(int currentIndex,int selectedIndex){
int currentTabView = tabViews[currentIndex];
if (isCurrentSelectTabView(currentIndex,selectedIndex)){
setBackgroundResource(currentTabView, R.drawable.widget_tab_selector);
}else{
setBackgroundResource(currentTabView, 0);
}
}
private boolean isCurrentSelectTabView(int currentIndex, int selectedIndex){
return currentIndex == selectedIndex;
}
/**
* set the textView color by user settings;
* @param viewId
*/
private void setTextViewFontColorWithConfig(int viewId, int type){
setTextViewFontColorWithConfig(remoteViews, viewId, type);
}
private void setTextViewFontColorWithConfig(RemoteViews parentView,int viewId,int type){
parentView.setFloat(viewId,"setTextSize",getTextFontSizeBy(type));
parentView.setTextColor(viewId,config.widgetFontColor().get());
}
private float getTextFontSizeBy(int type){
float multiple = Float.valueOf(config.widgetFontSize().get());
int resource = R.dimen.widget_item_textSize;
if(type == TYPE_TITLE){
resource = R.dimen.widget_title_textSize;
}else if (type == TYPE_ITEM){
resource = R.dimen.widget_item_textSize;
}else if (type == TYPE_TAB){
resource = R.dimen.widget_tab_textSize;
}
float textSize = app.getResources().getDimension(resource);
return getDimenSpVaule(textSize) * multiple;
}
private float getDimenSpVaule(float value){
float scaleRatio = app.getResources().getDisplayMetrics().density;
return value/scaleRatio;
}
private void setBackgroundResource(int viewId, int drawableResourceId){
remoteViews.setInt(viewId,"setBackgroundResource",drawableResourceId);
}
private void updateRemoteViews() {
ComponentName componentName = new ComponentName(app, WidgetProvider.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(app);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
}
}