Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/assets/locales/android_translatable_strings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -933,4 +933,5 @@ in.app.update.error.playstore=Updating CommCare requires an official PlayStore a
in.app.update.error.invalid.request=Couldn't install CommCare update due to internal failure. Please try later.
in.app.update.error.internal.error=Couldn't install CommCare update due to internal error in PlayStore. Please try later.

button.clear.title=Clear
button.clear.title=Clear
media.missing.invalid.reference=Can't load media due to invalid reference: ${0}
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ dependencies {
implementation 'com.github.dimagi:zebra-print-android:v1.2'
implementation 'com.simprints:LibSimprints:1.0.12'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
Expand Down
205 changes: 205 additions & 0 deletions app/res/layout/media_layout.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good use of merge to avoid layout hierarchy.

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<!-- Used to shift barriers to the top of the layout. Needed for aligning media above text -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/top_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="0dp"/>

<!-- Helpful constraint to shift textContainer to the bottom of mediaView -->
<androidx.constraintlayout.widget.Barrier
android:id="@+id/media_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="top_guideline" />

<org.commcare.views.media.AudioPlaybackButton
android:id="@+id/audio_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/media_barrier" />

<ImageButton
android:id="@+id/video_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:src="@android:drawable/ic_media_play"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/audio_button" />

<androidx.constraintlayout.widget.Barrier
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Read about Barrier a bit and seems like a real useful addition to the set of Android views. Thanks for finding about these.

android:id="@+id/buttons_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="start"
app:constraint_referenced_ids="audio_button, video_button" />

<FrameLayout
android:id="@+id/question_text_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
app:layout_constraintEnd_toStartOf="@id/buttons_barrier"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/buttons_barrier"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/media_barrier" />

<androidx.constraintlayout.widget.Barrier
android:id="@+id/question_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="audio_button, video_button, question_text_container" />

<org.commcare.views.media.CommCareVideoView
android:id="@+id/inline_video_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<ImageView
android:id="@+id/qr_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:adjustViewBounds="true"
android:padding="@dimen/standard_spacer"
android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:padding="@dimen/standard_spacer"
android:scaleType="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<org.commcare.views.ResizingImageView
android:id="@+id/resizing_image"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:adjustViewBounds="true"
android:padding="@dimen/standard_spacer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<!-- Missing media view -->

<!-- Probably an easiest way to show a background color to the missing media view. -->
<View
android:id="@+id/missing_media_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="gone"
tools:visibility="visible"
android:background="@color/border_grey"
app:layout_constraintBottom_toBottomOf="@+id/missing_media_tv"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/question_barrier" />

<ImageView
android:id="@+id/download_media_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:layout_marginTop="@dimen/dp40"
android:scaleType="center"
android:src="@drawable/update_download_icon"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:layout_marginTop="@dimen/dp40"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/question_barrier" />

<TextView
android:id="@+id/missing_media_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:layout_marginTop="@dimen/dp40"
android:gravity="center_horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/download_media_icon" />

<androidx.constraintlayout.widget.Barrier
android:id="@+id/divider_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="audio_button, video_button, question_text_container, missing_media_tv" />

<ImageView
android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"
android:layout_alignParentBottom="true"
android:background="@android:drawable/divider_horizontal_bright"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider_barrier" />

</merge>
38 changes: 0 additions & 38 deletions app/res/layout/missing_media_view.xml

This file was deleted.

4 changes: 2 additions & 2 deletions app/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,6 @@
<!-- Map Info View -->
<dimen name="map_info_view_text_size">12sp</dimen>
<dimen name="map_info_view_text_padding">4dp</dimen>


<dimen name="dp40">40dp</dimen>
</resources>
6 changes: 3 additions & 3 deletions app/src/org/commcare/activities/FormEntryActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -873,8 +873,8 @@ private void saveInlineVideoState() {
if (uiController.questionsView != null) {
for (int i = 0; i < uiController.questionsView.getWidgets().size(); i++) {
QuestionWidget q = uiController.questionsView.getWidgets().get(i);
if (q.findViewById(MediaLayout.INLINE_VIDEO_PANE_ID) != null) {
VideoView inlineVideo = q.findViewById(MediaLayout.INLINE_VIDEO_PANE_ID);
if (q.findViewById(R.id.inline_video_view) != null) {
VideoView inlineVideo = q.findViewById(R.id.inline_video_view);
if (inlineVideo.isPlaying()) {
indexOfWidgetWithVideoPlaying = i;
positionOfVideoProgress = inlineVideo.getCurrentPosition();
Expand All @@ -888,7 +888,7 @@ private void saveInlineVideoState() {
private void restoreInlineVideoState() {
if (indexOfWidgetWithVideoPlaying != -1) {
QuestionWidget widgetWithVideoToResume = uiController.questionsView.getWidgets().get(indexOfWidgetWithVideoPlaying);
VideoView inlineVideo = widgetWithVideoToResume.findViewById(MediaLayout.INLINE_VIDEO_PANE_ID);
VideoView inlineVideo = widgetWithVideoToResume.findViewById(R.id.inline_video_view);
if (inlineVideo != null) {
inlineVideo.seekTo(positionOfVideoProgress);
inlineVideo.start();
Expand Down
33 changes: 19 additions & 14 deletions app/src/org/commcare/views/ResizingImageView.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Pair;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import org.commcare.dalvik.R;
import org.commcare.utils.FileUtil;
import org.javarosa.core.reference.InvalidReferenceException;
Expand All @@ -39,29 +41,32 @@ public class ResizingImageView extends ImageView {
private int mMaxWidth;
private int mMaxHeight;

private final GestureDetector gestureDetector;
private final ScaleGestureDetector scaleGestureDetector;
private GestureDetector gestureDetector;
private ScaleGestureDetector scaleGestureDetector;

private final String imageURI;
private final String bigImageURI;
private String imageURI;
private String bigImageURI;

private float scaleFactor = 1.0f;
private final static float scaleFactorThreshhold = 1.2f;

public ResizingImageView(Context context) {
this(context, null, null);
super(context);
}

public ResizingImageView(Context context, String imageURI, String bigImageURI) {
super(context);
gestureDetector = new GestureDetector(context, new GestureListener());
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleListener());
public ResizingImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

public ResizingImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public void setImageURI(String imageURI, String bigImageURI) {
gestureDetector = new GestureDetector(getContext(), new GestureListener());
scaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleListener());
this.imageURI = imageURI;
this.bigImageURI = bigImageURI;
ViewGroup.MarginLayoutParams imageViewParams = new ViewGroup.MarginLayoutParams(
ViewGroup.MarginLayoutParams.WRAP_CONTENT,
ViewGroup.MarginLayoutParams.WRAP_CONTENT);
this.setLayoutParams(imageViewParams);
}

@Override
Expand Down
14 changes: 13 additions & 1 deletion app/src/org/commcare/views/media/CommCareVideoView.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.commcare.views.media;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;

import java.util.Date;

/**
Expand All @@ -20,6 +22,14 @@ public CommCareVideoView(Context context) {
super(context);
}

public CommCareVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CommCareVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public void setListener(VideoDetachedListener listener) {
this.listener = listener;
}
Expand All @@ -39,7 +49,9 @@ public void start() {
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
listener.onVideoDetached(duration);
if (listener != null) {
listener.onVideoDetached(duration);
}
}

public interface VideoDetachedListener {
Expand Down
Loading