OSDN Git Service

PとSの制御コードを a01d からマージ。
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / camera / vendor / sony / cameraproperty / SonyCameraApiListFragment.java
1 package net.osdn.gokigen.pkremote.camera.vendor.sony.cameraproperty;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.util.Log;
7 import android.view.LayoutInflater;
8 import android.view.Menu;
9 import android.view.MenuInflater;
10 import android.view.MenuItem;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.ArrayAdapter;
14 import android.widget.ListAdapter;
15 import android.widget.ListView;
16 import android.widget.Toast;
17
18 import androidx.annotation.NonNull;
19 import androidx.annotation.Nullable;
20 import androidx.appcompat.app.ActionBar;
21 import androidx.appcompat.app.AppCompatActivity;
22 import androidx.fragment.app.FragmentActivity;
23 import androidx.fragment.app.FragmentManager;
24 import androidx.fragment.app.ListFragment;
25
26 import net.osdn.gokigen.pkremote.R;
27 import net.osdn.gokigen.pkremote.camera.interfaces.IInterfaceProvider;
28 import net.osdn.gokigen.pkremote.scene.ConfirmationDialog;
29
30 import org.json.JSONArray;
31 import org.json.JSONObject;
32
33 import java.util.ArrayList;
34 import java.util.List;
35
36 public class SonyCameraApiListFragment extends ListFragment implements SendRequestDialog.Callback
37 {
38     private final String TAG = toString();
39     private ArrayAdapter<String> adapter;
40     private List<String> dataItems = new ArrayList<>();
41     private IInterfaceProvider interfaceProvider = null;
42
43
44     /**
45      *  カメラプロパティをやり取りするインタフェースを生成する
46      *
47      */
48     public static SonyCameraApiListFragment newInstance(@NonNull IInterfaceProvider interfaceProvider)
49     {
50         SonyCameraApiListFragment instance = new SonyCameraApiListFragment();
51         instance.prepare(interfaceProvider);
52
53         // パラメータはBundleにまとめておく
54         Bundle arguments = new Bundle();
55         //arguments.putString("title", title);
56         //arguments.putString("message", message);
57         instance.setArguments(arguments);
58
59         return (instance);
60     }
61
62     /**
63      *
64      *
65      */
66     private void prepare(@NonNull IInterfaceProvider interfaceProvider)
67     {
68         Log.v(TAG, "prepare()");
69         this.interfaceProvider = interfaceProvider;
70     }
71
72
73     @Override
74     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
75     {
76         inflater.inflate(R.menu.api_view, menu);
77         String title = getString(R.string.app_name) + " " + getString(R.string.pref_sony_api_list);
78         try {
79             AppCompatActivity activity = (AppCompatActivity) getActivity();
80             if (activity != null)
81             {
82                 ActionBar bar = activity.getSupportActionBar();
83                 if (bar != null)
84                 {
85                     bar.setTitle(title);
86                 }
87             }
88         }
89         catch (Exception e)
90         {
91             e.printStackTrace();
92         }
93     }
94
95     @Override
96     public boolean onOptionsItemSelected(MenuItem item)
97     {
98         if (item.getItemId() == R.id.action_refresh)
99         {
100             update();
101             return (true);
102         }
103         if (item.getItemId() == R.id.action_share)
104         {
105             share();
106             return (true);
107         }
108         return super.onOptionsItemSelected(item);
109     }
110
111     /**
112      *   API一覧の他アプリへ共有
113      *
114      */
115     private void share()
116     {
117         if ((dataItems != null)&&(dataItems.size() > 0))
118         {
119             try
120             {
121                 StringBuilder shareData = new StringBuilder();
122                 for (String item : dataItems)
123                 {
124                     shareData.append(item);
125                     shareData.append("\r\n");
126                 }
127                 String title = "; " + getString(R.string.pref_sony_api_list);
128                 Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
129                 sendIntent.putExtra(Intent.EXTRA_SUBJECT, title);
130                 sendIntent.setType("text/plain");
131                 sendIntent.putExtra(Intent.EXTRA_TEXT, new String(shareData));
132                 FragmentActivity activity = getActivity();
133                 if (activity != null)
134                 {
135                     // Intent発行(ACTION_SEND)
136                     startActivity(sendIntent);
137                     Log.v(TAG, "<<< SEND INTENT >>> : " + title);
138                 }
139             }
140             catch (Exception e)
141             {
142                 e.printStackTrace();
143             }
144         }
145     }
146
147     /**
148      *   表示データの更新
149      *
150      */
151     private void update()
152     {
153         try
154         {
155             if (dataItems != null)
156             {
157                 dataItems.clear();
158             }
159         }
160         catch (Exception e)
161         {
162             e.printStackTrace();
163         }
164         Thread thread = new Thread(new Runnable()
165         {
166             @Override
167             public void run()
168             {
169                 Log.v(TAG, "START GET API LIST");
170                 dataItems = interfaceProvider.getSonyInterface().getApiCommands();
171                 Log.v(TAG, "FINISH GET API LIST");
172                 try
173                 {
174                     final FragmentActivity activity = getActivity();
175                     if (activity != null)
176                     {
177                         activity.runOnUiThread(new Runnable()
178                         {
179                             @Override
180                             public void run()
181                             {
182                                 try
183                                 {
184                                     // 中身があったらクリアする
185                                     if (adapter.getCount() > 0)
186                                     {
187                                         adapter.clear();
188                                     }
189
190                                     // リストの内容を更新する
191                                     adapter.addAll(dataItems);
192
193                                     // 最下部にカーソルを移したい
194                                     ListView view = activity.findViewById(android.R.id.list);
195                                     view.setSelection(dataItems.size());
196
197                                     // 更新終了通知
198                                     Toast.makeText(getActivity(), getString(R.string.finish_refresh), Toast.LENGTH_SHORT).show();
199                                 }
200                                 catch (Exception ee)
201                                 {
202                                     ee.printStackTrace();
203                                 }
204                             }
205                         });
206                     }
207                 }
208                 catch (Exception e)
209                 {
210                     e.printStackTrace();
211                 }
212             }
213         });
214         try
215         {
216             // 本当は、ここでダイアログを出したい
217             thread.start();
218         }
219         catch (Exception e)
220         {
221             e.printStackTrace();
222         }
223     }
224
225     @Override
226     public void onResume()
227     {
228         super.onResume();
229         Log.v(TAG, "onResume()");
230
231         update();
232     }
233
234     @Override
235     public void onPause()
236     {
237         super.onPause();
238         Log.v(TAG, "onPause()");
239     }
240
241     @Override
242     public void onCreate(Bundle savedInstanceState)
243     {
244         super.onCreate(savedInstanceState);
245         Log.v(TAG, "SonyCameraApiListFragment::onCreate()");
246     }
247
248     @Override
249     public void onActivityCreated(@Nullable Bundle savedInstanceState)
250     {
251         super.onActivityCreated(savedInstanceState);
252         Log.v(TAG, "SonyCameraApiListFragment::onActivityCreated()");
253         setHasOptionsMenu(true);
254     }
255
256     @Override
257     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
258     {
259         adapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, dataItems);
260         setListAdapter(adapter);
261         return (super.onCreateView(inflater, container, savedInstanceState));
262     }
263
264     @Override
265     public void onListItemClick (ListView l, View v, int position, long id)
266     {
267         try
268         {
269             ListAdapter listAdapter = l.getAdapter();
270             final String apiName = (String) listAdapter.getItem(position);
271             final SendRequestDialog.Callback apiCallback = this;
272             Log.v(TAG, "onListItemClick() [" + position + "] " + apiName);
273             Activity activity =  getActivity();
274             if (activity != null)
275             {
276                 activity.runOnUiThread(new Runnable()
277                 {
278                     @Override
279                     public void run()
280                     {
281                         SendRequestDialog dialog = SendRequestDialog.newInstance(interfaceProvider.getSonyInterface().getCameraApi(), apiName, apiCallback);
282                         FragmentManager manager = getFragmentManager();
283                         String tag = "dialog";
284                         if (manager != null)
285                         {
286                             dialog.show(manager, tag);
287                         }
288                     }
289                 });
290             }
291         }
292         catch (Exception e)
293         {
294             e.printStackTrace();
295         }
296     }
297
298     /**
299      *   API のコマンドを発行する。
300      *
301      *   ※ 注意: 引数パラメータはカンマ区切りで複数個を入力してもらう
302      *      key & Value  値 keyとvalueのあいだを : で区切る (key:value みたいな感じ)
303      *      $T           Boolean値の True
304      *      $F           Boolean値の False
305      *      #xx          数値(integer)
306      *      #xx.xx       数値(double)
307      */
308     @Override
309     public void sendRequest(final String service, final String apiName, final String parameter, final String version)
310     {
311         String logValue = "sendRequest(" + service + ", " + apiName + ", [ " + parameter + "], " + version + ");";
312         Log.v(TAG, logValue);
313         try
314         {
315             Thread thread = new Thread(new Runnable()
316             {
317                 @Override
318                 public void run()
319                 {
320                     try
321                     {
322                         // parameterを parseして、メッセージを送信する
323                         JSONArray params = parseParams(parameter);
324                         receivedReply(interfaceProvider.getSonyInterface().getCameraApi().callGenericSonyApiMethod(service, apiName, params, version));
325                     }
326                     catch (Exception e)
327                     {
328                         e.printStackTrace();
329                     }
330                 }
331             });
332             thread.start();
333         }
334         catch (Exception e)
335         {
336             e.printStackTrace();
337         }
338     }
339
340     private JSONArray parseParams(final String parameter)
341     {
342         JSONArray params = new JSONArray();
343         final String[] parameterItems = parameter.split(",");
344         if (parameter.length() != 0)
345         {
346             for (int index = 0; index < parameterItems.length; index++)
347             {
348                 String oneItem = parameterItems[index];
349                 if (oneItem.contains(":"))
350                 {
351                     // key & value と判断
352                     try
353                     {
354                         String[] keyValue = oneItem.split(":");
355                         try
356                         {
357                             String key = keyValue[0];
358                             String value = keyValue[1];
359                             if (value.contains("$T"))
360                             {
361                                 params.put(new JSONObject().put(key, true));
362                             }
363                             else if (value.contains("$F"))
364                             {
365                                 params.put(new JSONObject().put(key, false));
366                             }
367                             else if (value.contains("#"))
368                             {
369                                 if (value.contains("."))
370                                 {
371                                     double doubleValue = Double.parseDouble(value.substring(1));
372                                     params.put(new JSONObject().put(key, doubleValue));
373                                 }
374                                 else
375                                 {
376                                     int intValue = Integer.parseInt(value.substring(1));
377                                     params.put(new JSONObject().put(key, intValue));
378                                 }
379                             }
380                             else
381                             {
382                                 params.put(new JSONObject().put(keyValue[0], keyValue[1]));
383                             }
384                         }
385                         catch (Exception e)
386                         {
387                             e.printStackTrace();
388                             params.put(oneItem);
389                         }
390                     }
391                     catch (Exception e)
392                     {
393                         e.printStackTrace();
394                         params.put(oneItem);
395                     }
396                 } else {
397                     try
398                     {
399                         if (oneItem.contains("$T"))
400                         {
401                             params.put(true);
402                         }
403                         else if (oneItem.contains("$F"))
404                         {
405                             params.put(false);
406                         }
407                         else if (oneItem.contains("#"))
408                         {
409                             if (oneItem.contains("."))
410                             {
411                                 double doubleValue = Double.parseDouble(oneItem.substring(1));
412                                 params.put(doubleValue);
413                             } else {
414                                 int intValue = Integer.parseInt(oneItem.substring(1));
415                                 params.put(intValue);
416                             }
417                         }
418                         else
419                         {
420                             params.put(oneItem);
421                         }
422                     }
423                     catch (Exception e)
424                     {
425                         e.printStackTrace();
426                         params.put(oneItem);
427                     }
428                 }
429             }
430         }
431         return (params);
432     }
433
434     @Override
435     public void cancelled()
436     {
437         Log.v(TAG, "cancelled()");
438     }
439
440
441     private void receivedReply(final JSONObject reply)
442     {
443         try
444         {
445             final Activity activity =  getActivity();
446             if (activity != null)
447             {
448                 activity.runOnUiThread(new Runnable()
449                 {
450                     @Override
451                     public void run()
452                     {
453                         try
454                         {
455                             ConfirmationDialog dialog = ConfirmationDialog.newInstance(getActivity());
456                             String replyString;
457                             try
458                             {
459                                 replyString = reply.getString("result");
460                             }
461                             catch (Exception ee)
462                             {
463                                 replyString = reply.getString("results");
464                             }
465                             dialog.show(android.R.drawable.ic_dialog_info, getString(R.string.dialog_title_reply), replyString);
466                         }
467                         catch (Exception e)
468                         {
469                             ConfirmationDialog dialog = ConfirmationDialog.newInstance(getActivity());
470                             String replyString = "";
471                             try
472                             {
473                                 replyString = reply.toString(4);
474                             }
475                             catch (Exception ee)
476                             {
477                                 ee.printStackTrace();
478                             }
479                             dialog.show(android.R.drawable.ic_dialog_alert, getString(R.string.dialog_title_reply), "RECEIVE ERROR \r\n" + replyString);
480                             e.printStackTrace();
481                         }
482                     }
483                 });
484             }
485         }
486         catch (Exception e)
487         {
488             e.printStackTrace();
489         }
490
491     }
492
493 }