1 package net.osdn.gokigen.gr2control.liveview;
3 import android.content.Context;
4 import android.content.SharedPreferences;
5 import android.graphics.Color;
6 import android.graphics.drawable.Drawable;
7 import android.os.Bundle;
8 import android.os.Vibrator;
10 import androidx.annotation.NonNull;
11 import androidx.appcompat.app.ActionBar;
12 import androidx.appcompat.app.AppCompatActivity;
13 import androidx.core.content.ContextCompat;
14 import androidx.core.content.res.ResourcesCompat;
15 import androidx.core.graphics.drawable.DrawableCompat;
16 import androidx.fragment.app.Fragment;
17 import androidx.fragment.app.FragmentActivity;
18 import androidx.preference.PreferenceManager;
20 import android.util.Log;
21 import android.view.KeyEvent;
22 import android.view.LayoutInflater;
23 import android.view.View;
24 import android.view.ViewGroup;
25 import android.widget.Button;
26 import android.widget.ImageView;
27 import android.widget.TextView;
29 import net.osdn.gokigen.gr2control.R;
30 import net.osdn.gokigen.gr2control.camera.ICameraButtonControl;
31 import net.osdn.gokigen.gr2control.camera.ICameraConnection;
32 import net.osdn.gokigen.gr2control.camera.ICameraInformation;
33 import net.osdn.gokigen.gr2control.camera.ICameraRunMode;
34 import net.osdn.gokigen.gr2control.camera.ICameraRunModeCallback;
35 import net.osdn.gokigen.gr2control.camera.ICameraStatus;
36 import net.osdn.gokigen.gr2control.camera.ICameraStatusWatcher;
37 import net.osdn.gokigen.gr2control.camera.IDisplayInjector;
38 import net.osdn.gokigen.gr2control.camera.IFocusingModeNotify;
39 import net.osdn.gokigen.gr2control.camera.IInterfaceProvider;
40 import net.osdn.gokigen.gr2control.camera.ILiveViewControl;
41 import net.osdn.gokigen.gr2control.camera.IZoomLensControl;
42 import net.osdn.gokigen.gr2control.camera.olympus.myolycameraprops.LoadSaveCameraProperties;
43 import net.osdn.gokigen.gr2control.camera.olympus.myolycameraprops.LoadSaveMyCameraPropertyDialog;
44 import net.osdn.gokigen.gr2control.liveview.liveviewlistener.ILiveViewListener;
45 import net.osdn.gokigen.gr2control.preference.IPreferencePropertyAccessor;
46 import net.osdn.gokigen.gr2control.scene.IChangeScene;
48 import static android.content.Context.VIBRATOR_SERVICE;
54 public class LiveViewFragment extends Fragment implements IStatusViewDrawer, IFocusingModeNotify, IFavoriteSettingDialogKicker, ICameraStatusUpdateNotify, LiveViewKeyPanelClickListener.KeyPanelFeedback, ICameraRunModeCallback
56 private final String TAG = this.toString();
58 private ILiveViewControl liveViewControl = null;
59 private IZoomLensControl zoomLensControl = null;
60 private IInterfaceProvider interfaceProvider = null;
61 private IDisplayInjector interfaceInjector = null;
62 //private OlympusCameraLiveViewListenerImpl liveViewListener = null;
63 private IChangeScene changeScene = null;
64 private ICameraInformation cameraInformation = null;
65 private ICameraStatusWatcher statusWatcher = null;
66 private LiveViewClickTouchListener onClickTouchListener = null;
67 private LiveViewControlPanelClickListener onPanelClickListener = null;
68 private LiveViewKeyPanelClickListener onKeyPanelClickListener = null;
69 private LiveViewFujiXKeyPanelClickListener fujiXOnKeyPanelClickListener = null;
71 private TextView statusArea = null;
72 private TextView focalLengthArea = null;
73 private CameraLiveImageView imageView = null;
75 private ImageView manualFocus = null;
76 private ImageView showGrid = null;
77 private ImageView connectStatus = null;
78 private Button changeLiveViewScale = null;
80 private boolean imageViewCreated = false;
81 private View myView = null;
82 private String messageValue = "";
84 private ICameraConnection.CameraConnectionStatus currentConnectionStatus = ICameraConnection.CameraConnectionStatus.UNKNOWN;
86 public static LiveViewFragment newInstance(IChangeScene sceneSelector, @NonNull IInterfaceProvider provider)
88 LiveViewFragment instance = new LiveViewFragment();
89 instance.prepare(sceneSelector, provider);
91 // パラメータはBundleにまとめておく
92 Bundle arguments = new Bundle();
93 //arguments.putString("title", title);
94 //arguments.putString("message", message);
95 instance.setArguments(arguments);
105 public void onCreate(Bundle savedInstanceState)
107 super.onCreate(savedInstanceState);
108 Log.v(TAG, "onCreate()");
110 if (liveViewListener == null)
112 liveViewListener = new OlympusCameraLiveViewListenerImpl();
122 public void onAttach(@NonNull Context context)
124 super.onAttach(context);
125 Log.v(TAG, "onAttach()");
133 public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
135 super.onCreateView(inflater, container, savedInstanceState);
137 Log.v(TAG, "onCreateView()");
138 if ((imageViewCreated)&&(myView != null))
141 Log.v(TAG, "onCreateView() : called again, so do nothing... : " + myView);
145 View view = inflater.inflate(R.layout.fragment_live_view, container, false);
147 imageViewCreated = true;
151 imageView = view.findViewById(R.id.cameraLiveImageView);
152 if (interfaceInjector != null)
154 interfaceInjector.injectDisplay(imageView, imageView, this);
158 Log.v(TAG, "interfaceInjector is NULL...");
160 FragmentActivity activity = this.getActivity();
161 Vibrator vibrator = (activity != null) ? (Vibrator) activity.getSystemService(VIBRATOR_SERVICE) : null;
162 if ((onClickTouchListener == null)&&(activity != null))
164 onClickTouchListener = new LiveViewClickTouchListener(activity, imageView, this, changeScene, interfaceProvider, this);
166 imageView.setOnClickListener(onClickTouchListener);
167 imageView.setOnTouchListener(onClickTouchListener);
170 view.setOnKeyListener(onClickTouchListener);
171 view.setFocusableInTouchMode(true);
173 setOnClickListener(view, R.id.hideControlPanelTextView);
174 setOnClickListener(view, R.id.showControlPanelTextView);
175 setOnClickListener(view, R.id.showKeyPanelImageView);
176 setOnClickListener(view, R.id.hideKeyPanelTextView);
177 setOnClickListener(view, R.id.shutter_button);
178 setOnClickListener(view, R.id.focusUnlockImageView);
179 setOnClickListener(view, R.id.show_images_button);
180 setOnClickListener(view, R.id.camera_power_off_button);
181 setOnClickListener(view, R.id.show_preference_button);
182 setOnClickListener(view, R.id.show_hide_grid_button);
183 setOnClickListener(view, R.id.zoom_in_button);
184 setOnClickListener(view, R.id.zoom_out_button);
185 setOnClickListener(view, R.id.specialButtonImageView);
186 setOnClickListener(view, R.id.fuji_x_hideKeyPanelTextView);
188 if (onPanelClickListener == null)
190 onPanelClickListener = new LiveViewControlPanelClickListener(activity, interfaceProvider);
192 setPanelClickListener(view, R.id.takemodeTextView);
193 setPanelClickListener(view, R.id.shutterSpeedTextView);
194 setPanelClickListener(view, R.id.apertureValueTextView);
195 setPanelClickListener(view, R.id.exposureCompensationTextView);
196 setPanelClickListener(view, R.id.aeModeImageView);
197 setPanelClickListener(view, R.id.whiteBalanceTextView);
198 setPanelClickListener(view, R.id.isoSensitivityTextView);
199 setPanelClickListener(view, R.id.setEffectImageView);
201 if (onKeyPanelClickListener == null)
203 onKeyPanelClickListener = new LiveViewKeyPanelClickListener(interfaceProvider, this, vibrator);
205 setKeyPanelClickListener(view, R.id.button_front_left);
206 setKeyPanelClickListener(view, R.id.button_front_right);
207 setKeyPanelClickListener(view, R.id.button_adjust_left);
208 setKeyPanelClickListener(view, R.id.button_adjust_enter);
209 setKeyPanelClickListener(view, R.id.button_adjust_right);
210 setKeyPanelClickListener(view, R.id.button_toggle_aeaf);
211 setKeyPanelClickListener(view, R.id.lever_ael_caf);
212 setKeyPanelClickListener(view, R.id.button_up);
213 setKeyPanelClickListener(view, R.id.button_left);
214 setKeyPanelClickListener(view, R.id.button_center_enter);
215 setKeyPanelClickListener(view, R.id.button_right);
216 setKeyPanelClickListener(view, R.id.button_down);
217 setKeyPanelClickListener(view, R.id.button_function_1);
218 setKeyPanelClickListener(view, R.id.button_function_2);
219 setKeyPanelClickListener(view, R.id.button_function_3);
220 setKeyPanelClickListener(view, R.id.button_plus);
221 setKeyPanelClickListener(view, R.id.button_minus);
222 setKeyPanelClickListener(view, R.id.button_playback);
223 setKeyPanelClickListener(view, R.id.button_acclock);
224 setKeyPanelClickListener(view, R.id.button_lcd_onoff);
225 setKeyPanelClickListener(view, R.id.button_highlight);
227 if (fujiXOnKeyPanelClickListener == null)
229 fujiXOnKeyPanelClickListener = new LiveViewFujiXKeyPanelClickListener(interfaceProvider, vibrator);
231 //setFujiXKeyPanelClickListener(view, xxx);
234 connectStatus = view.findViewById(R.id.connect_disconnect_button);
235 if (connectStatus != null)
237 connectStatus.setOnClickListener(onClickTouchListener);
240 View keyPanel = view.findViewById(R.id.showKeyPanelImageView);
241 ICameraButtonControl buttonControl = interfaceProvider.getButtonControl();
242 if (keyPanel != null)
244 keyPanel.setVisibility((buttonControl == null) ? View.INVISIBLE : View.VISIBLE);
245 keyPanel.invalidate();
256 private void setOnClickListener(View view, int id)
260 View button = view.findViewById(id);
263 button.setOnClickListener(onClickTouchListener);
272 private void setPanelClickListener(View view, int id)
276 View button = view.findViewById(id);
279 button.setOnClickListener(onPanelClickListener);
288 private void setKeyPanelClickListener(View view, int id)
292 View button = view.findViewById(id);
295 button.setOnClickListener(onKeyPanelClickListener);
296 button.setOnLongClickListener(onKeyPanelClickListener);
305 private void setFujiXKeyPanelClickListener(View view, int id)
309 View button = view.findViewById(id);
312 button.setOnClickListener(fujiXOnKeyPanelClickListener);
313 button.setOnLongClickListener(fujiXOnKeyPanelClickListener);
325 private void prepare(IChangeScene sceneSelector, IInterfaceProvider interfaceProvider)
327 Log.v(TAG, "prepare()");
329 this.changeScene = sceneSelector;
330 this.interfaceProvider = interfaceProvider;
331 this.interfaceInjector = interfaceProvider.getDisplayInjector();
332 this.liveViewControl = interfaceProvider.getLiveViewControl();
333 this.zoomLensControl = interfaceProvider.getZoomLensControl();
334 this.cameraInformation = interfaceProvider.getCameraInformation();
335 this.statusWatcher = interfaceProvider.getCameraStatusWatcher();
343 public void updateConnectionStatus(final ICameraConnection.CameraConnectionStatus connectionStatus)
347 currentConnectionStatus = connectionStatus;
348 runOnUiThread(new Runnable()
353 int id = R.drawable.ic_cloud_off_black_24dp;
354 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTING)
356 id = R.drawable.ic_cloud_queue_black_24dp;
358 else if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
360 id = R.drawable.ic_cloud_done_black_24dp;
362 if (connectStatus != null)
364 connectStatus.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
365 connectStatus.invalidate();
367 if (imageView != null)
369 imageView.invalidate();
386 public void updateGridIcon()
390 FragmentActivity activity = getActivity();
391 if (activity != null)
393 if (showGrid == null) {
394 showGrid = activity.findViewById(R.id.show_hide_grid_button);
396 activity.runOnUiThread(new Runnable() {
400 int id = (imageView.isShowGrid()) ? R.drawable.ic_grid_off_black_24dp : R.drawable.ic_grid_on_black_24dp;
401 if (showGrid != null)
403 showGrid.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
404 showGrid.invalidate();
406 imageView.invalidate();
422 public void changedFocusingMode()
426 if ((cameraInformation == null)||(manualFocus == null))
430 runOnUiThread(new Runnable()
435 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
437 manualFocus.setSelected(cameraInformation.isManualFocus());
438 manualFocus.invalidate();
450 public void updateLiveViewScale(boolean isChangeScale)
454 Log.v(TAG, "updateLiveViewScale() : " + isChangeScale);
457 liveViewControl.updateMagnifyingLiveViewScale(isChangeScale);
460 float scale = liveViewControl.getMagnifyingLiveViewScale();
461 final String datavalue = "LV: " + scale;
464 float digitalZoom = liveViewControl.getDigitalZoomScale();
465 final String digitalValue = (digitalZoom > 1.0f) ? "D x" + digitalZoom : "";
468 runOnUiThread(new Runnable()
473 changeLiveViewScale.setText(datavalue);
474 changeLiveViewScale.postInvalidate();
476 focalLengthArea.setText(digitalValue);
477 focalLengthArea.postInvalidate();
493 public void onStart()
496 Log.v(TAG, "onStart()");
504 public void onResume()
507 Log.v(TAG, "onResume() Start");
509 AppCompatActivity activity = (AppCompatActivity)getActivity();
510 if (activity != null)
512 ActionBar bar = activity.getSupportActionBar();
515 bar.hide(); // ActionBarの表示を消す
519 // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
520 ICameraRunMode changeRunModeExecutor = interfaceProvider.getCameraRunMode();
521 if ((changeRunModeExecutor != null)&&(!changeRunModeExecutor.isRecordingMode()))
523 // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。)
524 changeRunModeExecutor.changeRunMode(true, this);
525 Log.v(TAG, "onResume() End");
529 Log.v(TAG, "onResume() End");
532 private void prepareToStart()
536 Context context = getContext();
539 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
541 // グリッド・フォーカスアシストの情報を戻す
542 boolean showGrid = preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false);
543 if ((imageView != null) && (imageView.isShowGrid() != showGrid)) {
544 imageView.toggleShowGridFrame();
545 imageView.postInvalidate();
548 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
560 public void onCompleted(boolean isRecording)
566 public void onErrorOccurred(boolean isRecording)
576 public void onPause()
579 Log.v(TAG, "onPause() Start");
584 liveViewControl.stopLiveView();
592 Log.v(TAG, "onPause() End");
600 public void updateStatusView(String message)
602 messageValue = message;
603 runOnUiThread(new Runnable()
606 * カメラの状態(ステータステキスト)を更新する
607 * (ステータステキストは、プライベート変数で保持して、書き換える)
612 if (statusArea != null)
614 statusArea.setText(messageValue);
615 statusArea.invalidate();
626 public void startLiveView()
628 Log.v(TAG, " LiveViewFragment::startLiveView() ");
629 ICameraConnection.CameraConnectionMethod connectionMethod = interfaceProvider.getCammeraConnectionMethod();
630 if (liveViewControl == null)
632 if (connectionMethod == ICameraConnection.CameraConnectionMethod.OPC)
634 Log.v(TAG, "startLiveView() : liveViewControl is null.");
640 prepare(changeScene, interfaceProvider);
646 Context context = getContext();
647 boolean isCameraScreen = true;
650 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
651 liveViewControl.changeLiveViewSize(preferences.getString(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY, IPreferencePropertyAccessor.LIVE_VIEW_QUALITY_DEFAULT_VALUE));
652 isCameraScreen = preferences.getBoolean(IPreferencePropertyAccessor.GR2_DISPLAY_CAMERA_VIEW, true);
654 ILiveViewListener lvListener = interfaceProvider.getLiveViewListener();
655 if (lvListener != null)
657 lvListener.setCameraLiveImageView(imageView);
659 liveViewControl.startLiveView(isCameraScreen); // false : ライブビューのみ、 true : カメラ画面をミラー
664 // ここでズームレンズ制御ができるか確認する
665 if ((zoomLensControl != null)&&(zoomLensControl.canZoom()))
667 //Log.v(TAG, "CAN ZOOM LENS");
668 updateZoomlensControl(true);
672 //Log.v(TAG, "NO ZOOM LENS");
673 updateZoomlensControl(false);
687 public void showFavoriteSettingDialog()
691 Log.v(TAG, "showFavoriteSettingDialog()");
692 LoadSaveMyCameraPropertyDialog dialog = LoadSaveMyCameraPropertyDialog.newInstance(new LoadSaveCameraProperties(getActivity(), interfaceProvider.getOlympusInterfaceProvider()));
693 dialog.show(getChildFragmentManager(), "favorite_dialog");
706 private void updateZoomlensControl(final boolean isVisible)
708 runOnUiThread(new Runnable() {
711 // isVisibleがtrueなら、ズームレンズボタンを有効にする
712 FragmentActivity activity = getActivity();
713 if (activity != null)
717 View view1 = activity.findViewById(R.id.zoom_out_button);
720 view1.setVisibility((isVisible) ? View.VISIBLE : View.INVISIBLE);
724 View view2 = activity.findViewById(R.id.zoom_in_button);
727 view2.setVisibility((isVisible) ? View.VISIBLE : View.INVISIBLE);
744 private void startWatchStatus()
746 if (statusWatcher != null)
748 statusWatcher.startStatusWatch(this);
756 private void stopWatchStatus()
758 if (statusWatcher != null)
760 statusWatcher.stopStatusWatch();
768 private void runOnUiThread(Runnable action)
770 FragmentActivity activity = getActivity();
771 if (activity == null)
775 activity.runOnUiThread(action);
779 public void updatedTakeMode(final String mode)
783 final FragmentActivity activity = getActivity();
784 if (activity == null)
788 activity.runOnUiThread(new Runnable()
793 TextView view = activity.findViewById(R.id.takemodeTextView);
809 public void updatedShutterSpeed(final String tv)
813 final String shutterSpeed = tv.replace(".", "/");
814 final FragmentActivity activity = getActivity();
815 if (activity == null)
819 activity.runOnUiThread(new Runnable()
824 TextView view = activity.findViewById(R.id.shutterSpeedTextView);
826 view.setText(shutterSpeed);
840 public void updatedAperture(final String av)
844 final String apertureValue = (av.length() > 1) ? ("F" + av) : "";
845 final FragmentActivity activity = getActivity();
846 if (activity == null)
850 activity.runOnUiThread(new Runnable()
855 TextView view = activity.findViewById(R.id.apertureValueTextView);
858 view.setText(apertureValue);
871 public void updatedExposureCompensation(final String xv)
875 final FragmentActivity activity = getActivity();
876 if (activity == null)
880 activity.runOnUiThread(new Runnable()
885 TextView view = activity.findViewById(R.id.exposureCompensationTextView);
901 public void updatedMeteringMode(final String meteringMode)
905 Log.v(TAG, "updatedMeteringMode() : " + meteringMode);
906 final FragmentActivity activity = getActivity();
907 if ((activity == null)||(meteringMode == null))
912 int iconId = R.drawable.ic_crop_free_black_24dp;
913 switch (meteringMode)
915 case ICameraStatus.AE_STATUS_MULTI:
916 case ICameraStatus.AE_STATUS_ESP:
917 iconId = R.drawable.ic_crop_free_black_24dp;
919 case ICameraStatus.AE_STATUS_CENTER:
920 case ICameraStatus.AE_STATUS_CENTER2:
921 iconId = R.drawable.ic_center_focus_weak_black_24dp;
923 case ICameraStatus.AE_STATUS_SPOT:
924 case ICameraStatus.AE_STATUS_PINPOINT:
925 iconId = R.drawable.ic_filter_center_focus_black_24dp;
928 final int id = iconId;
929 activity.runOnUiThread(new Runnable()
934 ImageView view = activity.findViewById(R.id.aeModeImageView);
937 view.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
950 public void updatedWBMode(final String wbMode)
952 // とりあえず何もしない... 選択肢は以下 (Ricohの場合...)
953 // auto, multiAuto, daylight, shade, cloud, tungsten, warmWhiteFluorescent, daylightFluorescent, dayWhiteFluorescent, coolWhiteFluorescent, incandescent,manual1, cte, custom
961 public void updateRemainBattery(final int percentage)
965 final FragmentActivity activity = getActivity();
966 if (activity == null)
973 iconId = R.drawable.ic_battery_alert_black_24dp;
975 else if (percentage < 60)
977 iconId = R.drawable.ic_battery_20_black_24dp;
979 else if (percentage < 80)
981 iconId = R.drawable.ic_battery_60_black_24dp;
985 iconId = R.drawable.ic_battery_full_black_24dp;
987 final int id = iconId;
988 activity.runOnUiThread(new Runnable()
993 ImageView view = activity.findViewById(R.id.currentBatteryImageView);
996 Drawable target = ResourcesCompat.getDrawable(getResources(), id, null);
999 if (percentage <= 20)
1001 DrawableCompat.setTint(target, Color.RED);
1002 } else if (percentage <= 40)
1004 DrawableCompat.setTint(target, Color.YELLOW);
1006 view.setImageDrawable(target);
1015 e.printStackTrace();
1020 public void updateFocusedStatus(final boolean focused, final boolean focusLocked)
1022 final FragmentActivity activity = getActivity();
1025 if (activity != null)
1027 activity.runOnUiThread(new Runnable() {
1032 ImageView view = activity.findViewById(R.id.focusUnlockImageView);
1034 Drawable icon = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_center_focus_strong_black_24dp, null);
1036 DrawableCompat.setTint(icon, Color.GREEN);
1037 view.setImageDrawable(icon);
1040 Drawable icon = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_focus_free_black_24dp, null);
1042 int color = Color.BLACK;
1046 DrawableCompat.setTint(icon, color);
1047 view.setImageDrawable(icon);
1054 e.printStackTrace();
1062 e.printStackTrace();
1067 public void updateIsoSensitivity(String sv)
1069 Log.v(TAG, "updateIsoSensitivity : " + sv);
1073 public void updateWarning(String warning)
1075 Log.v(TAG, "updateWarning : " + warning);
1079 public void updateStorageStatus(String status)
1081 Log.v(TAG, "updateStorageStatus : " + status);
1085 public void updateToggleButton(boolean isOn)
1089 FragmentActivity activity = getActivity();
1090 if (activity != null)
1092 ImageView imageView = activity.findViewById(R.id.button_toggle_aeaf);
1095 imageView.setImageDrawable(ContextCompat.getDrawable(activity,R.drawable.ic_radio_button_checked_black_24dp));
1099 imageView.setImageDrawable(ContextCompat.getDrawable(activity,R.drawable.ic_radio_button_unchecked_black_24dp));
1101 imageView.invalidate();
1106 e.printStackTrace();
1111 public void updateLcdOnOff(boolean isOn)
1113 Log.v(TAG, "updateLcdOnOff() " + isOn);
1117 public void updateAFLlever(boolean isCaf)
1121 FragmentActivity activity = getActivity();
1122 if (activity != null)
1124 TextView textView = activity.findViewById(R.id.lever_ael_caf);
1127 textView.setText(getString(R.string.label_c_af));
1131 textView.setText(getString(R.string.label_aelock));
1133 textView.invalidate();
1138 e.printStackTrace();
1142 public boolean handleKeyDown(int keyCode, KeyEvent event)
1144 return (onClickTouchListener.onKey(null, keyCode, event));