diff --git a/androidshared/src/main/java/org/odk/collect/androidshared/ui/ObviousProgressBar.kt b/androidshared/src/main/java/org/odk/collect/androidshared/ui/ObviousProgressBar.kt
index 00fa7d6d6d5..44315dc6a47 100644
--- a/androidshared/src/main/java/org/odk/collect/androidshared/ui/ObviousProgressBar.kt
+++ b/androidshared/src/main/java/org/odk/collect/androidshared/ui/ObviousProgressBar.kt
@@ -3,23 +3,31 @@ package org.odk.collect.androidshared.ui
import android.content.Context
import android.os.Handler
import android.util.AttributeSet
-import android.widget.ProgressBar
+import com.google.android.material.progressindicator.LinearProgressIndicator
/**
* A progress bar that shows for a minimum amount fo time so it's obvious to the user that
* something has happened.
*/
-class ObviousProgressBar(context: Context, attrs: AttributeSet?) : ProgressBar(context, attrs) {
+class ObviousProgressBar(
+ context: Context,
+ attrs: AttributeSet?
+) : LinearProgressIndicator(context, attrs) {
private val handler = Handler()
private var shownAt: Long? = null
- fun show() {
+ init {
+ super.setVisibility(GONE)
+ super.setIndeterminate(true)
+ }
+
+ override fun show() {
handler.removeCallbacksAndMessages(null)
shownAt = System.currentTimeMillis()
super.setVisibility(VISIBLE)
}
- fun hide() {
+ override fun hide() {
if (shownAt != null) {
val timeShown = System.currentTimeMillis() - shownAt!!
diff --git a/androidshared/src/main/res/layout/app_bar_layout.xml b/androidshared/src/main/res/layout/app_bar_layout.xml
index 9491eb32aeb..f9ad565a70c 100644
--- a/androidshared/src/main/res/layout/app_bar_layout.xml
+++ b/androidshared/src/main/res/layout/app_bar_layout.xml
@@ -1,23 +1,42 @@
+
+ android:layout_height="wrap_content"
+ app:liftOnScrollTargetViewId="@+id/scrollable_container">
-
+ android:layout_height="wrap_content">
-
+
+
+
+
diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/AppListActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/AppListActivity.java
index 0c5f4a3fe0f..9026e450600 100644
--- a/collect_app/src/main/java/org/odk/collect/android/activities/AppListActivity.java
+++ b/collect_app/src/main/java/org/odk/collect/android/activities/AppListActivity.java
@@ -131,7 +131,7 @@ public void setContentView(@LayoutRes int layoutResID) {
}
private void init() {
- listView = findViewById(android.R.id.list);
+ listView = findViewById(R.id.scrollable_container);
listView.setOnItemClickListener((AdapterView.OnItemClickListener) this);
listView.setEmptyView(findViewById(android.R.id.empty));
progressBar = findViewById(org.odk.collect.androidshared.R.id.progressBar);
diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java
index 751b787aec2..db817fc8d02 100644
--- a/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java
+++ b/collect_app/src/main/java/org/odk/collect/android/activities/FormFillingActivity.java
@@ -65,6 +65,7 @@
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
+import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.javarosa.core.model.FormDef;
@@ -263,6 +264,7 @@ public class FormFillingActivity extends LocalizedActivity implements AnimationL
private Animation inAnimation;
private Animation outAnimation;
+ private AppBarLayout appBarLayout;
private FrameLayout questionHolder;
private SwipeHandler.View currentView;
@@ -468,6 +470,7 @@ public void onCreate(Bundle savedInstanceState) {
formError = null;
+ appBarLayout = findViewById(org.odk.collect.androidshared.R.id.appBarLayout);
questionHolder = findViewById(R.id.questionholder);
initToolbar();
@@ -1417,6 +1420,7 @@ public void showView(SwipeHandler.View next, FormAnimationType from) {
} else {
animationCompletionSet = 2;
}
+ appBarLayout.setLiftOnScrollTargetViewId(R.id.odk_view_container);
// start InAnimation for transition...
currentView.startAnimation(inAnimation);
diff --git a/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java b/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java
index 4efcc0426f5..b7339bb73a7 100644
--- a/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java
+++ b/collect_app/src/main/java/org/odk/collect/android/instancemanagement/send/InstanceUploaderListActivity.java
@@ -195,7 +195,7 @@ public void onUploadButtonsClicked() {
public void setContentView(View view) {
super.setContentView(view);
- listView = findViewById(android.R.id.list);
+ listView = findViewById(R.id.scrollable_container);
listView.setOnItemClickListener((AdapterView.OnItemClickListener) this);
listView.setEmptyView(findViewById(android.R.id.empty));
progressBar = findViewById(org.odk.collect.androidshared.R.id.progressBar);
diff --git a/collect_app/src/main/res/layout/form_chooser_list.xml b/collect_app/src/main/res/layout/form_chooser_list.xml
index 9031ad503a1..25d5d784b5f 100644
--- a/collect_app/src/main/res/layout/form_chooser_list.xml
+++ b/collect_app/src/main/res/layout/form_chooser_list.xml
@@ -8,7 +8,7 @@
>(
private val onViewCreated: (MultiSelectListBinding) -> Unit = {}
) : Fragment() {
+ private var appBarLayout: AppBarLayout? = null
+ private lateinit var list: RecyclerView
+
override fun onAttach(context: Context) {
super.onAttach(context)
@@ -50,15 +55,19 @@ class MultiSelectListFragment>(
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ appBarLayout = requireActivity().findViewById(org.odk.collect.androidshared.R.id.appBarLayout)
+
val binding = MultiSelectListBinding.bind(view)
onViewCreated(binding)
- binding.list.layoutManager = LinearLayoutManager(requireContext())
+ list = binding.list
+ list.layoutManager = LinearLayoutManager(requireContext())
val adapter = MultiSelectAdapter(
multiSelectViewModel,
viewHolderFactory
)
- binding.list.adapter = adapter
+ list.adapter = adapter
+
multiSelectViewModel.getData().observe(viewLifecycleOwner) {
adapter.data = it
binding.empty.isVisible = it.isEmpty()
@@ -68,4 +77,9 @@ class MultiSelectListFragment>(
adapter.selected = it
}
}
+
+ override fun onResume() {
+ super.onResume()
+ appBarLayout?.setLiftOnScrollTargetView(list)
+ }
}