package com.thibaudperso.sonycamera.timelapse.ui.settings; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.Volley; import com.thibaudperso.sonycamera.R; import com.thibaudperso.sonycamera.sdk.CameraAPI; import com.thibaudperso.sonycamera.sdk.CameraAPI.ZoomAction; import com.thibaudperso.sonycamera.sdk.CameraAPI.ZoomDirection; import com.thibaudperso.sonycamera.sdk.StartLiveviewListener; import com.thibaudperso.sonycamera.sdk.TakePictureListener; import com.thibaudperso.sonycamera.timelapse.TimelapseApplication; import com.thibaudperso.sonycamera.timelapse.control.FileRequest; import com.thibaudperso.sonycamera.timelapse.ui.SimpleStreamSurfaceView; import com.thibaudperso.sonycamera.timelapse.ui.processing.ProcessingActivity; import java.io.File; public class CameraSettingsFragment extends Fragment { private final static int PREVIEW_PICTURE_ACTIVITY_RESULT = 0x1; private final static String PREVIEW_PICTURE_NAME = "preview_picture.jpg"; private CameraAPI mCameraAPI; private SimpleStreamSurfaceView liveviewSurfaceView; private File mTemporaryPreviewPicture; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mCameraAPI = ((TimelapseApplication) getActivity().getApplication()).getCameraAPI(); View rootView = inflater.inflate(R.layout.fragment_camera_settings, container, false); liveviewSurfaceView = (SimpleStreamSurfaceView) rootView.findViewById(R.id.cameraSettingsLiveview); View zoomInButton = rootView.findViewById(R.id.cameraSettingsZoomIn); View zoomOutButton = rootView.findViewById(R.id.cameraSettingsZoomOut); zoomInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCameraAPI.actZoom(ZoomDirection.IN); } }); zoomOutButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCameraAPI.actZoom(ZoomDirection.OUT); } }); zoomInButton.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View arg0) { mCameraAPI.actZoom(ZoomDirection.IN, ZoomAction.START); return true; } }); zoomOutButton.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View arg0) { mCameraAPI.actZoom(ZoomDirection.OUT, ZoomAction.START); return true; } }); zoomInButton.setOnTouchListener(new View.OnTouchListener() { long downTime = -1; @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (System.currentTimeMillis() - downTime > 500) { mCameraAPI.actZoom(ZoomDirection.IN, ZoomAction.STOP); } } if (event.getAction() == MotionEvent.ACTION_DOWN) { downTime = System.currentTimeMillis(); } return false; } }); zoomOutButton.setOnTouchListener(new View.OnTouchListener() { long downTime = -1; @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (System.currentTimeMillis() - downTime > 500) { mCameraAPI.actZoom(ZoomDirection.OUT, ZoomAction.STOP); } } if (event.getAction() == MotionEvent.ACTION_DOWN) { downTime = System.currentTimeMillis(); } return false; } }); CompoundButton useFlashButton = (CompoundButton) rootView.findViewById(R.id.cameraSettingsUseFlash); useFlashButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mCameraAPI.setFlash(isChecked); } }); rootView.findViewById(R.id.cameraSettingsTakePictureButton).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mCameraAPI.takePicture(new TakePictureListener() { @Override public void onResult(String url) { onResultPicture(url); } @Override public void onError(CameraAPI.ResponseCode responseCode, String responseMsg) {} }); } }); rootView.findViewById(R.id.cameraSettingsPrevious).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { getActivity().onBackPressed(); } }); rootView.findViewById(R.id.cameraSettingsNext).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getContext(), ProcessingActivity.class); startActivity(intent); } }); return rootView; } private void onResultPicture(String url) { // It's not possible to directly use ACTION_VIEW because the external app will use mobile // data network to try to download this image (by default) and it will fail. So we need to // use the current process to download and store it in a public directory. mTemporaryPreviewPicture = new File(getContext().getExternalCacheDir(), PREVIEW_PICTURE_NAME); Request request = new FileRequest<>(url, mTemporaryPreviewPicture, new Response.Listener<File>() { @Override public void onResponse(File file) { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(mTemporaryPreviewPicture), "image/jpeg"); startActivityForResult(intent, PREVIEW_PICTURE_ACTIVITY_RESULT); } }, new Response.ErrorListener() { public void onErrorResponse(VolleyError error) {} }); Volley.newRequestQueue(getContext()).add(request); } @Override public void onResume() { super.onResume(); startLiveView(); } @Override public void onPause() { super.onPause(); stopLiveView(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PREVIEW_PICTURE_ACTIVITY_RESULT && mTemporaryPreviewPicture != null && mTemporaryPreviewPicture.exists()) { mTemporaryPreviewPicture.delete(); mTemporaryPreviewPicture = null; } } private void startLiveView() { if (liveviewSurfaceView.isStarted() && mCameraAPI != null) { return; } mCameraAPI.startLiveView(new StartLiveviewListener() { @Override public void onResult(String liveviewUrl) { liveviewSurfaceView.start(liveviewUrl); } @Override public void onError(String error) { } }); } private void stopLiveView() { if (liveviewSurfaceView.isStarted()) { liveviewSurfaceView.stop(); } } }