Java tutorial
/* * Copyright (C) 2012 University of Washington * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.odk.collect.android.widgets; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.support.v4.content.FileProvider; import android.view.View; import android.widget.Button; import org.javarosa.form.api.FormEntryPrompt; import org.odk.collect.android.BuildConfig; import org.odk.collect.android.R; import org.odk.collect.android.activities.DrawActivity; import org.odk.collect.android.application.Collect; import org.odk.collect.android.listeners.PermissionListener; import org.odk.collect.android.utilities.FileUtils; import java.io.File; import java.util.Locale; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static org.odk.collect.android.utilities.ApplicationConstants.RequestCodes; /** * Image widget that supports annotations on the image. * * @author BehrAtherton@gmail.com * @author Carl Hartung (carlhartung@gmail.com) * @author Yaw Anokwa (yanokwa@gmail.com) */ @SuppressLint("ViewConstructor") public class AnnotateWidget extends BaseImageWidget { private Button captureButton; private Button chooseButton; private Button annotateButton; public AnnotateWidget(Context context, FormEntryPrompt prompt) { super(context, prompt); imageClickHandler = new DrawImageClickHandler(DrawActivity.OPTION_ANNOTATE, RequestCodes.ANNOTATE_IMAGE, R.string.annotate_image); imageCaptureHandler = new ImageCaptureHandler(); setUpLayout(); setUpBinary(); addAnswerView(answerLayout); } @Override protected void setUpLayout() { super.setUpLayout(); captureButton = getSimpleButton(getContext().getString(R.string.capture_image), R.id.capture_image); chooseButton = getSimpleButton(getContext().getString(R.string.choose_image), R.id.choose_image); annotateButton = getSimpleButton(getContext().getString(R.string.markup_image), R.id.markup_image); if (binaryName == null) { annotateButton.setEnabled(false); } annotateButton.setOnClickListener(v -> imageClickHandler.clickImage("annotateButton")); answerLayout.addView(captureButton); answerLayout.addView(chooseButton); answerLayout.addView(annotateButton); answerLayout.addView(errorTextView); hideButtonsIfNeeded(); errorTextView.setVisibility(View.GONE); } @Override public Intent addExtrasToIntent(Intent intent) { intent.putExtra(DrawActivity.SCREEN_ORIENTATION, calculateScreenOrientation()); return intent; } @Override public void clearAnswer() { super.clearAnswer(); annotateButton.setEnabled(false); // reset buttons captureButton.setText(getContext().getString(R.string.capture_image)); } @Override public void setOnLongClickListener(OnLongClickListener l) { captureButton.setOnLongClickListener(l); chooseButton.setOnLongClickListener(l); annotateButton.setOnLongClickListener(l); super.setOnLongClickListener(l); } @Override public void cancelLongPress() { super.cancelLongPress(); captureButton.cancelLongPress(); chooseButton.cancelLongPress(); annotateButton.cancelLongPress(); } @Override public void onButtonClick(int buttonId) { switch (buttonId) { case R.id.capture_image: getPermissionUtils().requestCameraPermission((Activity) getContext(), new PermissionListener() { @Override public void granted() { captureImage(); } @Override public void denied() { } }); break; case R.id.choose_image: imageCaptureHandler.chooseImage(R.string.annotate_image); break; } } private void hideButtonsIfNeeded() { if (getFormEntryPrompt().getAppearanceHint() != null && getFormEntryPrompt().getAppearanceHint().toLowerCase(Locale.ENGLISH).contains("new")) { chooseButton.setVisibility(View.GONE); } } private int calculateScreenOrientation() { Bitmap bmp = null; if (imageView != null) { bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); } return bmp != null && bmp.getHeight() > bmp.getWidth() ? SCREEN_ORIENTATION_PORTRAIT : SCREEN_ORIENTATION_LANDSCAPE; } private void captureImage() { errorTextView.setVisibility(View.GONE); Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); // We give the camera an absolute filename/path where to put the // picture because of bug: // http://code.google.com/p/android/issues/detail?id=1480 // The bug appears to be fixed in Android 2.0+, but as of feb 2, // 2010, G1 phones only run 1.6. Without specifying the path the // images returned by the camera in 1.6 (and earlier) are ~1/4 // the size. boo. Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".provider", new File(Collect.TMPFILE_PATH)); // if this gets modified, the onActivityResult in // FormEntyActivity will also need to be updated. intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri); FileUtils.grantFilePermissions(intent, uri, getContext()); imageCaptureHandler.captureImage(intent, RequestCodes.IMAGE_CAPTURE, R.string.annotate_image); } }