| /* |
| * 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); |
| } |
| } |