am_dot_com

DDM 2021-11-16

Nov 16th, 2021 (edited)
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.89 KB | None | 0 0
  1. package com.joythis.android.distanceindays;
  2.  
  3. import android.app.Activity;
  4.  
  5. import java.util.Calendar;
  6.  
  7. public class AmCalendar {
  8.     Activity mActivity; //to bridge to Activity tools
  9.     /*
  10.     Calendar objects represent
  11.     month as 0-based data
  12.     days of week as 1-based data
  13.      */
  14.     private Calendar mCalendar;
  15.     private int mYear; //2021
  16.     private int mMonth; //11
  17.     private int mDay; //10
  18.  
  19.     private int mAbsDayInYear;
  20.     private int mDayOfWeek;
  21.  
  22.     /*
  23.     constructs an AmCalendar object
  24.     corresponding to the current date
  25.     default constructor - the constructor without
  26.     arguments
  27.      */
  28.     public AmCalendar(Activity pA){
  29.         this.mActivity = pA;
  30.         this.mCalendar = Calendar.getInstance();
  31.         this.mYear = this.mCalendar.get(Calendar.YEAR);
  32.         this.mMonth =
  33.             1+this.mCalendar.get(Calendar.MONTH);
  34.         this.mDay = this.mCalendar.get(Calendar.DATE);
  35.         this.mAbsDayInYear =
  36.             this.mCalendar.get(Calendar.DAY_OF_YEAR);
  37.         this.mDayOfWeek =
  38.             this.mCalendar.get(Calendar.DAY_OF_WEEK);
  39.     }//AmCalendar
  40.  
  41.     public AmCalendar(
  42.         Activity pA,
  43.         int pYear,
  44.         int pMonth, //natural
  45.         int pDay
  46.     ){
  47.         this.mActivity = pA;
  48.  
  49.         this.mCalendar = Calendar.getInstance();
  50.         this.mCalendar.clear();
  51.         this.mCalendar.set(
  52.             Calendar.YEAR,
  53.             pYear
  54.         );
  55.         //because Calendar's month are 0-based
  56.         //after having received a "natural" month
  57.         //we must discount it 1
  58.         this.mCalendar.set(
  59.             Calendar.MONTH,
  60.             pMonth-1
  61.         );
  62.         this.mCalendar.set(
  63.             Calendar.DATE,
  64.             pDay
  65.         );
  66.         this.mYear = pYear;
  67.         this.mMonth = pMonth;
  68.         this.mDay = pDay;
  69.         this.mAbsDayInYear = this.mCalendar.get(
  70.             Calendar.DAY_OF_YEAR
  71.         );
  72.         //1 - Sunday, 2 - Monday ... 7 - Saturday
  73.         this.mDayOfWeek = this.mCalendar.get(
  74.             Calendar.DAY_OF_WEEK
  75.         );
  76.  
  77.         this.mDayOfWeek = this.mDayOfWeek;
  78.     }//AmCalendar
  79.  
  80.     /*
  81.     computes the distance, in days,
  82.     relatively to the device's current date
  83.      */
  84.     public long distanceInDays(){
  85.         /*
  86.         One needs to compute the difference
  87.         between 2 moments
  88.         moments represented as Calendar objects
  89.         one of the 2 moments is the user's date
  90.         the other moment is the system's date
  91.         BOTH can be represented as Calendar objects
  92.         All Calendar objects provide a method named
  93.         getTimeInMillis
  94.         which computes the time in milliseconds
  95.         since the "Epoch" time (1970-1-1)
  96.         So, the subtraction of these ints (long)
  97.         gives the wanted number (in ms)
  98.          */
  99.         Calendar cNow = Calendar.getInstance();
  100.         long lNow = cNow.getTimeInMillis();
  101.  
  102.         long lUser = this.mCalendar.getTimeInMillis();
  103.  
  104.         long lDiffMs = Math.abs(lNow-lUser);
  105.         long lDiffDays = lDiffMs/1000/60/60/24;
  106.         return lDiffDays;
  107.     }//distanceInDays
  108.  
  109.     /*
  110.     computes the distance, in days, relatively
  111.     to a given date (as a Calendar object)
  112.      */
  113.     public int distanceInDays(Calendar pC){
  114.         return 0;
  115.     }//distanceInDays
  116.  
  117.  
  118.     public int distanceInDays(int y, int m, int d){
  119.         return 0;
  120.     }
  121.  
  122.     public String toString(){
  123.         String strRet = "";
  124.  
  125.         String strDayOfWeek = "";
  126.         /* 0=>"sunday", ... 6=>"saturday"*/
  127.         String[] dow = this.mActivity.getResources().
  128.                 getStringArray(R.array.aDaysOfWeek);
  129.         /* 1=>"sunday" .. 7=>"saturday"*/
  130.         strDayOfWeek = dow[this.mDayOfWeek-1];
  131.  
  132.         strRet = String.format(
  133.             "%d-%d-%d #%d (%d = %s) => %d day(s) distant",
  134.             this.mYear,
  135.             this.mMonth,
  136.             this.mDay,
  137.             this.mAbsDayInYear,
  138.             this.mDayOfWeek,
  139.             strDayOfWeek,
  140.             distanceInDays()
  141.         );
  142.  
  143.         return strRet;
  144.     }//toString
  145.  
  146.     public static boolean validYear(int pYear){
  147.         return pYear>=1;
  148.     }//validYear
  149.  
  150.     public static boolean validMonth(int pMonth){
  151.         return pMonth>=1 && pMonth<=12;
  152.     }//validMonth
  153.  
  154.     public static boolean validDay(
  155.         int pY, int pM, int pD
  156.     ){
  157.         boolean bY = validYear(pY);
  158.         boolean bM = validMonth(pM);
  159.         if (bY && bM)
  160.             return pD>=1 && pD<=daysInMonth(pY, pM);
  161.         return false;
  162.     }//validDay
  163.  
  164.     public final static int IMPOSSIBLE_MONTH = -1;
  165.     public static int daysInMonth(int pY, int pM){
  166.         switch(pM){
  167.             case 1:
  168.             case 3:
  169.             case 5:
  170.             case 7:
  171.             case 8:
  172.             case 10:
  173.             case 12:
  174.                 return 31;
  175.             case 4:
  176.             case 6:
  177.             case 9:
  178.             case 11:
  179.                 return 30;
  180.             case 2:
  181.                 return leapYear(pY) ? 29:28;
  182.             default:
  183.                 return IMPOSSIBLE_MONTH;
  184.         }//switch
  185.     }//daysInMonth
  186.  
  187.     public static boolean leapYear(int pY){
  188.         boolean bM4 = pY%4==0;
  189.         boolean bM100 = pY%100==0;
  190.         boolean bM400 = pY%400==0;
  191.  
  192.         return bM400 || (bM4 && !bM100);
  193.     }//leapYear
  194. }//AmCalendar
  195.  
  196.  
  197. ************
  198.  
  199. package com.joythis.android.distanceindays;
  200.  
  201. import androidx.appcompat.app.AppCompatActivity;
  202.  
  203. import android.os.Bundle;
  204. import android.view.View;
  205. import android.widget.Button;
  206. import android.widget.EditText;
  207. import android.widget.TextView;
  208.  
  209. import java.util.Calendar;
  210.  
  211. public class MainActivity extends AppCompatActivity {
  212.     AmUtil mUtil;
  213.     TextView mTvResults;
  214.     AmCalendar mCalendar;
  215.     EditText mEtYear, mEtMonth, mEtDay;
  216.     Button mBtnComputeDistance;
  217.  
  218.     View.OnClickListener mClickHandler =
  219.     new View.OnClickListener() {
  220.         @Override
  221.         public void onClick(View v) {
  222.             switch(v.getId()){
  223.                 case R.id.idBtnComputeDistance:
  224.                     actionComputeDistance();
  225.                     break;
  226.             }//switch
  227.         }//onClick
  228.     };
  229.  
  230.     void actionComputeDistance(){
  231.         int y,m,d;
  232.         try {
  233.             y = AmUtil.readIntFromEditText(mEtYear);
  234.             m = AmUtil.readIntFromEditText(mEtMonth);
  235.             d = AmUtil.readIntFromEditText(mEtDay);
  236.  
  237.             boolean bValidDate =
  238.                 AmCalendar.validDay(y,m,d);
  239.  
  240.             if (bValidDate){
  241.                 //instantiate and write a corresponding
  242.                 //AmCalendar object
  243.                 AmCalendar cUserDate =
  244.                     new AmCalendar(this, y,m,d);
  245.                 mTvResults.setText(cUserDate.toString());
  246.                 long lDays = cUserDate.distanceInDays();
  247.                 mTvResults.setText(
  248.                     cUserDate.toString());
  249.             }
  250.             else{
  251.                 //TODO
  252.                 mUtil.fb("Invalid Date!");
  253.             }
  254.  
  255.         }
  256.         catch (Exception e){
  257.             //TODO
  258.             mUtil.fb("Empty field.");
  259.         }
  260.  
  261.     }//actionComputeDistance
  262.  
  263.     @Override
  264.     protected void onCreate(Bundle savedInstanceState) {
  265.         super.onCreate(savedInstanceState);
  266.         setContentView(R.layout.rl_distance_in_days_v1);
  267.  
  268.         init();
  269.     }//onCreate
  270.  
  271.     void init(){
  272.         mUtil = new AmUtil (this);
  273.         mEtYear = findViewById(R.id.idEtYear);
  274.         mEtMonth = findViewById(R.id.idEtMonth);
  275.         mEtDay = findViewById(R.id.idEtDay);
  276.         mBtnComputeDistance = findViewById(R.id.idBtnComputeDistance);
  277.  
  278.         String[] aDaysOfWeek =
  279.             getResources().getStringArray
  280.                 (R.array.aDaysOfWeek);
  281.  
  282.         mTvResults = findViewById(R.id.idTvResults);
  283.  
  284.         mBtnComputeDistance.setOnClickListener(
  285.             mClickHandler
  286.         );
  287.         displayCurrentYMD();
  288.  
  289.     }//init
  290.  
  291.     void displayCurrentYMD(){
  292.         Calendar c = Calendar.getInstance();
  293.         int y = c.get(Calendar.YEAR);
  294.         int m = c.get(Calendar.MONTH)+1;
  295.         int d = c.get(Calendar.DATE);
  296.         mEtYear.setText(String.valueOf(y));
  297.         mEtMonth.setText(String.valueOf(m));
  298.         mEtDay.setText(String.valueOf(d));
  299.     }//displayCurrentYMD
  300.  
  301.     void auxTests(){
  302.         //testing
  303.         for (int day=1; day<=31; day+=1){
  304.             AmCalendar calendarAtDay = new AmCalendar
  305.                     (MainActivity.this, 2021, 1, day);
  306.             String strDay = calendarAtDay.toString();
  307.             mTvResults.setText(
  308.                     strDay+"\n"+
  309.                             mTvResults.getText().toString()
  310.             );
  311.         }//for
  312.     }//auxTests
  313.  
  314.     /*
  315.     EX1: on init make sure the EditTexts for
  316.     year, month and day, are initialized to the
  317.     device's current year, month and day
  318.  
  319.     EX2: create and print an AmCalendar object,
  320.     corresponding to the user date
  321.      */
  322. }//MainActivity
Add Comment
Please, Sign In to add comment