1 package net.osdn.gokigen.pkremote.camera.vendor.sony.cameraproperty;
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;
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;
26 import net.osdn.gokigen.pkremote.R;
27 import net.osdn.gokigen.pkremote.camera.interfaces.IInterfaceProvider;
28 import net.osdn.gokigen.pkremote.scene.ConfirmationDialog;
30 import org.json.JSONArray;
31 import org.json.JSONObject;
33 import java.util.ArrayList;
34 import java.util.List;
36 public class SonyCameraApiListFragment extends ListFragment implements SendRequestDialog.Callback
38 private final String TAG = toString();
39 private ArrayAdapter<String> adapter;
40 private List<String> dataItems = new ArrayList<>();
41 private IInterfaceProvider interfaceProvider = null;
45 * カメラプロパティをやり取りするインタフェースを生成する
48 public static SonyCameraApiListFragment newInstance(@NonNull IInterfaceProvider interfaceProvider)
50 SonyCameraApiListFragment instance = new SonyCameraApiListFragment();
51 instance.prepare(interfaceProvider);
53 // パラメータはBundleにまとめておく
54 Bundle arguments = new Bundle();
55 //arguments.putString("title", title);
56 //arguments.putString("message", message);
57 instance.setArguments(arguments);
66 private void prepare(@NonNull IInterfaceProvider interfaceProvider)
68 Log.v(TAG, "prepare()");
69 this.interfaceProvider = interfaceProvider;
74 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
76 inflater.inflate(R.menu.api_view, menu);
77 String title = getString(R.string.app_name) + " " + getString(R.string.pref_sony_api_list);
79 AppCompatActivity activity = (AppCompatActivity) getActivity();
82 ActionBar bar = activity.getSupportActionBar();
96 public boolean onOptionsItemSelected(MenuItem item)
98 if (item.getItemId() == R.id.action_refresh)
103 if (item.getItemId() == R.id.action_share)
108 return super.onOptionsItemSelected(item);
117 if ((dataItems != null)&&(dataItems.size() > 0))
121 StringBuilder shareData = new StringBuilder();
122 for (String item : dataItems)
124 shareData.append(item);
125 shareData.append("\r\n");
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)
135 // Intent発行(ACTION_SEND)
136 startActivity(sendIntent);
137 Log.v(TAG, "<<< SEND INTENT >>> : " + title);
151 private void update()
155 if (dataItems != null)
164 Thread thread = new Thread(new Runnable()
169 Log.v(TAG, "START GET API LIST");
170 dataItems = interfaceProvider.getSonyInterface().getApiCommands();
171 Log.v(TAG, "FINISH GET API LIST");
174 final FragmentActivity activity = getActivity();
175 if (activity != null)
177 activity.runOnUiThread(new Runnable()
185 if (adapter.getCount() > 0)
191 adapter.addAll(dataItems);
194 ListView view = activity.findViewById(android.R.id.list);
195 view.setSelection(dataItems.size());
198 Toast.makeText(getActivity(), getString(R.string.finish_refresh), Toast.LENGTH_SHORT).show();
202 ee.printStackTrace();
226 public void onResume()
229 Log.v(TAG, "onResume()");
235 public void onPause()
238 Log.v(TAG, "onPause()");
242 public void onCreate(Bundle savedInstanceState)
244 super.onCreate(savedInstanceState);
245 Log.v(TAG, "SonyCameraApiListFragment::onCreate()");
249 public void onActivityCreated(@Nullable Bundle savedInstanceState)
251 super.onActivityCreated(savedInstanceState);
252 Log.v(TAG, "SonyCameraApiListFragment::onActivityCreated()");
253 setHasOptionsMenu(true);
257 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
259 adapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, dataItems);
260 setListAdapter(adapter);
261 return (super.onCreateView(inflater, container, savedInstanceState));
265 public void onListItemClick (ListView l, View v, int position, long id)
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)
276 activity.runOnUiThread(new Runnable()
281 SendRequestDialog dialog = SendRequestDialog.newInstance(interfaceProvider.getSonyInterface().getCameraApi(), apiName, apiCallback);
282 FragmentManager manager = getFragmentManager();
283 String tag = "dialog";
286 dialog.show(manager, tag);
301 * ※ 注意: 引数パラメータはカンマ区切りで複数個を入力してもらう
302 * key & Value 値 keyとvalueのあいだを : で区切る (key:value みたいな感じ)
309 public void sendRequest(final String service, final String apiName, final String parameter, final String version)
311 String logValue = "sendRequest(" + service + ", " + apiName + ", [ " + parameter + "], " + version + ");";
312 Log.v(TAG, logValue);
315 Thread thread = new Thread(new Runnable()
322 // parameterを parseして、メッセージを送信する
323 JSONArray params = parseParams(parameter);
324 receivedReply(interfaceProvider.getSonyInterface().getCameraApi().callGenericSonyApiMethod(service, apiName, params, version));
340 private JSONArray parseParams(final String parameter)
342 JSONArray params = new JSONArray();
343 final String[] parameterItems = parameter.split(",");
344 if (parameter.length() != 0)
346 for (int index = 0; index < parameterItems.length; index++)
348 String oneItem = parameterItems[index];
349 if (oneItem.contains(":"))
354 String[] keyValue = oneItem.split(":");
357 String key = keyValue[0];
358 String value = keyValue[1];
359 if (value.contains("$T"))
361 params.put(new JSONObject().put(key, true));
363 else if (value.contains("$F"))
365 params.put(new JSONObject().put(key, false));
367 else if (value.contains("#"))
369 if (value.contains("."))
371 double doubleValue = Double.parseDouble(value.substring(1));
372 params.put(new JSONObject().put(key, doubleValue));
376 int intValue = Integer.parseInt(value.substring(1));
377 params.put(new JSONObject().put(key, intValue));
382 params.put(new JSONObject().put(keyValue[0], keyValue[1]));
399 if (oneItem.contains("$T"))
403 else if (oneItem.contains("$F"))
407 else if (oneItem.contains("#"))
409 if (oneItem.contains("."))
411 double doubleValue = Double.parseDouble(oneItem.substring(1));
412 params.put(doubleValue);
414 int intValue = Integer.parseInt(oneItem.substring(1));
415 params.put(intValue);
435 public void cancelled()
437 Log.v(TAG, "cancelled()");
441 private void receivedReply(final JSONObject reply)
445 final Activity activity = getActivity();
446 if (activity != null)
448 activity.runOnUiThread(new Runnable()
455 ConfirmationDialog dialog = ConfirmationDialog.newInstance(getActivity());
459 replyString = reply.getString("result");
463 replyString = reply.getString("results");
465 dialog.show(android.R.drawable.ic_dialog_info, getString(R.string.dialog_title_reply), replyString);
469 ConfirmationDialog dialog = ConfirmationDialog.newInstance(getActivity());
470 String replyString = "";
473 replyString = reply.toString(4);
477 ee.printStackTrace();
479 dialog.show(android.R.drawable.ic_dialog_alert, getString(R.string.dialog_title_reply), "RECEIVE ERROR \r\n" + replyString);