Use Compose to draw the list of recipes (#187)
* Add paging-compose dependency * Move progress indicator to separate module * Introduce color scheme preview * Move loading helper to UI module * Move helper composables to UI module * Rearrange shopping lists module * Add LazyPagingColumnPullRefresh Composable * Add BaseComposeFragment * Add pagingDataRecipeState * Add showFavoriteIcon to recipe state * Disable unused placeholders * Make "Try again" button optional * Fix example email * Wrap recipe info into a Scaffold * Add dialog to confirm deletion * Add RecipeItem Composable * Add RecipeListError Composable * Add RecipeList Composable * Replace recipes list Views with Compose * Update UI test * Remove application from ViewModel
This commit is contained in:
@@ -1,48 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.recipes.RecipesListFragment">
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/refresher"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recipes"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:itemCount="10"
|
||||
tools:listitem="@layout/view_holder_recipe" />
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/empty_list_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/fragment_recipes_list_no_recipes"
|
||||
android:textAppearance="?textAppearanceDisplaySmall"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.3" />
|
||||
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/progress"
|
||||
style="@style/IndeterminateProgress"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="?materialCardViewFilledStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/margin_medium"
|
||||
android:layout_marginStart="@dimen/margin_medium"
|
||||
android:layout_marginEnd="@dimen/margin_medium">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/margin_small"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textAppearance="?textAppearanceHeadline6"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="@+id/image"
|
||||
app:layout_constraintStart_toStartOf="@+id/image"
|
||||
app:layout_constraintTop_toBottomOf="@+id/image"
|
||||
tools:text="A delicious cake" />
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginHorizontal="@dimen/margin_medium"
|
||||
android:contentDescription="@string/content_description_view_holder_recipe_image"
|
||||
android:scaleType="centerCrop"
|
||||
app:layout_constraintBottom_toTopOf="@+id/name"
|
||||
app:layout_constraintDimensionRatio="2:1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/delete_icon"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:shapeAppearance="?shapeAppearanceCornerMedium"
|
||||
tools:srcCompat="@drawable/placeholder_recipe" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/favorite_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/margin_small"
|
||||
android:contentDescription="@string/view_holder_recipe_favorite_content_description"
|
||||
app:layout_constraintBottom_toTopOf="@+id/image"
|
||||
app:layout_constraintEnd_toEndOf="@id/image"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:srcCompat="@drawable/ic_favorite_unfilled"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/delete_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_medium"
|
||||
android:layout_marginVertical="@dimen/margin_small"
|
||||
android:contentDescription="@string/view_holder_recipe_delete_content_description"
|
||||
app:layout_constraintBottom_toTopOf="@+id/image"
|
||||
app:layout_constraintEnd_toStartOf="@id/favorite_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_goneMarginEnd="0dp"
|
||||
app:srcCompat="@drawable/ic_delete" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
@@ -13,9 +13,7 @@
|
||||
|
||||
<fragment
|
||||
android:id="@+id/recipesListFragment"
|
||||
android:name="gq.kirmanak.mealient.ui.recipes.RecipesListFragment"
|
||||
android:label="fragment_recipes"
|
||||
tools:layout="@layout/fragment_recipes_list">
|
||||
android:name="gq.kirmanak.mealient.ui.recipes.list.RecipesListFragment">
|
||||
<action
|
||||
android:id="@+id/action_recipesFragment_to_recipeInfoFragment"
|
||||
app:destination="@id/recipeInfoFragment"
|
||||
@@ -69,7 +67,7 @@
|
||||
|
||||
<fragment
|
||||
android:id="@+id/shoppingListsFragment"
|
||||
android:name="gq.kirmanak.mealient.shopping_lists.ui.ShoppingListsFragment" />
|
||||
android:name="gq.kirmanak.mealient.shopping_lists.ui.list.ShoppingListsFragment" />
|
||||
|
||||
<action
|
||||
android:id="@+id/action_global_authenticationFragment"
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Rezept erfolgreich gespeichert</string>
|
||||
<string name="fragment_add_recipe_clear_button">Klar</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Beispiel: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Beispiel: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Beispiel: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Beispiel: Demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Zuletzt geladene Seite</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Ladefehler: %1$s.</string>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Receta guardada con éxito</string>
|
||||
<string name="fragment_add_recipe_clear_button">Limpiar</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Ejemplo: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Ejemplo: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Ejemplo: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Ejemplo: demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Última página cargada</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Error al cargar: %1$s.</string>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Sauvegarde réussie de la recette</string>
|
||||
<string name="fragment_add_recipe_clear_button">Clair</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Exemple : demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Exemple : changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Exemple : changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Exemple : démo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Dernière page chargée</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Erreur de chargement : %1$s.</string>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Recept succesvol opgeslagen</string>
|
||||
<string name="fragment_add_recipe_clear_button">Duidelijk</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Voorbeeld: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Voorbeeld: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Voorbeeld: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Voorbeeld: demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Laatste pagina geladen</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Fout bij laden: %1$s.</string>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Receita guardada com sucesso</string>
|
||||
<string name="fragment_add_recipe_clear_button">Limpo</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Exemplo: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Exemplo: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Exemplo: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Exemplo: demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Última página carregada</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Erro de carregamento: %1$s.</string>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Рецепт сохранен успешно</string>
|
||||
<string name="fragment_add_recipe_clear_button">Очистить</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Пример: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Пример: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Пример: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Пример: demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Последняя страница</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Ошибка загрузки: %1$s.</string>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="fragment_add_recipe_save_success">Saved recipe successfully</string>
|
||||
<string name="fragment_add_recipe_clear_button">Clear</string>
|
||||
<string name="fragment_base_url_url_input_helper_text">Example: demo.mealie.io</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Example: changeme@email.com</string>
|
||||
<string name="fragment_authentication_email_input_helper_text">Example: changeme@example.com</string>
|
||||
<string name="fragment_authentication_password_input_helper_text">Example: demo</string>
|
||||
<string name="fragment_recipes_last_page_loaded_toast">Last page loaded</string>
|
||||
<string name="fragment_recipes_load_failure_toast" comment="EXAMPLE: Load error: unauthorized.">Load error: %1$s.</string>
|
||||
|
||||
Reference in New Issue
Block a user