Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //MainActivity.java
- package com.joythis.android.datesdistance;
- import androidx.activity.result.ActivityResult;
- import androidx.activity.result.ActivityResultCallback;
- import androidx.activity.result.ActivityResultLauncher;
- import androidx.activity.result.contract.ActivityResultContract;
- import androidx.activity.result.contract.ActivityResultContracts;
- import androidx.appcompat.app.AppCompatActivity;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.Set;
- public class MainActivity extends AppCompatActivity {
- public final static String DATES_SAVED_DB =
- "DATES_SAVED.DB";
- SharedPreferences mSp;
- public final static String KEY_RESULT_DATE =
- "KEY_RESULT_DATE";
- public final static String KEY_CALLER =
- "KEY_CALLER";
- public final static String VALUE_DATE1 =
- "DATE1";
- public final static String VALUE_DATE2 =
- "DATE2";
- Activity mA;
- EditText mEtDate1, mEtDate2;
- Button mBtnPickDate1,
- mBtnPickDate2,
- mBtnComputeDistance;
- /////////////// SAFR modern pattern START //////////////////
- /*
- SAFR
- Contract
- Callback
- Launcher
- */
- ActivityResultContract mContract =
- new ActivityResultContracts.StartActivityForResult();
- ActivityResultCallback<ActivityResult> mCallback =
- new ActivityResultCallback<ActivityResult>() {
- @Override
- public void onActivityResult(ActivityResult result) {
- boolean bConfirm =
- result.getResultCode() == RESULT_OK;
- boolean bCanceled =
- result.getResultCode() == RESULT_CANCELED;
- if(bConfirm){
- Intent intentResponse = result.getData();
- if (intentResponse!=null){
- int[] aYMD =
- intentResponse.getIntArrayExtra(
- KEY_RESULT_DATE
- );
- int y,m,d;
- y = aYMD[0];
- m = aYMD[1];
- d = aYMD[2];
- String strForWhomIsTheResult =
- intentResponse.getStringExtra(
- KEY_CALLER
- );
- /*
- se o caller for VALUE_DATE1
- devemos inscrever a data resultado
- em mEtDate1
- c.c.
- se o caller for VALUE_DATE2
- devemos inscrever a a data resultado
- em mEtDate2
- */
- String strDate = String.format(
- "%4d-%2d-%2d",
- y,m,d
- );
- switch(strForWhomIsTheResult){
- case VALUE_DATE1:
- mEtDate1.setText(strDate);
- break;
- case VALUE_DATE2:
- mEtDate2.setText(strDate);
- break;
- }//switch
- }//
- }
- }
- };
- ActivityResultLauncher<Intent> mLauncher =
- registerForActivityResult(
- mContract,
- mCallback
- );
- /////////////// SAFR modern pattern END //////////////////
- /////////////// ListView pattern START //////////////////
- ListView mLvDistances; //visualização
- ArrayAdapter<String> mAd;
- // 2022-12-06 and 2022-12-07 are 1 day(s) apart
- ArrayList<String> mAlDistances; // os dados
- /////////////// ListView pattern END //////////////////
- View.OnClickListener mClickHandler = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.idBtnPickDate1:
- actionPickDate1();
- break;
- case R.id.idBtnPickDate2:
- actionPickDate2();
- break;
- case R.id.idBtnComputeDistance:
- actionComputeDistance();
- break;
- }//switch
- }//onClick
- };//mClickHandler
- void actionComputeDistance(){
- //1 - instanciar um objeto AmDate
- // correspondente à data em mEtDate1
- AmDate d1 = new AmDate(
- mEtDate1.getText().toString().trim()
- );
- //2 - instanciar um objeto AmDate
- // correspondente à data em mEtDate2
- AmDate d2 = new AmDate(
- mEtDate2.getText().toString().trim()
- );
- //3 - pedir a um dos objetos (d1 ou d2)
- // que se meça
- // em dias, relativamente ao outro
- long distInDays = d2.distanceInDays(d1);
- //4 - preparar uma frase que inclua
- // a distância em dias
- //e.g.: 2022-12-06 and 2022-12-07 are 1 day(s) apart
- String strMsg =
- String.format(
- "%s and %s are %d day(s) apart",
- d1.toString(),
- d2.toString(),
- distInDays
- );
- //5 - mostrar a frase na ListView
- mAlDistances.add(0, strMsg);
- mAd.notifyDataSetChanged();
- //6 - gravar a nova distância
- // TODO: isolar em método próprio
- SharedPreferences.Editor ed = mSp.edit();
- Set<String> setDates = new HashSet<>();
- setDates.addAll(mAlDistances);
- ed.putStringSet(
- "DATES", setDates
- );
- ed.commit();
- }//actionComputeDistance
- void actionPickDate1(){
- //SAFR!!! TODO
- Intent goGoPickDate1 = new Intent(
- MainActivity.this,
- DateInput.class
- );
- // mera navegação
- //startActivity(goGoPickDate1);
- //SAFR modern
- goGoPickDate1.putExtra(
- KEY_CALLER,
- VALUE_DATE1
- );
- mLauncher.launch(goGoPickDate1);
- }//actionPickDate1
- void actionPickDate2(){
- //SAFR!!! TODO
- Intent goGoPickDate2 = new Intent(
- MainActivity.this,
- DateInput.class
- );
- // mera navegação
- //startActivity(goGoPickDate2);
- goGoPickDate2.putExtra(
- KEY_CALLER,
- VALUE_DATE2
- );
- mLauncher.launch(
- goGoPickDate2
- );
- }//actionPickDate2
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.rl_distance_dates);
- init();
- }//onCreate
- void init(){
- //1 - assocs
- mEtDate1 = findViewById(R.id.idEtDate1);
- mEtDate2 = findViewById(R.id.idEtDate2);
- mBtnPickDate1 = findViewById(R.id.idBtnPickDate1);
- mBtnPickDate2 = findViewById(R.id.idBtnPickDate2);
- mBtnComputeDistance = findViewById(R.id.idBtnComputeDistance);
- mLvDistances = findViewById(R.id.idLvDistances);
- mAlDistances = new ArrayList<>();
- mAd = new ArrayAdapter<String>(
- this,
- android.R.layout.simple_list_item_1,
- mAlDistances // os dados
- );
- mSp = getSharedPreferences(
- DATES_SAVED_DB,
- MODE_PRIVATE
- );
- if (mSp!=null){
- Set<String> setDates =
- mSp.getStringSet("DATES", null);
- if(setDates!=null){
- mAlDistances.clear();
- //mAlDistances.addAll(setDates);
- for (String d : setDates){
- mAlDistances.add(0, d);
- }
- }
- }
- displayDefaultDates();
- //2 - behaviors
- mBtnPickDate1.setOnClickListener(mClickHandler);
- mBtnPickDate2.setOnClickListener(mClickHandler);
- mBtnComputeDistance.setOnClickListener(mClickHandler);
- mLvDistances.setAdapter(mAd);
- }//init
- void displayDefaultDates(){
- AmDate d = new AmDate();
- mEtDate1.setText(d.toString());
- mEtDate2.setText(d.toString());
- }//displayDefaultDates
- }
Advertisement
Add Comment
Please, Sign In to add comment