com.google.android.apps.dashclock.PeriodicExtensionRefreshReceiver.java Source code

Java tutorial

Introduction

Here is the source code for com.google.android.apps.dashclock.PeriodicExtensionRefreshReceiver.java

Source

/*
 * Copyright 2013 Google Inc.
 *
 * 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.google.android.apps.dashclock;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.v4.content.WakefulBroadcastReceiver;

import com.google.android.apps.dashclock.api.DashClockExtension;

import static com.google.android.apps.dashclock.LogUtils.LOGD;
import static com.google.android.apps.dashclock.Utils.MINUTES_MILLIS;

/**
 * A broadcast receiver in charge of scheduling DashClock extension refreshes. This was
 * originally handled by updatePeriodMillis but custom refresh behavior and a separation of
 * extension refreshes from widget refreshes was desirable so was moved here.
 */
public class PeriodicExtensionRefreshReceiver extends WakefulBroadcastReceiver {
    private static final String TAG = LogUtils.makeLogTag(PeriodicExtensionRefreshReceiver.class);

    private static final String ACTION_PERIODIC_ALARM = "com.google.android.apps.dashclock.action.PERIODIC_ALARM";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null || !ACTION_PERIODIC_ALARM.equals(intent.getAction())) {
            return;
        }

        // Periodic alarm has triggered. Update all extensions.
        startWakefulService(context,
                getUpdateAllExtensionsIntent(context, DashClockExtension.UPDATE_REASON_PERIODIC));
    }

    private static Intent getUpdateAllExtensionsIntent(Context context, int reason) {
        LOGD(TAG, "getUpdateAllExtensionsIntent, reason=" + reason);
        return new Intent(context, DashClockService.class).setAction(DashClockService.ACTION_UPDATE_EXTENSIONS)
                .putExtra(DashClockService.EXTRA_UPDATE_REASON, reason);
    }

    /**
     * Sets the refresh schedule if one isn't set already.
     */
    public static void updateExtensionsAndEnsurePeriodicRefresh(final Context context) {
        LOGD(TAG, "updateExtensionsAndEnsurePeriodicRefresh");
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        // Update all extensions now.
        context.startService(getUpdateAllExtensionsIntent(context, DashClockExtension.UPDATE_REASON_MANUAL));

        // Schedule an alarm for every 30 minutes; it will not wake up the device;
        // it will be handled only once the device is awake. The first time that this
        // alarm can go off is in 15 minutes, and the latest time it will go off is
        // 45 minutes from now.
        PendingIntent pi = PendingIntent.getBroadcast(context, 0,
                new Intent(context, PeriodicExtensionRefreshReceiver.class).setAction(ACTION_PERIODIC_ALARM),
                PendingIntent.FLAG_UPDATE_CURRENT);
        am.cancel(pi);
        am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + 15 * MINUTES_MILLIS, AlarmManager.INTERVAL_HALF_HOUR, pi);
    }

    /**
     * Cancels the refresh schedule if one isn't set already.
     */
    protected static void cancelPeriodicRefresh(final Context context) {
        final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0,
                new Intent(context, PeriodicExtensionRefreshReceiver.class).setAction(ACTION_PERIODIC_ALARM),
                PendingIntent.FLAG_CANCEL_CURRENT);
        am.cancel(pi);
    }
}