OSDN Git Service

切断・接続について少し改善する。
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / scene / CameraSceneUpdater.java
1 package net.osdn.gokigen.pkremote.scene;
2
3 import android.util.Log;
4 import android.widget.ImageButton;
5 import android.widget.TextView;
6
7 import com.google.android.material.bottomnavigation.BottomNavigationView;
8
9 import net.osdn.gokigen.pkremote.R;
10 import net.osdn.gokigen.pkremote.calendar.CalendarFragment;
11 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection;
12 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContentsRecognizer;
13 import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatusReceiver;
14 import net.osdn.gokigen.pkremote.camera.interfaces.IInterfaceProvider;
15 import net.osdn.gokigen.pkremote.camera.vendor.sony.cameraproperty.SonyCameraApiListFragment;
16 import net.osdn.gokigen.pkremote.logcat.LogCatFragment;
17 import net.osdn.gokigen.pkremote.playback.ImageGridViewFragment;
18 import net.osdn.gokigen.pkremote.preference.canon.CanonPreferenceFragment;
19 import net.osdn.gokigen.pkremote.preference.fujix.FujiXPreferenceFragment;
20 import net.osdn.gokigen.pkremote.preference.nikon.NikonPreferenceFragment;
21 import net.osdn.gokigen.pkremote.preference.olympus.OpcPreferenceFragment;
22 import net.osdn.gokigen.pkremote.preference.olympuspen.OlympusPenPreferenceFragment;
23 import net.osdn.gokigen.pkremote.preference.panasonic.PanasonicPreferenceFragment;
24 import net.osdn.gokigen.pkremote.preference.ricohgr2.RicohGr2PreferenceFragment;
25 import net.osdn.gokigen.pkremote.preference.sony.SonyPreferenceFragment;
26 import net.osdn.gokigen.pkremote.transfer.AutoTransferFragment;
27
28 import androidx.annotation.NonNull;
29 import androidx.appcompat.app.AppCompatActivity;
30 import androidx.core.content.res.ResourcesCompat;
31 import androidx.fragment.app.FragmentTransaction;
32 import androidx.preference.PreferenceFragmentCompat;
33
34 /**
35  *
36  *
37  */
38 public class CameraSceneUpdater implements ICameraStatusReceiver, IChangeScene, ICameraContentsRecognizer.ICameraContentsListCallback
39 {
40     private final String TAG = toString();
41     private final AppCompatActivity activity;
42     private final BottomNavigationView bottomNavigationView;
43     private IInterfaceProvider interfaceProvider;
44     //private IStatusViewDrawer statusViewDrawer;
45     private ICameraStatusReceiver anotherStatusReceiver = null;
46     private PreferenceFragmentCompat preferenceFragment = null;
47     private LogCatFragment logCatFragment = null;
48     private CalendarFragment calendarFragment = null;
49     private ImageGridViewFragment gridViewFragment = null;
50     private AutoTransferFragment autoTransferFragment = null;
51     private SonyCameraApiListFragment sonyApiListFragmentSony = null;
52
53     public static CameraSceneUpdater newInstance(@NonNull AppCompatActivity activity)
54     {
55         return (new CameraSceneUpdater(activity));
56     }
57
58     /**
59      * コンストラクタ
60      */
61     private CameraSceneUpdater(@NonNull AppCompatActivity activity)
62     {
63         this.activity = activity;
64         this.bottomNavigationView = activity.findViewById(R.id.navigation);
65     }
66
67     /**
68      * 一番最初のフラグメントを表示する
69      */
70     public void changeFirstFragment(@NonNull IInterfaceProvider interfaceProvider)
71     {
72         this.interfaceProvider = interfaceProvider;
73         try
74         {
75             bottomNavigationView.setSelectedItemId(R.id.navigation_calendar);
76         }
77         catch (Exception e)
78         {
79             e.printStackTrace();
80         }
81
82         // 初期画面(カレンダー画面)へ遷移
83         changeSceneToCalendar();
84     }
85
86 /*
87     //  CameraSceneUpdater
88     public void registerInterface(@NonNull IStatusViewDrawer statusViewDrawer, @NonNull IInterfaceProvider interfaceProvider)
89     {
90         Log.v(TAG, "registerInterface()");
91         this.statusViewDrawer = statusViewDrawer;
92         this.interfaceProvider = interfaceProvider;
93     }
94 */
95
96     // ICameraStatusReceiver
97     @Override
98     public void onStatusNotify(String message)
99     {
100         Log.v(TAG, " CONNECTION MESSAGE : " + message);
101         try {
102 /*
103             if (statusViewDrawer != null)
104             {
105                 statusViewDrawer.updateStatusView(message);
106                 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
107                 if (connection != null) {
108                     statusViewDrawer.updateConnectionStatus(connection.getConnectionStatus());
109                 }
110             }
111 */
112             if (anotherStatusReceiver != null)
113             {
114                 anotherStatusReceiver.onStatusNotify(message);
115             }
116         } catch (Exception e) {
117             e.printStackTrace();
118         }
119     }
120
121     // ICameraStatusReceiver
122     @Override
123     public void onCameraConnected() {
124         Log.v(TAG, "onCameraConnected()");
125         updateConnectionStatus(activity.getString(R.string.connect_connected), ICameraConnection.CameraConnectionStatus.CONNECTED);
126         try {
127             ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
128             if (connection != null) {
129                 connection.forceUpdateConnectionStatus(ICameraConnection.CameraConnectionStatus.CONNECTED);
130             }
131 /*
132             if (statusViewDrawer != null)
133             {
134                 statusViewDrawer.updateConnectionStatus(ICameraConnection.CameraConnectionStatus.CONNECTED);
135
136                 // ライブビューの開始... 今回は手動化。
137                 //statusViewDrawer.startLiveView();
138             }
139 */
140             if (anotherStatusReceiver != null) {
141                 anotherStatusReceiver.onCameraConnected();
142             }
143             ICameraContentsRecognizer recognizer = interfaceProvider.getCameraContentsRecognizer();
144             if (recognizer != null) {
145                 // カメラ内のコンテンツ一覧を作成するように指示する
146                 recognizer.getRemoteCameraContentsList(true, this);
147             }
148         } catch (Exception e) {
149             e.printStackTrace();
150         }
151     }
152
153     // ICameraStatusReceiver
154     @Override
155     public void onCameraDisconnected() {
156         Log.v(TAG, "onCameraDisconnected()");
157         String message = activity.getString(R.string.camera_disconnected);
158         updateConnectionStatus(message, ICameraConnection.CameraConnectionStatus.DISCONNECTED);
159         try {
160 /*
161             if (statusViewDrawer != null) {
162                 statusViewDrawer.updateStatusView(activity.getString(R.string.camera_disconnected));
163                 statusViewDrawer.updateConnectionStatus(ICameraConnection.CameraConnectionStatus.DISCONNECTED);
164             }
165 */
166             if (anotherStatusReceiver != null) {
167                 anotherStatusReceiver.onCameraDisconnected();
168             }
169         } catch (Exception e) {
170             e.printStackTrace();
171         }
172     }
173
174     // ICameraStatusReceiver
175     @Override
176     public void onCameraOccursException(String message, Exception e) {
177         Log.v(TAG, "onCameraOccursException() " + message);
178         try {
179             ICameraConnection.CameraConnectionStatus connectionStatus;  // = ICameraConnection.CameraConnectionStatus.UNKNOWN;
180
181             e.printStackTrace();
182             ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
183             if (connection != null) {
184                 connectionStatus = connection.getConnectionStatus();
185                 connection.alertConnectingFailed(message + " " + e.getLocalizedMessage());
186                 updateConnectionStatus(message, connectionStatus);
187             }
188 /*
189             if (statusViewDrawer != null) {
190                 statusViewDrawer.updateStatusView(message);
191                 if (connection != null) {
192                     statusViewDrawer.updateConnectionStatus(connectionStatus);
193                 }
194             }
195 */
196             if (anotherStatusReceiver != null) {
197                 anotherStatusReceiver.onCameraOccursException(message, e);
198             }
199         } catch (Exception ee) {
200             ee.printStackTrace();
201         }
202     }
203
204     /**
205      * カメラとの接続状態を表示更新する
206      */
207     private void updateConnectionStatus(final String message, final ICameraConnection.CameraConnectionStatus status) {
208         try {
209             final int resId;
210             switch (status) {
211                 case CONNECTED:
212                     resId = R.drawable.ic_cloud_done_black_24dp;
213                     break;
214                 case CONNECTING:
215                     resId = R.drawable.ic_cloud_queue_black_24dp;
216                     break;
217                 case DISCONNECTED:
218                     resId = R.drawable.ic_cloud_off_black_24dp;
219                     break;
220                 case UNKNOWN:
221                 default:
222                     resId = R.drawable.ic_cloud_queue_grey_24dp;
223                     break;
224             }
225             final TextView messageArea = activity.findViewById(R.id.message);
226             final ImageButton buttonArea = activity.findViewById(R.id.button_wifi_connect);
227             activity.runOnUiThread(new Runnable() {
228                 @Override
229                 public void run() {
230                     try {
231                         if (buttonArea != null) {
232                             buttonArea.setImageDrawable(ResourcesCompat.getDrawable(activity.getResources(), resId, null));
233                             buttonArea.invalidate();
234                         }
235                         if ((messageArea != null) && (message != null)) {
236                             messageArea.setText(message);
237                             messageArea.invalidate();
238                         }
239                     } catch (Exception e) {
240                         e.printStackTrace();
241                     }
242                 }
243             });
244         } catch (Exception e) {
245             e.printStackTrace();
246         }
247     }
248
249     //  IChangeScene
250     @Override
251     public void changeSceneToCameraPropertyList()
252     {
253 /*
254         try
255         {
256             ICameraConnection.CameraConnectionMethod method = interfaceProvider.getCammeraConnectionMethod();
257             ICameraConnection connection = getCameraConnection(method);
258             if (method == ICameraConnection.CameraConnectionMethod.RICOH)
259             {
260                 // OPCカメラでない場合には、「OPCカメラのみ有効です」表示をして画面遷移させない
261                 Toast.makeText(getApplicationContext(), getText(R.string.only_opc_feature), Toast.LENGTH_SHORT).show();
262             }
263             else if (method == ICameraConnection.CameraConnectionMethod.SONY)
264             {
265                 // OPCカメラでない場合には、「OPCカメラのみ有効です」表示をして画面遷移させない
266                 Toast.makeText(getApplicationContext(), getText(R.string.only_opc_feature), Toast.LENGTH_SHORT).show();
267             }
268             else
269             {
270                 // OPC カメラの場合...
271                 if (connection != null)
272                 {
273                     ICameraConnection.CameraConnectionStatus status = connection.getConnectionStatus();
274                     if (status == ICameraConnection.CameraConnectionStatus.CONNECTED)
275                     {
276                         if (propertyListFragment == null)
277                         {
278                             propertyListFragment = OlyCameraPropertyListFragment.newInstance(this, interfaceProvider.getOlympusInterface().getCameraPropertyProvider());
279                         }
280                         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
281                         transaction.replace(R.id.fragment1, propertyListFragment);
282                         // backstackに追加
283                         transaction.addToBackStack(null);
284                         transaction.commit();
285                     }
286                 }
287             }
288         }
289         catch (Exception e)
290         {
291             e.printStackTrace();
292         }
293 */
294     }
295
296     //  IChangeScene
297     @Override
298     public void changeSceneToConfiguration()
299     {
300         try
301         {
302             if (preferenceFragment == null)
303             {
304                 try
305                 {
306                     //preferenceFragment = RicohGr2PreferenceFragment.newInstance(activity, this);
307                     ICameraConnection.CameraConnectionMethod connectionMethod = interfaceProvider.getCammeraConnectionMethod();
308                     if (connectionMethod == ICameraConnection.CameraConnectionMethod.RICOH)
309                     {
310                         preferenceFragment = RicohGr2PreferenceFragment.newInstance(activity, this);
311                     }
312                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.FUJI_X)
313                     {
314                         preferenceFragment = FujiXPreferenceFragment.newInstance(activity, this);
315                         //} else if (connectionMethod == ICameraConnection.CameraConnectionMethod.SONY) {
316                         //    preferenceFragment = SonyPreferenceFragment.newInstance(this, this);
317                     }
318                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.PANASONIC)
319                     {
320                         preferenceFragment = PanasonicPreferenceFragment.newInstance(activity, this);
321                     }
322                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.SONY)
323                     {
324                         preferenceFragment = SonyPreferenceFragment.newInstance(activity, this);
325                     }
326                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.CANON)
327                     {
328                         preferenceFragment = CanonPreferenceFragment.newInstance(activity, this);
329                     }
330                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.NIKON)
331                     {
332                         preferenceFragment = NikonPreferenceFragment.newInstance(activity, this);
333                     }
334                     else if (connectionMethod == ICameraConnection.CameraConnectionMethod.OLYMPUS)
335                     {
336                         preferenceFragment = OlympusPenPreferenceFragment.newInstance(activity, this);
337                     }
338                     else //  if (connectionMethod == ICameraConnection.CameraConnectionMethod.OPC)
339                     {
340                         preferenceFragment = OpcPreferenceFragment.newInstance(activity, interfaceProvider, this);
341                     }
342                 }
343                 catch (Exception e)
344                 {
345                     e.printStackTrace();
346                     //preferenceFragment = SonyPreferenceFragment.newInstance(this, this);
347                 }
348             }
349             FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
350             transaction.replace(R.id.fragment1, preferenceFragment);
351             // backstackに追加
352             transaction.addToBackStack(null);
353             transaction.commit();
354         }
355         catch (Exception e)
356         {
357             e.printStackTrace();
358         }
359     }
360
361     //  IChangeScene
362     @Override
363     public void changeCameraConnection()
364     {
365         if (interfaceProvider == null)
366         {
367             Log.v(TAG, "changeCameraConnection() : interfaceProvider is NULL");
368             return;
369         }
370         try
371         {
372             interfaceProvider.resetCameraConnectionMethod();
373             ICameraConnection connection = interfaceProvider.getCameraConnection();
374             if (connection != null)
375             {
376                 ICameraConnection.CameraConnectionStatus status = connection.getConnectionStatus();
377                 if (status == ICameraConnection.CameraConnectionStatus.CONNECTED)
378                 {
379                     // 接続中のときには切断する
380                     connection.disconnect(false);
381                     return;
382                 }
383                 // 接続中でない時は、接続中にする
384                 connection.startWatchWifiStatus(activity);
385             }
386         }
387         catch (Exception e)
388         {
389             e.printStackTrace();
390         }
391     }
392
393     //  IChangeScene
394     @Override
395     public void reloadRemoteImageContents()
396     {
397         try
398         {
399             ICameraContentsRecognizer recognizer = interfaceProvider.getCameraContentsRecognizer();
400             if (recognizer != null)
401             {
402                 // カメラ内のコンテンツ一覧を作成するように指示する
403                 recognizer.getRemoteCameraContentsList(true, this);
404             }
405             if (gridViewFragment != null)
406             {
407                 // サムネイル画像のキャッシュをクリアする
408                 gridViewFragment.clearImageCache();
409             }
410         }
411         catch (Exception e)
412         {
413             e.printStackTrace();
414         }
415     }
416
417     //  IChangeScene
418     @Override
419     public void changeSceneToDebugInformation()
420     {
421         if (logCatFragment == null) {
422             logCatFragment = LogCatFragment.newInstance();
423         }
424         FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
425         transaction.replace(R.id.fragment1, logCatFragment);
426         // backstackに追加
427         transaction.addToBackStack(null);
428         transaction.commit();
429     }
430
431     //  IChangeScene
432     @Override
433     public void changeSceneToApiList()
434     {
435         if (sonyApiListFragmentSony == null)
436         {
437             sonyApiListFragmentSony = SonyCameraApiListFragment.newInstance(interfaceProvider);
438         }
439         FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
440         transaction.replace(R.id.fragment1, sonyApiListFragmentSony);
441         // backstackに追加
442         transaction.addToBackStack(null);
443         transaction.commit();
444     }
445
446     //  IChangeScene
447     @Override
448     public void changeSceneToAutoTransfer()
449     {
450         if (autoTransferFragment == null)
451         {
452             autoTransferFragment = AutoTransferFragment.newInstance(activity, interfaceProvider);
453         }
454         FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
455         transaction.replace(R.id.fragment1, autoTransferFragment);
456         // backstackに追加
457         transaction.addToBackStack(null);
458         transaction.commit();
459     }
460
461     //  IChangeScene
462     @Override
463     public void changeSceneToCalendar()
464     {
465         if (calendarFragment == null)
466         {
467             calendarFragment = CalendarFragment.newInstance(activity, this, interfaceProvider);
468         }
469         FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
470         transaction.replace(R.id.fragment1, calendarFragment);
471         // backstackに追加
472         transaction.addToBackStack(null);
473         transaction.commit();
474     }
475
476     //  IChangeScene
477     @Override
478     public void changeScenceDateSelected(String filterLabel)
479     {
480         Log.v(TAG, "changeScenceDateSelected()");
481
482         bottomNavigationView.setSelectedItemId(R.id.navigation_photo_library);
483         changeScenceToImageList(filterLabel);
484     }
485
486     /**
487      * 画像一覧画面を開く
488      */
489     //  IChangeScene
490     @Override
491     public void changeScenceToImageList()
492     {
493         changeScenceToImageList(null);
494     }
495
496     /**
497      *
498      *
499      */
500     private void changeScenceToImageList(String filterLabel)
501     {
502         Log.v(TAG, "changeScenceToImageList() : " + filterLabel);
503         try
504         {
505             if (gridViewFragment == null)
506             {
507                 gridViewFragment = ImageGridViewFragment.newInstance(interfaceProvider);
508             }
509             gridViewFragment.setFilterLabel(filterLabel);
510             FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
511             transaction.replace(R.id.fragment1, gridViewFragment);
512             // backstackに追加
513             transaction.addToBackStack(null);
514             transaction.commit();
515         }
516         catch (Exception e)
517         {
518             e.printStackTrace();
519         }
520     }
521
522     //  IChangeScene
523     @Override
524     public void exitApplication()
525     {
526         Log.v(TAG, "exitApplication()");
527         try
528         {
529             ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
530             if (connection != null)
531             {
532                 connection.disconnect(true);
533             }
534             activity.finish();
535         }
536         catch (Exception e)
537         {
538             e.printStackTrace();
539         }
540     }
541
542     @Override
543     public void updateBottomNavigationMenu()
544     {
545         try
546         {
547             // ナビゲーション部分の選択状態をしたい...
548             int changeId = 0;
549             if (calendarFragment.isFragmentActive())
550             {
551                 changeId = R.id.navigation_calendar;
552             }
553             else if (gridViewFragment.isFragmentActive())
554             {
555                 changeId = R.id.navigation_photo_library;
556             }
557             if ((bottomNavigationView != null)&&(changeId != 0))
558             {
559                 bottomNavigationView.setSelectedItemId(changeId);
560             }
561         }
562         catch (Exception e)
563         {
564             e.printStackTrace();
565         }
566     }
567
568     @Override
569     public void setAnotherStatusReceiver(ICameraStatusReceiver statusReceiver)
570     {
571         this.anotherStatusReceiver = statusReceiver;
572     }
573
574     private ICameraConnection getCameraConnection(ICameraConnection.CameraConnectionMethod method)
575     {
576         Log.v(TAG, "method : " + method);
577         return (interfaceProvider.getCameraConnection());
578     }
579
580     @Override
581     public void contentsListCreated(int nofContents)
582     {
583         Log.v(TAG, "contentsListCreated() : " + nofContents);
584
585         // カレンダー画面のリフレッシュを行いたい (かなり無理やり...)
586         if ((calendarFragment != null)&&(calendarFragment.isFragmentActive()))
587         {
588             calendarFragment.contentsListCreated(nofContents);
589         }
590     }
591 }