itachi1706/CheesecakeUtilities

View on GitHub
app/src/main/java/com/itachi1706/cheesecakeutilities/modules/ordcountdown/ORDSettingsActivity.java

Summary

Maintainability
B
6 hrs
Test Coverage
package com.itachi1706.cheesecakeutilities.modules.ordcountdown;

import android.app.DatePickerDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import com.itachi1706.helperlib.helpers.PrefHelper;
import com.itachi1706.cheesecakeutilities.R;
import com.itachi1706.cheesecakeutilities.util.CommonMethods;
import com.itachi1706.helperlib.helpers.LogHelper;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class ORDSettingsActivity extends AppCompatActivity {

    private long enlistMS, ordMS, popMS, ptpMS, milestoneMS, pdoption;
    private String pesStatusString;
    private TextView enlistEt, ordEt, popEt, ptpEt, milestoneEt, leaveEt, offEt;
    private Spinner pesStatusSpinner, payDaySpinner;
    private DatePickerDialog.OnDateSetListener pop, ord, enlist, ptp, milestone;

    private SharedPreferences sp;

    private static final int UPDATE_ORD = 1, UPDATE_POP = 2, UPDATE_ENLIST = 3, UPDATE_PTP = 4, UPDATE_NONE = 5, UPDATE_STATUS = 6, UPDATE_MILESTONE = 7;

    public static final int PES_A = 1, PES_PTP = 2, PES_BP = 3, PES_C = 4, PES_E = 5; // PES Status
    public static final int ENHANCED_BMT = 9, PTP_BMT = 17, BP_BMT = 19, E_BMT = 4; // BMT Weeks
    public static final int ENHANCED_PES = 21, NORMAL_PES = 24; // NS Weeks
    public static final String SP_ORD = "ordcalc_ord", SP_PTP = "ordcalc_ptp",
            SP_POP = "ordcalc_pop", SP_ENLIST = "ordcalc_enlist", SP_STATUS = "ordcalc_status",
            SP_MILESTONE = "ordcalc_milestone", SP_PAYDAY = "ordcalc_payday", SP_LEAVE = "ordcalc_leave", SP_OFF = "ordcalc_off";
    public static final int PAYDAY_10 = 0, PAYDAY_12 = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ordsettings);

        this.enlistMS = 0;
        this.ordMS = 0;
        this.popMS = 0;
        this.ptpMS = 0;
        this.pop = new dateListener(UPDATE_POP);
        this.ord = new dateListener(UPDATE_ORD);
        this.enlist = new dateListener(UPDATE_ENLIST);
        this.milestone = new dateListener(UPDATE_MILESTONE);
        this.ptp = new dateListener(UPDATE_PTP);

        this.sp = PrefHelper.getDefaultSharedPreferences(this);

        enlistEt = findViewById(R.id.etEnlist);
        ordEt = findViewById(R.id.etORD);
        popEt = findViewById(R.id.etPOP);
        ptpEt = findViewById(R.id.etPTP);
        leaveEt = findViewById(R.id.etLeave);
        offEt = findViewById(R.id.etOff);
        milestoneEt = (EditText) findViewById(R.id.etMilestone);
        milestoneEt.setOnClickListener(this::milestoneDialog);
        popEt.setOnClickListener(this::popDialog);
        ptpEt.setOnClickListener(this::ptpDialog);
        ordEt.setOnClickListener(this::ordDialog);
        enlistEt.setOnClickListener(this::enlistDialog);
        CommonMethods.disableAutofill(getWindow().getDecorView());
        pesStatusSpinner = findViewById(R.id.spinnerPES);
        pesStatusString = pesStatusSpinner.getSelectedItem().toString();
        payDaySpinner = findViewById(R.id.spinnerPD);
        leaveEt.setText(String.valueOf(sp.getInt(SP_LEAVE, 0)));
        offEt.setText(String.valueOf(sp.getInt(SP_OFF, 0)));
    }

    @Override
    protected void onResume() {
        super.onResume();
        this.popMS = sp.getLong(SP_POP, 0);
        this.ptpMS = sp.getLong(SP_PTP, 0);
        this.enlistMS = sp.getLong(SP_ENLIST, 0);
        this.ordMS = sp.getLong(SP_ORD, 0);
        this.milestoneMS = sp.getLong(SP_MILESTONE, 0);
        int statusTmp = sp.getInt("ordcalc_status_pos", -2);
        if (statusTmp != 0) {
            this.pesStatusSpinner.setSelection(statusTmp, true);
        }
        this.pdoption = sp.getLong(SP_PAYDAY, -1);
        if (this.pdoption != -1) {
            this.payDaySpinner.setSelection((int) this.pdoption);
        }
        this.pesStatusString = this.pesStatusSpinner.getSelectedItem().toString();
        this.updateText(UPDATE_NONE);
        pesStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                LogHelper.d("PES UPDATE", pesStatusSpinner.getSelectedItem().toString());
                ORDSettingsActivity.this.pesStatusString = pesStatusSpinner.getSelectedItem().toString();
                ORDSettingsActivity.this.updateText(UPDATE_STATUS);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        payDaySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                pdoption = payDaySpinner.getSelectedItemId();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

    private void saveSettings() {
        SharedPreferences.Editor edit = sp.edit();
        edit.putLong(SP_POP, this.popMS);
        edit.putLong(SP_PTP, this.ptpMS);
        edit.putLong(SP_ENLIST, this.enlistMS);
        edit.putLong(SP_ORD, this.ordMS);
        edit.putString(SP_STATUS, this.pesStatusString);
        edit.putLong(SP_PAYDAY, this.pdoption);
        edit.putLong(SP_MILESTONE, this.milestoneMS);
        int offs = 0, leaves = 0;
        if (!this.leaveEt.getText().toString().isEmpty()) leaves = Integer.parseInt(this.leaveEt.getText().toString());
        if (!this.offEt.getText().toString().isEmpty()) offs = Integer.parseInt(this.offEt.getText().toString());
        edit.putInt(SP_LEAVE, leaves);
        edit.putInt(SP_OFF, offs);
        edit.putInt("ordcalc_status_pos", this.pesStatusSpinner.getSelectedItemPosition());
        edit.apply();
        Toast.makeText(this, "Settings Saved", Toast.LENGTH_LONG).show();
    }

    private void clearSettings() {
        SharedPreferences.Editor edit = sp.edit();
        edit.remove(SP_POP);
        edit.remove(SP_PTP);
        edit.remove(SP_ENLIST);
        edit.remove(SP_ORD);
        edit.remove(SP_STATUS);
        edit.remove(SP_MILESTONE);
        edit.remove(SP_OFF);
        edit.remove(SP_LEAVE);
        edit.remove("ordcalc_status_pos");
        edit.apply();

        this.pesStatusSpinner.setSelection(0);
        this.offEt.setText("0");
        this.leaveEt.setText("0");

        this.enlistMS = 0;
        this.ordMS = 0;
        this.popMS = 0;
        this.ptpMS = 0;
        this.milestoneMS = 0;
        this.pesStatusString = this.pesStatusSpinner.getSelectedItem().toString();

        this.updateText(UPDATE_NONE);
        Toast.makeText(this, "Cleared Settings", Toast.LENGTH_LONG).show();
    }

    private void saveAndExit() {
        saveSettings();
        this.finish();
    }

    public void ptpDialog(View v) {
        Calendar calendar = Calendar.getInstance();
        if (this.ptpMS > 0) calendar.setTimeInMillis(this.ptpMS);
        new DatePickerDialog(this, this.ptp, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show();
    }

    public void ordDialog(View v) {
        Calendar calendar = Calendar.getInstance();
        if (this.ordMS > 0) calendar.setTimeInMillis(this.ordMS);
        new DatePickerDialog(this, this.ord, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show();
    }

    public void enlistDialog(View v) {
        Calendar calendar = Calendar.getInstance();
        if (this.enlistMS > 0) calendar.setTimeInMillis(this.enlistMS);
        new DatePickerDialog(this, this.enlist, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show();
    }

    public void popDialog(View v) {
        Calendar calendar = Calendar.getInstance();
        if (this.popMS > 0) calendar.setTimeInMillis(this.popMS);
        new DatePickerDialog(this, this.pop, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show();
    }

    public void milestoneDialog(View v) {
        Calendar calendar = Calendar.getInstance();
        if (this.milestoneMS > 0) calendar.setTimeInMillis(this.milestoneMS);
        DatePickerDialog mDialog = new DatePickerDialog(this, this.milestone, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
        mDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "Clear", (dialog, which) -> {
            milestoneMS = 0;
            ORDSettingsActivity.this.updateText(UPDATE_MILESTONE);
        });
        mDialog.show();
    }

    private class dateListener implements DatePickerDialog.OnDateSetListener {
        private int type;

        dateListener(int type) {
            this.type = type;
        }

        @Override
        public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
            Calendar calendar = getCal(i, i1, i2);
            switch (type) {
                case UPDATE_MILESTONE: ORDSettingsActivity.this.milestoneMS = calendar.getTimeInMillis(); break;
                case UPDATE_POP: ORDSettingsActivity.this.popMS = calendar.getTimeInMillis(); break;
                case UPDATE_ENLIST: ORDSettingsActivity.this.enlistMS = calendar.getTimeInMillis(); break;
                case UPDATE_PTP: ORDSettingsActivity.this.ptpMS = calendar.getTimeInMillis(); break;
                case UPDATE_ORD: ORDSettingsActivity.this.ordMS = calendar.getTimeInMillis(); break;
            }
            ORDSettingsActivity.this.updateText(type);
        }
    }

    public static Calendar getCal(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, day);
        clearTime(cal);
        return cal;
    }

    public static void clearTime(Calendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
    }

    private int getPesStatus() {
        return getPesStatus(pesStatusString);
    }

    public static int getPesStatus(String pes) {
        switch (pes) {
            case "A/B": return PES_A;
            case "A/B PTP": return PES_PTP;
            case "BP": return PES_BP;
            case "C": return PES_C;
            case "E": return PES_E;
            default: return PES_A;
        }
    }

    private void updatePtpTime() {
        int pesStatus = getPesStatus();
        if (pesStatus == PES_A || pesStatus == PES_E || pesStatus == PES_C) {
            this.ptpMS = 0;
            return;
        }
        if (this.enlistMS < 0) return;
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(this.enlistMS);
        switch (pesStatus) {
            case PES_BP: cal.add(Calendar.WEEK_OF_YEAR, (BP_BMT - ENHANCED_BMT)); break;
            case PES_PTP: cal.add(Calendar.WEEK_OF_YEAR, (PTP_BMT - ENHANCED_BMT)); break;
            default: return;
        }
        this.ptpMS = cal.getTimeInMillis();
    }

    private void updateOrdTime() {
        if (this.enlistMS <= 0) return;
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(this.enlistMS);
        if (getPesStatus() == PES_A)
            cal.add(Calendar.MONTH, ENHANCED_PES);
        else
            cal.add(Calendar.MONTH, NORMAL_PES);
        cal.add(Calendar.DATE, -1);
        this.ordMS = cal.getTimeInMillis();
    }

    private void updatePopTime() {
        if (this.enlistMS <= 0) return;
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(this.enlistMS);
        switch (getPesStatus()) {
            case PES_A:
            case PES_C: cal.add(Calendar.WEEK_OF_YEAR, ENHANCED_BMT); break;
            case PES_PTP: cal.add(Calendar.WEEK_OF_YEAR, PTP_BMT); break;
            case PES_BP: cal.add(Calendar.WEEK_OF_YEAR, BP_BMT); break;
            case PES_E: cal.add(Calendar.WEEK_OF_YEAR, E_BMT); break;
            default: return;
        }
        this.popMS = cal.getTimeInMillis();
    }

    private void updateText(int updated) {
        // Do calculations
        if (updated != UPDATE_NONE) {
            switch (updated) {
                case UPDATE_ENLIST:
                case UPDATE_STATUS:
                    updatePtpTime();
                    updatePopTime();
                    updateOrdTime();
                    break;
            }
        }
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy", Locale.US);

        if (this.enlistMS != 0) {
            cal.setTimeInMillis(this.enlistMS);
            enlistEt.setText(dateFormat.format(cal.getTime()));
        } else enlistEt.setText("");
        if (this.ptpMS != 0) {
            cal.setTimeInMillis(this.ptpMS);
            ptpEt.setText(dateFormat.format(cal.getTime()));
        } else ptpEt.setText("");
        if (this.popMS != 0) {
            cal.setTimeInMillis(this.popMS);
            popEt.setText(dateFormat.format(cal.getTime()));
        } else popEt.setText("");
        if (this.ordMS != 0) {
            cal.setTimeInMillis(this.ordMS);
            ordEt.setText(dateFormat.format(cal.getTime()));
        } else ordEt.setText("");
        if (this.milestoneMS != 0) {
            cal.setTimeInMillis(this.milestoneMS);
            milestoneEt.setText(dateFormat.format(cal.getTime()));
        } else milestoneEt.setText("");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.modules_ord_settings, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.save) {
            saveAndExit();
            return true;
        }
        else if (id == R.id.clear) {
            new AlertDialog.Builder(this).setTitle("Clearing options")
                    .setMessage("This will clear all of your settings. Are you sure you want to continue?")
                    .setPositiveButton(android.R.string.yes, (dialog, which) -> clearSettings()).setNegativeButton(android.R.string.no, null).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}