/** * technoXist * * Copyright (c) 2014-2015 Suyash Bhatt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.technoxist.service; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.IBinder; import android.os.SystemClock; import com.technoxist.Constants; import com.technoxist.utils.PrefUtils; public class RefreshService extends Service { public static final String SIXTY_MINUTES = "3600000"; public static class RefreshAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, FetcherService.class).setAction(FetcherService.ACTION_REFRESH_FEEDS).putExtra(Constants.FROM_AUTO_REFRESH, true)); } } private final OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PrefUtils.REFRESH_INTERVAL.equals(key)) { restartTimer(false); } } }; private AlarmManager alarmManager; private PendingIntent timerIntent; @Override public IBinder onBind(Intent intent) { onRebind(intent); return null; } @Override public boolean onUnbind(Intent intent) { return true; // we want to use rebind } @Override public void onCreate() { super.onCreate(); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); PrefUtils.registerOnPrefChangeListener(listener); restartTimer(true); } private void restartTimer(boolean created) { if (timerIntent == null) { timerIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, RefreshAlarmReceiver.class), 0); } else { alarmManager.cancel(timerIntent); } int time = 3600000; try { time = Math.max(60000, Integer.parseInt(PrefUtils.getString(PrefUtils.REFRESH_INTERVAL, SIXTY_MINUTES))); } catch (Exception ignored) { } long elapsedRealTime = SystemClock.elapsedRealtime(); long initialRefreshTime = elapsedRealTime + 10000; if (created) { long lastRefresh = PrefUtils.getLong(PrefUtils.LAST_SCHEDULED_REFRESH, 0); // If the system rebooted, we need to reset the last value if (elapsedRealTime < lastRefresh) { lastRefresh = 0; PrefUtils.putLong(PrefUtils.LAST_SCHEDULED_REFRESH, 0); } if (lastRefresh > 0) { // this indicates a service restart by the system initialRefreshTime = Math.max(initialRefreshTime, lastRefresh + time); } } alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, initialRefreshTime, time, timerIntent); } @Override public void onDestroy() { if (timerIntent != null) { alarmManager.cancel(timerIntent); } PrefUtils.unregisterOnPrefChangeListener(listener); super.onDestroy(); } }