am_dot_com

PDM2 20201112

Nov 12th, 2020 (edited)
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.78 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.AsyncTask;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.widget.ArrayAdapter;
  13. import android.widget.Button;
  14. import android.widget.ListView;
  15. import android.widget.Spinner;
  16. import android.widget.TextView;
  17.  
  18. import java.io.InputStream;
  19. import java.io.InputStreamReader;
  20. import java.net.URL;
  21. import java.util.ArrayList;
  22.  
  23. import javax.net.ssl.HttpsURLConnection;
  24.  
  25. public class StarterActivity extends AppCompatActivity {
  26.  
  27.     String mRemoteContent = "";
  28.     class MyAsyncTask extends AsyncTask<String, Void, String>{
  29.  
  30.         @Override
  31.         protected void onPreExecute() {
  32.             super.onPreExecute();
  33.             mRemoteContent = "";
  34.         }
  35.  
  36.         @Override
  37.         protected String doInBackground(String... strings) {
  38.             //return null;
  39.             //consumeHttpsResource(SOURCE);
  40.             String strHttpsContent = consumeHttpsResource(strings[0]);
  41.             mRemoteContent = strHttpsContent;
  42.             return strHttpsContent;
  43.         }//doInBackground
  44.  
  45.         @Override
  46.         protected void onPostExecute(String s) {
  47.             //super.onPostExecute(s);
  48.             populateSpinnerWithLinesFromOnlineTSV(
  49.                 mSpnDatesFromTheWeb,
  50.                 mRemoteContent
  51.             );
  52.         }
  53.     }//AsyncTask
  54.  
  55.     Context mContext;
  56.  
  57.     Button mBtnRequestDate1, mBtnRequestDate2;
  58.     TextView mTvDate1, mTvDate2;
  59.     Button mBtnComputeDistance;
  60.  
  61.     ListView mLvFeedback; //vis
  62.     ArrayAdapter<String> mAd;
  63.     ArrayList<String> mAlComputedDistances; //data
  64.  
  65.     AmCalendar mDate1, mDate2;
  66.  
  67.     Button.OnClickListener mButtonClickHandler =
  68.         new View.OnClickListener() {
  69.             @Override
  70.             public void onClick(View v) {
  71.                 int id = v.getId();
  72.                 switch(id){
  73.                     case R.id.idBtnRequestDate1:
  74.                         actionRequestDate1();
  75.                         break;
  76.                     case R.id.idBtnRequestDate2:
  77.                         actionRequestDate2();
  78.                         break;
  79.                     case R.id.idBtnComputeDistance:
  80.                         actionComputeDistance();
  81.                         break;
  82.                 }//switch
  83.             }//onClick
  84.         };//mButtonClickHandler
  85.  
  86.     public final
  87.         static int
  88.             CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE1 = 444;
  89.  
  90.     public final
  91.     static int
  92.             CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE2 = 888;
  93.  
  94.     public final static int DEFAULT_YEAR = 2020;
  95.     public final static int DEFAULT_MONTH = 11;
  96.     public final static int DEFAULT_DAY = 12;
  97.  
  98.     @Override
  99.     protected void onActivityResult
  100.     (int requestCode, //who is Android calling?
  101.      int resultCode, //OK or CANCEL ?
  102.      @Nullable Intent data //this will transport the "result(s)"
  103.     )
  104.     {
  105.         super.onActivityResult(requestCode, resultCode, data);
  106.  
  107.         boolean bUserConfirmedDate = resultCode == RESULT_OK;
  108.         boolean bUserCanceled = resultCode == RESULT_CANCELED;
  109.  
  110.         if (bUserConfirmedDate){
  111.             //data extraction!
  112.             boolean bIsThereDateToExtractFrom = data!=null;
  113.  
  114.             if (bIsThereDateToExtractFrom){
  115.                 //extraction time!
  116.                 int y, m, d;
  117.                 y = data.getIntExtra(
  118.                     DateInputActivity.KEY_YEAR,
  119.                     DEFAULT_YEAR
  120.                 );
  121.  
  122.                 m = data.getIntExtra(
  123.                     DateInputActivity.KEY_MONTH,
  124.                     DEFAULT_MONTH
  125.                 );
  126.  
  127.                 d = data.getIntExtra(
  128.                     DateInputActivity.KEY_DAY,
  129.                     DEFAULT_DAY
  130.                 );
  131.  
  132.                 String strDate = String.format(
  133.                     "%d-%d-%d", y, m, d
  134.                 );
  135.                 //end of extraction
  136.  
  137.                 switch(requestCode){
  138.                     case CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE1:
  139.                         //TODO
  140.                         //code to display the recv date in mTvDate1
  141.                         mTvDate1.setText(strDate);
  142.                         mDate1 = new AmCalendar(y,m,d);
  143.                         break;
  144.                         //TODO
  145.                     case CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE2:
  146.                         //code to display the recv date in mTvDate2
  147.                         mTvDate2.setText(strDate);
  148.                         mDate2 = new AmCalendar(y,m,d);
  149.                         break;
  150.                 }//switch
  151.             }//if there is data to extract from
  152.  
  153.             if (mDate1!=null && mDate2!=null){
  154.                 mBtnComputeDistance.setEnabled(true);
  155.             }//if
  156.         }//the user did NOT cancel, but CONFIRMED / OKed the response
  157.     }//onActivityResult
  158.  
  159.     void actionRequestDate1(){
  160.         Intent intentToGoPickSomeDateViaDateInputActivity =
  161.             new Intent(
  162.                 this,
  163.                 DateInputActivity.class
  164.             );
  165.  
  166.         //startActivity(intentToGoPickSomeDateViaDateInputActivity);
  167.  
  168.         startActivityForResult(
  169.             intentToGoPickSomeDateViaDateInputActivity,
  170.             CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE1
  171.         );
  172.     }//actionRequestDate1
  173.  
  174.     void actionRequestDate2(){
  175.         Intent intentToGoPickSomeDateViaDateInputActivity =
  176.             new Intent(
  177.                 this,
  178.                 DateInputActivity.class
  179.             );
  180.  
  181.         //startActivity(intentToGoPickSomeDateViaDateInputActivity);
  182.  
  183.         startActivityForResult(
  184.             intentToGoPickSomeDateViaDateInputActivity,
  185.             CALL_ME_ON_THIS_CODE_WHEN_YOU_HAVE_DATE2
  186.         );
  187.     }//actionRequestDate2
  188.  
  189.     void actionComputeDistance(){
  190.         boolean bCanEnableComputeDistance =
  191.             mDate1!=null & mDate2!=null;
  192.  
  193.         if (bCanEnableComputeDistance){
  194.             int iDistanceInDays =
  195.                 mDate1.distanceInDaysToOtherAmCalendar(mDate2);
  196.  
  197.             /*
  198.             int iDistanceInDays =
  199.                 mDate2.distanceInDaysToOtherAmCalendar(mDate1);
  200.              */
  201.  
  202.             String strMsg = getString(
  203.                 R.string.strDistanceBetweenDays,
  204.                 mDate1.toString(),
  205.                 mDate2.toString(),
  206.                 iDistanceInDays
  207.             );
  208.             mAlComputedDistances.add(0, strMsg);
  209.             mAd.notifyDataSetChanged();
  210.         }//if
  211.     }//actionComputeDistance
  212.  
  213.     @Override
  214.     protected void onCreate(Bundle savedInstanceState) {
  215.         super.onCreate(savedInstanceState);
  216.         setContentView(R.layout.activity_starter_rl);
  217.  
  218.         init();
  219.     }//onCreate
  220.  
  221.     Spinner mSpnDatesFromTheWeb;
  222.     void init(){
  223.         mContext = this;
  224.  
  225.         mSpnDatesFromTheWeb = findViewById(R.id.idSpnDatesFromTheWeb);
  226.  
  227.         //DO NOT!
  228.         //android.os.NetworkOnMainThreadException
  229.         /*
  230.         populateSpinnerWithLinesFromOnlineTSV(
  231.             mSpnDatesFromTheWeb,
  232.             consumeHttpsResource(SOURCE)
  233.         );
  234.  
  235.          */
  236.  
  237.         //do it async
  238.         MyAsyncTask t = new MyAsyncTask();
  239.         t.execute(SOURCE);
  240.  
  241.         mBtnRequestDate1 = findViewById(R.id.idBtnRequestDate1);
  242.         mBtnRequestDate2 = findViewById(R.id.idBtnRequestDate2);
  243.  
  244.         mTvDate1 = findViewById(R.id.idTvDate1);
  245.         mTvDate2 = findViewById(R.id.idTvDate2);
  246.  
  247.         mBtnComputeDistance =
  248.             findViewById(R.id.idBtnComputeDistance);
  249.  
  250.         mLvFeedback = findViewById(R.id.idLvFeedback);
  251.         mAlComputedDistances = new ArrayList<>();
  252.         mAd = new ArrayAdapter<>(
  253.             mContext,
  254.             android.R.layout.simple_list_item_1,
  255.             mAlComputedDistances
  256.         );
  257.         mLvFeedback.setAdapter(mAd);
  258.  
  259.         Button[] aBtns = {
  260.             mBtnRequestDate1,
  261.             mBtnRequestDate2,
  262.             mBtnComputeDistance
  263.         };
  264.         for (Button b : aBtns){
  265.             b.setOnClickListener(mButtonClickHandler);
  266.         }//for
  267.  
  268.         //makes the Button ignore any user input
  269.         mBtnComputeDistance.setEnabled(false);
  270.     }//init
  271.  
  272.     /*
  273.     TODO: put it in AmUtil?
  274.      */
  275.     void populateSpinnerWithLinesFromOnlineTSV(
  276.         Spinner pSpn,
  277.         String pOnlineTSVContent
  278.  
  279.     ){
  280.         String[] aLinesFromTheWWW = pOnlineTSVContent.split("\n");
  281.  
  282.         ArrayAdapter<String> ad = new ArrayAdapter<>(
  283.             mContext,
  284.             android.R.layout.simple_spinner_item,
  285.             aLinesFromTheWWW
  286.         );
  287.  
  288.         ad.setDropDownViewResource(
  289.             android.R.layout.simple_spinner_dropdown_item
  290.         );
  291.  
  292.         pSpn.setAdapter(ad);
  293.     }//populateSpinnerWithLinesFromOnlineTSV
  294.  
  295.     public final static String SOURCE =
  296.         "https://arturmarques.com/edu/pdm2/dates.TSV";
  297.  
  298.     public String consumeHttpsResource(
  299.         String pUrl
  300.     ){
  301.         try{
  302.             URL url = new URL(pUrl);
  303.             HttpsURLConnection httpsCon =
  304.                 (HttpsURLConnection)url.openConnection();
  305.             InputStream is = httpsCon.getInputStream();
  306.             InputStreamReader isr = new InputStreamReader(is);
  307.  
  308.             char c; int iByte; String strAll = "";
  309.  
  310.             while((iByte=isr.read())!=-1){
  311.                 c = (char)iByte;
  312.                 strAll += c;
  313.             }//while
  314.  
  315.             isr.close();
  316.             is.close();
  317.             httpsCon.disconnect();
  318.  
  319.             return strAll;
  320.         }//try
  321.         catch (Exception e){
  322.             Log.e(
  323.                 getClass().getName(),
  324.                 e.toString()
  325.             );
  326.         }//catch
  327.  
  328.         return "";
  329.     }//consumeHttpsResource
  330. }//StarterActivity
Advertisement
Add Comment
Please, Sign In to add comment