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) + } }