mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-29 05:43:55 +01:00
Feature: Bookmark Categories (#6035)
* database setup and insert/delete working Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * add new categories screen in bookmarks page Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * add theme Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * set tab layout scrollable Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * cleanup Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * fix tests Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * bump database version Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> * add docs Signed-off-by: parneet-guraya <gurayaparneet@gmail.com> --------- Signed-off-by: parneet-guraya <gurayaparneet@gmail.com>
This commit is contained in:
parent
0153cbe0ed
commit
5500b03976
15 changed files with 410 additions and 11 deletions
|
|
@ -7,13 +7,13 @@ import android.view.LayoutInflater;
|
|||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import fr.free.nrw.commons.Media;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.bookmarks.category.BookmarkCategoriesFragment;
|
||||
import fr.free.nrw.commons.bookmarks.items.BookmarkItemsFragment;
|
||||
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsFragment;
|
||||
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesFragment;
|
||||
|
|
@ -48,14 +48,21 @@ public class BookmarkListRootFragment extends CommonsDaggerSupportFragment imple
|
|||
String title = bundle.getString("categoryName");
|
||||
int order = bundle.getInt("order");
|
||||
final int orderItem = bundle.getInt("orderItem");
|
||||
if (order == 0) {
|
||||
listFragment = new BookmarkPicturesFragment();
|
||||
} else {
|
||||
listFragment = new BookmarkLocationsFragment();
|
||||
|
||||
switch (order){
|
||||
case 0: listFragment = new BookmarkPicturesFragment();
|
||||
break;
|
||||
|
||||
case 1: listFragment = new BookmarkLocationsFragment();
|
||||
break;
|
||||
|
||||
case 3: listFragment = new BookmarkCategoriesFragment();
|
||||
break;
|
||||
}
|
||||
if(orderItem == 2) {
|
||||
listFragment = new BookmarkItemsFragment();
|
||||
}
|
||||
}
|
||||
|
||||
Bundle featuredArguments = new Bundle();
|
||||
featuredArguments.putString("categoryName", title);
|
||||
listFragment.setArguments(featuredArguments);
|
||||
|
|
|
|||
|
|
@ -49,6 +49,13 @@ public class BookmarksPagerAdapter extends FragmentPagerAdapter {
|
|||
new BookmarkListRootFragment(locationBundle, this),
|
||||
context.getString(R.string.title_page_bookmarks_items)));
|
||||
}
|
||||
final Bundle categoriesBundle = new Bundle();
|
||||
categoriesBundle.putString("categoryName",
|
||||
context.getString(R.string.title_page_bookmarks_categories));
|
||||
categoriesBundle.putInt("order", 3);
|
||||
pages.add(new BookmarkPages(
|
||||
new BookmarkListRootFragment(categoriesBundle, this),
|
||||
context.getString(R.string.title_page_bookmarks_categories)));
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
package fr.free.nrw.commons.bookmarks.category
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Delete
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/**
|
||||
* Bookmark categories dao
|
||||
*
|
||||
* @constructor Create empty Bookmark categories dao
|
||||
*/
|
||||
@Dao
|
||||
interface BookmarkCategoriesDao {
|
||||
|
||||
/**
|
||||
* Insert or Delete category bookmark into DB
|
||||
*
|
||||
* @param bookmarksCategoryModal
|
||||
*/
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insert(bookmarksCategoryModal: BookmarksCategoryModal)
|
||||
|
||||
|
||||
/**
|
||||
* Delete category bookmark from DB
|
||||
*
|
||||
* @param bookmarksCategoryModal
|
||||
*/
|
||||
@Delete
|
||||
suspend fun delete(bookmarksCategoryModal: BookmarksCategoryModal)
|
||||
|
||||
/**
|
||||
* Checks if given category exist in DB
|
||||
*
|
||||
* @param categoryName
|
||||
* @return
|
||||
*/
|
||||
@Query("SELECT EXISTS (SELECT 1 FROM bookmarks_categories WHERE categoryName = :categoryName)")
|
||||
suspend fun doesExist(categoryName: String): Boolean
|
||||
|
||||
/**
|
||||
* Get all categories
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Query("SELECT * FROM bookmarks_categories")
|
||||
fun getAllCategories(): Flow<List<BookmarksCategoryModal>>
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
package fr.free.nrw.commons.bookmarks.category
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.darkColorScheme
|
||||
import androidx.compose.material3.lightColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||
import androidx.compose.ui.res.colorResource
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import dagger.android.support.DaggerFragment
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.category.CategoryDetailsActivity
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Tab fragment to show list of bookmarked Categories
|
||||
*/
|
||||
class BookmarkCategoriesFragment : DaggerFragment() {
|
||||
|
||||
@Inject
|
||||
lateinit var bookmarkCategoriesDao: BookmarkCategoriesDao
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
return ComposeView(requireContext()).apply {
|
||||
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
||||
setContent {
|
||||
MaterialTheme(
|
||||
colorScheme = if (isSystemInDarkTheme()) darkColorScheme(
|
||||
primary = colorResource(R.color.primaryDarkColor),
|
||||
surface = colorResource(R.color.main_background_dark),
|
||||
background = colorResource(R.color.main_background_dark)
|
||||
) else lightColorScheme(
|
||||
primary = colorResource(R.color.primaryColor),
|
||||
surface = colorResource(R.color.main_background_light),
|
||||
background = colorResource(R.color.main_background_light)
|
||||
)
|
||||
) {
|
||||
val listOfBookmarks by bookmarkCategoriesDao.getAllCategories()
|
||||
.collectAsStateWithLifecycle(initialValue = emptyList())
|
||||
Surface(modifier = Modifier.fillMaxSize()) {
|
||||
Box(contentAlignment = Alignment.Center) {
|
||||
if (listOfBookmarks.isEmpty()) {
|
||||
Text(
|
||||
text = stringResource(R.string.bookmark_empty),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = if (isSystemInDarkTheme()) Color(0xB3FFFFFF)
|
||||
else Color(
|
||||
0x8A000000
|
||||
)
|
||||
)
|
||||
} else {
|
||||
LazyColumn(modifier = Modifier.fillMaxSize()) {
|
||||
items(items = listOfBookmarks) { bookmarkItem ->
|
||||
CategoryItem(
|
||||
categoryName = bookmarkItem.categoryName,
|
||||
onClick = {
|
||||
val categoryDetailsIntent = Intent(
|
||||
requireContext(),
|
||||
CategoryDetailsActivity::class.java
|
||||
).putExtra("categoryName", it)
|
||||
startActivity(categoryDetailsIntent)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
fun CategoryItem(
|
||||
modifier: Modifier = Modifier,
|
||||
onClick: (String) -> Unit,
|
||||
categoryName: String
|
||||
) {
|
||||
Row(modifier = modifier.clickable {
|
||||
onClick(categoryName)
|
||||
}) {
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Image(
|
||||
modifier = Modifier.size(48.dp),
|
||||
painter = painterResource(R.drawable.commons),
|
||||
contentDescription = null
|
||||
)
|
||||
},
|
||||
headlineContent = {
|
||||
Text(
|
||||
text = categoryName,
|
||||
maxLines = 2,
|
||||
color = if (isSystemInDarkTheme()) Color.White else Color.Black,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
fontWeight = FontWeight.SemiBold
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun CategoryItemPreview() {
|
||||
CategoryItem(
|
||||
onClick = {},
|
||||
categoryName = "Test Category"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package fr.free.nrw.commons.bookmarks.category
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
|
||||
/**
|
||||
* Data class representing bookmarked category in DB
|
||||
*
|
||||
* @property categoryName
|
||||
* @constructor Create empty Bookmarks category modal
|
||||
*/
|
||||
@Entity(tableName = "bookmarks_categories")
|
||||
data class BookmarksCategoryModal(
|
||||
@PrimaryKey val categoryName: String
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue