Procházet zdrojové kódy

Added animation when changing app theme

Vadik Sirekanyan před 7 roky
rodič
revize
6c44c71978

+ 0 - 10
app/src/main/java/com/sirekanyan/knigopis/common/extensions/Collection.kt

@@ -1,10 +0,0 @@
-package com.sirekanyan.knigopis.common.extensions
-
-import java.util.*
-
-private val random = Random()
-
-fun <T> List<T>.random(): T? {
-    if (size == 0) return null
-    return get(random.nextInt(size))
-}

+ 15 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -11,6 +11,7 @@ import com.sirekanyan.knigopis.common.extensions.startActivityOrNull
 import com.sirekanyan.knigopis.common.extensions.toast
 import com.sirekanyan.knigopis.common.functions.createAppSettingsIntent
 import com.sirekanyan.knigopis.common.functions.createLoginIntent
+import com.sirekanyan.knigopis.common.functions.extra
 import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
@@ -24,6 +25,7 @@ import com.sirekanyan.knigopis.feature.users.UsersPresenter
 import com.sirekanyan.knigopis.feature.users.getMainState
 import com.sirekanyan.knigopis.feature.users.saveMainState
 import com.sirekanyan.knigopis.model.BookDataModel
+import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.repository.Configuration
 import com.sirekanyan.knigopis.repository.Endpoint
 import org.koin.android.ext.android.inject
@@ -31,6 +33,7 @@ import ru.ulogin.sdk.UloginAuthActivity
 
 private const val LOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
+private val CURRENT_TAB_EXTRA = extra("current_tab")
 
 class MainActivity : BaseActivity(),
     MainPresenter.Router,
@@ -47,7 +50,11 @@ class MainActivity : BaseActivity(),
         setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
-        presenter.init(savedInstanceState?.getMainState())
+        val restoredCurrentTab = savedInstanceState?.getMainState()?.currentTab
+        val currentTab = intent.getIntExtra(CURRENT_TAB_EXTRA, 0)
+            .takeUnless { it == 0 }
+            ?.let { CurrentTab.getByItemId(it) }
+        presenter.init(restoredCurrentTab ?: currentTab)
     }
 
     override fun onStart() {
@@ -135,7 +142,13 @@ class MainActivity : BaseActivity(),
     }
 
     override fun reopenScreen() {
-        recreate()
+        finish()
+        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
+        startActivity(intent.also { intent ->
+            presenter.state?.let { state ->
+                intent.putExtra(CURRENT_TAB_EXTRA, state.currentTab.itemId)
+            }
+        })
     }
 
 }

+ 3 - 3
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -14,7 +14,7 @@ import com.sirekanyan.knigopis.repository.Configuration
 interface MainPresenter : Presenter {
 
     val state: MainPresenterState?
-    fun init(state: MainPresenterState?)
+    fun init(tab: CurrentTab?)
     fun start()
     fun resume()
     fun back(): Boolean
@@ -48,10 +48,10 @@ class MainPresenterImpl(
     override val state
         get() = currentTab?.let { MainPresenterState(it) }
 
-    override fun init(state: MainPresenterState?) {
+    override fun init(tab: CurrentTab?) {
         view.setDarkThemeOptionChecked(config.isDarkTheme)
         val defaultTab = if (auth.isAuthorized()) BOOKS_TAB else NOTES_TAB
-        this.currentTab = state?.currentTab ?: defaultTab
+        this.currentTab = tab ?: defaultTab
     }
 
     override fun start() {

+ 24 - 19
app/src/main/java/com/sirekanyan/knigopis/feature/profile/ProfileActivity.kt

@@ -22,6 +22,7 @@ import io.reactivex.Observable
 import io.reactivex.rxkotlin.Observables
 import kotlinx.android.synthetic.main.profile_activity.*
 import org.koin.android.ext.android.inject
+import java.util.*
 import java.util.concurrent.TimeUnit
 
 fun Context.createProfileIntent() = Intent(this, ProfileActivity::class.java)
@@ -31,9 +32,9 @@ class ProfileActivity : BaseActivity() {
     private val api by inject<Endpoint>()
     private val bookRepository by inject<BookRepository>()
     private val auth by inject<AuthRepository>()
-    private val todoList = mutableListOf<BookDataModel>()
-    private val doingList = mutableListOf<BookDataModel>()
-    private val doneList = mutableListOf<BookDataModel>()
+    private val todoList = Stack<BookDataModel>()
+    private val doingList = Stack<BookDataModel>()
+    private val doneList = Stack<BookDataModel>()
     private var userId: String? = null
     private var profileUrl: String? = null
     private lateinit var editOption: MenuItem
@@ -45,14 +46,16 @@ class ProfileActivity : BaseActivity() {
         profileTodoCount.text = getString(R.string.profile_text_todo, 0)
         profileDoingCount.text = getString(R.string.profile_text_doing, 0)
         profileDoneCount.text = getString(R.string.profile_text_done, 0)
-        profileTodoCount.setOnClickListener {
-            setRandomFooterBook(todoList)
-        }
-        profileDoingCount.setOnClickListener {
-            setRandomFooterBook(doingList)
-        }
-        profileDoneCount.setOnClickListener {
-            setRandomFooterBook(doneList)
+        mapOf(
+            profileTodoCount to todoList,
+            profileDoingCount to doingList,
+            profileDoneCount to doneList
+        ).forEach { view, list ->
+            view.setOnClickListener {
+                if (!list.isEmpty()) {
+                    showFooterBook(list.pop())
+                }
+            }
         }
         profileNicknameEditText.setOnEditorActionListener { _, actionId, _ ->
             when (actionId) {
@@ -65,11 +68,13 @@ class ProfileActivity : BaseActivity() {
         }
     }
 
-    private fun setRandomFooterBook(books: List<BookDataModel>) {
-        val book = books.random() ?: return
+    private fun showFooterBook(book: BookDataModel) {
         randomProfileBook.alpha = 1f
-        val title = resources.getTitleString(book.title)
-        randomProfileBook.text = getString(R.string.profile_text_random, title, book.priority)
+        randomProfileBook.text = getString(
+            R.string.profile_text_random,
+            resources.getTitleString(book.title),
+            book.priority
+        )
         randomProfileBook.animate()
             .setInterpolator(AccelerateInterpolator())
             .setDuration(1000)
@@ -105,7 +110,7 @@ class ProfileActivity : BaseActivity() {
             .flatMapObservable {
                 Observables.zip(
                     Observable.fromIterable(it),
-                    Observable.interval(10, TimeUnit.MILLISECONDS)
+                    Observable.interval(5, TimeUnit.MILLISECONDS)
                 )
             }
             .io2main()
@@ -125,17 +130,17 @@ class ProfileActivity : BaseActivity() {
     private fun addBookToList(book: BookDataModel) {
         when {
             book.isFinished -> {
-                doneList.add(book)
+                doneList.push(book)
                 profileDoneCount.text =
                         getString(R.string.profile_text_done, doneList.size as Int)
             }
             book.priority > 0 -> {
-                doingList.add(book)
+                doingList.push(book)
                 profileDoingCount.text =
                         getString(R.string.profile_text_doing, doingList.size as Int)
             }
             else -> {
-                todoList.add(book)
+                todoList.push(book)
                 profileTodoCount.text =
                         getString(R.string.profile_text_todo, todoList.size as Int)
             }

+ 1 - 1
app/src/main/res/layout/profile_activity.xml

@@ -96,7 +96,7 @@
         android:id="@+id/randomProfileBook"
         android:layout_width="match_parent"
         android:layout_height="56dp"
-        android:gravity="bottom|center"
+        android:gravity="center"
         android:padding="8dp"
         android:textColor="?android:attr/textColorSecondary"
         android:textSize="12sp"