Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.joythis.android.distancebetweendates;
- import androidx.annotation.Nullable;
- import androidx.appcompat.app.AppCompatActivity;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.Spinner;
- import android.widget.TextView;
- import java.util.ArrayList;
- public class DatesRequesterActivity extends AppCompatActivity {
- AmUtil mUtil;
- Context mContext;
- AmCalendar mDate1, mDate2;
- Button mBtnRequestDate1, mBtnRequestDate2;
- TextView mTvShowDate1, mTvShowDate2;
- Button mBtnCompute;
- Spinner mSpnDates;
- ListView mLvFeedback;
- ArrayList<String> mAlComputedDistances;
- ArrayAdapter<String> mAd;
- Button.OnClickListener mButtonClickHandler = new Button.OnClickListener() {
- @Override
- public void onClick(View v) {
- int id = v.getId();
- switch(id){
- case R.id.idBtnRequestDate1:
- actionRequestDate1();
- break;
- case R.id.idBtnRequestDate2:
- actionRequestDate2();
- break;
- case R.id.idBtnCompute:
- actionComputeDistanceBetweenDates();
- break;
- }//switch
- }//onClick
- };//mButtonClickHandler
- public final static int
- CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1 = 1234;
- //2020-11-17
- public final static int
- CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2 = 4321;
- void goPickDate1(){
- Intent goToDatesInputActivityAndPickDate =
- new Intent(
- this,
- DateInputActivity.class
- );
- //startActivity(goToDatesInputActivityAndPickDate);
- startActivityForResult(
- goToDatesInputActivityAndPickDate,
- CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1
- );
- }//goPickDate1
- void goPickDate2(){
- Intent goToDatesInputActivityAndPickDate =
- new Intent(
- this,
- DateInputActivity.class
- );
- //startActivity(goToDatesInputActivityAndPickDate);
- startActivityForResult(
- goToDatesInputActivityAndPickDate,
- CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2
- );
- }//goPickDate2
- public final static int DEFAULT_YEAR = 2020;
- public final static int DEFAULT_MONTH = 11;
- public final static int DEFAULT_DAY = 17;
- //CTRL+O
- @Override
- protected void onActivityResult
- (int requestCode, //contact code for the result
- int resultCode, //RESULT_OK or RESULT_CANCELED
- @Nullable Intent data //contains the extras (the results) transported, sent by the called
- )
- {
- super.onActivityResult(requestCode, resultCode, data);
- boolean bUserConfirmedData = resultCode == RESULT_OK;
- boolean bUserCanceled = resultCode == RESULT_CANCELED;
- if (bUserConfirmedData){
- boolean bNotEmptyData = data!=null;
- if (bNotEmptyData){
- int y = data.getIntExtra(
- DateInputActivity.KEY_YEAR, DEFAULT_YEAR
- );
- int m = data.getIntExtra(
- DateInputActivity.KEY_MONTH, DEFAULT_MONTH
- );
- int d = data.getIntExtra(
- DateInputActivity.KEY_DAY, DEFAULT_DAY
- );
- String strDateReceived = getResources().getString(
- R.string.strYMD,
- y,m,d
- );
- switch(requestCode){
- case CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1:
- this.mDate1 = new AmCalendar(y,m,d);
- mTvShowDate1.setText(strDateReceived);
- break;
- case CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2:
- this.mDate2 = new AmCalendar(y,m,d);
- mTvShowDate2.setText(strDateReceived);
- break;
- }//switch
- /*
- if, by now, both mDate1 and mDate2 have become NOT null
- we should enable the compute button, because
- computation is now possible
- */
- if (mDate1!=null && mDate2!=null){
- mBtnCompute.setEnabled(true);
- }//if
- }//if there is data
- }//if user confirmed the interaction
- }//onActivityResult
- void actionRequestDate1(){
- goPickDate1();
- }//actionRequestDate1
- void actionRequestDate2(){
- goPickDate2();
- }//actionRequestDate2
- void actionComputeDistanceBetweenDates(){
- //TODO
- long iDistanceInDays =
- mDate1.distanceInDaysTo(mDate2);
- /*
- %s is %d day(s) apart from %s\n
- */
- String strComputationResult = getString(
- R.string.strDistanceBetweenDates,
- mDate1.toString(),
- iDistanceInDays,
- mDate2.toString()
- );
- mAlComputedDistances.add(
- 0,
- strComputationResult
- );
- mAd.notifyDataSetChanged();
- }//actionConfirmDate
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dates_requester_rl);
- init();
- }//onCreate
- void init(){
- mContext = this;
- mUtil = new AmUtil(this);
- mSpnDates = findViewById(R.id.idSpnDates);
- mBtnRequestDate1 = findViewById(R.id.idBtnRequestDate1);
- mBtnRequestDate2 = findViewById(R.id.idBtnRequestDate2);
- mTvShowDate1 = findViewById(R.id.idTvShowDate1);
- mTvShowDate2 = findViewById(R.id.idTvShowDate2);
- mBtnCompute = findViewById(R.id.idBtnCompute);
- mLvFeedback = findViewById(R.id.idLvFeedback);
- String[] aSpinnerOptions = {
- "option A", "option B"
- };
- mUtil.populateSpinner(
- mSpnDates,
- aSpinnerOptions //simplest alt
- //for those interested in improving the app, here provide options sourced from the WWW
- );
- mAlComputedDistances = new ArrayList<>();
- mAd = new ArrayAdapter<>(
- mContext,
- android.R.layout.simple_list_item_1,
- mAlComputedDistances
- );
- mLvFeedback.setAdapter(mAd);
- Button[] aBtns = {
- mBtnRequestDate1,
- mBtnRequestDate2,
- mBtnCompute
- };
- for (Button b : aBtns)
- b.setOnClickListener(mButtonClickHandler);
- //the button that requests the computation should not be usable
- //until both dates become available
- if (mDate1==null && mDate2==null){
- mBtnCompute.setEnabled(false);
- }//if
- }//init
- }//DatesRequesterActivity
- **
- package com.joythis.android.distancebetweendates;
- import android.app.Activity;
- import android.widget.ArrayAdapter;
- import android.widget.Spinner;
- public class AmUtil {
- Activity mA;
- public AmUtil(
- Activity pA
- ){
- this.mA = pA;
- }//AmUtil
- public void populateSpinner(
- Spinner pSpn,
- String[] pOptions
- ){
- ArrayAdapter<String> ad = new ArrayAdapter<>(
- this.mA,
- android.R.layout.simple_spinner_item,
- pOptions
- );
- //optional
- ad.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item
- );
- pSpn.setAdapter(ad);
- }//populateSpinner
- }//AmUtil
- **
- package com.joythis.android.distancebetweendates;
- import androidx.appcompat.app.AppCompatActivity;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.NumberPicker;
- import java.util.ArrayList;
- import java.util.Calendar;
- public class DateInputActivity extends AppCompatActivity {
- Context mContext;
- NumberPicker mNpYear, mNpMonth, mNpDay;
- Button mBtnConfirmDate;
- ListView mLvFeedback;
- ArrayList<String> mAlUserMsgs;
- ArrayAdapter<String> mAd;
- Button.OnClickListener mButtonClickHandler =
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- actionSendDateToOtherActivity();
- }//onClick
- };//mButtonClickHandler
- NumberPicker.OnValueChangeListener mNumberPickerChangeHandler =
- new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(
- NumberPicker picker,
- int oldVal,
- int newVal
- ){
- int y = mNpYear.getValue();
- int m = mNpMonth.getValue();
- int d = mNpDay.getValue();
- boolean bValidDate = AmCalendar.validDay(y, m, d);
- //some of the code that follows became
- //unnecessary, because of this line
- mNpDay.setMaxValue(
- AmCalendar.daysInMonth(y,m)
- );
- if (!bValidDate){
- //%1$d-%2$d-%3$d invalid date!
- String strMsg =
- getResources().getString(
- R.string.strInvalidDate,
- y,m,d
- );
- mAlUserMsgs.add(0, strMsg);
- mAd.notifyDataSetChanged();
- //TODO
- int iMaxDaysForSelectedYM =
- AmCalendar.daysInMonth(y, m);
- /*
- <string name="strInvalidDate">%1$d-%2$d-%3$d invalid date!</string>
- <string name="strDayFixed">Day fixed from %1$d to %2$d.</string>
- */
- mNpDay.setValue(iMaxDaysForSelectedYM);
- mNpDay.setMaxValue(iMaxDaysForSelectedYM);
- strMsg = getString(
- R.string.strDayFixed,
- d,
- iMaxDaysForSelectedYM
- );
- mAlUserMsgs.add(0, strMsg);
- mAd.notifyDataSetChanged();
- }//if
- }//onValueChange
- };//mNumberChangeHandler
- /*
- single purpose:
- - exemplify how to navigate from this activity to A2
- */
- public static String KEY_HELLO = "KEY_HELLO";
- public static String KEY_THE_USER_DATE = "KEY_THE_USER_DATE";
- public static String KEY_YEAR = "KEY_YEAR";
- public static String KEY_MONTH = "KEY_MONTH";
- public static String KEY_DAY = "KEY_DAY";
- public static String KEY_BUNDLE = "KEY_BUNDLE";
- void actionSendDateToOtherActivity(){
- /*
- Intent intentToRespondToDatesRequester = new Intent(
- //this,
- DateInputActivity.this, //source intance
- DatesRequesterActivity.class//class of destination
- );
- */
- Intent intentResponse = new Intent();
- int y, m, d;
- y=mNpYear.getValue();
- m=mNpMonth.getValue();
- d=mNpDay.getValue();
- intentResponse.putExtra(
- KEY_YEAR, y
- );
- intentResponse.putExtra(
- KEY_MONTH,
- m
- );
- intentResponse.putExtra(
- KEY_DAY,
- d
- );
- /*
- //we are <del>NOT</del> sending the user selected date
- startActivity(
- intentToRespondToDatesRequester
- );
- */
- setResult(
- //RESULT_CANCELED
- RESULT_OK,
- intentResponse
- );
- finish();
- }//actionSendDateToOtherActivity
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.date_input_cl);
- init();
- }//onCreate
- void init(){
- mContext = DateInputActivity.this;
- mNpYear = findViewById(R.id.idNpYear);
- mNpMonth = findViewById(R.id.idNpMonth);
- mNpDay = findViewById(R.id.idNpDay);
- mBtnConfirmDate = findViewById(R.id.idBtnConfirmDate);
- mLvFeedback = findViewById(R.id.idLvFeedback);
- NumberPicker[] aNpYMD = {
- mNpYear, mNpMonth, mNpDay
- };
- for (NumberPicker np : aNpYMD)
- np.setOnValueChangedListener(mNumberPickerChangeHandler);
- //TODO
- Calendar cal = Calendar.getInstance();
- mNpYear.setMinValue(1);
- mNpYear.setMaxValue(9999);
- mNpYear.setValue(
- //2020
- /*
- Calendar.getInstance().get(
- Calendar.YEAR
- )
- */
- cal.get(Calendar.YEAR)
- );
- mNpMonth.setMinValue(1);
- mNpMonth.setMaxValue(12);
- mNpMonth.setValue(
- //11
- /*
- Calendar.getInstance().get(
- Calendar.MONTH
- )
- */
- cal.get(
- Calendar.MONTH
- )+1
- );
- mNpDay.setMinValue(1);
- mNpDay.setMaxValue(31);
- mNpDay.setValue(
- //10
- cal.get(Calendar.DAY_OF_MONTH)
- );
- mAlUserMsgs = new ArrayList<>();
- mAd = new ArrayAdapter<>(
- mContext,
- android.R.layout.simple_list_item_1,
- mAlUserMsgs
- );
- mLvFeedback.setAdapter(mAd);
- mBtnConfirmDate.setOnClickListener(
- mButtonClickHandler
- );
- }//init
- }
- **
- package com.joythis.android.distancebetweendates;
- import java.util.Calendar;
- public class AmCalendar {
- private int mYear, mMonth, mDay;
- private Calendar mCal;
- public Calendar getCalendar(){return this.mCal;}
- public AmCalendar(
- int pY,
- int pM,
- int pD
- ){
- this.mYear = pY;
- this.mMonth = pM;
- this.mDay = pD;
- //mCal that corresponds to the mYear, mMonth, mDay trio
- mCal = Calendar.getInstance();
- mCal.set(Calendar.YEAR, this.mYear);
- mCal.set(Calendar.MONTH, this.mMonth-1);
- mCal.set(Calendar.DAY_OF_MONTH, this.mDay);
- }//AmCalendar
- public long distanceInDaysTo(
- AmCalendar pSomeOtherCalendar
- ){
- long msCurrent = mCal.getTimeInMillis();
- long msOther =
- pSomeOtherCalendar.getCalendar().getTimeInMillis();
- long msDif = Math.abs(msCurrent-msOther);
- //int iDays = (int)(msDif/1000/60/60/24);
- long iDays = msDif/1000/60/60/24;
- return iDays;
- }//distanceInDaysTo
- public static boolean validYear(int pY){
- return pY>=1;
- }//validYear
- public static boolean validMonth(int pM){
- return pM>=1 && pM<=12;
- }//validMonth
- public static boolean validDay(
- int pY,
- int pM,
- int pD
- ){
- return pD>=1 && pD<=AmCalendar.daysInMonth(pY, pM);
- }//validDay
- public final static int IMPOSSIBLE_MONTH = -1;
- public static int daysInMonth (
- int pY,
- int pM
- ){
- switch(pM){
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- return 31;
- case 4:
- case 6:
- case 9:
- case 11:
- return 30;
- case 2:
- return AmCalendar.leapYear(pY) ? 29 : 28;
- default:
- return IMPOSSIBLE_MONTH;
- }//switch
- }//daysInMonth
- public static boolean leapYear(
- int pY
- ){
- boolean bM400 = pY%400 == 0;
- boolean bM100 = pY%100 == 0;
- boolean bM4 = pY%4 == 0;
- boolean bCase1 = bM400; //2000
- boolean bCase2 = bM4 && !bM100; //1996
- return bCase1 || bCase2;
- }//leapYear
- public String toString(){
- return String.format("%d-%d-%d", mYear, mMonth, mDay);
- }//toString
- }//AmCalendar
- **
- <?xml version="1.0" encoding="utf-8"?>
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.joythis.android.distancebetweendates">
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher_round"
- android:supportsRtl="true"
- android:theme="@style/Theme.DistanceBetweenDates">
- <activity android:name=".DatesRequesterActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".A2">
- </activity>
- <activity android:name=".DateInputActivity">
- </activity>
- </application>
- </manifest>
Advertisement
Add Comment
Please, Sign In to add comment