OSDN Git Service

ラップタイムの差分表示で、表示限界よりも小さい場合には正負記号を表示しないようにした。
[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.os.Bundle;
4 import android.support.v7.widget.DividerItemDecoration;
5 import android.support.wear.widget.WearableLinearLayoutManager;
6 import android.support.wear.widget.WearableRecyclerView;
7 import android.support.wear.widget.drawer.WearableActionDrawerView;
8 import android.support.wearable.activity.WearableActivity;
9 import android.util.Log;
10 import android.view.MenuItem;
11 import android.widget.Toast;
12
13 import net.osdn.gokigen.joggingtimer.R;
14 import net.osdn.gokigen.joggingtimer.storage.ITimeEntryDatabase;
15 import net.osdn.gokigen.joggingtimer.utilities.CreateModelData;
16 import net.osdn.gokigen.joggingtimer.utilities.CreateModelDataDialog;
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
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             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
51             detailAdapter = new RecordDetailAdapter();
52             WearableLinearLayoutManager layoutManager = new WearableLinearLayoutManager(this);
53
54             view.setCircularScrollingGestureEnabled(getResources().getConfiguration().isScreenRound());
55
56             DividerItemDecoration dividerDecoration = new DividerItemDecoration(view.getContext(), layoutManager.getOrientation());
57
58             view.addItemDecoration(dividerDecoration);
59             view.setLayoutManager(layoutManager);
60             view.setAdapter(detailAdapter);
61         }
62         catch (Exception e)
63         {
64             e.printStackTrace();
65             detailAdapter = null;
66         }
67
68         // Bottom Action Drawer
69         actionDrawerView = findViewById(R.id.bottom_action_drawer);
70         actionDrawerView.getController().peekDrawer();
71         actionDrawerView.setOnMenuItemClickListener(this);
72
73     }
74
75     /**
76      *
77      */
78     @Override
79     protected void onSaveInstanceState(Bundle outState)
80     {
81         super.onSaveInstanceState(outState);
82     }
83
84     /**
85      *
86      */
87     @Override
88     protected void onRestoreInstanceState(Bundle savedInstanceState)
89     {
90         super.onRestoreInstanceState(savedInstanceState);
91     }
92
93     /**
94      *
95      */
96     @Override
97     protected void onResume()
98     {
99         super.onResume();
100         Log.v(TAG, "onResume() ");
101     }
102
103     /**
104      *
105      */
106     @Override
107     protected void onPause()
108     {
109         super.onPause();
110         Log.v(TAG, "onPause()");
111     }
112
113     /**
114      *
115      *
116      */
117     @Override
118     public void onStart()
119     {
120         super.onStart();
121         try
122         {
123             long indexId = getIntent().getLongExtra(INTENT_EXTRA_DATA_ID, -1);
124             Log.v(TAG, "onResume() " + indexId);
125
126             setupper = new RecordDetailSetup(this, indexId, this, detailAdapter, this);
127             setupper.setup();
128         }
129         catch (Exception e)
130         {
131             e.printStackTrace();
132         }
133     }
134
135     /**
136      *
137      *
138      */
139     @Override
140     public void onStop()
141     {
142         super.onStop();
143         Log.v(TAG, "onStop()");
144
145         try
146         {
147             if (setupper != null)
148             {
149                 setupper.closeDatabase();
150                 setupper = null;
151             }
152         }
153         catch (Exception e)
154         {
155             e.printStackTrace();
156         }
157         System.gc();
158     }
159
160     /**
161      *
162      *
163      */
164     @Override
165     public void onEnterAmbient(Bundle ambientDetails)
166     {
167         super.onEnterAmbient(ambientDetails);
168         Log.v(TAG, "onEnterAmbient()");
169     }
170
171     /**
172      *
173      *
174      */
175     @Override
176     public void onExitAmbient()
177     {
178         super.onExitAmbient();
179         Log.v(TAG, "onExitAmbient()");
180     }
181
182     /**
183      *
184      *
185      */
186     @Override
187     public void onUpdateAmbient()
188     {
189         super.onUpdateAmbient();
190         Log.v(TAG, "onUpdateAmbient()");
191     }
192
193     /**
194      *
195      *
196      */
197     @Override
198     public void databaseSetupFinished(boolean result)
199     {
200         Log.v(TAG, "databaseSetupFinished() : " + result);
201     }
202
203     /**
204      *
205      *
206      */
207     @Override
208     public void updatedIndexData(final boolean isIconOnly)
209     {
210         Log.v(TAG, "selectedReferenceData() : " + isIconOnly);
211         runOnUiThread(new Runnable() {
212             @Override
213             public void run() {
214                 try
215                 {
216                     String title;
217                     if (isIconOnly)
218                     {
219                         title = getString(R.string.action_set_reference);
220                     }
221                     else
222                     {
223                         title = getString(R.string.action_edited_data);
224                     }
225                     Toast toast = Toast.makeText(getApplicationContext(), title, Toast.LENGTH_SHORT);
226                     toast.show();
227                 }
228                 catch (Exception e)
229                 {
230                     e.printStackTrace();
231                 }
232             }
233         });
234     }
235
236     /**
237      *
238      *
239      */
240     @Override
241     public boolean onMenuItemClick(MenuItem item)
242     {
243         Log.v(TAG, "onMenuItemClick(): " + item);
244
245         boolean ret = false;
246         final int itemId = item.getItemId();
247         String toastMessage = "";
248         switch (itemId)
249         {
250             case R.id.menu_edit_title:
251                 // タイトルの編集
252                 DataEditDialog dialog = new DataEditDialog(this);
253                 dialog.show(R.drawable.ic_android_black_24dp, "", this);
254                 ret = true;
255                 break;
256             case R.id.menu_create_model:
257                 CreateModelDataDialog dialog2 = new CreateModelDataDialog(this);
258                 dialog2.show(true, getString(R.string.information_time_picker), 0, setupper.getCreateModelDataCallback(ITimeEntryDatabase.DONT_USE_ID, ITimeEntryDatabase.DONT_USE_ID), 0);
259                 break;
260
261             case R.id.menu_set_reference:
262                 // 現在のデータを基準値として設定する
263                 setupper.setReferenceData();
264                 ret = true;
265                 break;
266
267             default:
268                 // 何もしない
269                 break;
270         }
271         try
272         {
273             actionDrawerView.getController().closeDrawer();
274
275             if (toastMessage.length() > 0)
276             {
277                 Toast toast = Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT);
278                 toast.show();
279             }
280         }
281         catch (Exception e)
282         {
283             e.printStackTrace();
284         }
285
286         return (ret);
287     }
288
289
290     /**
291      *
292      */
293     @Override
294     public void dataEdited(int iconId, String title)
295     {
296         Log.v(TAG, "iconId : " + iconId + " title : '"+ title +"'");
297         try {
298             setupper.setIndexData(title, iconId);
299             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
300             view.postInvalidate();
301         }
302         catch (Exception e)
303         {
304             e.printStackTrace();
305         }
306     }
307
308     /**
309      *
310      */
311     private void updateScreen()
312     {
313         try
314         {
315             WearableRecyclerView view = findViewById(R.id.recycler_detail_view);
316             view.postInvalidate();
317         }
318         catch (Exception e)
319         {
320             e.printStackTrace();
321         }
322     }
323
324     /**
325      *
326      */
327     @Override
328     public void cancelled()
329     {
330         updateScreen();
331     }
332
333     /**
334      *
335      */
336     @Override
337     public void editedModelData(long indexId, long detailId, int lapCount, long prevTime, long newTime)
338     {
339         Log.v(TAG, "editedModelData() " + indexId + " " + detailId + " " + lapCount + " (" + prevTime + " -> " + newTime + ")");
340         if (detailAdapter == null)
341         {
342             return;
343         }
344
345         long diffTime = newTime - prevTime;
346         int count = detailAdapter.getItemCount();
347         if (count > 1)
348         {
349             long totalTime = 0;
350             long modTime = diffTime * (-1) / (count - 1);
351             for (int index = 1; index <= count; index++)
352             {
353                 DetailRecord record = detailAdapter.getRecord(index - 1);
354                 if (lapCount == index)
355                 {
356                     totalTime = record.addModifiedTime(diffTime, totalTime);
357                 }
358                 else
359                 {
360                     totalTime = record.addModifiedTime(modTime, totalTime);
361                 }
362
363                 detailAdapter.notifyItemChanged(index - 1);
364             }
365             try
366             {
367                 Thread thread = new Thread(new Runnable()
368                 {
369                     @Override
370                     public void run()
371                     {
372                         if (setupper != null)
373                         {
374                             setupper.updateDatabaseRecord(detailAdapter);
375                         }
376                     }
377                 });
378                 thread.start();
379             }
380             catch (Exception e)
381             {
382                 e.printStackTrace();
383             }
384         }
385         detailAdapter.notifyDataSetChanged();
386     }
387 }