/* * Calendula - An assistant for personal medication management. * Copyright (C) 2016 CITIUS - USC * * Calendula 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 software. If not, see <http://www.gnu.org/licenses/>. */ package es.usc.citius.servando.calendula; import android.app.AlarmManager; import android.app.Application; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.preference.PreferenceManager; import android.util.Log; import com.evernote.android.job.JobManager; import com.mikepenz.iconics.Iconics; import org.joda.time.LocalTime; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Locale; import de.greenrobot.event.EventBus; import es.usc.citius.servando.calendula.database.DB; import es.usc.citius.servando.calendula.database.PatientDao; import es.usc.citius.servando.calendula.jobs.CalendulaJobCreator; import es.usc.citius.servando.calendula.jobs.PurgeCacheJob; import es.usc.citius.servando.calendula.persistence.Patient; import es.usc.citius.servando.calendula.scheduling.AlarmIntentParams; import es.usc.citius.servando.calendula.scheduling.AlarmReceiver; import es.usc.citius.servando.calendula.scheduling.AlarmScheduler; import es.usc.citius.servando.calendula.scheduling.DailyAgenda; import es.usc.citius.servando.calendula.util.PresentationsTypeface; /** * Created by castrelo on 4/10/14. */ public class CalendulaApp extends Application { public static boolean disableReceivers = false; private static boolean isOpen; public static final String PHARMACY_MODE_ENABLED = "PHARMACY_MODE_ENABLED"; // PREFERENCES public static final String PREFERENCES_NAME = "CalendulaPreferences"; public static final String PREF_ALARM_SETTLED = "alarm_settled"; // INTENTS public static final String INTENT_EXTRA_ACTION = "action"; public static final String INTENT_EXTRA_ROUTINE_ID = "routine_id"; public static final String INTENT_EXTRA_MEDICINE_ID = "medicine_id"; public static final String INTENT_EXTRA_SCHEDULE_ID = "schedule_id"; public static final String INTENT_EXTRA_SCHEDULE_TIME = "schedule_time"; public static final String INTENT_EXTRA_DELAY_ROUTINE_ID = "delay_routine_id"; public static final String INTENT_EXTRA_DELAY_SCHEDULE_ID = "delay_schedule_id"; // ACTIONS public static final int ACTION_ROUTINE_TIME = 1; public static final int ACTION_DAILY_ALARM = 2; public static final int ACTION_ROUTINE_DELAYED_TIME = 3; public static final int ACTION_DELAY_ROUTINE = 4; public static final int ACTION_CANCEL_ROUTINE = 5; public static final int ACTION_HOURLY_SCHEDULE_TIME = 6; public static final int ACTION_HOURLY_SCHEDULE_DELAYED_TIME = 7; public static final int ACTION_DELAY_HOURLY_SCHEDULE = 8; public static final int ACTION_CANCEL_HOURLY_SCHEDULE = 9; public static final int ACTION_CHECK_PICKUPS_ALARM = 10; // REQUEST CODES public static final int RQ_SHOW_ROUTINE = 1; public static final int RQ_DELAY_ROUTINE = 2; private static EventBus eventBus = EventBus.getDefault(); public static boolean isOpen() { return isOpen; } public static void open(boolean isOpen) { CalendulaApp.isOpen = isOpen; } SharedPreferences prefs; @Override public void onCreate() { super.onCreate(); prefs = PreferenceManager.getDefaultSharedPreferences(this); // initialize SQLite engine initializeDatabase(); if (!prefs.getBoolean("DEFAULT_DATA_INSERTED", false)) { DefaultDataGenerator.fillDBWithDummyData(getApplicationContext()); prefs.edit().putBoolean("DEFAULT_DATA_INSERTED", true).commit(); } // initialize daily agenda DailyAgenda.instance().setupForToday(this, false); // setup alarm for daily agenda update setupUpdateDailyAgendaAlarm(); //exportDatabase(this, DB_NAME, new File(Environment.getExternalStorageDirectory() + File.separator + DB_NAME)); //forceLocale(Locale.GERMAN); //only required if you add a custom or generic font on your own Iconics.init(getApplicationContext()); //register custom fonts like this (or also provide a font definition file) Iconics.registerFont(new PresentationsTypeface()); //initialize job engine JobManager.create(this).addJobCreator(new CalendulaJobCreator()); PurgeCacheJob.scheduleJob(); } public static boolean isPharmaModeEnabled(Context ctx) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); return prefs.getBoolean(PHARMACY_MODE_ENABLED, false); } private void forceLocale(Locale l) { Locale locale = new Locale(l.getLanguage()); Locale.setDefault(locale); Configuration config = getApplicationContext().getResources().getConfiguration(); config.locale = locale; getApplicationContext().getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics()); } public void initializeDatabase() { DB.init(this); try{ if(DB.patients().countOf() == 1) { Patient p = DB.patients().getDefault(); prefs.edit().putLong(PatientDao.PREFERENCE_ACTIVE_PATIENT, p.id()).commit(); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onTerminate() { DB.dispose(); super.onTerminate(); } public void setupUpdateDailyAgendaAlarm() { // intent our receiver will receive Intent intent = new Intent(this, AlarmReceiver.class); AlarmIntentParams params = AlarmIntentParams.forDailyUpdate(); AlarmScheduler.setAlarmParams(intent, params); PendingIntent dailyAlarm = PendingIntent.getBroadcast(this, params.hashCode(), intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); if (alarmManager != null) { alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, new LocalTime(0, 0).toDateTimeToday().getMillis(), AlarmManager.INTERVAL_DAY, dailyAlarm); } } public void exportDatabase(Context context, String databaseName, File out) { final File dbPath = context.getDatabasePath(databaseName); // If the database already exists, return if (!dbPath.exists()) { Log.d("APP", "Database not found"); return; } // Try to copy database file try { final InputStream inputStream = new FileInputStream(dbPath); final OutputStream output = new FileOutputStream(out); byte[] buffer = new byte[8192]; int length; while ((length = inputStream.read(buffer, 0, 8192)) > 0) { output.write(buffer, 0, length); } output.flush(); output.close(); inputStream.close(); } catch (IOException e) { Log.e("APP", "Failed to export database", e); } } public static EventBus eventBus() { return eventBus; } public static String activePatientAuth(Context ctx) { Long id = DB.patients().getActive(ctx).id(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); return prefs.getString("remote_token" + id, null); } }