OSDN Git Service

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