1 package net.osdn.gokigen.a01d;
3 import android.Manifest;
4 import android.annotation.SuppressLint;
5 import android.content.SharedPreferences;
6 import android.content.pm.PackageManager;
7 import android.graphics.Color;
8 import android.graphics.Typeface;
9 import android.os.Bundle;
10 import android.util.Log;
11 import android.view.KeyEvent;
12 import android.view.WindowManager;
13 import android.widget.TextView;
15 import net.osdn.gokigen.a01d.camera.CameraInterfaceProvider;
16 import net.osdn.gokigen.a01d.camera.IInterfaceProvider;
17 import net.osdn.gokigen.a01d.camera.fujix.cameraproperty.FujiXCameraCommandSendDialog;
18 import net.osdn.gokigen.a01d.camera.olympus.cameraproperty.OlyCameraPropertyListFragment;
19 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
20 import net.osdn.gokigen.a01d.camera.ICameraConnection;
21 import net.osdn.gokigen.a01d.camera.olympus.wrapper.connection.ble.ICameraPowerOn;
22 import net.osdn.gokigen.a01d.camera.ptpip.operation.PtpIpCameraCommandSendDialog;
23 import net.osdn.gokigen.a01d.camera.utils.SimpleHttpSendCommandDialog;
24 import net.osdn.gokigen.a01d.camera.panasonic.operation.PanasonicSendCommandDialog;
25 import net.osdn.gokigen.a01d.camera.ricohgr2.operation.RicohGr2SendCommandDialog;
26 import net.osdn.gokigen.a01d.camera.sony.cameraproperty.SonyCameraApiListFragment;
27 import net.osdn.gokigen.a01d.liveview.IStatusViewDrawer;
28 import net.osdn.gokigen.a01d.liveview.LiveViewFragment;
29 import net.osdn.gokigen.a01d.logcat.LogCatFragment;
30 import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
31 import net.osdn.gokigen.a01d.preference.canon.CanonPreferenceFragment;
32 import net.osdn.gokigen.a01d.preference.fujix.FujiXPreferenceFragment;
33 import net.osdn.gokigen.a01d.preference.kodak.KodakPreferenceFragment;
34 import net.osdn.gokigen.a01d.preference.nikon.NikonPreferenceFragment;
35 import net.osdn.gokigen.a01d.preference.olympus.PreferenceFragment;
36 import net.osdn.gokigen.a01d.preference.panasonic.PanasonicPreferenceFragment;
37 import net.osdn.gokigen.a01d.preference.olympuspen.OlympusPreferenceFragment;
38 import net.osdn.gokigen.a01d.preference.ricohgr2.RicohGr2PreferenceFragment;
39 import net.osdn.gokigen.a01d.preference.sony.SonyPreferenceFragment;
40 import net.osdn.gokigen.a01d.preference.summary.PreferenceFragmentSummary;
41 import net.osdn.gokigen.a01d.preference.theta.ThetaPreferenceFragment;
43 import androidx.annotation.NonNull;
44 import androidx.annotation.Nullable;
45 import androidx.appcompat.app.ActionBar;
46 import androidx.appcompat.app.AppCompatActivity;
47 import androidx.core.app.ActivityCompat;
48 import androidx.core.content.ContextCompat;
49 import androidx.fragment.app.FragmentTransaction;
50 import androidx.preference.PreferenceFragmentCompat;
51 import androidx.preference.PreferenceManager;
53 import java.util.HashMap;
60 public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver, IChangeScene, ICameraPowerOn.PowerOnCameraCallback, IInformationReceiver, ICardSlotSelector
62 private final String TAG = toString();
63 private IInterfaceProvider interfaceProvider = null;
64 private IStatusViewDrawer statusViewDrawer = null;
66 private PreferenceFragmentCompat preferenceFragment = null;
67 private PreferenceFragmentCompat preferenceFragmentOPC = null;
68 private PreferenceFragmentCompat preferenceFragmentOlympus = null;
69 private PreferenceFragmentCompat preferenceFragmentSony = null;
70 private PreferenceFragmentCompat preferenceFragmentRicoh = null;
71 private PreferenceFragmentCompat preferenceFragmentTheta = null;
72 private PreferenceFragmentCompat preferenceFragmentFuji = null;
73 private PreferenceFragmentCompat preferenceFragmentPanasonic = null;
74 private PreferenceFragmentCompat preferenceFragmentCanon = null;
75 private PreferenceFragmentCompat preferenceFragmentNikon = null;
76 private PreferenceFragmentCompat preferenceFragmentKodak = null;
78 private OlyCameraPropertyListFragment propertyListFragment = null;
79 private SonyCameraApiListFragment sonyApiListFragmentSony = null;
80 private LogCatFragment logCatFragment = null;
81 private LiveViewFragment liveViewFragment = null;
85 @SuppressLint("InlinedApi")
86 protected void onCreate(Bundle savedInstanceState)
88 final int REQUEST_NEED_PERMISSIONS = 1010;
90 super.onCreate(savedInstanceState);
94 if (Build.VERSION.SDK_INT >= 19)
96 View decor = this.getWindow().getDecorView();
97 decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
99 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
107 setContentView(R.layout.activity_a01d_main);
109 ActionBar bar = getSupportActionBar();
114 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
117 if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) ||
118 (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) ||
119 (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_MEDIA_LOCATION) != PackageManager.PERMISSION_GRANTED) ||
120 (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) ||
121 (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) ||
122 (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) ||
123 (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) ||
124 (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) ||
125 (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED)) {
127 ActivityCompat.requestPermissions(this,
130 Manifest.permission.WRITE_EXTERNAL_STORAGE,
131 Manifest.permission.READ_EXTERNAL_STORAGE,
132 Manifest.permission.ACCESS_MEDIA_LOCATION,
133 Manifest.permission.ACCESS_NETWORK_STATE,
134 Manifest.permission.ACCESS_WIFI_STATE,
135 Manifest.permission.BLUETOOTH,
136 Manifest.permission.BLUETOOTH_ADMIN,
137 Manifest.permission.ACCESS_COARSE_LOCATION,
138 Manifest.permission.INTERNET,
140 REQUEST_NEED_PERMISSIONS);
143 initializeFragment();
148 * なぜか、onReadyClass() が有効ではなさそうなので...
152 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
154 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
161 private void initializeClass()
165 interfaceProvider = new CameraInterfaceProvider(this, this, this, this);
176 private void onReadyClass()
180 // BLEでPower ONは、OPCのみ対応
181 if (interfaceProvider.getCammeraConnectionMethod() == ICameraConnection.CameraConnectionMethod.OPC)
183 // BLEでカメラの電源をONにする設定だった時
186 // カメラの電源ONクラスを呼び出しておく (電源ONができたら、コールバックをもらう)
187 interfaceProvider.getOlympusInterface().getCameraPowerOn().wakeup(this);
195 else if (isAutoConnectCamera())
198 changeCameraConnection();
205 private void initializeFragment()
209 //if (liveViewFragment == null)
211 liveViewFragment = LiveViewFragment.newInstance(this, interfaceProvider);
213 statusViewDrawer = liveViewFragment;
214 liveViewFragment.setRetainInstance(true);
215 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
216 transaction.replace(R.id.fragment1, liveViewFragment);
217 transaction.commitAllowingStateLoss();
229 protected void onPause()
234 ICameraConnection.CameraConnectionMethod method = interfaceProvider.getCammeraConnectionMethod();
235 ICameraConnection connection = getCameraConnection(method);
236 if (connection != null)
238 connection.stopWatchWifiStatus(this);
250 * (カメラと接続中のときのみ、接続方式が Olympusのときのみ)
253 public void changeSceneToCameraPropertyList()
257 ICameraConnection.CameraConnectionMethod method = interfaceProvider.getCammeraConnectionMethod();
258 if (method == ICameraConnection.CameraConnectionMethod.OPC)
260 changeSceneToCameraPropertyList(method);
271 * (カメラと接続中のときのみ、接続方式が Olympusのときのみ)
274 public void changeSceneToCameraPropertyList(ICameraConnection.CameraConnectionMethod connectionMethod)
278 if (connectionMethod == ICameraConnection.CameraConnectionMethod.RICOH_GR2)
282 // Ricohの場合は、コマンド送信ダイアログを表示する
283 RicohGr2SendCommandDialog.newInstance().show(getSupportFragmentManager(), "RicohGr2SendCommandDialog");
290 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.SONY)
292 // SONYの場合は、API一覧画面へ遷移させる
293 changeSceneToApiList();
295 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.PANASONIC)
299 // Panasonicの場合は、コマンド送信ダイアログを表示する
300 PanasonicSendCommandDialog.newInstance(interfaceProvider.getPanasonicInterface()).show(getSupportFragmentManager(), "panasonicSendCommandDialog");
307 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.FUJI_X)
311 // FUJI X Seriesの場合は、コマンド送信ダイアログを表示する
312 FujiXCameraCommandSendDialog.newInstance(interfaceProvider.getFujiXInterface()).show(getSupportFragmentManager(), "sendCommandDialog");
319 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.OLYMPUS)
323 Map<String, String> headerMap = new HashMap<>();
324 headerMap.put("User-Agent", "OlympusCameraKit"); // "OI.Share"
325 headerMap.put("X-Protocol", "OlympusCameraKit"); // "OI.Share"
327 // Olympus Penの場合は、コマンド送信ダイアログを表示する
328 SimpleHttpSendCommandDialog.newInstance("http://192.168.0.10/", interfaceProvider.getOlympusPenInterface().getLiveViewControl(), headerMap).show(getSupportFragmentManager(), "olympusPenSendCommandDialog");
335 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.THETA)
339 // THETA の場合は、HTTPコマンド送信ダイアログを表示する
340 SimpleHttpSendCommandDialog.newInstance("http://192.168.1.1/", null, null).show(getSupportFragmentManager(), "thetaSendCommandDialog");
347 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.CANON)
351 // CANON の場合は、PTPIPコマンド送信ダイアログを表示する
352 PtpIpCameraCommandSendDialog.newInstance(interfaceProvider.getCanonInterface(), true).show(getSupportFragmentManager(), "ptpipSendCommandDialog");
359 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.NIKON)
363 // NIKON の場合は、PTPIPコマンド送信ダイアログを表示する
364 PtpIpCameraCommandSendDialog.newInstance(interfaceProvider.getCanonInterface(), true).show(getSupportFragmentManager(), "ptpipSendCommandDialog");
374 Log.v(TAG, " Change Scene to propertyList :");
375 ICameraConnection connection = getCameraConnection(connectionMethod);
376 if (connection != null)
378 ICameraConnection.CameraConnectionStatus status = connection.getConnectionStatus();
379 if (status == ICameraConnection.CameraConnectionStatus.CONNECTED)
381 if (propertyListFragment == null)
383 propertyListFragment = OlyCameraPropertyListFragment.newInstance(this, interfaceProvider.getOlympusInterface().getCameraPropertyProvider());
385 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
386 transaction.replace(R.id.fragment1, propertyListFragment);
388 transaction.addToBackStack(null);
389 transaction.commit();
405 public void changeSceneToConfiguration()
409 if (preferenceFragment == null)
413 preferenceFragment = PreferenceFragmentSummary.newInstance(this, this);
420 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
421 transaction.replace(R.id.fragment1, preferenceFragment);
422 transaction.addToBackStack(null); // backstackに追加
423 transaction.commit();
432 public void changeSceneToConfiguration(ICameraConnection.CameraConnectionMethod connectionMethod)
436 PreferenceFragmentCompat targetFragment = null;
437 if (connectionMethod == ICameraConnection.CameraConnectionMethod.RICOH_GR2) {
438 if (preferenceFragmentRicoh == null)
440 preferenceFragmentRicoh = RicohGr2PreferenceFragment.newInstance(this, this);
442 targetFragment = preferenceFragmentRicoh;
443 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.SONY) {
444 if (preferenceFragmentSony == null)
446 preferenceFragmentSony = SonyPreferenceFragment.newInstance(this, this);
448 targetFragment = preferenceFragmentSony;
449 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.PANASONIC) {
450 if (preferenceFragmentPanasonic == null)
452 preferenceFragmentPanasonic = PanasonicPreferenceFragment.newInstance(this, this);
454 targetFragment = preferenceFragmentPanasonic;
455 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.OLYMPUS) {
456 if (preferenceFragmentOlympus == null)
458 preferenceFragmentOlympus = OlympusPreferenceFragment.newInstance(this, this);
460 targetFragment = preferenceFragmentOlympus;
461 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.FUJI_X) {
462 if (preferenceFragmentFuji == null)
464 preferenceFragmentFuji = FujiXPreferenceFragment.newInstance(this, this);
466 targetFragment = preferenceFragmentFuji;
467 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.THETA) {
468 if (preferenceFragmentTheta == null)
470 preferenceFragmentTheta = ThetaPreferenceFragment.newInstance(this, this);
472 targetFragment = preferenceFragmentTheta;
473 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.CANON) {
474 if (preferenceFragmentCanon == null)
476 preferenceFragmentCanon = CanonPreferenceFragment.newInstance(this, this);
478 targetFragment = preferenceFragmentCanon;
479 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.NIKON) {
480 if (preferenceFragmentNikon == null)
482 preferenceFragmentNikon = NikonPreferenceFragment.newInstance(this, this);
484 targetFragment = preferenceFragmentNikon;
485 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.KODAK) {
486 if (preferenceFragmentKodak == null)
488 preferenceFragmentKodak = KodakPreferenceFragment.newInstance(this, this);
490 targetFragment = preferenceFragmentKodak;
491 } else if (connectionMethod == ICameraConnection.CameraConnectionMethod.OPC) {
492 if (preferenceFragmentOPC == null)
494 preferenceFragmentOPC = PreferenceFragment.newInstance(this, interfaceProvider, this);
496 targetFragment = preferenceFragmentOPC;
498 if (targetFragment != null)
500 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
501 transaction.replace(R.id.fragment1, targetFragment);
502 transaction.addToBackStack(null); // backstackに追加
503 transaction.commit();
517 public void changeSceneToDebugInformation()
519 if (logCatFragment == null)
521 logCatFragment = LogCatFragment.newInstance();
523 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
524 transaction.replace(R.id.fragment1, logCatFragment);
526 transaction.addToBackStack(null);
527 transaction.commit();
535 public void changeSceneToApiList()
537 if (sonyApiListFragmentSony == null)
539 sonyApiListFragmentSony = SonyCameraApiListFragment.newInstance(interfaceProvider);
541 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
542 transaction.replace(R.id.fragment1, sonyApiListFragmentSony);
544 transaction.addToBackStack(null);
545 transaction.commit();
552 public void changeCameraConnection()
554 if (interfaceProvider == null)
556 Log.v(TAG, "changeCameraConnection() : interfaceProvider is NULL");
561 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
562 if (connection != null)
564 ICameraConnection.CameraConnectionStatus status = connection.getConnectionStatus();
565 if (status == ICameraConnection.CameraConnectionStatus.CONNECTED)
568 connection.disconnect(false);
572 connection.startWatchWifiStatus(this);
585 public void exitApplication()
587 Log.v(TAG, "exitApplication()");
590 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
591 if (connection != null)
593 connection.disconnect(true);
608 public void onStatusNotify(String message)
610 Log.v(TAG, " CONNECTION MESSAGE : " + message);
613 if (statusViewDrawer != null)
615 statusViewDrawer.updateStatusView(message);
616 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
617 if (connection != null)
619 statusViewDrawer.updateConnectionStatus(connection.getConnectionStatus());
634 public void onCameraConnected()
636 Log.v(TAG, "onCameraConnected()");
640 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
641 if (connection != null)
643 // クラス構造をミスった...のでこんなところで、無理やりステータスを更新する
644 connection.forceUpdateConnectionStatus(ICameraConnection.CameraConnectionStatus.CONNECTED);
646 if (statusViewDrawer != null)
648 statusViewDrawer.updateConnectionStatus(ICameraConnection.CameraConnectionStatus.CONNECTED);
651 statusViewDrawer.startLiveView();
665 public void onCameraDisconnected()
667 Log.v(TAG, "onCameraDisconnected()");
668 if (statusViewDrawer != null)
670 statusViewDrawer.updateStatusView(getString(R.string.camera_disconnected));
671 statusViewDrawer.updateConnectionStatus(ICameraConnection.CameraConnectionStatus.DISCONNECTED);
680 public void onCameraOccursException(String message, Exception e)
682 Log.v(TAG, "onCameraOccursException() " + message);
686 ICameraConnection connection = getCameraConnection(interfaceProvider.getCammeraConnectionMethod());
687 if (connection != null)
689 connection.alertConnectingFailed(message + " " + e.getLocalizedMessage());
691 if (statusViewDrawer != null)
693 statusViewDrawer.updateStatusView(message);
694 if (connection != null)
696 statusViewDrawer.updateConnectionStatus(connection.getConnectionStatus());
702 ee.printStackTrace();
707 * BLE経由でカメラの電源を入れるかどうか
710 private boolean isBlePowerOn()
715 if (interfaceProvider.getCammeraConnectionMethod() == ICameraConnection.CameraConnectionMethod.OPC)
717 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
718 ret = preferences.getBoolean(IPreferencePropertyAccessor.BLE_POWER_ON, false);
719 // Log.v(TAG, "isBlePowerOn() : " + ret);
733 private boolean isAutoConnectCamera()
738 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
739 ret = preferences.getBoolean(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, true);
740 // Log.v(TAG, "isAutoConnectCamera() : " + ret);
754 private ICameraConnection getCameraConnection(ICameraConnection.CameraConnectionMethod connectionMethod)
756 ICameraConnection connection;
757 if (connectionMethod == ICameraConnection.CameraConnectionMethod.RICOH_GR2)
759 connection = interfaceProvider.getRicohGr2Infterface().getRicohGr2CameraConnection();
761 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.SONY)
763 connection = interfaceProvider.getSonyInterface().getSonyCameraConnection();
765 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.PANASONIC)
767 connection = interfaceProvider.getPanasonicInterface().getPanasonicCameraConnection();
769 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.FUJI_X)
771 connection = interfaceProvider.getFujiXInterface().getFujiXCameraConnection();
773 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.OLYMPUS)
775 connection = interfaceProvider.getOlympusPenInterface().getOlyCameraConnection();
777 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.THETA)
779 connection = interfaceProvider.getThetaInterface().getCameraConnection();
781 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.CANON)
783 connection = interfaceProvider.getCanonInterface().getCameraConnection();
785 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.NIKON)
787 connection = interfaceProvider.getNikonInterface().getCameraConnection();
789 else if (connectionMethod == ICameraConnection.CameraConnectionMethod.KODAK)
791 connection = interfaceProvider.getKodakInterface().getCameraConnection();
793 else // if (connectionMethod == ICameraConnection.CameraConnectionMethod.OPC)
795 connection = interfaceProvider.getOlympusInterface().getOlyCameraConnection();
801 * カメラへのBLE接続指示が完了したとき
803 * @param isExecuted true : BLEで起動した, false : 起動していない、その他
806 public void wakeupExecuted(boolean isExecuted)
808 Log.v(TAG, "wakeupExecuted() : " + isExecuted);
809 if (isAutoConnectCamera())
811 // カメラへ自動接続する設定だった場合、カメラへWiFi接続する (BLEで起動しなくても)
812 changeCameraConnection();
818 public boolean onKeyDown(int keyCode, KeyEvent event)
820 Log.v(TAG, "onKeyDown()" + " " + keyCode);
823 if ((event.getAction() == KeyEvent.ACTION_DOWN)&&
824 ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
826 if (liveViewFragment != null)
828 return (liveViewFragment.handleKeyDown(keyCode, event));
836 return (super.onKeyDown(keyCode, event));
840 public void updateMessage(final String message, final boolean isBold, final boolean isColor, final int color)
842 Log.v(TAG, " updateMessage() : " + message);
845 final TextView messageArea = findViewById(R.id.message);
846 runOnUiThread(new Runnable() {
850 if ((messageArea != null) && (message != null))
852 messageArea.setText(message);
855 messageArea.setTypeface(Typeface.DEFAULT_BOLD);
859 messageArea.setTextColor(color);
863 messageArea.setTextColor(Color.DKGRAY);
865 messageArea.invalidate();
883 public void setupSlotSelector(boolean isEnable, @Nullable ICardSlotSelectionReceiver slotSelectionReceiver)
889 public void selectSlot(@NonNull String slotId)
895 public void changedCardSlot(@NonNull String slotId)