import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBar;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.NumberPicker;
import android.widget.Toast;
import com.siliconicpro.admin.ialarm.SlidingTabs.SlidingTabLayout;
import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Home extends ActionBarActivity{
private static DatabaseOperations dop; // Database Handler
private SQLiteDatabase db;
public static ViewPager viewPager;
public myPagerAdapter pagerAdapter;
private static DateFormat timeFormat = new SimpleDateFormat("hh:mm aa dd/MM/yyyy");
public static Context context;
public static final int alert1Code = 1000;
public static final int alert2Code = 2000;
public Home(){
context = this;
dop = new DatabaseOperations(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
context = this;
// Changing Action Bar Color
ActionBar ab = getSupportActionBar();
ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#ff156514"));
ab.setBackgroundDrawable(colorDrawable);
ab.setDisplayShowHomeEnabled(true);
ab.setIcon(getResources().getDrawable(R.drawable.app_icon));
ab.setTitle(" iAlarm");
// Creating database for the APP
dop = new DatabaseOperations(this);
db = dop.getWritableDatabase();
// Creating Sliding Tabs
final List<Fragment> fragments = new ArrayList<>();
fragments.add(new Active());
fragments.add(new Archive());
SlidingTabLayout tabs = (SlidingTabLayout)findViewById(R.id.tabs);
viewPager = (ViewPager)findViewById(R.id.viewPager);
pagerAdapter = new myPagerAdapter(getSupportFragmentManager(), this, fragments);
viewPager.setAdapter(pagerAdapter);
tabs.setDistributeEvenly(true);
tabs.setViewPager(viewPager);
}
public static Context getContext(){
return context;
}
// Handler for App Database
public static DatabaseOperations getDop(){
return dop;
}
// Called when a new alarm is created
// Called when any off alarm is turned on
// Called when any alarm is updated
// Value of interval_ is always in minutes
public static void setNewAlarm(Context ctx, String time_, String date_, int interval_, int repeat_,
long id_, String alert1_, String alert2_){
PendingIntent pi = createPendingIntentAlarm(ctx, id_);
AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
long timeInMillis = getRingTime(time_, date_, interval_);
long intervalMillis = minuteToMillis(interval_);
// No Repeat
if(repeat_ == 0) {
if(Build.VERSION.SDK_INT >= 19) {
am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}
else{
am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}
if(!alert1_.equals(ctx.getResources().getString(R.string.no_alert))) {
setAlert(ctx, id_, alert1_, repeat_, timeInMillis, intervalMillis, alert1Code);
}
if(!alert2_.equals(ctx.getResources().getString(R.string.no_alert))) {
setAlert(ctx, id_, alert2_, repeat_, timeInMillis, intervalMillis, alert2Code);
}
}
else{
am.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, intervalMillis, pi);
if(!alert1_.equals(ctx.getResources().getString(R.string.no_alert))) {
setAlert(ctx, id_, alert1_, repeat_, timeInMillis, intervalMillis, alert1Code);
}
if(!alert2_.equals(ctx.getResources().getString(R.string.no_alert))) {
setAlert(ctx, id_, alert2_, repeat_, timeInMillis, intervalMillis, alert2Code);
}
}
}
// Called when a new alarm is created
// Called when any off alarm is turned on
// Called when any alarm is updated
public static void setAlert(Context ctx, long id, String alertTime, int repeat_, long alarmTimeInMillis,
long intervalInMillis, int code){
// Using code as a unique identifier for pending intents
long alertTimeInMillis = getIntFromString(ctx, alertTime);
long actualTime = alarmTimeInMillis - alertTimeInMillis;
PendingIntent pi = createPendingIntentAlert(ctx, id, code);
AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
// Create alert only in future time
if(actualTime > System.currentTimeMillis()) {
// No Repeat
if (repeat_ == 0) {
if (Build.VERSION.SDK_INT >= 19) {
am.setExact(AlarmManager.RTC_WAKEUP, actualTime, pi);
}
else {
am.set(AlarmManager.RTC_WAKEUP, actualTime, pi);
}
}
else {
am.setRepeating(AlarmManager.RTC_WAKEUP, actualTime, intervalInMillis, pi);
}
}
}
// Deleting Alarm from System
public static void cancelAlarm(Context ctx, long id_){
// Deleting alerts of alarm
cancelAlert(ctx, id_, alert1Code);
cancelAlert(ctx, id_, alert2Code);
// Deleting alarm
PendingIntent pi = createPendingIntentAlarm(ctx, id_);
AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
am.cancel(pi);
}
// Deleting Alerts from System
// Called when any alarm is deleted/cancelled
private static void cancelAlert(Context ctx, long id_, int code) {
PendingIntent pi = createPendingIntentAlert(ctx, id_, code);
AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
am.cancel(pi);
}
// Creating PendingIntent for Alarm
public static PendingIntent createPendingIntentAlarm(Context ctx, long id_){
Intent intent = new Intent(ctx, AlarmScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.putExtra("id", Long.toString(id_));
return PendingIntent.getActivity(ctx, (int) id_, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
// Creating PendingIntent for Alerts
public static PendingIntent createPendingIntentAlert(Context ctx, long id_, int code){
Intent intent = new Intent(ctx, NReceiver.class);
intent.putExtra("id", Long.toString(id_));
return PendingIntent.getBroadcast(ctx, (int) id_ + code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
// Ring Time of Alarm in String Format
public static String ringTime(String time_, String date_, int interval_){
long ringTime = getRingTime(time_, date_, interval_);
return timeFormat.format(ringTime);
}
// Calculating Ring Time of Alarm Long Format
public static long getRingTime(String time_, String date_, int interval_){
try {
Date date = timeFormat.parse(time_+" "+date_);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MINUTE, interval_);
return calendar.getTimeInMillis();
}
catch (ParseException e) {
// Nothing
}
return 0;
}
// To get String array out of XML (int|string) Array
public static String[] getStringArray(String alerts[]){
String array[] = new String[alerts.length];
int i = 0;
for(String s : alerts){
String parts[] = s.split("\\|");
array[i] = parts[1];
i++;
}
return array;
}
// To get int value out of String
// Returning long value
public static long getIntFromString(Context ctx, String alert){
String alerts[] = ctx.getResources().getStringArray(R.array.alerts);
int alertTime;
for(String s : alerts){
String parts[] = s.split("\\|");
if(parts[1].equals(alert)){
alertTime = Integer.parseInt(parts[0]);
return alertTime * 60 * 1000;
}
}
return 0;
}
// Convert minutes into milli seconds
public static long minuteToMillis(int interval_) {
return interval_ * 60 * 1000;
}
@Override
protected void onStop() {
super.onStop();
if(db != null){
db.close();
}
}
@Override
protected void onRestart() {
super.onRestart();
int position = viewPager.getCurrentItem();
refreshViewPager(position);
}
// Refresh All Pages in View Pager
private void refreshViewPager(int position) {
List<Fragment> fragments = new ArrayList<>();
fragments.add(new Active());
fragments.add(new Archive());
myPagerAdapter adapter = new myPagerAdapter(getSupportFragmentManager(), this, fragments);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(position);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.add_alarm:
if(AlarmsTable.onAlarms(getDop()) < 30) {
startActivity(new Intent(Home.this, NewAlarm.class));
}
else{
Toast.makeText(this, "Number of active alarms have reached the limit!", Toast.LENGTH_LONG).show();
}
break;
case R.id.settings:
startActivity(new Intent(Home.this, Settings.class));
break;
}
return super.onOptionsItemSelected(item);
}
// Converting minutes into days, hours, minutes format
public static String minutesToIntervalLabel(Context ctx, int minutes){
int days = 0, hours = 0;
if(minutes >= 1440){
days = minutes / 1440;
minutes = minutes % 1440;
if(minutes >= 60){
hours = minutes / 60;
minutes = minutes % 60;
}
}
else if(minutes < 1440){
if(minutes >= 60){
hours = minutes / 60;
minutes = minutes % 60;
}
}
return Home.getIntervalLabel(ctx, days, hours, minutes);
}
// Determine Interval Label
public static String getIntervalLabel(Context ctx, int days, int hours, int min){
String interval = ctx.getResources().getString(R.string.minHourDay);
// Days selection
if(days != 0 && hours == 0 && min == 0){
if(days == 1){
interval = days + " day";
}
else {
interval = days + " days";
}
}
// Hours selection
else if(days == 0 && hours != 0 && min == 0){
if(hours == 1){
interval = hours + " hour";
}
else{
interval = hours + " hours";
}
}
// Minutes selection
else if(days == 0 && hours == 0 && min != 0){
if(min == 1){
interval = min + " minute";
}
else{
interval = min + " minutes";
}
}
// Days/Hours selection
else if(days != 0 && hours != 0 && min == 0){
if(days == 1 && hours == 1){
interval = days + " day and " + hours + " hour";
}
else if(days != 1 && hours == 1){
interval = days + " days and " + hours + " hour";
}
else if(days == 1 && hours != 1){
interval = days + " day and " + hours + " hours";
}
else{
interval = days + " days and " + hours + " hours";
}
}
// Days/Minutes selection
else if(days != 0 && hours == 0 && min != 0){
if(days == 1 && min == 1){
interval = days + " day and " + min + " minute";
}
else if(days != 1 && min == 1){
interval = days + " days and " + min + " minute";
}
else if(days == 1 && min != 1){
interval = days + " day and " + min + " minutes";
}
else{
interval = days + " days and " + min + " minutes";
}
}
// Hours/Minutes selection
else if(days == 0 && hours != 0 && min != 0){
if(hours == 1 && min == 1){
interval = hours + " hour and " + min + " minute";
}
else if(hours != 1 && min == 1){
interval = hours + " hours and " + min + " minute";
}
else if(hours == 1 && min != 1){
interval = hours + " hour and " + min + " minutes";
}
else{
interval = hours + " hours and " + min + " minutes";
}
}
// Days/Hours/Minutes selection
else if(days != 0 && hours != 0 && min != 0){
if(days == 1 && hours == 1 && min == 1) {
interval = days + " day, " + hours + " hour and " + min + " minute";
}
else if(days != 1 && hours == 1 && min == 1) {
interval = days + " days, " + hours + " hour and " + min + " minute";
}
else if(days == 1 && hours != 1 && min == 1) {
interval = days + " day, " + hours + " hours and " + min + " minute";
}
else if(days == 1 && hours == 1 && min != 1) {
interval = days + " day, " + hours + " hour and " + min + " minutes";
}
else if(days != 1 && hours != 1 && min == 1) {
interval = days + " days, " + hours + " hours and " + min + " minute";
}
else if(days == 1 && hours != 1 && min != 1) {
interval = days + " day, " + hours + " hours and " + min + " minutes";
}
else if(days != 1 && hours == 1 && min != 1) {
interval = days + " days, " + hours + " hour and " + min + " minutes";
}
else{
interval = days + " days, " + hours + " hours and " + min + " minutes";
}
}
return interval;
}
@Override
protected void onDestroy() {
super.onDestroy();
// Enabling Boot Receiver
if(AlarmsTable.onAlarms(getDop()) > 0) {
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
// Disabling Boot Receiver
else {
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
}
No comments:
Post a Comment