WidgetLargeService.java :  » Weather » hkowidget » com » tako » hko » Android Open Source

Android Open Source » Weather » hkowidget 
hkowidget » com » tako » hko » WidgetLargeService.java
package com.tako.hko;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;

public class WidgetLargeService extends Service {
  private static final String PREFS_NAME = "HKOPrefs";
  private static final String URI_HEADER = "hkolargewidget://widget/id";
  private static final String TAG = "HKOWidget";

  private RemoteViews views;
  private AppWidgetManager manager;
  private boolean upFlag;
  private Context sContext;
  private CurrentWeatherWrapper current;
  private int todayIcon;
  private PowerManager pm;
  private PowerManager.WakeLock wl;
  private SharedPreferences settings;
  private int widgetId;

  @Override
  public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub

    // Getting back the values
    widgetId = intent.getIntExtra("widgetId", -1);
    upFlag = intent.getBooleanExtra("updateFlag", true);
    boolean iFlag = intent.getBooleanExtra("iUpdate", false);

    sContext = getApplicationContext();
    settings = sContext.getSharedPreferences(PREFS_NAME, 0);

    pm = (PowerManager) sContext.getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "HKO Tag");


    views = new RemoteViews(sContext.getPackageName(), R.layout.hkowidget_large);
    // Get the layout for the App Widget and attach an on-click listener to the button
    Intent clickIntent = new Intent(sContext, HKOActivity.class);
    clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    clickIntent.setData(Uri.withAppendedPath(Uri.parse(URI_HEADER + "://widget/id/"), String.valueOf(widgetId)));

    Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    updateIntent.putExtra("iUpdate", true);
    updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetId});
    updateIntent.setData(Uri.withAppendedPath(Uri.parse(URI_HEADER + "://widget/id/"), String.valueOf(widgetId)));

    PendingIntent pendingIntent = PendingIntent.getActivity(sContext, 0, clickIntent, 0);
    PendingIntent updatePendingIntent = PendingIntent.getBroadcast(sContext, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    views.setOnClickPendingIntent(R.id.widgetLargeLayout, pendingIntent);
    views.setOnClickPendingIntent(R.id.todayicon_large, updatePendingIntent);

    manager = AppWidgetManager.getInstance(sContext);
    if (iFlag) {
      views.setViewVisibility(R.id.updateText_large, View.VISIBLE);
      manager.updateAppWidget(widgetId, views);
    }

    //super.onUpdate(context, appWidgetManager, appWidgetIds);    

    new Thread(){
      public void run(){

        // wl.acquire();
        Log.e(TAG, "Lock accquired");
        //if (!upFlag && oldState != null) {
        HKOConnect dataMine = new HKOConnect();
        if (!upFlag) {
          current = dataMine.getOldWrapper(sContext);
          todayIcon = dataMine.getOldIcon(sContext);
          Log.e(TAG, "icon : " + todayIcon);
        } else {
          current = dataMine.getCurrentWeather(sContext, Misc.ENGLISH, true);
          todayIcon = dataMine.getForecastIcon(sContext);
        }  

        //  Set alarm
        int currentValue = 0;
        Log.e(TAG, "Error : " + current.getError());
        if (current.getError() != -1) {
          currentValue = settings.getInt("refresh", 1800);
          views.setImageViewResource(R.id.error_large, R.drawable.empty);
        } else {
          currentValue = settings.getInt("retry", 300);
          views.setImageViewResource(R.id.error_large, R.drawable.error);
        }

        //if (currentValue > 0 && upFlag) {
        if (currentValue > 0) {
          Intent widgetUpdate = new Intent();
          widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
          widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetId});
          widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(URI_HEADER), String.valueOf(widgetId)));
          PendingIntent newPending = PendingIntent.getBroadcast(sContext, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);
          AlarmManager alarm = (AlarmManager) sContext.getSystemService(Context.ALARM_SERVICE);
          alarm.cancel(newPending);
          Log.e(TAG, "Cancelling and re-creating");

          alarm.set(AlarmManager.RTC, System.currentTimeMillis() + currentValue * 1000, newPending);
        }
        //Toast.makeText(context, "New Alarm for " + appWidgetId, Toast.LENGTH_LONG).show();
        Log.e(TAG, "New Alarm for " + widgetId + ". Refresh Value : " + currentValue);

        Date now = new Date(System.currentTimeMillis() + currentValue * 1000);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd h:mm:ss a");
        Log.e(TAG, "Next wake up time : " + sdf.format(now));

        widgetHandle.sendEmptyMessage(0);
        if (wl != null && wl.isHeld()) wl.release();
        Log.e(TAG, "Lock release");

      }
    }.start();
    //updateAppWidget(context, appWidgetManager, appWidgetId);
    //this.stopSelf();
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  Handler widgetHandle = new Handler() {
    public void handleMessage(Message msg) {
      int color = settings.getInt("color", 0);
      int textColor = settings.getInt("fontColor", 0xffd3d3d9);;

      switch (color) {
      case 0:
        views.setImageViewResource(R.id.widgetback_large, R.drawable.empty);
        break;
      case 1:
        views.setImageViewResource(R.id.widgetback_large, R.drawable.background_dark);
        break;
      case 2:
      case 3:
        ObjectHandler oh = new ObjectHandler(sContext, Misc.CHINESE);
        Bitmap map = (Bitmap) oh.readBackground();
        views.setImageViewBitmap(R.id.widgetback_large, map);
        break;
      }
      //  Handle background end

      views.setTextColor(R.id.temp_large, textColor);
      views.setTextColor(R.id.humidity_large, textColor);
      views.setTextColor(R.id.uvLevel_large, textColor);
      views.setTextColor(R.id.updateText_large, textColor);
      views.setTextColor(R.id.updateTime_large, textColor);

      views.setTextViewText(R.id.temp_large, current.getTemperature());
      views.setTextViewText(R.id.humidity_large, current.getHumidity());
      views.setTextViewText(R.id.uvLevel_large, current.getUvLevel());
      views.setImageViewResource(R.id.todayicon_large, todayIcon);
      views.setImageViewResource(R.id.fire_large, current.getFireWarning());
      views.setImageViewResource(R.id.extreme_temp_large, current.getExtremeTemp());
      views.setImageViewResource(R.id.typhoon_large, current.getTyphoon());
      views.setImageViewResource(R.id.others_large, current.getOther());

      //views.setImageViewResource(R.id.fire_large, R.drawable.rainr);
      //views.setImageViewResource(R.id.extreme_temp, R.drawable.cold);
      //views.setImageViewResource(R.id.typhoon, R.drawable.tc9);
      //views.setImageViewResource(R.id.others, R.drawable.ts);

      views.setImageViewResource(R.id.tempicon_large, R.drawable.thermometer);
      views.setImageViewResource(R.id.humidityicon_large, R.drawable.humidity);

      //  Save the old state

      //  Set last update time:
      Calendar cal = Calendar.getInstance();
      SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
      if (current.getError() != -1)
        views.setTextViewText(R.id.updateTime_large, "Last: " + sdf.format(cal.getTime()));
      else
        views.setTextViewText(R.id.updateTime_large, "Last: " + settings.getString("last_update", ""));

      //  Reset the background change flag
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("color_change", false);
      if (current.getError() != -1)
        editor.putString("last_update", sdf.format(cal.getTime()));
      editor.commit();
      views.setViewVisibility(R.id.updateText_large, View.INVISIBLE);
      Log.e(TAG, "Start updating widget");
      manager.updateAppWidget(widgetId, views);
      Log.e(TAG, "End updating widget");
      //if (wl != null && wl.isHeld()) wl.release();

      super.handleMessage(msg);

    }
  };


}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.