package com.github.andlyticsproject.sync;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.BigTextStyle;
import android.support.v4.app.NotificationCompat.Builder;
import com.github.andlyticsproject.AndlyticsApp;
import com.github.andlyticsproject.AppStatsDiff;
import com.github.andlyticsproject.BaseActivity;
import com.github.andlyticsproject.DeveloperAccountManager;
import com.github.andlyticsproject.Main;
import com.github.andlyticsproject.Preferences;
import com.github.andlyticsproject.R;
import com.github.andlyticsproject.model.DeveloperAccount;
public class NotificationHandler {
static final String GROWL_ACTION = "org.damazio.notifier.service.UserReceiver.USER_MESSAGE";
static final String EXTRA_TITLE = "title";
static final String EXTRA_DESCRIPTION = "description";
public static void handleNotificaions(Context context, List<AppStatsDiff> diffs,
String accountName) {
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String contentTitle = context.getString(R.string.notification_title);
String contentText = "";
String iconName = null;
boolean downloadsEnabled = Preferences.getNotificationPerf(context,
Preferences.NOTIFICATION_CHANGES_DOWNLOADS);
boolean commentsEnabled = Preferences.getNotificationPerf(context,
Preferences.NOTIFICATION_CHANGES_COMMENTS);
boolean ratingsEnabled = Preferences.getNotificationPerf(context,
Preferences.NOTIFICATION_CHANGES_RATING);
boolean lightEnabled = Preferences.getNotificationPerf(context,
Preferences.NOTIFICATION_LIGHT);
String ringtone = Preferences.getNotificationRingtone(context);
List<String> appNameList = new ArrayList<String>();
int number = 0;
for (int i = 0; i < diffs.size(); i++) {
AppStatsDiff diff = diffs.get(i);
if (!diff.isSkipNotification()) {
if (diff.hasChanges()) {
List<String> changeProperties = new ArrayList<String>();
if (commentsEnabled && diff.getCommentsChange() != 0) {
changeProperties.add(context.getString(R.string.comments));
number++;
}
if (ratingsEnabled && diff.getAvgRatingChange() != 0) {
changeProperties.add(context.getString(R.string.ratings));
number++;
}
if (downloadsEnabled && diff.getDownloadsChange() != 0) {
changeProperties.add(context.getString(R.string.downloads));
number++;
}
if (changeProperties.size() > 0) {
String name = diff.getAppName();
name += " (";
for (int j = 0; j < changeProperties.size(); j++) {
name += changeProperties.get(j);
if (j < changeProperties.size() - 1) {
name += ", ";
}
}
name += ")";
if (appNameList.size() == 0) {
// Record the icon of the first app with changes that we are
// interested in that also has notifications turned on
iconName = diff.getIconName();
}
appNameList.add(name);
}
}
}
}
if (appNameList.size() > 0) {
for (int i = 0; i < appNameList.size(); i++) {
contentText += appNameList.get(i);
if (i < appNameList.size() - 1) {
contentText += ", ";
}
}
String selectedAccountName = null;
DeveloperAccount devAccount = DeveloperAccountManager.getInstance(context)
.getSelectedDeveloperAccount();
if (devAccount != null) {
selectedAccountName = devAccount.getName();
}
if (!AndlyticsApp.getInstance().isAppVisible()
|| !accountName.equals(selectedAccountName)
|| Preferences.getNotificationPerf(context,
Preferences.NOTIFICATION_WHEN_ACCOUNT_VISISBLE)) {
// The user can choose not to see notifications if the current account is visible
Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.statusbar_andlytics);
builder.setContentTitle(contentTitle);
builder.setContentText(contentText);
File iconFilePath = new File(context.getCacheDir(), iconName);
if (iconFilePath.exists()) {
Bitmap bm = BitmapFactory.decodeFile(iconFilePath.getAbsolutePath());
builder.setLargeIcon(bm);
}
BigTextStyle style = new BigTextStyle(builder);
style.bigText(contentText);
style.setBigContentTitle(contentTitle);
style.setSummaryText(accountName);
builder.setStyle(style);
builder.setWhen(System.currentTimeMillis());
builder.setNumber(number);
Intent notificationIntent = new Intent(context, Main.class);
notificationIntent.putExtra(BaseActivity.EXTRA_AUTH_ACCOUNT_NAME, accountName);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(context,
accountName.hashCode(), notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(contentIntent);
builder.setTicker(contentTitle);
if (ringtone != null) {
builder.setSound(Uri.parse(ringtone));
}
if (lightEnabled) {
builder.setDefaults(Notification.DEFAULT_LIGHTS);
}
builder.setAutoCancel(true);
nm.notify(accountName.hashCode(), builder.build());
}
Intent i = new Intent(GROWL_ACTION);
i.putExtra(EXTRA_TITLE, contentTitle);
i.putExtra(EXTRA_DESCRIPTION, contentText);
context.sendBroadcast(i);
}
}
}