am_dot_com

DDM 20201117

Nov 17th, 2020 (edited)
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.29 KB | None | 0 0
  1. package com.joythis.android.distancebetweendates;
  2.  
  3. import androidx.annotation.Nullable;
  4. import androidx.appcompat.app.AppCompatActivity;
  5.  
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.Button;
  12. import android.widget.ListView;
  13. import android.widget.Spinner;
  14. import android.widget.TextView;
  15.  
  16. import java.util.ArrayList;
  17.  
  18. public class DatesRequesterActivity extends AppCompatActivity {
  19.     AmUtil mUtil;
  20.     Context mContext;
  21.  
  22.     AmCalendar mDate1, mDate2;
  23.  
  24.     Button mBtnRequestDate1, mBtnRequestDate2;
  25.     TextView mTvShowDate1, mTvShowDate2;
  26.     Button mBtnCompute;
  27.     Spinner mSpnDates;
  28.  
  29.     ListView mLvFeedback;
  30.     ArrayList<String> mAlComputedDistances;
  31.     ArrayAdapter<String> mAd;
  32.  
  33.     Button.OnClickListener mButtonClickHandler = new Button.OnClickListener() {
  34.         @Override
  35.         public void onClick(View v) {
  36.             int id = v.getId();
  37.             switch(id){
  38.                 case R.id.idBtnRequestDate1:
  39.                     actionRequestDate1();
  40.                     break;
  41.                 case R.id.idBtnRequestDate2:
  42.                     actionRequestDate2();
  43.                     break;
  44.                 case R.id.idBtnCompute:
  45.                     actionComputeDistanceBetweenDates();
  46.                     break;
  47.             }//switch
  48.         }//onClick
  49.     };//mButtonClickHandler
  50.  
  51.     public final static int
  52.             CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1 = 1234;
  53.  
  54.     //2020-11-17
  55.     public final static int
  56.             CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2 = 4321;
  57.  
  58.     void goPickDate1(){
  59.         Intent goToDatesInputActivityAndPickDate =
  60.                 new Intent(
  61.                         this,
  62.                         DateInputActivity.class
  63.                 );
  64.  
  65.         //startActivity(goToDatesInputActivityAndPickDate);
  66.  
  67.         startActivityForResult(
  68.             goToDatesInputActivityAndPickDate,
  69.                 CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1
  70.         );
  71.     }//goPickDate1
  72.  
  73.     void goPickDate2(){
  74.         Intent goToDatesInputActivityAndPickDate =
  75.                 new Intent(
  76.                         this,
  77.                         DateInputActivity.class
  78.                 );
  79.  
  80.         //startActivity(goToDatesInputActivityAndPickDate);
  81.  
  82.         startActivityForResult(
  83.                 goToDatesInputActivityAndPickDate,
  84.                 CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2
  85.         );
  86.     }//goPickDate2
  87.  
  88.     public final static int DEFAULT_YEAR = 2020;
  89.     public final static int DEFAULT_MONTH = 11;
  90.     public final static int DEFAULT_DAY = 17;
  91.  
  92.     //CTRL+O
  93.     @Override
  94.     protected void onActivityResult
  95.     (int requestCode, //contact code for the result
  96.      int resultCode, //RESULT_OK or RESULT_CANCELED
  97.      @Nullable Intent data //contains the extras (the results) transported, sent by the called
  98.     )
  99.     {
  100.         super.onActivityResult(requestCode, resultCode, data);
  101.  
  102.         boolean bUserConfirmedData = resultCode == RESULT_OK;
  103.         boolean bUserCanceled = resultCode == RESULT_CANCELED;
  104.  
  105.         if (bUserConfirmedData){
  106.             boolean bNotEmptyData = data!=null;
  107.             if (bNotEmptyData){
  108.                 int y = data.getIntExtra(
  109.                         DateInputActivity.KEY_YEAR, DEFAULT_YEAR
  110.                 );
  111.                 int m = data.getIntExtra(
  112.                         DateInputActivity.KEY_MONTH, DEFAULT_MONTH
  113.                 );
  114.                 int d = data.getIntExtra(
  115.                             DateInputActivity.KEY_DAY, DEFAULT_DAY
  116.                         );
  117.  
  118.                 String strDateReceived = getResources().getString(
  119.                     R.string.strYMD,
  120.                     y,m,d
  121.                 );
  122.  
  123.                 switch(requestCode){
  124.                     case CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE1:
  125.                         this.mDate1 = new AmCalendar(y,m,d);
  126.                         mTvShowDate1.setText(strDateReceived);
  127.                         break;
  128.  
  129.                     case CALL_ME_ON_THIS_NUMBER_WHEN_YOU_HAVE_DATE2:
  130.                         this.mDate2 = new AmCalendar(y,m,d);
  131.                         mTvShowDate2.setText(strDateReceived);
  132.                         break;
  133.                 }//switch
  134.  
  135.                 /*
  136.                 if, by now, both mDate1 and mDate2 have become NOT null
  137.                 we should enable the compute button, because
  138.                 computation is now possible
  139.                  */
  140.                 if (mDate1!=null && mDate2!=null){
  141.                     mBtnCompute.setEnabled(true);
  142.                 }//if
  143.  
  144.            }//if there is data
  145.         }//if user confirmed the interaction
  146.     }//onActivityResult
  147.  
  148.     void actionRequestDate1(){
  149.         goPickDate1();
  150.     }//actionRequestDate1
  151.  
  152.     void actionRequestDate2(){
  153.         goPickDate2();
  154.     }//actionRequestDate2
  155.  
  156.     void actionComputeDistanceBetweenDates(){
  157.         //TODO
  158.         long iDistanceInDays =
  159.             mDate1.distanceInDaysTo(mDate2);
  160.  
  161.         /*
  162.         %s is %d day(s) apart from %s\n
  163.          */
  164.         String strComputationResult = getString(
  165.             R.string.strDistanceBetweenDates,
  166.             mDate1.toString(),
  167.             iDistanceInDays,
  168.             mDate2.toString()
  169.         );
  170.  
  171.         mAlComputedDistances.add(
  172.             0,
  173.             strComputationResult
  174.         );
  175.         mAd.notifyDataSetChanged();
  176.     }//actionConfirmDate
  177.  
  178.     @Override
  179.     protected void onCreate(Bundle savedInstanceState) {
  180.         super.onCreate(savedInstanceState);
  181.         setContentView(R.layout.dates_requester_rl);
  182.  
  183.         init();
  184.     }//onCreate
  185.  
  186.     void init(){
  187.         mContext = this;
  188.         mUtil = new AmUtil(this);
  189.  
  190.         mSpnDates = findViewById(R.id.idSpnDates);
  191.         mBtnRequestDate1 = findViewById(R.id.idBtnRequestDate1);
  192.         mBtnRequestDate2 = findViewById(R.id.idBtnRequestDate2);
  193.         mTvShowDate1 = findViewById(R.id.idTvShowDate1);
  194.         mTvShowDate2 = findViewById(R.id.idTvShowDate2);
  195.         mBtnCompute = findViewById(R.id.idBtnCompute);
  196.         mLvFeedback = findViewById(R.id.idLvFeedback);
  197.  
  198.         String[] aSpinnerOptions = {
  199.             "option A", "option B"
  200.         };
  201.         mUtil.populateSpinner(
  202.             mSpnDates,
  203.             aSpinnerOptions //simplest alt
  204.             //for those interested in improving the app, here provide options sourced from the WWW
  205.         );
  206.  
  207.         mAlComputedDistances = new ArrayList<>();
  208.         mAd = new ArrayAdapter<>(
  209.             mContext,
  210.             android.R.layout.simple_list_item_1,
  211.             mAlComputedDistances
  212.         );
  213.         mLvFeedback.setAdapter(mAd);
  214.  
  215.         Button[] aBtns = {
  216.             mBtnRequestDate1,
  217.             mBtnRequestDate2,
  218.             mBtnCompute
  219.         };
  220.         for (Button b : aBtns)
  221.             b.setOnClickListener(mButtonClickHandler);
  222.  
  223.         //the button that requests the computation should not be usable
  224.         //until both dates become available
  225.         if (mDate1==null && mDate2==null){
  226.             mBtnCompute.setEnabled(false);
  227.         }//if
  228.     }//init
  229.  
  230.  
  231. }//DatesRequesterActivity
  232.  
  233. **
  234.  
  235. package com.joythis.android.distancebetweendates;
  236.  
  237. import android.app.Activity;
  238. import android.widget.ArrayAdapter;
  239. import android.widget.Spinner;
  240.  
  241. public class AmUtil {
  242.     Activity mA;
  243.  
  244.     public AmUtil(
  245.         Activity pA
  246.     ){
  247.         this.mA = pA;
  248.     }//AmUtil
  249.  
  250.     public void populateSpinner(
  251.         Spinner pSpn,
  252.         String[] pOptions
  253.     ){
  254.         ArrayAdapter<String> ad = new ArrayAdapter<>(
  255.             this.mA,
  256.             android.R.layout.simple_spinner_item,
  257.             pOptions
  258.         );
  259.  
  260.         //optional
  261.         ad.setDropDownViewResource(
  262.             android.R.layout.simple_spinner_dropdown_item
  263.         );
  264.  
  265.         pSpn.setAdapter(ad);
  266.     }//populateSpinner
  267. }//AmUtil
  268.  
  269. **
  270.  
  271. package com.joythis.android.distancebetweendates;
  272.  
  273. import androidx.appcompat.app.AppCompatActivity;
  274.  
  275. import android.content.Context;
  276. import android.content.Intent;
  277. import android.os.Bundle;
  278. import android.view.View;
  279. import android.widget.ArrayAdapter;
  280. import android.widget.Button;
  281. import android.widget.ListView;
  282. import android.widget.NumberPicker;
  283.  
  284. import java.util.ArrayList;
  285. import java.util.Calendar;
  286.  
  287. public class DateInputActivity extends AppCompatActivity {
  288.     Context mContext;
  289.  
  290.     NumberPicker mNpYear, mNpMonth, mNpDay;
  291.     Button mBtnConfirmDate;
  292.     ListView mLvFeedback;
  293.  
  294.     ArrayList<String> mAlUserMsgs;
  295.     ArrayAdapter<String> mAd;
  296.  
  297.     Button.OnClickListener mButtonClickHandler =
  298.         new View.OnClickListener() {
  299.             @Override
  300.             public void onClick(View v) {
  301.  
  302.                 actionSendDateToOtherActivity();
  303.             }//onClick
  304.         };//mButtonClickHandler
  305.  
  306.     NumberPicker.OnValueChangeListener mNumberPickerChangeHandler =
  307.     new NumberPicker.OnValueChangeListener() {
  308.         @Override
  309.         public void onValueChange(
  310.             NumberPicker picker,
  311.             int oldVal,
  312.             int newVal
  313.         ){
  314.             int y = mNpYear.getValue();
  315.             int m = mNpMonth.getValue();
  316.             int d = mNpDay.getValue();
  317.             boolean bValidDate = AmCalendar.validDay(y, m, d);
  318.  
  319.             //some of the code that follows became
  320.             //unnecessary, because of this line
  321.             mNpDay.setMaxValue(
  322.                 AmCalendar.daysInMonth(y,m)
  323.             );
  324.  
  325.             if (!bValidDate){
  326.                 //%1$d-%2$d-%3$d invalid date!
  327.                 String strMsg =
  328.                     getResources().getString(
  329.                         R.string.strInvalidDate,
  330.                         y,m,d
  331.                     );
  332.  
  333.                 mAlUserMsgs.add(0, strMsg);
  334.                 mAd.notifyDataSetChanged();
  335.  
  336.                 //TODO
  337.                 int iMaxDaysForSelectedYM =
  338.                     AmCalendar.daysInMonth(y, m);
  339.  
  340.                 /*
  341. <string name="strInvalidDate">%1$d-%2$d-%3$d invalid date!</string>
  342. <string name="strDayFixed">Day fixed from %1$d to %2$d.</string>
  343.                  */
  344.                 mNpDay.setValue(iMaxDaysForSelectedYM);
  345.                 mNpDay.setMaxValue(iMaxDaysForSelectedYM);
  346.  
  347.                 strMsg = getString(
  348.                     R.string.strDayFixed,
  349.                     d,
  350.                     iMaxDaysForSelectedYM
  351.                 );
  352.                 mAlUserMsgs.add(0, strMsg);
  353.                 mAd.notifyDataSetChanged();
  354.             }//if
  355.         }//onValueChange
  356.     };//mNumberChangeHandler
  357.  
  358.     /*
  359.     single purpose:
  360.     - exemplify how to navigate from this activity to A2
  361.      */
  362.     public static String KEY_HELLO = "KEY_HELLO";
  363.     public static String KEY_THE_USER_DATE = "KEY_THE_USER_DATE";
  364.     public static String KEY_YEAR = "KEY_YEAR";
  365.     public static String KEY_MONTH = "KEY_MONTH";
  366.     public static String KEY_DAY = "KEY_DAY";
  367.     public static String KEY_BUNDLE = "KEY_BUNDLE";
  368.  
  369.     void actionSendDateToOtherActivity(){
  370.         /*
  371.         Intent intentToRespondToDatesRequester = new Intent(
  372.             //this,
  373.             DateInputActivity.this, //source intance
  374.             DatesRequesterActivity.class//class of destination
  375.         );
  376.          */
  377.         Intent intentResponse = new Intent();
  378.  
  379.         int y, m, d;
  380.         y=mNpYear.getValue();
  381.         m=mNpMonth.getValue();
  382.         d=mNpDay.getValue();
  383.  
  384.         intentResponse.putExtra(
  385.             KEY_YEAR, y
  386.         );
  387.         intentResponse.putExtra(
  388.             KEY_MONTH,
  389.             m
  390.         );
  391.         intentResponse.putExtra(
  392.             KEY_DAY,
  393.             d
  394.         );
  395.  
  396.         /*
  397.         //we are <del>NOT</del> sending the user selected date
  398.         startActivity(
  399.             intentToRespondToDatesRequester
  400.         );
  401.          */
  402.  
  403.         setResult(
  404.             //RESULT_CANCELED
  405.             RESULT_OK,
  406.             intentResponse
  407.         );
  408.  
  409.         finish();
  410.     }//actionSendDateToOtherActivity
  411.  
  412.     @Override
  413.     protected void onCreate(Bundle savedInstanceState) {
  414.         super.onCreate(savedInstanceState);
  415.         setContentView(R.layout.date_input_cl);
  416.  
  417.         init();
  418.     }//onCreate
  419.  
  420.     void init(){
  421.         mContext = DateInputActivity.this;
  422.  
  423.         mNpYear = findViewById(R.id.idNpYear);
  424.         mNpMonth = findViewById(R.id.idNpMonth);
  425.         mNpDay = findViewById(R.id.idNpDay);
  426.         mBtnConfirmDate = findViewById(R.id.idBtnConfirmDate);
  427.         mLvFeedback = findViewById(R.id.idLvFeedback);
  428.  
  429.         NumberPicker[] aNpYMD = {
  430.             mNpYear, mNpMonth, mNpDay
  431.         };
  432.         for (NumberPicker np : aNpYMD)
  433.             np.setOnValueChangedListener(mNumberPickerChangeHandler);
  434.  
  435.         //TODO
  436.         Calendar cal = Calendar.getInstance();
  437.         mNpYear.setMinValue(1);
  438.         mNpYear.setMaxValue(9999);
  439.         mNpYear.setValue(
  440.             //2020
  441.             /*
  442.             Calendar.getInstance().get(
  443.                 Calendar.YEAR
  444.             )
  445.              */
  446.             cal.get(Calendar.YEAR)
  447.         );
  448.  
  449.         mNpMonth.setMinValue(1);
  450.         mNpMonth.setMaxValue(12);
  451.         mNpMonth.setValue(
  452.             //11
  453.             /*
  454.             Calendar.getInstance().get(
  455.                 Calendar.MONTH
  456.             )
  457.              */
  458.             cal.get(
  459.                 Calendar.MONTH
  460.             )+1
  461.         );
  462.  
  463.         mNpDay.setMinValue(1);
  464.         mNpDay.setMaxValue(31);
  465.         mNpDay.setValue(
  466.             //10
  467.             cal.get(Calendar.DAY_OF_MONTH)
  468.         );
  469.  
  470.         mAlUserMsgs = new ArrayList<>();
  471.         mAd = new ArrayAdapter<>(
  472.             mContext,
  473.             android.R.layout.simple_list_item_1,
  474.             mAlUserMsgs
  475.         );
  476.         mLvFeedback.setAdapter(mAd);
  477.  
  478.         mBtnConfirmDate.setOnClickListener(
  479.             mButtonClickHandler
  480.         );
  481.     }//init
  482. }
  483.  
  484. **
  485.  
  486. package com.joythis.android.distancebetweendates;
  487.  
  488. import java.util.Calendar;
  489.  
  490. public class AmCalendar {
  491.     private int mYear, mMonth, mDay;
  492.     private Calendar mCal;
  493.  
  494.     public Calendar getCalendar(){return this.mCal;}
  495.  
  496.     public AmCalendar(
  497.         int pY,
  498.         int pM,
  499.         int pD
  500.     ){
  501.         this.mYear = pY;
  502.         this.mMonth = pM;
  503.         this.mDay = pD;
  504.  
  505.         //mCal that corresponds to the mYear, mMonth, mDay trio
  506.         mCal = Calendar.getInstance();
  507.         mCal.set(Calendar.YEAR, this.mYear);
  508.         mCal.set(Calendar.MONTH, this.mMonth-1);
  509.         mCal.set(Calendar.DAY_OF_MONTH, this.mDay);
  510.     }//AmCalendar
  511.  
  512.     public long distanceInDaysTo(
  513.         AmCalendar pSomeOtherCalendar
  514.     ){
  515.         long msCurrent = mCal.getTimeInMillis();
  516.         long msOther =
  517.             pSomeOtherCalendar.getCalendar().getTimeInMillis();
  518.  
  519.         long msDif = Math.abs(msCurrent-msOther);
  520.         //int iDays = (int)(msDif/1000/60/60/24);
  521.         long iDays = msDif/1000/60/60/24;
  522.         return iDays;
  523.     }//distanceInDaysTo
  524.  
  525.     public static boolean validYear(int pY){
  526.         return pY>=1;
  527.     }//validYear
  528.  
  529.     public static boolean validMonth(int pM){
  530.         return pM>=1 && pM<=12;
  531.     }//validMonth
  532.  
  533.     public static boolean validDay(
  534.         int pY,
  535.         int pM,
  536.         int pD
  537.     ){
  538.         return pD>=1 && pD<=AmCalendar.daysInMonth(pY, pM);
  539.     }//validDay
  540.  
  541.     public final static int IMPOSSIBLE_MONTH = -1;
  542.     public static int daysInMonth (
  543.         int pY,
  544.         int pM
  545.     ){
  546.         switch(pM){
  547.             case 1:
  548.             case 3:
  549.             case 5:
  550.             case 7:
  551.             case 8:
  552.             case 10:
  553.             case 12:
  554.                 return 31;
  555.             case 4:
  556.             case 6:
  557.             case 9:
  558.             case 11:
  559.                 return 30;
  560.             case 2:
  561.                 return AmCalendar.leapYear(pY) ? 29 : 28;
  562.             default:
  563.                 return IMPOSSIBLE_MONTH;
  564.         }//switch
  565.     }//daysInMonth
  566.  
  567.     public static boolean leapYear(
  568.         int pY
  569.     ){
  570.         boolean bM400 = pY%400 == 0;
  571.         boolean bM100 = pY%100 == 0;
  572.         boolean bM4 = pY%4 == 0;
  573.  
  574.         boolean bCase1 = bM400; //2000
  575.         boolean bCase2 = bM4 && !bM100; //1996
  576.  
  577.         return bCase1 || bCase2;
  578.     }//leapYear
  579.  
  580.     public String toString(){
  581.         return String.format("%d-%d-%d", mYear, mMonth, mDay);
  582.     }//toString
  583. }//AmCalendar
  584.  
  585. **
  586.  
  587. <?xml version="1.0" encoding="utf-8"?>
  588. <manifest
  589.     xmlns:android="http://schemas.android.com/apk/res/android"
  590.     package="com.joythis.android.distancebetweendates">
  591.  
  592.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  593.  
  594.     <application
  595.         android:allowBackup="true"
  596.         android:icon="@mipmap/ic_launcher"
  597.         android:label="@string/app_name"
  598.         android:roundIcon="@mipmap/ic_launcher_round"
  599.         android:supportsRtl="true"
  600.         android:theme="@style/Theme.DistanceBetweenDates">
  601.         <activity android:name=".DatesRequesterActivity">
  602.             <intent-filter>
  603.                 <action android:name="android.intent.action.MAIN" />
  604.                 <category android:name="android.intent.category.LAUNCHER" />
  605.             </intent-filter>
  606.         </activity>
  607.  
  608.         <activity android:name=".A2">
  609.  
  610.         </activity>
  611.  
  612.         <activity android:name=".DateInputActivity">
  613.  
  614.         </activity>
  615.     </application>
  616.  
  617. </manifest>
Advertisement
Add Comment
Please, Sign In to add comment