package it.fdev.backgroundSync; import it.fdev.unisaconnect.MainActivity; import it.fdev.unisaconnect.R; import it.fdev.unisaconnect.data.SharedPrefDataManager; import it.fdev.utils.Utils; import java.util.Date; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.provider.Settings; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.sun.mail.imap.IMAPFolder; public class MailChecker { private final static String IMAP_SERVER = "imap.studenti.unisa.it"; public static final int MAIL_NOTIFICATION_ID = 2; // public static final long ALARM_INTERVAL = 30 * 1000; // public static final long ALARM_INTERVAL = AlarmManager.INTERVAL_FIFTEEN_MINUTES; public static final long ALARM_INTERVAL = AlarmManager.INTERVAL_HOUR * 2; public static final long FIRST_ALARM_DELAY = 1; public void doRead(Context context) { Log.v(Utils.TAG, "Checking webmail..."); SharedPrefDataManager mDM = new SharedPrefDataManager(context); if (!mDM.loginDataExists()) { return; } IMAPFolder folder = null; Store store = null; try { Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); Session session = Session.getDefaultInstance(props, null); store = session.getStore("imaps"); store.connect(IMAP_SERVER, mDM.getUser() + "@studenti.unisa.it", mDM.getPass()); folder = (IMAPFolder) store.getFolder("inbox"); if (!folder.isOpen()) { folder.open(Folder.READ_ONLY); } int numMsg = folder.getMessageCount(); if (numMsg < 1) { return; } Message lastMessage = folder.getMessages(numMsg, numMsg)[0]; Date lastReceivedDate = lastMessage.getReceivedDate(); if (!lastReceivedDate.after(mDM.getMailLastRead())) { // Log.v(Utils.TAG, "Last mail already notified"); return; } int unreadNumMsg = folder.getUnreadMessageCount(); createNofitication(context, unreadNumMsg); mDM.setMailLastRead(lastReceivedDate); } catch (MessagingException e) { e.printStackTrace(); } finally { try { if (folder != null && folder.isOpen()) { folder.close(true); } if (store != null) { store.close(); } } catch (MessagingException e) { e.printStackTrace(); } } } private void createNofitication(Context context, int numUnread) { Intent intent_notification = new Intent(context, MainActivity.class); intent_notification.setAction(MainActivity.INTENT_LAUNCH_FRAGMENT); intent_notification.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); intent_notification.putExtra("launch_fragment", MainActivity.BootableFragmentsEnum.WEBMAIL); PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent_notification, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(context) .setContentTitle("Unisa Webmail") .setContentText(context.getString(R.string.mail_non_lette, numUnread)) .setAutoCancel(true) .setSound(Settings.System.DEFAULT_NOTIFICATION_URI) .setSmallIcon(R.drawable.ic_stat_mail) .setContentIntent(pIntent) .setOngoing(false) .setOnlyAlertOnce(true) .setWhen(System.currentTimeMillis()); Notification cNotification = mNotifyBuilder.build(); cNotification.defaults |= Notification.DEFAULT_ALL; cNotification.audioStreamType = AudioManager.STREAM_NOTIFICATION; mNotificationManager.notify(MAIL_NOTIFICATION_ID, cNotification); } /** * Controlla se sono memorizzati i dati utente (user/pass) * Controlla la preferenza di sistema per il controllo automatico della mail * @param context */ public static void autoSetAlarm(Context context) { SharedPrefDataManager mDM = new SharedPrefDataManager(context); if (!mDM.loginDataExists()) { cancelAlarm(context); return; } boolean mailCheckEnabled = mDM.getMailDoCheck(); if (mailCheckEnabled) { setAlarm(context); } else { cancelAlarm(context); } } /** * Set alarm for background sync service * @param context */ private static void setAlarm(Context context) { if (isAlarmUp(context)) { return; } // Log.d(Utils.TAG, "Set alarm"); Intent alarmIntent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, FIRST_ALARM_DELAY, ALARM_INTERVAL, pendingIntent); } private static void cancelAlarm(Context context) { Intent i = new Intent(context, AlarmReceiver.class); PendingIntent pendingI = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_NO_CREATE); if (pendingI != null) { // Log.d(Utils.TAG, "Canceling alarm..."); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingI); pendingI.cancel(); } } private static boolean isAlarmUp(Context context) { Intent i = new Intent(context, AlarmReceiver.class); PendingIntent pendingI = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_NO_CREATE); // Log.d(Utils.TAG, "Alarm exists: " + (pendingI!=null)); return pendingI != null; } }