Skip to content

Commit

Permalink
Merge pull request #11 from mateusz-bak/dev
Browse files Browse the repository at this point in the history
Version 1.2.0
  • Loading branch information
mateusz-bak committed Jun 14, 2021
2 parents 6fd1870 + c12d4e7 commit 87e91ca
Show file tree
Hide file tree
Showing 43 changed files with 1,552 additions and 437 deletions.
41 changes: 36 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# books-tracker-android
[![Build Status](https://git-drone.mateusz.ovh/api/badges/mateusz-bak/books-tracker-android/status.svg)](https://git-drone.mateusz.ovh/mateusz-bak/books-tracker-android)

[![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/mateusz-bak/books-tracker-android?label=latest%20version)](https://github.com/mateusz-bak/books-tracker-android/releases/latest)

### An Android app written in Kotlin for keeping tracks of your books.
#### There are three lists provided so you won't get confused:
- books you finished,
Expand All @@ -10,12 +11,42 @@

## Screenshots
<p align='center'>
<img src='https://raw.githubusercontent.com/mateusz-bak/books-tracker-android/master/doc/images/screenshot-finished.png' width='35%'/>
<img src='https://raw.githubusercontent.com/mateusz-bak/books-tracker-android/master/doc/images/screenshot-in-progress.png' width='35%'/>
<img src='doc/images/screenshot-finished.png' width='35%'/>
<img src='doc/images/screenshot-in-progress.png' width='35%'/>

<img src='https://raw.githubusercontent.com/mateusz-bak/books-tracker-android/master/doc/images/screenshot-to-read.png' width='35%'/>
<img src='https://raw.githubusercontent.com/mateusz-bak/books-tracker-android/master/doc/images/screenshot-add-book.png' width='35%'/>
<img src='doc/images/screenshot-to-read.png' width='35%'/>
<img src='doc/images/screenshot-add-book.png' width='35%'/>
</p>


## Build Process

### Dependencies

- Android SDK

### Build

1. Clone or download this repository

```sh
git clone https://github.com/mateusz-bak/books-tracker-android.git
cd books-tracker-android
```

2. Open the project in Android Studio and run it from there or build an APK directly through Gradle:

```sh
./gradlew assembleDebug
```

### Deploy to device/emulator

```sh
./gradlew installDebug
```

*You can also replace the "Debug" with "Release" to get an optimized release binary.*

## Attributions
Launcher and welcome screen icon made by [smalllikeart](https://www.flaticon.com/authors/smalllikeart "smalllikeart") from [www.flaticon.com](https://www.flaticon.com/ "Flaticon")
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ android {
minSdkVersion 24
targetSdkVersion 30
versionCode 1
versionName "1.1.0"
versionName "1.2.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import androidx.recyclerview.widget.RecyclerView
import software.mdev.bookstracker.R
import software.mdev.bookstracker.data.db.entities.Book
import kotlinx.android.synthetic.main.item_book.view.*
import software.mdev.bookstracker.other.Constants.BOOK_STATUS_IN_PROGRESS
import software.mdev.bookstracker.other.Constants.BOOK_STATUS_READ
import software.mdev.bookstracker.other.Constants.BOOK_STATUS_TO_READ
import software.mdev.bookstracker.other.Constants
import java.text.SimpleDateFormat
import java.util.*

class BookAdapter(
var context: Context,
Expand Down Expand Up @@ -45,25 +45,57 @@ class BookAdapter(
tvBookTitle.text = curBook.bookTitle
tvBookAuthor.text = curBook.bookAuthor

var stringPages = curBook.bookNumberOfPages.toString() +
holder.itemView.getContext().getString(R.string.space) +
holder.itemView.getContext().getString(R.string.pages)

tvNumberOfPages.text = stringPages
tvNumberOfPages.visibility = View.GONE
tvDateFinished.visibility = View.GONE

if(curBook.bookFinishDate == "none" || curBook.bookFinishDate == "null") {
tvDateFinished.text = holder.itemView.getContext().getString(R.string.not_set)
} else {
var bookFinishTimeStampLong = curBook.bookFinishDate.toLong()
tvDateFinished.text = convertLongToTime(bookFinishTimeStampLong)
}

val sharedPref = context.getSharedPreferences(Constants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)
val sortOrder = sharedPref.getString(
Constants.SHARED_PREFERENCES_KEY_SORT_ORDER,
Constants.SORT_ORDER_TITLE_ASC
)

if (sortOrder == Constants.SORT_ORDER_PAGES_DESC || sortOrder == Constants.SORT_ORDER_PAGES_ASC) {
tvNumberOfPages.visibility = View.VISIBLE
}
if (sortOrder == Constants.SORT_ORDER_DATE_DESC || sortOrder == Constants.SORT_ORDER_DATE_ASC) {
tvDateFinished.visibility = View.VISIBLE
}

when (whichFragment ){
BOOK_STATUS_READ -> rbRatingIndicator.rating = curBook.bookRating
Constants.BOOK_STATUS_READ -> rbRatingIndicator.rating = curBook.bookRating
}
when (curBook.bookStatus ){
BOOK_STATUS_READ -> {
Constants.BOOK_STATUS_READ -> {
ivInProgressIndicator.visibility = View.GONE
ivToReadIndicator.visibility = View.GONE
rbRatingIndicator.visibility = View.VISIBLE
rbRatingIndicator.rating = curBook.bookRating
}
BOOK_STATUS_IN_PROGRESS -> {
Constants.BOOK_STATUS_IN_PROGRESS -> {
rbRatingIndicator.visibility = View.GONE
ivToReadIndicator.visibility = View.GONE
ivInProgressIndicator.visibility = View.VISIBLE
tvNumberOfPages.visibility = View.GONE
tvDateFinished.visibility = View.GONE
}
BOOK_STATUS_TO_READ -> {
Constants.BOOK_STATUS_TO_READ -> {
rbRatingIndicator.visibility = View.GONE
ivInProgressIndicator.visibility = View.GONE
ivToReadIndicator.visibility = View.VISIBLE
tvNumberOfPages.visibility = View.GONE
tvDateFinished.visibility = View.GONE
}
}
}
Expand All @@ -82,4 +114,10 @@ class BookAdapter(
override fun getItemCount(): Int {
return differ.currentList.size
}

fun convertLongToTime(time: Long): String {
val date = Date(time)
val format = SimpleDateFormat("dd MMM yyyy")
return format.format(date)
}
}
22 changes: 15 additions & 7 deletions app/src/main/java/software/mdev/bookstracker/data/db/BooksDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,32 @@ interface BooksDao {
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE 'to_read'")
fun getToReadBooks(): LiveData<List<Book>>

@Query("UPDATE Book SET item_bookTitle =:bookTitle ,item_bookAuthor=:bookAuthor ,item_bookRating=:bookRating ,item_bookStatus=:bookStatus WHERE id=:id")
suspend fun updateBook(id: Int?, bookTitle: String, bookAuthor: String, bookRating: Float, bookStatus: String)
@Query("UPDATE Book SET item_bookTitle =:bookTitle ,item_bookAuthor=:bookAuthor ,item_bookRating=:bookRating, item_bookStatus=:bookStatus, item_bookFinishDate=:bookFinishDateMs, item_bookNumberOfPages=:bookNumberOfPagesInt, item_bookTitle_ASCII=:bookTitle_ASCII, item_bookAuthor_ASCII=:bookAuthor_ASCII WHERE id=:id")
suspend fun updateBook(id: Int?, bookTitle: String, bookAuthor: String, bookRating: Float, bookStatus: String, bookFinishDateMs: String, bookNumberOfPagesInt: Int, bookTitle_ASCII: String, bookAuthor_ASCII: String)

@Query("SELECT * FROM Book WHERE (item_bookTitle LIKE '%' || :searchQuery || '%' OR item_bookAuthor LIKE '%' || :searchQuery || '%')")
@Query("SELECT * FROM Book WHERE (item_bookTitle_ASCII LIKE '%' || :searchQuery || '%' OR item_bookAuthor_ASCII LIKE '%' || :searchQuery || '%')")
fun searchBooks(searchQuery: String): LiveData<List<Book>>

@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookTitle DESC")
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookTitle_ASCII DESC")
fun getSortedBooksByTitleDesc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookTitle ASC")
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookTitle_ASCII ASC")
fun getSortedBooksByTitleAsc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookAuthor DESC")
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookAuthor_ASCII DESC")
fun getSortedBooksByAuthorDesc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookAuthor ASC")
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookAuthor_ASCII ASC")
fun getSortedBooksByAuthorAsc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookRating DESC")
fun getSortedBooksByRatingDesc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookRating ASC")
fun getSortedBooksByRatingAsc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookNumberOfPages DESC")
fun getSortedBooksByPagesDesc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookNumberOfPages ASC")
fun getSortedBooksByPagesAsc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookFinishDate DESC")
fun getSortedBooksByDateDesc(bookStatus: String): LiveData<List<Book>>
@Query("SELECT * FROM Book WHERE item_bookStatus LIKE :bookStatus ORDER BY item_bookFinishDate ASC")
fun getSortedBooksByDateAsc(bookStatus: String): LiveData<List<Book>>

@Query("SELECT COUNT(id) FROM Book WHERE item_bookStatus LIKE :bookStatus")
fun getBookCount(bookStatus: String): LiveData<Integer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import software.mdev.bookstracker.data.db.entities.Book
import software.mdev.bookstracker.other.Constants.DATABASE_FILE_NAME

@Database(
entities = [Book::class],
version = 1
version = 3
)
abstract class BooksDatabase: RoomDatabase() {

Expand All @@ -25,7 +27,27 @@ abstract class BooksDatabase: RoomDatabase() {
}

private fun createDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
BooksDatabase::class.java, DATABASE_FILE_NAME).build()
Room.databaseBuilder(
context.applicationContext,
BooksDatabase::class.java,
DATABASE_FILE_NAME
).addMigrations(
MIGRATION_1_2,
MIGRATION_2_3
)
.build()

val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE Book ADD COLUMN item_bookNumberOfPages INTEGER NOT NULL DEFAULT 0")
}
}

val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE Book ADD COLUMN item_bookTitle_ASCII TEXT NOT NULL DEFAULT 'not_converted'")
database.execSQL("ALTER TABLE Book ADD COLUMN item_bookAuthor_ASCII TEXT NOT NULL DEFAULT 'not_converted'")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_AUTHOR
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_AUTHOR_ASCII
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_FINISH_DATE
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_NUMBER_OF_PAGES
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_PRIORITY
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_RATING
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_START_DATE
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_STATUS
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_TITLE
import software.mdev.bookstracker.other.Constants.DATABASE_ITEM_BOOK_TITLE_ASCII
import software.mdev.bookstracker.other.Constants.DATABASE_NAME
import java.io.Serializable

Expand All @@ -35,7 +38,16 @@ data class Book (
var bookStartDate: String,

@ColumnInfo(name = DATABASE_ITEM_BOOK_FINISH_DATE)
var bookFinishDate: String
var bookFinishDate: String,

@ColumnInfo(name = DATABASE_ITEM_BOOK_NUMBER_OF_PAGES)
var bookNumberOfPages: Int,

@ColumnInfo(name = DATABASE_ITEM_BOOK_TITLE_ASCII)
var bookTitle_ASCII: String,

@ColumnInfo(name = DATABASE_ITEM_BOOK_AUTHOR_ASCII)
var bookAuthor_ASCII: String
): Serializable{
@PrimaryKey(autoGenerate = true)
var id: Int? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,27 @@ class BooksRepository (

fun getToReadBooks() = db.getBooksDao().getToReadBooks()

suspend fun updateBook(id: Int?, bookTitle: String, bookAuthor: String, bookRating: Float, bookStatus: String) = db.getBooksDao().updateBook(id, bookTitle, bookAuthor, bookRating, bookStatus)
suspend fun updateBook(
id: Int?,
bookTitle: String,
bookAuthor: String,
bookRating: Float,
bookStatus: String,
bookFinishDateMs: String,
bookNumberOfPagesInt: Int,
bookTitle_ASCII: String,
bookAuthor_ASCII: String
) = db.getBooksDao().updateBook(
id,
bookTitle,
bookAuthor,
bookRating,
bookStatus,
bookFinishDateMs,
bookNumberOfPagesInt,
bookTitle_ASCII,
bookAuthor_ASCII
)

fun searchBooks(searchQuery: String) = db.getBooksDao().searchBooks(searchQuery)

Expand All @@ -26,6 +46,10 @@ class BooksRepository (
fun getSortedBooksByAuthorAsc(bookStatus: String) = db.getBooksDao().getSortedBooksByAuthorAsc(bookStatus)
fun getSortedBooksByRatingDesc(bookStatus: String) = db.getBooksDao().getSortedBooksByRatingDesc(bookStatus)
fun getSortedBooksByRatingAsc(bookStatus: String) = db.getBooksDao().getSortedBooksByRatingAsc(bookStatus)
fun getSortedBooksByPagesDesc(bookStatus: String) = db.getBooksDao().getSortedBooksByPagesDesc(bookStatus)
fun getSortedBooksByPagesAsc(bookStatus: String) = db.getBooksDao().getSortedBooksByPagesAsc(bookStatus)
fun getSortedBooksByDateDesc(bookStatus: String) = db.getBooksDao().getSortedBooksByDateDesc(bookStatus)
fun getSortedBooksByDateAsc(bookStatus: String) = db.getBooksDao().getSortedBooksByDateAsc(bookStatus)

fun getBookCount(bookStatus: String) = db.getBooksDao().getBookCount(bookStatus)
}
15 changes: 11 additions & 4 deletions app/src/main/java/software/mdev/bookstracker/other/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ object Constants {
const val DATABASE_ITEM_BOOK_PRIORITY = "item_bookPriority"
const val DATABASE_ITEM_BOOK_START_DATE = "item_bookStartDate"
const val DATABASE_ITEM_BOOK_FINISH_DATE = "item_bookFinishDate"
const val DATABASE_ITEM_BOOK_NUMBER_OF_PAGES = "item_bookNumberOfPages"
const val DATABASE_ITEM_BOOK_TITLE_ASCII = "item_bookTitle_ASCII"
const val DATABASE_ITEM_BOOK_AUTHOR_ASCII = "item_bookAuthor_ASCII"
const val DATABASE_EMPTY_VALUE = "none"

const val SORT_ORDER_TITLE_DESC = "ivSortTitleDesc"
Expand All @@ -24,6 +27,10 @@ object Constants {
const val SORT_ORDER_AUTHOR_ASC = "ivSortAuthorAsc"
const val SORT_ORDER_RATING_DESC = "ivSortRatingDesc"
const val SORT_ORDER_RATING_ASC = "ivSortRatingAsc"
const val SORT_ORDER_PAGES_DESC = "ivSortPagesDesc"
const val SORT_ORDER_PAGES_ASC = "ivSortPagesAsc"
const val SORT_ORDER_DATE_DESC = "ivSortDateDesc"
const val SORT_ORDER_DATE_ASC = "ivSortDateAsc"

const val SERIALIZABLE_BUNDLE_BOOK = "book"

Expand All @@ -36,13 +43,13 @@ object Constants {

const val EMPTY_STRING = ""

const val THEME_ACCENT_AMBER_500 = "accent_amber"
const val THEME_ACCENT_BLUE_500 = "accent_blue"
const val THEME_ACCENT_LIGHT_GREEN = "accent_light_green"
const val THEME_ACCENT_RED_800 = "accent_red"
const val THEME_ACCENT_CYAN_500 = "accent_cyan"
const val THEME_ACCENT_GREEN_500 = "accent_green"
const val THEME_ACCENT_INDIGO_500 = "accent_indigo"
const val THEME_ACCENT_BROWN_400 = "accent_brown"
const val THEME_ACCENT_LIME_500 = "accent_lime"
const val THEME_ACCENT_PINK_500 = "accent_pink"
const val THEME_ACCENT_PINK_300 = "accent_pink"
const val THEME_ACCENT_PURPLE_500 = "accent_purple"
const val THEME_ACCENT_TEAL_500 = "accent_teal"
const val THEME_ACCENT_YELLOW_500 = "accent_yellow"
Expand Down
Loading

0 comments on commit 87e91ca

Please sign in to comment.