am_dot_com

DDM 2022-12-07

Dec 7th, 2022 (edited)
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.40 KB | None | 0 0
  1. //MainActivity.java
  2. package com.joythis.android.datesdistance;
  3.  
  4. import androidx.activity.result.ActivityResult;
  5. import androidx.activity.result.ActivityResultCallback;
  6. import androidx.activity.result.ActivityResultLauncher;
  7. import androidx.activity.result.contract.ActivityResultContract;
  8. import androidx.activity.result.contract.ActivityResultContracts;
  9. import androidx.appcompat.app.AppCompatActivity;
  10.  
  11. import android.app.Activity;
  12. import android.content.Intent;
  13. import android.content.SharedPreferences;
  14. import android.os.Bundle;
  15. import android.view.View;
  16. import android.widget.ArrayAdapter;
  17. import android.widget.Button;
  18. import android.widget.EditText;
  19. import android.widget.ListView;
  20.  
  21. import java.util.ArrayList;
  22. import java.util.HashSet;
  23. import java.util.Set;
  24.  
  25. public class MainActivity extends AppCompatActivity {
  26. public final static String DATES_SAVED_DB =
  27. "DATES_SAVED.DB";
  28. SharedPreferences mSp;
  29.  
  30. public final static String KEY_RESULT_DATE =
  31. "KEY_RESULT_DATE";
  32. public final static String KEY_CALLER =
  33. "KEY_CALLER";
  34. public final static String VALUE_DATE1 =
  35. "DATE1";
  36. public final static String VALUE_DATE2 =
  37. "DATE2";
  38.  
  39. Activity mA;
  40. EditText mEtDate1, mEtDate2;
  41. Button mBtnPickDate1,
  42. mBtnPickDate2,
  43. mBtnComputeDistance;
  44.  
  45. /////////////// SAFR modern pattern START //////////////////
  46. /*
  47. SAFR
  48. Contract
  49. Callback
  50. Launcher
  51. */
  52. ActivityResultContract mContract =
  53. new ActivityResultContracts.StartActivityForResult();
  54.  
  55. ActivityResultCallback<ActivityResult> mCallback =
  56. new ActivityResultCallback<ActivityResult>() {
  57. @Override
  58. public void onActivityResult(ActivityResult result) {
  59. boolean bConfirm =
  60. result.getResultCode() == RESULT_OK;
  61. boolean bCanceled =
  62. result.getResultCode() == RESULT_CANCELED;
  63. if(bConfirm){
  64. Intent intentResponse = result.getData();
  65. if (intentResponse!=null){
  66. int[] aYMD =
  67. intentResponse.getIntArrayExtra(
  68. KEY_RESULT_DATE
  69. );
  70. int y,m,d;
  71. y = aYMD[0];
  72. m = aYMD[1];
  73. d = aYMD[2];
  74.  
  75. String strForWhomIsTheResult =
  76. intentResponse.getStringExtra(
  77. KEY_CALLER
  78. );
  79.  
  80. /*
  81. se o caller for VALUE_DATE1
  82. devemos inscrever a data resultado
  83. em mEtDate1
  84. c.c.
  85. se o caller for VALUE_DATE2
  86. devemos inscrever a a data resultado
  87. em mEtDate2
  88. */
  89. String strDate = String.format(
  90. "%4d-%2d-%2d",
  91. y,m,d
  92. );
  93. switch(strForWhomIsTheResult){
  94. case VALUE_DATE1:
  95. mEtDate1.setText(strDate);
  96. break;
  97. case VALUE_DATE2:
  98. mEtDate2.setText(strDate);
  99. break;
  100. }//switch
  101.  
  102.  
  103. }//
  104. }
  105. }
  106. };
  107.  
  108. ActivityResultLauncher<Intent> mLauncher =
  109. registerForActivityResult(
  110. mContract,
  111. mCallback
  112. );
  113.  
  114. /////////////// SAFR modern pattern END //////////////////
  115.  
  116. /////////////// ListView pattern START //////////////////
  117. ListView mLvDistances; //visualização
  118.  
  119. ArrayAdapter<String> mAd;
  120.  
  121. // 2022-12-06 and 2022-12-07 are 1 day(s) apart
  122. ArrayList<String> mAlDistances; // os dados
  123.  
  124. /////////////// ListView pattern END //////////////////
  125.  
  126. View.OnClickListener mClickHandler = new View.OnClickListener() {
  127. @Override
  128. public void onClick(View v) {
  129. switch(v.getId()){
  130. case R.id.idBtnPickDate1:
  131. actionPickDate1();
  132. break;
  133. case R.id.idBtnPickDate2:
  134. actionPickDate2();
  135. break;
  136. case R.id.idBtnComputeDistance:
  137. actionComputeDistance();
  138. break;
  139. }//switch
  140. }//onClick
  141. };//mClickHandler
  142.  
  143. void actionComputeDistance(){
  144. //1 - instanciar um objeto AmDate
  145. // correspondente à data em mEtDate1
  146. AmDate d1 = new AmDate(
  147. mEtDate1.getText().toString().trim()
  148. );
  149.  
  150. //2 - instanciar um objeto AmDate
  151. // correspondente à data em mEtDate2
  152. AmDate d2 = new AmDate(
  153. mEtDate2.getText().toString().trim()
  154. );
  155.  
  156. //3 - pedir a um dos objetos (d1 ou d2)
  157. // que se meça
  158. // em dias, relativamente ao outro
  159. long distInDays = d2.distanceInDays(d1);
  160.  
  161. //4 - preparar uma frase que inclua
  162. // a distância em dias
  163. //e.g.: 2022-12-06 and 2022-12-07 are 1 day(s) apart
  164. String strMsg =
  165. String.format(
  166. "%s and %s are %d day(s) apart",
  167. d1.toString(),
  168. d2.toString(),
  169. distInDays
  170. );
  171.  
  172. //5 - mostrar a frase na ListView
  173. mAlDistances.add(0, strMsg);
  174. mAd.notifyDataSetChanged();
  175.  
  176. //6 - gravar a nova distância
  177. // TODO: isolar em método próprio
  178. SharedPreferences.Editor ed = mSp.edit();
  179. Set<String> setDates = new HashSet<>();
  180. setDates.addAll(mAlDistances);
  181. ed.putStringSet(
  182. "DATES", setDates
  183. );
  184. ed.commit();
  185. }//actionComputeDistance
  186.  
  187. void actionPickDate1(){
  188. //SAFR!!! TODO
  189. Intent goGoPickDate1 = new Intent(
  190. MainActivity.this,
  191. DateInput.class
  192. );
  193.  
  194. // mera navegação
  195. //startActivity(goGoPickDate1);
  196.  
  197. //SAFR modern
  198. goGoPickDate1.putExtra(
  199. KEY_CALLER,
  200. VALUE_DATE1
  201. );
  202. mLauncher.launch(goGoPickDate1);
  203. }//actionPickDate1
  204.  
  205. void actionPickDate2(){
  206. //SAFR!!! TODO
  207. Intent goGoPickDate2 = new Intent(
  208. MainActivity.this,
  209. DateInput.class
  210. );
  211.  
  212. // mera navegação
  213. //startActivity(goGoPickDate2);
  214.  
  215. goGoPickDate2.putExtra(
  216. KEY_CALLER,
  217. VALUE_DATE2
  218. );
  219.  
  220. mLauncher.launch(
  221. goGoPickDate2
  222. );
  223. }//actionPickDate2
  224.  
  225. @Override
  226. protected void onCreate(Bundle savedInstanceState) {
  227. super.onCreate(savedInstanceState);
  228. setContentView(R.layout.rl_distance_dates);
  229.  
  230. init();
  231. }//onCreate
  232.  
  233. void init(){
  234. //1 - assocs
  235. mEtDate1 = findViewById(R.id.idEtDate1);
  236. mEtDate2 = findViewById(R.id.idEtDate2);
  237. mBtnPickDate1 = findViewById(R.id.idBtnPickDate1);
  238. mBtnPickDate2 = findViewById(R.id.idBtnPickDate2);
  239. mBtnComputeDistance = findViewById(R.id.idBtnComputeDistance);
  240.  
  241. mLvDistances = findViewById(R.id.idLvDistances);
  242. mAlDistances = new ArrayList<>();
  243. mAd = new ArrayAdapter<String>(
  244. this,
  245. android.R.layout.simple_list_item_1,
  246. mAlDistances // os dados
  247. );
  248.  
  249. mSp = getSharedPreferences(
  250. DATES_SAVED_DB,
  251. MODE_PRIVATE
  252. );
  253. if (mSp!=null){
  254. Set<String> setDates =
  255. mSp.getStringSet("DATES", null);
  256. if(setDates!=null){
  257. mAlDistances.clear();
  258. //mAlDistances.addAll(setDates);
  259. for (String d : setDates){
  260. mAlDistances.add(0, d);
  261. }
  262. }
  263. }
  264.  
  265. displayDefaultDates();
  266.  
  267. //2 - behaviors
  268. mBtnPickDate1.setOnClickListener(mClickHandler);
  269. mBtnPickDate2.setOnClickListener(mClickHandler);
  270. mBtnComputeDistance.setOnClickListener(mClickHandler);
  271.  
  272. mLvDistances.setAdapter(mAd);
  273. }//init
  274.  
  275. void displayDefaultDates(){
  276. AmDate d = new AmDate();
  277. mEtDate1.setText(d.toString());
  278. mEtDate2.setText(d.toString());
  279. }//displayDefaultDates
  280. }
Advertisement
Add Comment
Please, Sign In to add comment