Thursday, 11 June 2015

Main activity class

package com.siliconicpro.admin.ialarm;

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