OSDN Git Service

とりあえず、APIレベルの引き上げと Android Jetpack化。
[gokigen/JoggingTimer.git] / wear / src / main / java / net / osdn / gokigen / joggingtimer / recorddetail / DetailActivity.java
1 package net.osdn.gokigen.joggingtimer.recorddetail;
2
3 import android.app.FragmentManager;
4 import android.os.Bundle;
5 import android.support.wearable.activity.WearableActivity;
6 import android.util.Log;
7 import android.view.MenuItem;
8 import android.widget.Toast;
9
10 import androidx.recyclerview.widget.DividerItemDecoration;
11 import androidx.wear.widget.WearableLinearLayoutManager;
12 import androidx.wear.widget.WearableRecyclerView;
13 import androidx.wear.widget.drawer.WearableActionDrawerView;
14 import androidx.wear.widget.drawer.WearableNavigationDrawerView;
15
16 import net.osdn.gokigen.joggingtimer.R;
17 import net.osdn.gokigen.joggingtimer.utilities.CreateModelData;
18 import net.osdn.gokigen.joggingtimer.utilities.DataEditDialog;
19
20
21 /**
22  *
23  *
24  */
25 public class DetailActivity extends WearableActivity implements RecordDetailSetup.IDatabaseReadyNotify, MenuItem.OnMenuItemClickListener, DataEditDialog.Callback, CreateModelData.IEditedModelDataCallback, DetailSelectionMenuAdapter.ISelectedMenu
26 {
27     private final String TAG = toString();
28     public static final String INTENT_EXTRA_DATA_ID = "Detail.dataId";
29
30     private RecordDetailAdapter detailAdapter = null;
31     private RecordDetailSetup setupper = null;
32
33     private WearableActionDrawerView actionDrawerView = null;
34
35     /**
36      *
37      */
38     @Override
39     protected void onCreate(Bundle savedInstanceState)
40     {
41         super.onCreate(savedInstanceState);
42         Log.v(TAG, "onCreate()");
43
44         setContentView(R.layout.activity_detail);
45
46         // Enables Always-on
47         setAmbientEnabled();
48
49         try
50         {
51             WearableNavigationDrawerView naviView = findViewById(R.id.top_navigation_drawer);
52             DetailSelectionMenuAdapter menuAdapter = new DetailSelectionMenuAdapter(this, this);
53             naviView.setAdapter(menuAdapter);
54             naviView.addOnItemSelectedListener(menuAdapter);
55
56             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
57             detailAdapter = new RecordDetailAdapter();
58             WearableLinearLayoutManager layoutManager = new WearableLinearLayoutManager(this);
59
60             //view.setCircularScrollingGestureEnabled(getResources().getConfiguration().isScreenRound());
61             view.setCircularScrollingGestureEnabled(false);
62
63             DividerItemDecoration dividerDecoration = new DividerItemDecoration(view.getContext(), layoutManager.getOrientation());
64
65             view.addItemDecoration(dividerDecoration);
66             view.setLayoutManager(layoutManager);
67             view.setAdapter(detailAdapter);
68         }
69         catch (Exception e)
70         {
71             e.printStackTrace();
72             detailAdapter = null;
73         }
74
75         // Bottom Action Drawer
76         actionDrawerView = findViewById(R.id.bottom_action_drawer);
77         actionDrawerView.getController().peekDrawer();
78         actionDrawerView.setOnMenuItemClickListener(this);
79
80     }
81
82     /**
83      *
84      */
85     @Override
86     protected void onSaveInstanceState(Bundle outState)
87     {
88         super.onSaveInstanceState(outState);
89     }
90
91     /**
92      *
93      */
94     @Override
95     protected void onRestoreInstanceState(Bundle savedInstanceState)
96     {
97         super.onRestoreInstanceState(savedInstanceState);
98     }
99
100     /**
101      *
102      */
103     @Override
104     protected void onResume()
105     {
106         super.onResume();
107         Log.v(TAG, "onResume() ");
108     }
109
110     /**
111      *
112      */
113     @Override
114     protected void onPause()
115     {
116         super.onPause();
117         Log.v(TAG, "onPause()");
118     }
119
120     /**
121      *
122      *
123      */
124     @Override
125     public void onStart()
126     {
127         super.onStart();
128         try
129         {
130             long indexId = getIntent().getLongExtra(INTENT_EXTRA_DATA_ID, -1);
131             Log.v(TAG, "onResume() " + indexId);
132
133             setupper = new RecordDetailSetup(this, indexId, this, detailAdapter, this);
134             setupper.setup();
135         }
136         catch (Exception e)
137         {
138             e.printStackTrace();
139         }
140     }
141
142     /**
143      *
144      *
145      */
146     @Override
147     public void onStop()
148     {
149         super.onStop();
150         Log.v(TAG, "onStop()");
151
152         try
153         {
154             if (setupper != null)
155             {
156                 setupper.closeDatabase();
157                 setupper = null;
158             }
159         }
160         catch (Exception e)
161         {
162             e.printStackTrace();
163         }
164         System.gc();
165     }
166
167     /**
168      *
169      *
170      */
171     @Override
172     public void onEnterAmbient(Bundle ambientDetails)
173     {
174         super.onEnterAmbient(ambientDetails);
175         Log.v(TAG, "onEnterAmbient()");
176     }
177
178     /**
179      *
180      *
181      */
182     @Override
183     public void onExitAmbient()
184     {
185         super.onExitAmbient();
186         Log.v(TAG, "onExitAmbient()");
187     }
188
189     /**
190      *
191      *
192      */
193     @Override
194     public void onUpdateAmbient()
195     {
196         super.onUpdateAmbient();
197         Log.v(TAG, "onUpdateAmbient()");
198     }
199
200     /**
201      *
202      *
203      */
204     @Override
205     public void databaseSetupFinished(boolean result)
206     {
207         Log.v(TAG, "databaseSetupFinished() : " + result);
208     }
209
210     /**
211      *
212      *
213      */
214     @Override
215     public void updatedIndexData(final boolean isIconOnly)
216     {
217         Log.v(TAG, "selectedReferenceData() : " + isIconOnly);
218         runOnUiThread(new Runnable() {
219             @Override
220             public void run() {
221                 try
222                 {
223                     String title;
224                     if (isIconOnly)
225                     {
226                         title = getString(R.string.action_set_reference);
227                     }
228                     else
229                     {
230                         title = getString(R.string.action_edited_data);
231                     }
232                     Toast toast = Toast.makeText(getApplicationContext(), title, Toast.LENGTH_SHORT);
233                     toast.show();
234                 }
235                 catch (Exception e)
236                 {
237                     e.printStackTrace();
238                 }
239             }
240         });
241     }
242
243     /**
244      *
245      *
246      */
247     @Override
248     public boolean onMenuItemClick(MenuItem item)
249     {
250         Log.v(TAG, "onMenuItemClick(): " + item);
251
252         final int itemId = item.getItemId();
253         try
254         {
255             actionDrawerView.getController().closeDrawer();
256         }
257         catch (Exception e)
258         {
259             e.printStackTrace();
260         }
261         return (itemSelected(itemId));
262     }
263
264     private boolean itemSelected(int itemId)
265     {
266         boolean ret = false;
267         String toastMessage = "";
268         switch (itemId)
269         {
270             case R.id.menu_edit_title:
271                 // タイトルの編集
272                 String title = "";
273                 int iconId = R.drawable.ic_android_black_24dp;
274                 RecordDetailSetup.EditIndexData data = setupper.getEditIndexData();
275                 if (data != null)
276                 {
277                     iconId = data.getIcon();
278                     title = data.getTitle();
279                 }
280                 DataEditDialog dialog = DataEditDialog.newInstance(iconId, title, this);
281                 FragmentManager manager = getFragmentManager();
282                 String tag = "dialog";
283                 if (manager != null)
284                 {
285                     dialog.show(manager, tag);
286                 }
287                 ret = true;
288                 break;
289
290             case R.id.menu_set_reference:
291                 // 現在のデータを基準値として設定する
292                 setupper.setReferenceData();
293                 ret = true;
294                 break;
295
296             case R.id.menu_share_data:
297                 // 現在のデータを共有する
298                 setupper.shareTheData(detailAdapter);
299                 ret = true;
300                 break;
301
302             default:
303                 // 何もしない
304                 break;
305         }
306         try
307         {
308             if (toastMessage.length() > 0)
309             {
310                 Toast toast = Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT);
311                 toast.show();
312             }
313         }
314         catch (Exception e)
315         {
316             e.printStackTrace();
317         }
318
319         return (ret);
320     }
321
322
323     /**
324      *
325      */
326     @Override
327     public void dataEdited(int iconId, String title)
328     {
329         Log.v(TAG, "iconId : " + iconId + " title : '"+ title +"'");
330         try {
331             setupper.setEditIndexData(title, iconId);
332             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
333             view.postInvalidate();
334         }
335         catch (Exception e)
336         {
337             e.printStackTrace();
338         }
339     }
340
341     /**
342      *
343      */
344     private void updateScreen()
345     {
346         try
347         {
348             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
349             view.postInvalidate();
350         }
351         catch (Exception e)
352         {
353             e.printStackTrace();
354         }
355     }
356
357     /**
358      *
359      */
360     @Override
361     public void cancelled()
362     {
363         updateScreen();
364     }
365
366     /**
367      *
368      */
369     @Override
370     public void editedModelData(long indexId, long detailId, int lapCount, long prevTime, long newTime)
371     {
372         Log.v(TAG, "editedModelData() " + indexId + " " + detailId + " " + lapCount + " (" + prevTime + " -> " + newTime + ")");
373         if (detailAdapter == null)
374         {
375             return;
376         }
377
378         long diffTime = newTime - prevTime;
379         int count = detailAdapter.getItemCount();
380         if (count > 1)
381         {
382             long totalTime = 0;
383             long modTime = diffTime * (-1) / (count - 1);
384             for (int index = 1; index <= count; index++)
385             {
386                 DetailRecord record = detailAdapter.getRecord(index - 1);
387                 if (lapCount == index)
388                 {
389                     totalTime = record.addModifiedTime(diffTime, totalTime);
390                 }
391                 else
392                 {
393                     totalTime = record.addModifiedTime(modTime, totalTime);
394                 }
395                 detailAdapter.notifyItemChanged(index - 1);
396             }
397             try
398             {
399                 Thread thread = new Thread(new Runnable()
400                 {
401                     @Override
402                     public void run()
403                     {
404                         if (setupper != null)
405                         {
406                             setupper.updateDatabaseRecord(detailAdapter);
407                         }
408                     }
409                 });
410                 thread.start();
411             }
412             catch (Exception e)
413             {
414                 e.printStackTrace();
415             }
416         }
417         detailAdapter.notifyDataSetChanged();
418     }
419
420     @Override
421     public void selectedMenu(int itemId)
422     {
423         itemSelected(itemId);
424     }
425 }