blob: 2900558e3b6a30899c3a423c5829a7c99431c822 [file] [log] [blame]
/*
* Copyright (C) 2013 Fairphone Project
*
* 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 org.fairphone.peaceofmind;
import com.flurry.android.FlurryAgent;
import org.fairphone.fairphonepeaceofmindapp.R;
import org.fairphone.peaceofmind.data.PeaceOfMindRun;
import org.fairphone.peaceofmind.data.PeaceOfMindStats;
import org.fairphone.peaceofmind.utils.FlurryHelper;
import org.fairphone.peaceofmind.widget.WidgetProvider;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
public class PeaceOfMindBroadCastReceiver extends BroadcastReceiver {
private static final String TAG = PeaceOfMindBroadCastReceiver.class.getSimpleName();
private static final int PEACE_OF_MIND_ON_NOTIFICATION = 0;
private static final int PEACE_OF_MIND_INTERRUPTED_NOTIFICATION = 1;
private PeaceOfMindStats mCurrentStats;
private SharedPreferences mSharedPreferences;
private Context mContext;
private IDeviceController mDeviceController;
@Override
public void onReceive(Context context, Intent intent) {
mContext = context;
setupDeviceController();
String action = intent.getAction();
if (action != null) {
// obtains the piece of mind data from shared preferences
mSharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);
mCurrentStats = PeaceOfMindStats
.getStatsFromSharedPreferences(mSharedPreferences);
if (action.equals(PeaceOfMindActivity.UPDATE_PEACE_OF_MIND)) {
updateTargetTime(intent);
} else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
//only react to this if the app is running
if(mCurrentStats.mIsOnPeaceOfMind){
Bundle extras = intent.getExtras();
//if the intent was sent by the system end Peace of mind
if(!extras.containsKey(AirplaneModeToggler.PEACE_OF_MIND_TOGGLE)){
endPeaceOfMind(true);
}
}
} else if (Intent.ACTION_SHUTDOWN.equals(action) && mCurrentStats.mIsOnPeaceOfMind) {
endPeaceOfMind(true);
} else {
performTimeTick();
}
} else {
return;
}
// update the widgets
updateWidget(context);
}
private void setupDeviceController() {
mDeviceController = new AirplaneModeDeviceController(mContext);
}
private void updateWidget(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class));
if (appWidgetIds.length > 0)
{
new WidgetProvider().onUpdate(context, appWidgetManager, appWidgetIds);
}
}
private void performTimeTick() {
long currentTime = System.currentTimeMillis();
long passedTime = 0;
if (mCurrentStats.mLastTimePinged != 0) {
if(mCurrentStats.mLastTimePinged >= currentTime){
endPeaceOfMind(false);
return;
}else{
passedTime += currentTime - mCurrentStats.mLastTimePinged;
}
}
mCurrentStats.mLastTimePinged = currentTime;
if (mCurrentStats.mIsOnPeaceOfMind) {
mCurrentStats.mCurrentRun.mPastTime += passedTime;
if(mCurrentStats.mCurrentRun.mPastTime >= mCurrentStats.mCurrentRun.mTargetTime){
endPeaceOfMind(false);
return;
}
}
PeaceOfMindStats.saveToSharedPreferences(mCurrentStats, mSharedPreferences);
// send broadcast to application receiver
if (mCurrentStats.mIsOnPeaceOfMind) {
Intent tickIntent = new Intent(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_TICK);
tickIntent.putExtra(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_TARGET_TIME, mCurrentStats.mCurrentRun.mTargetTime);
tickIntent.putExtra(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_PAST_TIME, mCurrentStats.mCurrentRun.mPastTime);
mContext.sendBroadcast(tickIntent);
}
}
private void startPeaceOfMind(long targetTime) {
long currentTime = System.currentTimeMillis();
mCurrentStats.mIsOnPeaceOfMind = true;
mCurrentStats.mLastTimePinged = currentTime;
mCurrentStats.mCurrentRun = new PeaceOfMindRun();
mCurrentStats.mCurrentRun.mTimeStarted = currentTime;
mCurrentStats.mCurrentRun.mPastTime = 0;
mCurrentStats.mCurrentRun.mTargetTime = targetTime;
PeaceOfMindStats.saveToSharedPreferences(mCurrentStats, mSharedPreferences);
mDeviceController.startPeaceOfMind();
// send broadcast to application receiver
Intent intent = new Intent(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_STARTED);
intent.putExtra(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_TARGET_TIME, targetTime);
mContext.sendBroadcast(intent);
}
private void updateTargetTime(Intent intent) {
long newTargetTime = intent.getExtras().getLong(
PeaceOfMindActivity.BROADCAST_TARGET_PEACE_OF_MIND);
if(newTargetTime == 0){
if(mCurrentStats.mIsOnPeaceOfMind){
endPeaceOfMind(false);
}
}else if (mCurrentStats.mIsOnPeaceOfMind) {
if (mCurrentStats.mCurrentRun.mPastTime < newTargetTime) {
mCurrentStats.mCurrentRun.mTargetTime = newTargetTime;
PeaceOfMindStats.saveToSharedPreferences(mCurrentStats, mSharedPreferences);
Intent updateIntent = new Intent(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_UPDATED);
updateIntent.putExtra(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_TARGET_TIME, mCurrentStats.mCurrentRun.mTargetTime);
updateIntent.putExtra(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_PAST_TIME, mCurrentStats.mCurrentRun.mPastTime);
mContext.sendBroadcast(updateIntent);
} else {
endPeaceOfMind(false);
}
}else {
startPeaceOfMind(newTargetTime);
setPeaceOfMindIconInNotificationBar(true, false);
}
}
/**
* Sets the Peace of mind icon on the notification bar
* @param putIcon if true the icon is put otherwise it is removed
* @param wasInterrupted when true, an extra notification is sent to inform the user that Peace of mind was ended
*/
private void setPeaceOfMindIconInNotificationBar(boolean putIcon, boolean wasInterrupted) {
NotificationManager manager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if(putIcon){
//just in case the user didn't clear it
manager.cancel(PEACE_OF_MIND_INTERRUPTED_NOTIFICATION);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.peace_system_bar_icon)
.setContentTitle(mContext.getResources().getString(R.string.app_name))
.setContentText(mContext.getResources().getString(R.string.peace_on_notification));
Intent resultIntent = new Intent(mContext, PeaceOfMindActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(PeaceOfMindActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
Notification notificationWhileRunnig = builder.build();
notificationWhileRunnig.flags |= Notification.FLAG_NO_CLEAR;
// Add notification
manager.notify(PEACE_OF_MIND_ON_NOTIFICATION, notificationWhileRunnig);
}else{
manager.cancel(PEACE_OF_MIND_ON_NOTIFICATION);
//send a notification saying that the peace was ended
if(wasInterrupted){
NotificationCompat.Builder builder =
new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.peace_system_bar_icon)
.setAutoCancel(true)
.setContentTitle(mContext.getResources().getString(R.string.app_name))
.setContentText(mContext.getResources().getString(R.string.peace_off_notification))
.setTicker(mContext.getResources().getString(R.string.peace_off_notification));
manager.notify(PEACE_OF_MIND_INTERRUPTED_NOTIFICATION, builder.build());
}
}
}
private void endPeaceOfMind(boolean wasInterrupted) {
mCurrentStats.mIsOnPeaceOfMind = false;
mCurrentStats.mLastTimePinged = 0;
if(mCurrentStats.mCurrentRun != null){
mCurrentStats.mCurrentRun.mTimeStarted = 0;
mCurrentStats.mCurrentRun.mPastTime = 0;
mCurrentStats.mCurrentRun.mTargetTime = 0;
mCurrentStats.mCurrentRun = null;
}
PeaceOfMindStats.saveToSharedPreferences(mCurrentStats, mSharedPreferences);
mDeviceController.endPeaceOfMind();
FlurryHelper.startFlurrySession(mContext);
FlurryAgent.endTimedEvent(FlurryHelper.PEACE_OF_MIND_STARTED);
if(wasInterrupted){
FlurryAgent.logEvent(FlurryHelper.PEACE_OF_MIND_STOPPED);
}
FlurryHelper.endFlurrySession(mContext);
Intent endIntent = new Intent(PeaceOfMindApplicationBroadcastReceiver.PEACE_OF_MIND_ENDED);
mContext.sendBroadcast(endIntent);
setPeaceOfMindIconInNotificationBar(false, wasInterrupted);
}
}