Aller au contenu

Widget - Actualisation d'un Widget horloge (oui, encore un...)


Kuja

Recommended Posts

Bien le bonjour à tous !

Je développe un widget horloge classique (car je voulais un truc simple pour commencer le dev sous Android).

Donc j'ai réussi à faire mon layout, mon AppWidgetProvider, mon Activity de configuration, etc. Tout marche impec !

Seulement vient le problème du rafraîchissement de celui-ci. Je peux me servir de l'alarm manager et de faire un setRepeating pour rafraichir tout les x temps (je l'ai placé dans le onReceive =>et si l'action est un update) .

Le problème c'est qu'il se déclenche alors que je n'ai même pas fini la configuration. Ce qui déclenche un rafraichissement sans fin.

Et j'ai beau déclencher un alarm.cancel() (avec une vérification par id) mais rien n'y fait, j'ai toujours un rafraichissement qui ne se finit pas, je dois killer le process de force avec le gestionnaire...

Bref, avez-vous une idée d'où ça peut venir ?

J'ai mis un flag authUpdate, mais c'est plus une rustine qu'une solution...

Et surtout quelle est la meilleure façon de rafraichir un widget horloge sans que ça pompe toute la batterie ? Si vous avez des conseils je suis preneur :)

Ps: j'ai mis mes 2 classes : l'AppWidgetProvider et l'Activity de configuration.

Ps2: j'ai mis une intervalle de 5 secondes pour mes tests, je sais bien que ce n'est même pas envisageable de laisser tel quel lors du déploiement réel sur smartphone...

public class ClockWidget extends AppWidgetProvider
{
private static final String TAG = "KujaClockDebug";
public static final String URI_SCHEME = "kujaclock_widget";
public static int updateRateSeconds = 60000;
public static Boolean authUpdate = false;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
	if (authUpdate)
	{
		for (int appWidgetId : appWidgetIds)
        {
			// Déclarations des variables
	        Log.d(TAG, "onUpdate");
	        Calendar now;
	        Date trialTime;
			double batteryScale;
			int batteryLevel;
			int batteryRawLevel;
			int month;
			int weekDay;
			RemoteViews remoteViews;
			String amPm;
			String battery;
			String day;
			String hours;
			String minutes;
			String year;
			TimeZone thisTimeZone;

			if (!LocaleTexts.getIsInitiated())
				LocaleTexts.initLocaleTexts();

			//Set des variables pour le calendrier 
			thisTimeZone = TimeZone.getDefault();
			now = new GregorianCalendar(thisTimeZone);
			trialTime = new Date();
			now.setTime(trialTime);

			hours = now.get(Calendar.HOUR_OF_DAY)+"";
			if (hours.length() == 1) hours = "0"+hours;

			minutes = now.get(Calendar.MINUTE)+"";
			if (minutes.length() == 1) minutes = "0"+minutes;

			amPm = LocaleTexts.getAmPm(now.get(Calendar.AM_PM));

			weekDay = now.get(Calendar.DAY_OF_WEEK)-now.getFirstDayOfWeek();

			day = now.get(Calendar.DAY_OF_MONTH)+"";
			if (day.length() == 1) day = "0"+day;

			month = now.get(Calendar.MONTH);

			year = now.get(Calendar.YEAR)+"";

			battery = "loading...";
			Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
			batteryRawLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
			batteryScale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
			batteryLevel = -1;
			if (batteryRawLevel >= 0 && batteryScale > 0)
				batteryLevel = (int) ((batteryRawLevel*100) / batteryScale);
			battery =  batteryLevel + "%";

			remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_clock_layout);
			remoteViews.setTextViewText(R.id.heure10, hours.substring(0, 1));
			remoteViews.setTextViewText(R.id.heure1, hours.substring(1, 2));
			remoteViews.setTextViewText(R.id.minute10, minutes.substring(0, 1));
			remoteViews.setTextViewText(R.id.minute1, minutes.substring(1, 2));
			remoteViews.setTextViewText(R.id.ampm, amPm);
			remoteViews.setTextViewText(R.id.jourLettre, LocaleTexts.getWeekDay(weekDay));
			remoteViews.setTextViewText(R.id.dateJour, day);
			remoteViews.setTextViewText(R.id.dateMois, LocaleTexts.getMonth(month));
			remoteViews.setTextViewText(R.id.dateAnnee, year);
			remoteViews.setTextViewText(R.id.batterieTitre, LocaleTexts.getBattery());
			remoteViews.setTextViewText(R.id.batteriePourcent, battery);
			remoteViews.setImageViewBitmap(R.id.batterieBar, Bitmap.createBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.battery_bar), 0, 0, (int)(70*((double)batteryLevel/100)), 6));		

			appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
        }
	}
}

   @Override
   public void onDeleted(Context context, int[] appWidgetIds)
   {
       Log.d(TAG, "onDeleted");
       authUpdate = false;
       for (int appWidgetId : appWidgetIds)
       {
           // stop alarm
           Intent widgetUpdate = new Intent();
           widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
           widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
           widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId)));
           PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);
           Log.d(TAG, "getId: "+Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId)));

           AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
           alarms.cancel(newPending);
       }

       super.onDeleted(context, appWidgetIds);
   }

   @Override
   public void onEnabled(Context context)
   {
       Log.d(TAG, "onEnabled");
   }

   @Override
   public void onDisabled(Context context)
   {
       Log.d(TAG, "onDisabled");
   }

   @Override
   public void onReceive(Context context, Intent intent)
   {
       final String action = intent.getAction();
       final int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
       Log.d(TAG, "onReceive: "+action);

       if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action))
       {
           final int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
           if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
           {
               this.onDeleted(context, new int[] { appWidgetId });
           }
       }
       else if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action))
       {
           Log.d(TAG, "onReceive: update");
       	if (!URI_SCHEME.equals(intent.getScheme()))
       	{
        	for (int appWidgetId : appWidgetIds)
        	{
	        	AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
	        	Intent widgetUpdate = new Intent(context.getApplicationContext(), ClockWidget.class);
				widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
				widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { appWidgetId });
	            widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId)));
	            Log.d(TAG, "setId: "+Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), String.valueOf(appWidgetId)));
	            PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);
	            if (authUpdate)
	            	alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 5000, newPending);

	        }
       	}
           super.onReceive(context, intent);
       }
       else
       {
       	super.onReceive(context, intent);
       }
   }
}

public class KujaClockConfigure extends Activity
{
private static final String TAG = "KujaClockConfDebug";
int kujAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
ToggleButton widgetClockBtn;
PendingIntent pendingIntent;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState);
       Log.d(TAG, "onCreate");
       setContentView(R.layout.main);

   	Intent intent = getIntent();
   	Bundle extras = intent.getExtras();
   	if (extras != null)
   	{
   		kujAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
   	}
   	if (kujAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
   	{
           finish();
       }

       widgetClockBtn = (ToggleButton) findViewById(R.id.toggleButton1);
       widgetClockBtn.setOnClickListener(new OnClickListener()
       {
		public void onClick(View v)
		{
    		Log.d(TAG, "click");

               if (kujAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
               {
	    		final Context context = getApplicationContext();
	    		RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_clock_layout);
	    		AppWidgetManager.getInstance(context).updateAppWidget(kujAppWidgetId, views);

	    		Intent result = new Intent();
	    		result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, kujAppWidgetId);
	    		setResult(RESULT_OK, result);

	            Intent widgetUpdate = new Intent();
	            widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
	            widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { kujAppWidgetId });

	            // make this pending intent unique
                   widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(ClockWidget.URI_SCHEME + "://widget/id/"), String.valueOf(kujAppWidgetId)));
	            PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);

	            // schedule the new widget for updating
	            AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
	            alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 5000, newPending);

	            // On quitte et valide une fois la config finie
	    		LocaleTexts.initLocaleTexts();
	            finish();
	            ClockWidget.authUpdate = true;

	            new ClockWidget().onUpdate(context, AppWidgetManager.getInstance(context), new int[] { kujAppWidgetId });
               }
		}	
    });
   }

}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...