From 85d5ba6ccbad3cd8653d437299a24a1d519537bf Mon Sep 17 00:00:00 2001 From: phicdy Date: Tue, 8 Jan 2019 22:40:59 +0900 Subject: [PATCH 001/143] Replace ImageView and TextView in LinearLayout with TextView with compound drawable in layout_speaker --- .../ui/bindingadapter/TextViewBinding.kt | 70 +++++++++++++++++++ .../session/ui/item/SpeechSessionItem.kt | 16 ++--- .../src/main/res/layout/layout_speaker.xml | 9 +-- 3 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt new file mode 100644 index 000000000..0d4663157 --- /dev/null +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt @@ -0,0 +1,70 @@ +package io.github.droidkaigi.confsched2019.session.ui.bindingadapter + +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.widget.TextView +import androidx.core.graphics.drawable.DrawableCompat +import com.squareup.picasso.Picasso +import com.squareup.picasso.Target +import jp.wasabeef.picasso.transformations.CropCircleTransformation + + +fun loadImage( + textView: TextView, + imageUrl: String?, + circleCrop: Boolean?, + rawPlaceHolder: Drawable?, + placeHolderTint: Int?, + widthDp: Int = 16, + heightDp: Int = 16 +) { + fun setDrawable(drawable: Drawable) { + val res = textView.context.resources + val widthPx = (widthDp * res.displayMetrics.density).toInt() + val heightPx = (heightDp * res.displayMetrics.density).toInt() + drawable.setBounds(0, 0, widthPx, heightPx) + textView.setCompoundDrawables(drawable, null, null, null) + } + + val placeHolder = run { + DrawableCompat.wrap( + rawPlaceHolder ?: return@run null + )?.apply { + setTint(placeHolderTint ?: return@run this) + } + } + imageUrl ?: run { + placeHolder?.let { + setDrawable(it) + } + } + + Picasso + .get() + .load(imageUrl) + .apply { + if (circleCrop == true) { + transform(CropCircleTransformation()) + } + if (placeHolder != null) { + placeholder(placeHolder) + } + } + .into(object : Target { + override fun onPrepareLoad(placeHolderDrawable: Drawable?) { + placeHolderDrawable?.let { + setDrawable(it) + } + } + + override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { + } + + override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { + val res = textView.context.resources + val drawable = BitmapDrawable(res, bitmap) + setDrawable(drawable) + } + }) +} diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt index 546004a1f..389f72886 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt @@ -3,7 +3,6 @@ package io.github.droidkaigi.confsched2019.session.ui.item import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup -import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -102,11 +101,8 @@ class SpeechSessionItem @AssistedInject constructor( val speakerView = layoutInflater.get(root.context).inflate( R.layout.layout_speaker, speakers, false ) as ViewGroup - val imageView: ImageView = speakerView.findViewById( - R.id.speaker_image - ) val textView: TextView = speakerView.findViewById(R.id.speaker) - bindSpeakerData(speaker, textView, imageView) + bindSpeakerData(speaker, textView) speakers.addView(speakerView) return@forEach @@ -114,19 +110,17 @@ class SpeechSessionItem @AssistedInject constructor( if (existSpeakerView != null && speaker != null) { val textView: TextView = existSpeakerView.findViewById(R.id.speaker) textView.text = speaker.name - val imageView = existSpeakerView.findViewById(R.id.speaker_image) - bindSpeakerData(speaker, textView, imageView) + bindSpeakerData(speaker, textView) } } } private fun bindSpeakerData( speaker: Speaker, - textView: TextView, - imageView: ImageView + textView: TextView ) { textView.text = speaker.name - val context = imageView.context + val context = textView.context val placeHolder = VectorDrawableCompat.create( context.resources, R.drawable.ic_person_outline_black_24dp, @@ -137,7 +131,7 @@ class SpeechSessionItem @AssistedInject constructor( R.color.gray2 ) loadImage( - imageView = imageView, + textView = textView, imageUrl = speaker.imageUrl, circleCrop = true, rawPlaceHolder = placeHolder, diff --git a/feature/session/src/main/res/layout/layout_speaker.xml b/feature/session/src/main/res/layout/layout_speaker.xml index 52e6076fe..7ea443412 100644 --- a/feature/session/src/main/res/layout/layout_speaker.xml +++ b/feature/session/src/main/res/layout/layout_speaker.xml @@ -6,18 +6,11 @@ android:layout_height="wrap_content" > - - From 86a7232c4d28d09c4085d9858df026f4e9651d5d Mon Sep 17 00:00:00 2001 From: phicdy Date: Tue, 8 Jan 2019 23:13:36 +0900 Subject: [PATCH 002/143] Delete needless blank line --- .../confsched2019/session/ui/bindingadapter/TextViewBinding.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt index 0d4663157..de2499620 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt @@ -9,7 +9,6 @@ import com.squareup.picasso.Picasso import com.squareup.picasso.Target import jp.wasabeef.picasso.transformations.CropCircleTransformation - fun loadImage( textView: TextView, imageUrl: String?, From 35f240cd7225c115bf4ad0ca57adf4756a502044 Mon Sep 17 00:00:00 2001 From: phicdy Date: Tue, 8 Jan 2019 23:30:59 +0900 Subject: [PATCH 003/143] Move loadImage() for TextView to SpeechSessionItem --- .../ui/bindingadapter/TextViewBinding.kt | 69 ------------------- .../session/ui/item/SpeechSessionItem.kt | 67 +++++++++++++++++- 2 files changed, 66 insertions(+), 70 deletions(-) delete mode 100644 feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt deleted file mode 100644 index de2499620..000000000 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/bindingadapter/TextViewBinding.kt +++ /dev/null @@ -1,69 +0,0 @@ -package io.github.droidkaigi.confsched2019.session.ui.bindingadapter - -import android.graphics.Bitmap -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable -import android.widget.TextView -import androidx.core.graphics.drawable.DrawableCompat -import com.squareup.picasso.Picasso -import com.squareup.picasso.Target -import jp.wasabeef.picasso.transformations.CropCircleTransformation - -fun loadImage( - textView: TextView, - imageUrl: String?, - circleCrop: Boolean?, - rawPlaceHolder: Drawable?, - placeHolderTint: Int?, - widthDp: Int = 16, - heightDp: Int = 16 -) { - fun setDrawable(drawable: Drawable) { - val res = textView.context.resources - val widthPx = (widthDp * res.displayMetrics.density).toInt() - val heightPx = (heightDp * res.displayMetrics.density).toInt() - drawable.setBounds(0, 0, widthPx, heightPx) - textView.setCompoundDrawables(drawable, null, null, null) - } - - val placeHolder = run { - DrawableCompat.wrap( - rawPlaceHolder ?: return@run null - )?.apply { - setTint(placeHolderTint ?: return@run this) - } - } - imageUrl ?: run { - placeHolder?.let { - setDrawable(it) - } - } - - Picasso - .get() - .load(imageUrl) - .apply { - if (circleCrop == true) { - transform(CropCircleTransformation()) - } - if (placeHolder != null) { - placeholder(placeHolder) - } - } - .into(object : Target { - override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - placeHolderDrawable?.let { - setDrawable(it) - } - } - - override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { - } - - override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { - val res = textView.context.resources - val drawable = BitmapDrawable(res, bitmap) - setDrawable(drawable) - } - }) -} diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt index 389f72886..83e55636b 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt @@ -1,10 +1,14 @@ package io.github.droidkaigi.confsched2019.session.ui.item import android.content.Context +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.isVisible import androidx.core.view.size import androidx.navigation.NavController @@ -12,6 +16,8 @@ import androidx.navigation.NavDirections import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject +import com.squareup.picasso.Picasso +import com.squareup.picasso.Target import com.xwray.groupie.databinding.BindableItem import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.model.Speaker @@ -19,9 +25,9 @@ import io.github.droidkaigi.confsched2019.model.defaultLang import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.session.databinding.ItemSessionBinding import io.github.droidkaigi.confsched2019.session.ui.actioncreator.SessionContentsActionCreator -import io.github.droidkaigi.confsched2019.session.ui.bindingadapter.loadImage import io.github.droidkaigi.confsched2019.system.store.SystemStore import io.github.droidkaigi.confsched2019.util.lazyWithParam +import jp.wasabeef.picasso.transformations.CropCircleTransformation import kotlin.math.max class SpeechSessionItem @AssistedInject constructor( @@ -139,6 +145,65 @@ class SpeechSessionItem @AssistedInject constructor( ) } + private fun loadImage( + textView: TextView, + imageUrl: String?, + circleCrop: Boolean?, + rawPlaceHolder: Drawable?, + placeHolderTint: Int?, + widthDp: Int = 16, + heightDp: Int = 16 + ) { + fun setDrawable(drawable: Drawable) { + val res = textView.context.resources + val widthPx = (widthDp * res.displayMetrics.density).toInt() + val heightPx = (heightDp * res.displayMetrics.density).toInt() + drawable.setBounds(0, 0, widthPx, heightPx) + textView.setCompoundDrawables(drawable, null, null, null) + } + + val placeHolder = run { + DrawableCompat.wrap( + rawPlaceHolder ?: return@run null + )?.apply { + setTint(placeHolderTint ?: return@run this) + } + } + imageUrl ?: run { + placeHolder?.let { + setDrawable(it) + } + } + + Picasso + .get() + .load(imageUrl) + .apply { + if (circleCrop == true) { + transform(CropCircleTransformation()) + } + if (placeHolder != null) { + placeholder(placeHolder) + } + } + .into(object : Target { + override fun onPrepareLoad(placeHolderDrawable: Drawable?) { + placeHolderDrawable?.let { + setDrawable(it) + } + } + + override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) { + } + + override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { + val res = textView.context.resources + val drawable = BitmapDrawable(res, bitmap) + setDrawable(drawable) + } + }) + } + override fun getLayout(): Int = R.layout.item_session override fun equals(other: Any?): Boolean { From cbc3f86eda3b9202dcfa66194cac5eba806c3bd4 Mon Sep 17 00:00:00 2001 From: phicdy Date: Tue, 8 Jan 2019 23:36:12 +0900 Subject: [PATCH 004/143] Delete needless nullable arguments --- .../confsched2019/session/ui/item/SpeechSessionItem.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt index 83e55636b..38a3fb8cb 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt @@ -148,9 +148,9 @@ class SpeechSessionItem @AssistedInject constructor( private fun loadImage( textView: TextView, imageUrl: String?, - circleCrop: Boolean?, + circleCrop: Boolean, rawPlaceHolder: Drawable?, - placeHolderTint: Int?, + placeHolderTint: Int, widthDp: Int = 16, heightDp: Int = 16 ) { @@ -166,7 +166,7 @@ class SpeechSessionItem @AssistedInject constructor( DrawableCompat.wrap( rawPlaceHolder ?: return@run null )?.apply { - setTint(placeHolderTint ?: return@run this) + setTint(placeHolderTint) } } imageUrl ?: run { @@ -179,7 +179,7 @@ class SpeechSessionItem @AssistedInject constructor( .get() .load(imageUrl) .apply { - if (circleCrop == true) { + if (circleCrop) { transform(CropCircleTransformation()) } if (placeHolder != null) { From 2e554422770ff58061623661b421e97ca12cd78c Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 10:09:07 +0900 Subject: [PATCH 005/143] Added video and slide url response --- .../confsched2019/data/api/response/SessionResponseImpl.kt | 4 +++- .../confsched2019/data/api/response/SessionResponse.kt | 2 ++ .../github/droidkaigi/confsched2019/data/db/CacheDatabase.kt | 2 +- .../confsched2019/data/db/entity/SessionEntityImpl.kt | 2 ++ .../data/db/entity/mapper/SessionDataMapperExt.kt | 4 ++++ .../droidkaigi/confsched2019/data/db/entity/SessionEntity.kt | 2 ++ .../confsched2019/data/repository/mapper/SessionMappers.kt | 2 ++ .../io/github/droidkaigi/confsched2019/SessionDummyDatas.kt | 4 ++++ model/src/commonMain/kotlin/Session.kt | 2 ++ 9 files changed, 22 insertions(+), 2 deletions(-) diff --git a/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponseImpl.kt b/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponseImpl.kt index b93bf8559..e35f63a03 100644 --- a/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponseImpl.kt +++ b/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponseImpl.kt @@ -19,5 +19,7 @@ data class SessionResponseImpl( override val sessionType: String?, @Optional override val message: SessionMessageResponseImpl? = null, override val isPlenumSession: Boolean, - override val interpretationTarget: Boolean + override val interpretationTarget: Boolean, + override val videoUrl: String?, + override val slideUrl: String? ) : SessionResponse diff --git a/data/api/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponse.kt b/data/api/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponse.kt index 549125023..d7387d6cc 100644 --- a/data/api/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponse.kt +++ b/data/api/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/response/SessionResponse.kt @@ -15,5 +15,7 @@ interface SessionResponse { val message: SessionMessageResponse? val isPlenumSession: Boolean val sessionType: String? + val videoUrl: String? + val slideUrl: String? val interpretationTarget: Boolean } diff --git a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/CacheDatabase.kt b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/CacheDatabase.kt index 3b309bbfd..251ae9439 100644 --- a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/CacheDatabase.kt +++ b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/CacheDatabase.kt @@ -22,7 +22,7 @@ import io.github.droidkaigi.confsched2019.data.db.entity.SponsorEntityImpl (SponsorEntityImpl::class), (SessionFeedbackImpl::class) ], - version = 8 + version = 9 ) abstract class CacheDatabase : RoomDatabase() { abstract fun sessionDao(): SessionDao diff --git a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntityImpl.kt b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntityImpl.kt index 25139ea31..8cdd53536 100644 --- a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntityImpl.kt +++ b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntityImpl.kt @@ -16,6 +16,8 @@ data class SessionEntityImpl( override var sessionFormat: String?, override val sessionType: String?, override val intendedAudience: String?, + override val videoUrl: String?, + override val slideUrl: String?, override val isInterpretationTarget: Boolean, @Embedded override var language: LanguageEntityImpl?, @Embedded override val category: CategoryEntityImpl?, diff --git a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/mapper/SessionDataMapperExt.kt b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/mapper/SessionDataMapperExt.kt index 9738d0fb8..376a92173 100644 --- a/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/mapper/SessionDataMapperExt.kt +++ b/data/db-room/src/main/java/io/github/droidkaigi/confsched2019/data/db/entity/mapper/SessionDataMapperExt.kt @@ -77,6 +77,8 @@ fun SessionResponse.toSessionEntityImpl( requireNotNull(category.translatedName?.en) ), intendedAudience = intendedAudience, + videoUrl = videoUrl, + slideUrl = slideUrl, isInterpretationTarget = interpretationTarget, room = RoomEntityImpl(roomId, rooms.roomName(roomId)), sessionType = sessionType @@ -95,6 +97,8 @@ fun SessionResponse.toSessionEntityImpl( category = null, room = RoomEntityImpl(roomId, rooms.roomName(roomId)), intendedAudience = null, + videoUrl = videoUrl, + slideUrl = slideUrl, isInterpretationTarget = interpretationTarget, message = message?.let { MessageEntityImpl(requireNotNull(it.ja), requireNotNull(it.en)) diff --git a/data/db/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntity.kt b/data/db/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntity.kt index c8b50364e..fad5335fa 100644 --- a/data/db/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntity.kt +++ b/data/db/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/db/entity/SessionEntity.kt @@ -11,6 +11,8 @@ interface SessionEntity { val language: LanguageEntity? val category: CategoryEntity? val intendedAudience: String? + val videoUrl: String? + val slideUrl: String? val isInterpretationTarget: Boolean val room: RoomEntity? val message: MessageEntity? diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt index 18fef898e..f4641729d 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt @@ -64,6 +64,8 @@ fun SessionWithSpeakers.toSession( ) }, intendedAudience = session.intendedAudience, + videoUrl = session.videoUrl, + slideUrl = session.slideUrl, isInterpretationTarget = session.isInterpretationTarget, isFavorited = favList!!.map { it.toString() }.contains(session.id), speakers = speakers, diff --git a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt index 722918416..42322a027 100644 --- a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt +++ b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt @@ -37,6 +37,8 @@ fun dummySessionData(): List { language = LocaledString("英語", "English"), category = Category(10, LocaledString("ツール", "Tool")), intendedAudience = "extream", + videoUrl = "https://droidkaigi.jp/2019/#might_be_null", + slideUrl = "https://droidkaigi.jp/2019/#might_be_null", isInterpretationTarget = true, isFavorited = true, speakers = listOf(), @@ -61,6 +63,8 @@ fun firstDummySpeechSession(): Session.SpeechSession { language = LocaledString("日本語", "Japanese"), category = Category(id = 10, name = LocaledString("アーキテクチャ", "App Architecture")), intendedAudience = "intermediate", + videoUrl = "https://droidkaigi.jp/2019/#might_be_null", + slideUrl = "https://droidkaigi.jp/2019/#might_be_null", isInterpretationTarget = false, isFavorited = false, speakers = listOf(), diff --git a/model/src/commonMain/kotlin/Session.kt b/model/src/commonMain/kotlin/Session.kt index e69a4e4e0..15fc14aac 100644 --- a/model/src/commonMain/kotlin/Session.kt +++ b/model/src/commonMain/kotlin/Session.kt @@ -22,6 +22,8 @@ sealed class Session( val language: LocaledString, val category: Category, val intendedAudience: String?, + val videoUrl: String?, + val slideUrl: String?, val isInterpretationTarget: Boolean, val isFavorited: Boolean, val speakers: List, From 3649cf9a0a7487ad3e0d16a118936d5277e5371f Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 10:52:41 +0900 Subject: [PATCH 006/143] Implemented document views --- .../res/layout/fragment_session_detail.xml | 87 +++++++++++++++++-- .../src/main/res/values-ja/strings.xml | 1 + .../session/src/main/res/values/strings.xml | 1 + model/src/commonMain/kotlin/Session.kt | 5 +- 4 files changed, 87 insertions(+), 7 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 4020e945e..ccfce644f 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -6,7 +6,9 @@ > + + @@ -228,9 +231,9 @@ android:layout_marginTop="26dp" android:text="@string/session_detail_survey" android:textAppearance="@style/TextAppearance.App.Subtitle1" - app:visibleGone="@{session.isFinished}" app:layout_constraintStart_toStartOf="@id/session_title" app:layout_constraintTop_toBottomOf="@id/divider3" + app:visibleGone="@{session.isFinished}" /> + + + + + + + + diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index 3be46132d..fa5fc3bb7 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -5,6 +5,7 @@ 絞り込む アンケート 回答する + 資料 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 21298fd5f..4d6557510 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Survey Go to survey Speaker + 資料 Session Share Place diff --git a/model/src/commonMain/kotlin/Session.kt b/model/src/commonMain/kotlin/Session.kt index 15fc14aac..82785a17b 100644 --- a/model/src/commonMain/kotlin/Session.kt +++ b/model/src/commonMain/kotlin/Session.kt @@ -28,7 +28,10 @@ sealed class Session( val isFavorited: Boolean, val speakers: List, val message: SessionMessage? - ) : Session(id, dayNumber, startTime, endTime, room) + ) : Session(id, dayNumber, startTime, endTime, room) { + val hasVideo: Boolean = videoUrl.isNullOrEmpty().not() + val hasSlide: Boolean = slideUrl.isNullOrEmpty().not() + } data class ServiceSession( override val id: String, From ea831bb9df81e06bc68bef0d589d8698046fb6ef Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 10:56:16 +0900 Subject: [PATCH 007/143] Added title string --- .../session/src/main/res/layout/fragment_session_detail.xml | 4 ++-- feature/session/src/main/res/values-ja/strings.xml | 2 ++ feature/session/src/main/res/values/strings.xml | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index ccfce644f..169b6145c 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -340,7 +340,7 @@ android:paddingEnd="16dp" android:paddingStart="16dp" android:paddingTop="8dp" - android:text="動画" + android:text="@string/session_detail_document_video" android:textColor="@color/colorSecondary" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" @@ -364,7 +364,7 @@ android:paddingEnd="16dp" android:paddingStart="16dp" android:paddingTop="8dp" - android:text="スライド" + android:text="@string/session_detail_document_slide" android:textColor="@color/colorSecondary" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index fa5fc3bb7..4ecab50c3 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -6,6 +6,8 @@ アンケート 回答する 資料 + 動画 + スライド 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 4d6557510..98735b7b9 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ Go to survey Speaker 資料 + 動画 + スライド Session Share Place From 2e9dfc4a68818f49f93410b446f6144c0014ef9b Mon Sep 17 00:00:00 2001 From: yuri-hondo Date: Tue, 8 Jan 2019 12:49:36 +0900 Subject: [PATCH 008/143] Reduce the bottom touch area of the session item --- feature/session/src/main/res/layout/item_session.xml | 3 ++- feature/session/src/main/res/layout/item_special_session.xml | 2 +- feature/session/src/main/res/values/dimens.xml | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/session/src/main/res/layout/item_session.xml b/feature/session/src/main/res/layout/item_session.xml index 8c9fe53f5..17682dc77 100644 --- a/feature/session/src/main/res/layout/item_session.xml +++ b/feature/session/src/main/res/layout/item_session.xml @@ -27,7 +27,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" - android:paddingBottom="@dimen/session_item_bottom_padding" + android:layout_marginBottom="30dp" + android:paddingBottom="4dp" android:paddingEnd="0dp" android:paddingStart="@{addPaddingForTime ? @dimen/session_bottom_sheet_left_time_space : 0}" android:paddingTop="@dimen/session_item_top_padding" diff --git a/feature/session/src/main/res/layout/item_special_session.xml b/feature/session/src/main/res/layout/item_special_session.xml index 8876fcc68..d37b5b24d 100644 --- a/feature/session/src/main/res/layout/item_special_session.xml +++ b/feature/session/src/main/res/layout/item_special_session.xml @@ -20,7 +20,7 @@ android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" android:paddingTop="@dimen/session_item_top_padding" - android:paddingBottom="@dimen/session_item_bottom_padding" + android:paddingBottom="34dp" android:paddingEnd="0dp" android:paddingStart="@dimen/session_bottom_sheet_left_time_space" > diff --git a/feature/session/src/main/res/values/dimens.xml b/feature/session/src/main/res/values/dimens.xml index 48038b1ba..3e6aa518c 100644 --- a/feature/session/src/main/res/values/dimens.xml +++ b/feature/session/src/main/res/values/dimens.xml @@ -8,5 +8,4 @@ 8dp 0dp 4dp - 34dp From c80d039f16883aa5665a604f12493c334bb46d24 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 11:35:18 +0900 Subject: [PATCH 009/143] Added icon --- .../res/drawable/ic_file_copy_outline_gray2_24dp.xml | 9 +++++++++ .../drawable/ic_local_movies_outline_gray2_24dp.xml | 12 ++++++++++++ .../src/main/res/layout/fragment_session_detail.xml | 4 ++-- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 feature/session/src/main/res/drawable/ic_file_copy_outline_gray2_24dp.xml create mode 100644 feature/session/src/main/res/drawable/ic_local_movies_outline_gray2_24dp.xml diff --git a/feature/session/src/main/res/drawable/ic_file_copy_outline_gray2_24dp.xml b/feature/session/src/main/res/drawable/ic_file_copy_outline_gray2_24dp.xml new file mode 100644 index 000000000..51c3c69cf --- /dev/null +++ b/feature/session/src/main/res/drawable/ic_file_copy_outline_gray2_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/feature/session/src/main/res/drawable/ic_local_movies_outline_gray2_24dp.xml b/feature/session/src/main/res/drawable/ic_local_movies_outline_gray2_24dp.xml new file mode 100644 index 000000000..a92fb656b --- /dev/null +++ b/feature/session/src/main/res/drawable/ic_local_movies_outline_gray2_24dp.xml @@ -0,0 +1,12 @@ + + + diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 169b6145c..96ccd7a2b 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -333,7 +333,7 @@ android:background="?attr/selectableItemBackground" android:clickable="true" android:drawablePadding="8dp" - android:drawableStart="@drawable/ic_share_outline_black_24dp" + android:drawableStart="@drawable/ic_local_movies_outline_gray2_24dp" android:focusable="true" android:gravity="center_vertical" android:paddingBottom="8dp" @@ -357,7 +357,7 @@ android:background="?attr/selectableItemBackground" android:clickable="true" android:drawablePadding="8dp" - android:drawableStart="@drawable/ic_share_outline_black_24dp" + android:drawableStart="@drawable/ic_file_copy_outline_gray2_24dp" android:focusable="true" android:gravity="center_vertical" android:paddingBottom="8dp" From 2f5dc86193a6b4d6bfc55939ffa3afbd9b8130fe Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 12:15:26 +0900 Subject: [PATCH 010/143] Rename FireStore.kt to Firestore.kt --- .../confsched2019/data/firestore/FireStoreComponent.kt | 4 ++-- .../confsched2019/data/firestore/FirestoreImpl.kt | 2 +- .../confsched2019/data/firestore/FirestoreModule.kt | 2 +- .../confsched2019/data/firestore/FireStore.kt | 2 +- .../data/repository/DataSessionRepository.kt | 8 ++++---- .../data/repository/RepositoryComponent.kt | 4 ++-- .../ui/actioncreator/AnnouncementActionCreator.kt | 6 +++--- .../confsched2019/di/FireStoreComponentModule.kt | 6 +++--- .../confsched2019/di/RepositoryComponentModule.kt | 10 +++++----- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt index 78f9958fd..1d1925342 100644 --- a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt +++ b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt @@ -2,7 +2,7 @@ package io.github.droidkaigi.confsched2019.data.repository import dagger.BindsInstance import dagger.Component -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.data.firestore.FirestoreModule import javax.inject.Singleton import kotlin.coroutines.CoroutineContext @@ -14,7 +14,7 @@ import kotlin.coroutines.CoroutineContext ] ) interface FireStoreComponent { - fun fireStore(): FireStore + fun firestore(): Firestore @Component.Builder interface Builder { diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt index b139b7ca1..5a17a8fff 100644 --- a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt +++ b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt @@ -13,7 +13,7 @@ import io.github.droidkaigi.confsched2019.model.Announcement import kotlinx.coroutines.tasks.await import javax.inject.Inject -class FirestoreImpl @Inject constructor() : FireStore { +class FirestoreImpl @Inject constructor() : Firestore { override suspend fun getFavoriteSessionIds(): List { if (FirebaseAuth.getInstance().currentUser?.uid == null) return listOf() diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreModule.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreModule.kt index d3829fd76..3c6d27be9 100644 --- a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreModule.kt +++ b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreModule.kt @@ -5,7 +5,7 @@ import dagger.Module @Module(includes = [FirestoreModule.Providers::class]) internal abstract class FirestoreModule { - @Binds abstract fun fireStore(impl: FirestoreImpl): FireStore + @Binds abstract fun firestore(impl: FirestoreImpl): Firestore @Module internal object Providers diff --git a/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt b/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt index 90becd5ce..7c1de79d8 100644 --- a/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt +++ b/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt @@ -2,7 +2,7 @@ package io.github.droidkaigi.confsched2019.data.firestore import io.github.droidkaigi.confsched2019.model.Announcement -interface FireStore { +interface Firestore { suspend fun getFavoriteSessionIds(): List suspend fun toggleFavorite(sessionId: String) suspend fun getAnnouncements(): List diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt index c85c9389c..d8412db70 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt @@ -4,7 +4,7 @@ import com.soywiz.klock.DateTime import io.github.droidkaigi.confsched2019.data.api.DroidKaigiApi import io.github.droidkaigi.confsched2019.data.api.GoogleFormApi import io.github.droidkaigi.confsched2019.data.db.SessionDatabase -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.data.repository.mapper.toSession import io.github.droidkaigi.confsched2019.model.Lang import io.github.droidkaigi.confsched2019.model.Session @@ -19,7 +19,7 @@ class DataSessionRepository @Inject constructor( private val droidKaigiApi: DroidKaigiApi, private val googleFormApi: GoogleFormApi, private val sessionDatabase: SessionDatabase, - private val fireStore: FireStore + private val firestore: Firestore ) : SessionRepository { override suspend fun sessionContents(): SessionContents = coroutineScope { @@ -39,7 +39,7 @@ class DataSessionRepository @Inject constructor( val sessionsAsync = async { sessionDatabase.sessions() } val allSpeakersAsync = async { sessionDatabase.allSpeaker() } val fabSessionIdsAsync = async { - fireStore.getFavoriteSessionIds() + firestore.getFavoriteSessionIds() } val sessionEntities = sessionsAsync.await() @@ -56,7 +56,7 @@ class DataSessionRepository @Inject constructor( } override suspend fun toggleFavorite(session: Session.SpeechSession) { - fireStore.toggleFavorite(session.id) + firestore.toggleFavorite(session.id) } override suspend fun submitSessionFeedback( diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/RepositoryComponent.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/RepositoryComponent.kt index 253050ea1..bb8d541f7 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/RepositoryComponent.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/RepositoryComponent.kt @@ -6,7 +6,7 @@ import io.github.droidkaigi.confsched2019.data.api.DroidKaigiApi import io.github.droidkaigi.confsched2019.data.api.GoogleFormApi import io.github.droidkaigi.confsched2019.data.db.SessionDatabase import io.github.droidkaigi.confsched2019.data.db.SponsorDatabase -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import javax.inject.Singleton @Singleton @@ -28,7 +28,7 @@ interface RepositoryComponent { @BindsInstance fun database(database: SessionDatabase): Builder @BindsInstance fun sponsorDatabase(database: SponsorDatabase): Builder - @BindsInstance fun fireStore(fireStore: FireStore): Builder + @BindsInstance fun firestore(firestore: Firestore): Builder fun build(): RepositoryComponent } diff --git a/feature/announcement/src/main/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreator.kt b/feature/announcement/src/main/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreator.kt index 923e0f955..8d5192779 100644 --- a/feature/announcement/src/main/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreator.kt +++ b/feature/announcement/src/main/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreator.kt @@ -2,7 +2,7 @@ package io.github.droidkaigi.confsched2019.announcement.ui.actioncreator import androidx.lifecycle.Lifecycle import io.github.droidkaigi.confsched2019.action.Action -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.di.PageScope import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher import io.github.droidkaigi.confsched2019.ext.android.coroutineScope @@ -14,7 +14,7 @@ import javax.inject.Inject class AnnouncementActionCreator @Inject constructor( override val dispatcher: Dispatcher, - private val fireStore: FireStore, + private val firestore: Firestore, @PageScope private val lifecycle: Lifecycle ) : CoroutineScope by lifecycle.coroutineScope, ErrorHandler { @@ -22,7 +22,7 @@ class AnnouncementActionCreator @Inject constructor( fun load() = launch { try { dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADING)) - dispatcher.dispatch(Action.AnnouncementLoaded(fireStore.getAnnouncements())) + dispatcher.dispatch(Action.AnnouncementLoaded(firestore.getAnnouncements())) dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADED)) } catch (e: Exception) { onError(e) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt index 521ec408a..194dccc1d 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt @@ -2,17 +2,17 @@ package io.github.droidkaigi.confsched2019.di import dagger.Module import dagger.Provides -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.data.repository.FireStoreComponent import io.github.droidkaigi.confsched2019.ext.android.Dispatchers import javax.inject.Singleton @Module object FireStoreComponentModule { - @JvmStatic @Provides @Singleton fun provideRepository(): FireStore { + @JvmStatic @Provides @Singleton fun provideRepository(): Firestore { return FireStoreComponent.builder() .coroutineContext(Dispatchers.IO) .build() - .fireStore() + .firestore() } } diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/RepositoryComponentModule.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/RepositoryComponentModule.kt index 4cb50c516..0fe749d71 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/RepositoryComponentModule.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/RepositoryComponentModule.kt @@ -6,7 +6,7 @@ import io.github.droidkaigi.confsched2019.data.api.DroidKaigiApi import io.github.droidkaigi.confsched2019.data.api.GoogleFormApi import io.github.droidkaigi.confsched2019.data.db.SessionDatabase import io.github.droidkaigi.confsched2019.data.db.SponsorDatabase -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.data.repository.RepositoryComponent import io.github.droidkaigi.confsched2019.data.repository.SessionRepository import io.github.droidkaigi.confsched2019.data.repository.SponsorRepository @@ -19,14 +19,14 @@ object RepositoryComponentModule { googleFormApi: GoogleFormApi, database: SessionDatabase, sponsorDatabase: SponsorDatabase, - fireStore: FireStore + firestore: Firestore ): SessionRepository { return RepositoryComponent.builder() .droidKaigiApi(droidKaigiApi) .googleFormApi(googleFormApi) .database(database) .sponsorDatabase(sponsorDatabase) - .fireStore(fireStore) + .firestore(firestore) .build() .sessionRepository() } @@ -36,14 +36,14 @@ object RepositoryComponentModule { googleFormApi: GoogleFormApi, database: SessionDatabase, sponsorDatabase: SponsorDatabase, - fireStore: FireStore + firestore: Firestore ): SponsorRepository { return RepositoryComponent.builder() .droidKaigiApi(droidKaigiApi) .googleFormApi(googleFormApi) .database(database) .sponsorDatabase(sponsorDatabase) - .fireStore(fireStore) + .firestore(firestore) .build() .sponsorRepository() } From 7ae65c61892678f848dfe2e1034139817e18dd44 Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 12:20:42 +0900 Subject: [PATCH 011/143] add keep scroll position logic From 5322dccd29502a7101c0d7d85496e4371b9ec699 Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 12:21:43 +0900 Subject: [PATCH 012/143] rename FireStoreComponent.kt to FirestoreComponent.kt --- .../confsched2019/data/firestore/FireStoreComponent.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt index 1d1925342..55ebaccaa 100644 --- a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt +++ b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt @@ -13,7 +13,7 @@ import kotlin.coroutines.CoroutineContext FirestoreModule::class ] ) -interface FireStoreComponent { +interface FirestoreComponent { fun firestore(): Firestore @Component.Builder @@ -21,10 +21,10 @@ interface FireStoreComponent { @BindsInstance fun coroutineContext(coroutineContext: CoroutineContext): Builder - fun build(): FireStoreComponent + fun build(): FirestoreComponent } companion object { - fun builder(): Builder = DaggerFireStoreComponent.builder() + fun builder(): Builder = DaggerFirestoreComponent.builder() } } From 6854f0f6de2122833c070b0f2fe1323d8c738936 Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 12:22:01 +0900 Subject: [PATCH 013/143] Rename FireStoreComponentModule.kt to FirestoreComponentModule.kt --- .../io/github/droidkaigi/confsched2019/di/AppComponent.kt | 2 +- .../droidkaigi/confsched2019/di/FireStoreComponentModule.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/AppComponent.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/AppComponent.kt index 31ca8520e..5d6a7951f 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/AppComponent.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/AppComponent.kt @@ -16,7 +16,7 @@ import javax.inject.Singleton MainActivityModule.MainActivityBuilder::class, DbComponentModule::class, RepositoryComponentModule::class, - FireStoreComponentModule::class, + FirestoreComponentModule::class, ApiComponentModule::class ] ) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt index 194dccc1d..e50454145 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt @@ -3,14 +3,14 @@ package io.github.droidkaigi.confsched2019.di import dagger.Module import dagger.Provides import io.github.droidkaigi.confsched2019.data.firestore.Firestore -import io.github.droidkaigi.confsched2019.data.repository.FireStoreComponent +import io.github.droidkaigi.confsched2019.data.repository.FirestoreComponent import io.github.droidkaigi.confsched2019.ext.android.Dispatchers import javax.inject.Singleton @Module -object FireStoreComponentModule { +object FirestoreComponentModule { @JvmStatic @Provides @Singleton fun provideRepository(): Firestore { - return FireStoreComponent.builder() + return FirestoreComponent.builder() .coroutineContext(Dispatchers.IO) .build() .firestore() From f2140fbcb142031c1a2c208ce085b0f86c574380 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 12:49:49 +0900 Subject: [PATCH 014/143] Implemented click event --- .../session/ui/SessionDetailFragment.kt | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 50947f693..198c0e243 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -23,6 +23,7 @@ import io.github.droidkaigi.confsched2019.session.ui.actioncreator.SessionConten import io.github.droidkaigi.confsched2019.session.ui.item.SpeakerItem import io.github.droidkaigi.confsched2019.session.ui.store.SessionContentsStore import io.github.droidkaigi.confsched2019.session.ui.widget.DaggerFragment +import io.github.droidkaigi.confsched2019.system.actioncreator.ActivityActionCreator import io.github.droidkaigi.confsched2019.system.store.SystemStore import javax.inject.Inject @@ -33,6 +34,7 @@ class SessionDetailFragment : DaggerFragment() { @Inject lateinit var systemStore: SystemStore @Inject lateinit var sessionContentsStore: SessionContentsStore @Inject lateinit var speakerItemFactory: SpeakerItem.Factory + @Inject lateinit var activityActionCreator: ActivityActionCreator private lateinit var sessionDetailFragmentArgs: SessionDetailFragmentArgs private val groupAdapter = GroupAdapter>() @@ -108,6 +110,17 @@ class SessionDetailFragment : DaggerFragment() { ) } groupAdapter.update(sessionItems) + + binding.sessionVideoButton.setOnClickListener { + session.videoUrl?.let { urlString -> + activityActionCreator.openUrl(urlString) + } + } + binding.sessionSlideButton.setOnClickListener { + session.slideUrl?.let { urlString -> + activityActionCreator.openUrl(urlString) + } + } } } @@ -122,10 +135,10 @@ abstract class SessionDetailFragmentModule { return sessionsFragment.viewLifecycleOwner.lifecycle } - @JvmStatic @Provides fun provideActivity( - sessionsFragment: SessionDetailFragment - ): FragmentActivity { - return sessionsFragment.requireActivity() - } +// @JvmStatic @Provides fun provideActivity( +// sessionsFragment: SessionDetailFragment +// ): FragmentActivity { +// return sessionsFragment.requireActivity() +// } } } From 82ded5060574409f65e075a324dbb570d65bcb35 Mon Sep 17 00:00:00 2001 From: shyne Date: Wed, 9 Jan 2019 12:51:33 +0900 Subject: [PATCH 015/143] add chipMinTouchTargetSize --- feature/session/src/main/res/layout/fragment_session_detail.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 6b3f1665d..23359420c 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -190,6 +190,7 @@ android:textAppearance="?textAppearanceCaption" android:textColor="@color/white" app:chipBackgroundColor="#7982e1" + app:chipMinTouchTargetSize="0dp" app:visibleGone="@{session.isInterpretationTarget}" /> From ffbf02a6d8cac9644eb8cc4444b2d22d0514a05a Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 12:52:31 +0900 Subject: [PATCH 016/143] Fixed translation --- feature/session/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 55381e1af..514ab9788 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -14,9 +14,9 @@ Survey Go to survey Speaker - 資料 - 動画 - スライド + Resources + Video + Slides Session Share Place From 4eb2868fb8a3078ef5b4c4c85414abf29daf7501 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 12:57:14 +0900 Subject: [PATCH 017/143] Hide resource layout when not have movie and slide links --- feature/session/src/main/res/layout/fragment_session_detail.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 96ccd7a2b..adc5d3be1 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -312,6 +312,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/session_message" + app:visibleGone="@{session.hasVideo && session.hasSlide}" /> Date: Wed, 9 Jan 2019 13:13:23 +0900 Subject: [PATCH 018/143] Rename --- .../src/main/res/layout/fragment_session_detail.xml | 10 +++++----- feature/session/src/main/res/values-ja/strings.xml | 6 +++--- feature/session/src/main/res/values/strings.xml | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index adc5d3be1..392b9cac5 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -316,11 +316,11 @@ /> @@ -366,7 +366,7 @@ android:paddingEnd="16dp" android:paddingStart="16dp" android:paddingTop="8dp" - android:text="@string/session_detail_document_slide" + android:text="@string/session_detail_resource_slide" android:textColor="@color/colorSecondary" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index 4ecab50c3..e27a963fd 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -5,9 +5,9 @@ 絞り込む アンケート 回答する - 資料 - 動画 - スライド + 資料 + 動画 + スライド 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 514ab9788..5e6dfb356 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -14,9 +14,9 @@ Survey Go to survey Speaker - Resources - Video - Slides + Resources + Video + Slides Session Share Place From e99f650a16c1711057929f3552b500e18be0902b Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 13:27:09 +0900 Subject: [PATCH 019/143] Removed unused import --- .../droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 198c0e243..85ebedec7 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.databinding.DataBindingUtil -import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle import com.xwray.groupie.GroupAdapter import com.xwray.groupie.databinding.ViewHolder From a1edf2c33773f977b09a8f3bca71a91cfe69ce02 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 13:35:06 +0900 Subject: [PATCH 020/143] Removed comment out code --- .../confsched2019/session/ui/SessionDetailFragment.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 85ebedec7..2ce43da55 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -133,11 +133,5 @@ abstract class SessionDetailFragmentModule { fun providesLifecycle(sessionsFragment: SessionDetailFragment): Lifecycle { return sessionsFragment.viewLifecycleOwner.lifecycle } - -// @JvmStatic @Provides fun provideActivity( -// sessionsFragment: SessionDetailFragment -// ): FragmentActivity { -// return sessionsFragment.requireActivity() -// } } } From 6dc0cc9451e8680e273232021c74bebf19c4a18e Mon Sep 17 00:00:00 2001 From: PT2050 Date: Wed, 9 Jan 2019 13:42:57 +0900 Subject: [PATCH 021/143] add privacy policy link --- .../droidkaigi/confsched2019/about/ui/item/AboutSection.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/about/src/main/java/io/github/droidkaigi/confsched2019/about/ui/item/AboutSection.kt b/feature/about/src/main/java/io/github/droidkaigi/confsched2019/about/ui/item/AboutSection.kt index 30cb5d184..fe2e666bc 100644 --- a/feature/about/src/main/java/io/github/droidkaigi/confsched2019/about/ui/item/AboutSection.kt +++ b/feature/about/src/main/java/io/github/droidkaigi/confsched2019/about/ui/item/AboutSection.kt @@ -34,7 +34,7 @@ class AboutSection @Inject constructor( R.string.about_privacy_policy, R.string.about_check ) { - Toast.makeText(it, "FIXME!!", Toast.LENGTH_SHORT).show() + activityActionCreator.openUrl("http://www.association.droidkaigi.jp/privacy") }, AboutItem( R.string.about_license, From c380acf6680539c4a3f55041b2971342cb9c0ae4 Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 13:43:50 +0900 Subject: [PATCH 022/143] Refilename FireStoreComponent.kt to FirestoreComponent.kt --- .../firestore/{FireStoreComponent.kt => FirestoreComponent.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/{FireStoreComponent.kt => FirestoreComponent.kt} (100%) diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreComponent.kt similarity index 100% rename from data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FireStoreComponent.kt rename to data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreComponent.kt From b313391f4393695ef3229425c081819f54d46581 Mon Sep 17 00:00:00 2001 From: Takafumi Kanda Date: Tue, 8 Jan 2019 23:14:33 +0530 Subject: [PATCH 023/143] Copy EventFilterView from iosched Source: https://github.com/google/iosched/blob/d8bc48b20c132b519879eda3a8e9af120519e159/mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/filters/EventFilterView.kt --- .../confsched2019/widget/EventFilterView.kt | 320 ++++++++++++++++++ .../src/main/res/drawable/tag_clear.xml | 32 ++ .../src/main/res/values/attrs.xml | 18 + .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/styles.xml | 10 + 5 files changed, 383 insertions(+) create mode 100644 frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt create mode 100644 frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml create mode 100644 frontendcomponent/androidcomponent/src/main/res/values/attrs.xml diff --git a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt new file mode 100644 index 000000000..f79001d8b --- /dev/null +++ b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt @@ -0,0 +1,320 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.iosched.ui.schedule.filters + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Outline +import android.graphics.Paint +import android.graphics.Paint.ANTI_ALIAS_FLAG +import android.graphics.Paint.Style.STROKE +import android.graphics.drawable.Drawable +import android.os.Build.VERSION.SDK_INT +import android.os.Build.VERSION_CODES.M +import android.text.Layout.Alignment.ALIGN_NORMAL +import android.text.StaticLayout +import android.text.TextPaint +import android.util.AttributeSet +import android.view.View +import android.view.ViewOutlineProvider +import android.view.animation.AnimationUtils +import android.widget.Checkable +import androidx.annotation.ColorInt +import androidx.core.animation.doOnEnd +import androidx.core.content.res.getColorOrThrow +import androidx.core.content.res.getDimensionOrThrow +import androidx.core.content.res.getDimensionPixelSizeOrThrow +import androidx.core.content.res.getDrawableOrThrow +import androidx.core.graphics.ColorUtils +import androidx.core.graphics.withScale +import androidx.core.graphics.withTranslation +import com.google.samples.apps.iosched.R +import com.google.samples.apps.iosched.util.lerp +import com.google.samples.apps.iosched.util.textWidth + +/** + * A custom view for displaying filters. Allows a custom presentation of the tag color and selection + * state. + */ +class EventFilterView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr), Checkable { + + var color: Int = 0xffff00ff.toInt() + set(value) { + if (field != value) { + field = value + dotPaint.color = value + postInvalidateOnAnimation() + } + } + + var selectedTextColor: Int? = null + + var text: CharSequence? = null + set(value) { + field = value + updateContentDescription() + requestLayout() + } + + var showIcons: Boolean = true + set(value) { + if (field != value) { + field = value + requestLayout() + } + } + + private var progress = 0f + set(value) { + if (field != value) { + field = value + postInvalidateOnAnimation() + if (value == 0f || value == 1f) { + updateContentDescription() + } + } + } + + private val padding: Int + + private val outlinePaint: Paint + + private val textPaint: TextPaint + + private val dotPaint: Paint + + private val clear: Drawable + + private val touchFeedback: Drawable + + private lateinit var textLayout: StaticLayout + + private var progressAnimator: ValueAnimator? = null + + private val interp = + AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in) + + @ColorInt private val defaultTextColor: Int + + init { + val a = context.obtainStyledAttributes( + attrs, + R.styleable.EventFilterView, + R.attr.eventFilterViewStyle, + R.style.Widget_IOSched_EventFilters + ) + outlinePaint = Paint(ANTI_ALIAS_FLAG).apply { + color = a.getColorOrThrow(R.styleable.EventFilterView_android_strokeColor) + strokeWidth = a.getDimensionOrThrow(R.styleable.EventFilterView_outlineWidth) + style = STROKE + } + defaultTextColor = a.getColorOrThrow(R.styleable.EventFilterView_android_textColor) + textPaint = TextPaint(ANTI_ALIAS_FLAG).apply { + color = defaultTextColor + textSize = a.getDimensionOrThrow(R.styleable.EventFilterView_android_textSize) + } + dotPaint = Paint(ANTI_ALIAS_FLAG) + clear = a.getDrawableOrThrow(R.styleable.EventFilterView_clearIcon).apply { + setBounds( + -intrinsicWidth / 2, -intrinsicHeight / 2, intrinsicWidth / 2, intrinsicHeight / 2 + ) + } + touchFeedback = a.getDrawableOrThrow(R.styleable.EventFilterView_foreground).apply { + callback = this@EventFilterView + } + padding = a.getDimensionPixelSizeOrThrow(R.styleable.EventFilterView_android_padding) + isChecked = a.getBoolean(R.styleable.EventFilterView_android_checked, false) + showIcons = a.getBoolean(R.styleable.EventFilterView_showIcons, true) + a.recycle() + clipToOutline = true + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val nonTextWidth = (4 * padding) + + (2 * outlinePaint.strokeWidth).toInt() + + if (showIcons) clear.intrinsicWidth else 0 + val availableTextWidth = when (MeasureSpec.getMode(widthMeasureSpec)) { + MeasureSpec.EXACTLY -> MeasureSpec.getSize(widthMeasureSpec) - nonTextWidth + MeasureSpec.AT_MOST -> MeasureSpec.getSize(widthMeasureSpec) - nonTextWidth + MeasureSpec.UNSPECIFIED -> Int.MAX_VALUE + else -> Int.MAX_VALUE + } + createLayout(availableTextWidth) + val w = nonTextWidth + textLayout.textWidth() + val h = padding + textLayout.height + padding + setMeasuredDimension(w, h) + outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, outline: Outline) { + outline.setRoundRect(0, 0, w, h, h / 2f) + } + } + touchFeedback.setBounds(0, 0, w, h) + } + + override fun onDraw(canvas: Canvas) { + val strokeWidth = outlinePaint.strokeWidth + val iconRadius = clear.intrinsicWidth / 2f + val halfStroke = strokeWidth / 2f + val rounding = (height - strokeWidth) / 2f + + // Outline + if (progress < 1f) { + canvas.drawRoundRect( + halfStroke, + halfStroke, + width - halfStroke, + height - halfStroke, + rounding, + rounding, + outlinePaint + ) + } + + // Tag color dot/background + if (showIcons) { + // Draws beyond bounds and relies on clipToOutline to enforce pill shape + val dotRadius = lerp( + strokeWidth + iconRadius, + width.toFloat(), + progress + ) + canvas.drawCircle(strokeWidth + padding + iconRadius, height / 2f, dotRadius, dotPaint) + } else { + canvas.drawRoundRect( + halfStroke, + halfStroke, + width - halfStroke, + height - halfStroke, + rounding, + rounding, + dotPaint + ) + } + + // Text + val textX = if (showIcons) { + lerp( + strokeWidth + padding + clear.intrinsicWidth + padding, + strokeWidth + padding * 2f, + progress + ) + } else { + strokeWidth + padding * 2f + } + val selectedColor = selectedTextColor + textPaint.color = if (selectedColor != null && selectedColor != 0 && progress > 0) { + ColorUtils.blendARGB(defaultTextColor, selectedColor, progress) + } else { + defaultTextColor + } + canvas.withTranslation( + x = textX, + y = (height - textLayout.height) / 2f + ) { + textLayout.draw(canvas) + } + + // Clear icon + if (showIcons && progress > 0f) { + canvas.withTranslation( + x = width - strokeWidth - padding - iconRadius, + y = height / 2f + ) { + canvas.withScale(progress, progress) { + clear.draw(canvas) + } + } + } + + // Touch feedback + touchFeedback.draw(canvas) + } + + /** + * Starts the animation to enable/disable a filter and invokes a function when done. + */ + fun animateCheckedAndInvoke(checked: Boolean, onEnd: (() -> Unit)?) { + val newProgress = if (checked) 1f else 0f + if (newProgress != progress) { + progressAnimator?.cancel() + progressAnimator = ValueAnimator.ofFloat(progress, newProgress).apply { + addUpdateListener { + progress = it.animatedValue as Float + } + doOnEnd { + progress = newProgress + onEnd?.invoke() + } + interpolator = interp + duration = if (checked) SELECTING_DURATION else DESELECTING_DURATION + start() + } + } + } + + override fun isChecked() = progress == 1f + + override fun toggle() { + progress = if (progress == 0f) 1f else 0f + } + + override fun setChecked(checked: Boolean) { + progress = if (checked) 1f else 0f + } + + override fun verifyDrawable(who: Drawable?): Boolean { + return super.verifyDrawable(who) || who == touchFeedback + } + + override fun drawableStateChanged() { + super.drawableStateChanged() + touchFeedback.state = drawableState + } + + override fun jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState() + touchFeedback.jumpToCurrentState() + } + + override fun drawableHotspotChanged(x: Float, y: Float) { + super.drawableHotspotChanged(x, y) + touchFeedback.setHotspot(x, y) + } + + private fun createLayout(textWidth: Int) { + textLayout = if (SDK_INT >= M) { + StaticLayout.Builder.obtain(text, 0, text?.length!!, textPaint, textWidth).build() + } else { + StaticLayout(text, textPaint, textWidth, ALIGN_NORMAL, 1f, 0f, true) + } + } + + private fun updateContentDescription() { + val desc = if (isChecked) R.string.a11y_filter_applied else R.string.a11y_filter_not_applied + contentDescription = resources.getString(desc, text) + } + + companion object { + private const val SELECTING_DURATION = 350L + private const val DESELECTING_DURATION = 200L + } +} diff --git a/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml b/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml new file mode 100644 index 000000000..3c076238f --- /dev/null +++ b/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml b/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml new file mode 100644 index 000000000..1f0e3cbd2 --- /dev/null +++ b/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml index 882ab46b4..e29f97a6c 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml @@ -19,4 +19,7 @@ Search Setting + + %1s filter applied + %1s filter not applied diff --git a/frontendcomponent/androidcomponent/src/main/res/values/styles.xml b/frontendcomponent/androidcomponent/src/main/res/values/styles.xml index 045e125f3..5bbc929c0 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/styles.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/styles.xml @@ -1,3 +1,13 @@ + From e376fb378078620a148a6085937e02b5417974f3 Mon Sep 17 00:00:00 2001 From: Takafumi Kanda Date: Wed, 9 Jan 2019 00:09:28 +0530 Subject: [PATCH 024/143] Rename EventFilterView to FilterChip and fix its impl & resources --- .../androidcomponent/build.gradle | 1 + .../{EventFilterView.kt => FilterChip.kt} | 63 ++++++++++++------- .../src/main/res/drawable/tag_clear.xml | 35 ++--------- .../src/main/res/values-ja/strings.xml | 2 + .../src/main/res/values/attrs.xml | 9 +-- .../src/main/res/values/strings.xml | 4 +- .../src/main/res/values/styles.xml | 9 +-- .../src/main/res/values/themes.xml | 1 + 8 files changed, 62 insertions(+), 62 deletions(-) rename frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/{EventFilterView.kt => FilterChip.kt} (82%) diff --git a/frontendcomponent/androidcomponent/build.gradle b/frontendcomponent/androidcomponent/build.gradle index 388441ba7..d113489e8 100644 --- a/frontendcomponent/androidcomponent/build.gradle +++ b/frontendcomponent/androidcomponent/build.gradle @@ -9,6 +9,7 @@ apply from: rootProject.file('gradle/android.gradle') dependencies { api project(":model") api Dep.AndroidX.design + api Dep.AndroidX.coreKtx implementation Dep.Kotlin.stdlibJvm api Dep.Dagger.androidSupport diff --git a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/FilterChip.kt similarity index 82% rename from frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt rename to frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/FilterChip.kt index f79001d8b..200969b48 100644 --- a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/EventFilterView.kt +++ b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/widget/FilterChip.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.samples.apps.iosched.ui.schedule.filters +package io.github.droidkaigi.confsched2019.widget import android.animation.ValueAnimator import android.content.Context @@ -43,21 +43,20 @@ import androidx.core.content.res.getDrawableOrThrow import androidx.core.graphics.ColorUtils import androidx.core.graphics.withScale import androidx.core.graphics.withTranslation -import com.google.samples.apps.iosched.R -import com.google.samples.apps.iosched.util.lerp -import com.google.samples.apps.iosched.util.textWidth +import com.google.android.material.math.MathUtils.lerp +import io.github.droidkaigi.confsched2019.widget.component.R /** * A custom view for displaying filters. Allows a custom presentation of the tag color and selection * state. */ -class EventFilterView @JvmOverloads constructor( +class FilterChip @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr), Checkable { - var color: Int = 0xffff00ff.toInt() + var color: Int = 0 set(value) { if (field != value) { field = value @@ -68,7 +67,7 @@ class EventFilterView @JvmOverloads constructor( var selectedTextColor: Int? = null - var text: CharSequence? = null + var text: CharSequence = "" set(value) { field = value updateContentDescription() @@ -118,32 +117,34 @@ class EventFilterView @JvmOverloads constructor( init { val a = context.obtainStyledAttributes( attrs, - R.styleable.EventFilterView, - R.attr.eventFilterViewStyle, - R.style.Widget_IOSched_EventFilters + R.styleable.FilterChip, + R.attr.filterChipStyle, + 0 ) outlinePaint = Paint(ANTI_ALIAS_FLAG).apply { - color = a.getColorOrThrow(R.styleable.EventFilterView_android_strokeColor) - strokeWidth = a.getDimensionOrThrow(R.styleable.EventFilterView_outlineWidth) + color = a.getColorOrThrow(R.styleable.FilterChip_strokeColor) + strokeWidth = a.getDimensionOrThrow(R.styleable.FilterChip_strokeWidth) style = STROKE } - defaultTextColor = a.getColorOrThrow(R.styleable.EventFilterView_android_textColor) + defaultTextColor = a.getColorOrThrow(R.styleable.FilterChip_android_textColor) + selectedTextColor = a.getColor(R.styleable.FilterChip_selectedTextColor, 0) textPaint = TextPaint(ANTI_ALIAS_FLAG).apply { color = defaultTextColor - textSize = a.getDimensionOrThrow(R.styleable.EventFilterView_android_textSize) + textSize = a.getDimensionOrThrow(R.styleable.FilterChip_android_textSize) } dotPaint = Paint(ANTI_ALIAS_FLAG) - clear = a.getDrawableOrThrow(R.styleable.EventFilterView_clearIcon).apply { + color = a.getColor(R.styleable.FilterChip_android_color, 0) + clear = a.getDrawableOrThrow(R.styleable.FilterChip_clearIcon).apply { setBounds( -intrinsicWidth / 2, -intrinsicHeight / 2, intrinsicWidth / 2, intrinsicHeight / 2 ) } - touchFeedback = a.getDrawableOrThrow(R.styleable.EventFilterView_foreground).apply { - callback = this@EventFilterView + touchFeedback = a.getDrawableOrThrow(R.styleable.FilterChip_foreground).apply { + callback = this@FilterChip } - padding = a.getDimensionPixelSizeOrThrow(R.styleable.EventFilterView_android_padding) - isChecked = a.getBoolean(R.styleable.EventFilterView_android_checked, false) - showIcons = a.getBoolean(R.styleable.EventFilterView_showIcons, true) + padding = a.getDimensionPixelSizeOrThrow(R.styleable.FilterChip_android_padding) + isChecked = a.getBoolean(R.styleable.FilterChip_android_checked, false) + showIcons = a.getBoolean(R.styleable.FilterChip_showIcons, true) a.recycle() clipToOutline = true } @@ -281,7 +282,7 @@ class EventFilterView @JvmOverloads constructor( progress = if (checked) 1f else 0f } - override fun verifyDrawable(who: Drawable?): Boolean { + override fun verifyDrawable(who: Drawable): Boolean { return super.verifyDrawable(who) || who == touchFeedback } @@ -302,17 +303,33 @@ class EventFilterView @JvmOverloads constructor( private fun createLayout(textWidth: Int) { textLayout = if (SDK_INT >= M) { - StaticLayout.Builder.obtain(text, 0, text?.length!!, textPaint, textWidth).build() + StaticLayout.Builder.obtain(text, 0, text.length, textPaint, textWidth).build() } else { + @Suppress("DEPRECATION") StaticLayout(text, textPaint, textWidth, ALIGN_NORMAL, 1f, 0f, true) } } private fun updateContentDescription() { - val desc = if (isChecked) R.string.a11y_filter_applied else R.string.a11y_filter_not_applied + val desc = if (isChecked) { + R.string.description_filter_applied + } else { + R.string.description_filter_not_applied + } contentDescription = resources.getString(desc, text) } + /** + * Calculated the widest line in a [StaticLayout]. + */ + private fun StaticLayout.textWidth(): Int { + var width = 0f + for (i in 0 until lineCount) { + width = width.coerceAtLeast(getLineWidth(i)) + } + return width.toInt() + } + companion object { private const val SELECTING_DURATION = 350L private const val DESELECTING_DURATION = 200L diff --git a/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml b/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml index 3c076238f..71afac4c5 100644 --- a/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml +++ b/frontendcomponent/androidcomponent/src/main/res/drawable/tag_clear.xml @@ -1,32 +1,9 @@ - - - + android:width="12dp" + android:height="12dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> - + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> diff --git a/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml b/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml index 9d80623bb..dbb1e1799 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml @@ -6,4 +6,6 @@ Droidkaigiとは スポンサーページ 全体アンケート + フィルター%1sを適用 + フィルター%1sを解除 diff --git a/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml b/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml index 1f0e3cbd2..65cae3e7d 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/attrs.xml @@ -1,16 +1,17 @@ - + - + - - + + + diff --git a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml index e29f97a6c..33ad5806d 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml @@ -20,6 +20,6 @@ Setting - %1s filter applied - %1s filter not applied + %1s filter applied + %1s filter not applied diff --git a/frontendcomponent/androidcomponent/src/main/res/values/styles.xml b/frontendcomponent/androidcomponent/src/main/res/values/styles.xml index 5bbc929c0..dfd3ed4f0 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/styles.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/styles.xml @@ -1,11 +1,12 @@ - + From 14d03b2d5c65adf8c1432ec32c0961051d57aacc Mon Sep 17 00:00:00 2001 From: takahirom Date: Wed, 9 Jan 2019 14:02:59 +0900 Subject: [PATCH 027/143] Rename FireStoreComponentModule.kt -> FirestoreComponentModule.kt --- .../{FireStoreComponentModule.kt => FirestoreComponentModule.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/{FireStoreComponentModule.kt => FirestoreComponentModule.kt} (100%) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FirestoreComponentModule.kt similarity index 100% rename from frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FireStoreComponentModule.kt rename to frontend/android/src/main/java/io/github/droidkaigi/confsched2019/di/FirestoreComponentModule.kt From ed5102c400a385c9d22962e019e3bcb760159236 Mon Sep 17 00:00:00 2001 From: androhi Date: Wed, 9 Jan 2019 14:44:48 +0900 Subject: [PATCH 028/143] Fix to hide BottomAppBar when session detail can not scroll. --- .../ui/widget/SessionBottomAppBarBehavior.kt | 53 +++++++++++++++++++ .../res/layout/fragment_session_detail.xml | 1 + .../session/src/main/res/values/strings.xml | 1 + 3 files changed, 55 insertions(+) create mode 100644 feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt new file mode 100644 index 000000000..706a15174 --- /dev/null +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt @@ -0,0 +1,53 @@ +package io.github.droidkaigi.confsched2019.session.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.children +import androidx.core.widget.NestedScrollView +import com.google.android.material.bottomappbar.BottomAppBar + +class SessionBottomAppBarBehavior( + context: Context? = null, + attrs: AttributeSet? = null + ) : BottomAppBar.Behavior(context, attrs) { + + private var state: Int = STATE_SCROLLED_UP + + override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: BottomAppBar, ev: MotionEvent): Boolean { + if (child.isShown.not() || ev.action != MotionEvent.ACTION_DOWN) { + return super.onInterceptTouchEvent(parent, child, ev) + } + + // If screen be able not to scrolled, it makes to slide the bottom app bar. + if (canScroll(parent).not()) { + state = if (state == STATE_SCROLLED_UP) { + super.slideDown(child) + STATE_SCROLLED_DOWN + } else { + super.slideUp(child) + STATE_SCROLLED_UP + } + } + return super.onInterceptTouchEvent(parent, child, ev) + } + + private fun canScroll(parent: CoordinatorLayout): Boolean { + val nestedScrollView = if (parent.childCount > 0) { + (parent.children.find { it is NestedScrollView } as? NestedScrollView) + } else { + null + } + return nestedScrollView?.canScrollVertically(POSITIVE_DIRECTION) ?: true || + nestedScrollView?.canScrollVertically(NEGATIVE_DIRECTION) ?: true + } + + companion object { + private const val POSITIVE_DIRECTION = 1 + private const val NEGATIVE_DIRECTION = -1 + + private const val STATE_SCROLLED_DOWN = 1 + private const val STATE_SCROLLED_UP = 2 + } +} diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index e8a06f7c6..74f1ba4d6 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -397,6 +397,7 @@ android:layout_gravity="bottom" app:fabAlignmentMode="end" app:hideOnScroll="true" + app:layout_behavior="@string/session_bottom_appbar_behavior" /> Go to survey Live simultaneous interpretation + io.github.droidkaigi.confsched2019.session.ui.widget.SessionBottomAppBarBehavior From 3dce11024c362e5e0c1c92609e72ecf744670731 Mon Sep 17 00:00:00 2001 From: androhi Date: Wed, 9 Jan 2019 15:03:44 +0900 Subject: [PATCH 029/143] Fix code format in SessionBottomAppBarBehavior class --- .../session/ui/widget/SessionBottomAppBarBehavior.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt index 706a15174..c05d95531 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt @@ -11,11 +11,15 @@ import com.google.android.material.bottomappbar.BottomAppBar class SessionBottomAppBarBehavior( context: Context? = null, attrs: AttributeSet? = null - ) : BottomAppBar.Behavior(context, attrs) { +) : BottomAppBar.Behavior(context, attrs) { private var state: Int = STATE_SCROLLED_UP - override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: BottomAppBar, ev: MotionEvent): Boolean { + override fun onInterceptTouchEvent( + parent: CoordinatorLayout, + child: BottomAppBar, + ev: MotionEvent + ): Boolean { if (child.isShown.not() || ev.action != MotionEvent.ACTION_DOWN) { return super.onInterceptTouchEvent(parent, child, ev) } From eeb92da309b83467f5710e3edafc94c8a94d12f2 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 15:07:37 +0900 Subject: [PATCH 030/143] Added ripple effect in about screen --- feature/about/src/main/res/layout/header_about.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/about/src/main/res/layout/header_about.xml b/feature/about/src/main/res/layout/header_about.xml index a011ddbd9..0a8bb6280 100644 --- a/feature/about/src/main/res/layout/header_about.xml +++ b/feature/about/src/main/res/layout/header_about.xml @@ -58,7 +58,7 @@ android:contentDescription="@null" android:layout_marginStart="16dp" android:layout_marginTop="16dp" - android:background="@null" + android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/description_droidkaigi_text"/> @@ -69,7 +69,7 @@ android:layout_marginStart="16dp" android:src="@drawable/ic_github_black_24dp" android:contentDescription="@null" - android:background="@null" + android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_twitter" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" /> @@ -81,7 +81,7 @@ android:layout_marginStart="16dp" android:src="@drawable/ic_youtube_24dp" android:contentDescription="@null" - android:background="@null" + android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_github" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" /> @@ -93,7 +93,7 @@ android:layout_marginStart="16dp" android:src="@drawable/ic_medium_24dp" android:contentDescription="@null" - android:background="@null" + android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_youtube" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" /> From 25183e92847aad278274a9d7f842434b9191bc4e Mon Sep 17 00:00:00 2001 From: pg0084 Date: Wed, 9 Jan 2019 15:08:07 +0900 Subject: [PATCH 031/143] Delete File LocaleMessage.kt --- model/src/commonMain/kotlin/LocaleMessage.kt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 model/src/commonMain/kotlin/LocaleMessage.kt diff --git a/model/src/commonMain/kotlin/LocaleMessage.kt b/model/src/commonMain/kotlin/LocaleMessage.kt deleted file mode 100644 index 6c30e43c8..000000000 --- a/model/src/commonMain/kotlin/LocaleMessage.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.github.droidkaigi.confsched2019.model - -class LocaleMessage(val enMessage: String, val jaMessage: String) - -fun LocaleMessage.get() = if (defaultLang() != Lang.JA) enMessage else jaMessage From 0d46417be0c407cece99058cf20dddb41a9c53e4 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 15:24:30 +0900 Subject: [PATCH 032/143] Expanded tap area --- .../src/main/res/layout/header_about.xml | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/feature/about/src/main/res/layout/header_about.xml b/feature/about/src/main/res/layout/header_about.xml index 0a8bb6280..c3cb6ec67 100644 --- a/feature/about/src/main/res/layout/header_about.xml +++ b/feature/about/src/main/res/layout/header_about.xml @@ -8,7 +8,7 @@ android:id="@+id/about_header_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingBottom="24dp"> + android:paddingBottom="12dp"> Date: Wed, 9 Jan 2019 11:57:19 +0530 Subject: [PATCH 033/143] Add missing dollar marks on format string placeholders --- .../androidcomponent/src/main/res/values-ja/strings.xml | 4 ++-- .../androidcomponent/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml b/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml index dbb1e1799..d8f13296b 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values-ja/strings.xml @@ -6,6 +6,6 @@ Droidkaigiとは スポンサーページ 全体アンケート - フィルター%1sを適用 - フィルター%1sを解除 + フィルター%1$sを適用 + フィルター%1$sを解除 diff --git a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml index 33ad5806d..dc1b96338 100644 --- a/frontendcomponent/androidcomponent/src/main/res/values/strings.xml +++ b/frontendcomponent/androidcomponent/src/main/res/values/strings.xml @@ -20,6 +20,6 @@ Setting - %1s filter applied - %1s filter not applied + %1$s filter applied + %1$s filter not applied From 18c812ce2a4372c7822b1bcba6b992c369235824 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 15:35:44 +0900 Subject: [PATCH 034/143] changed padding --- .../about/src/main/res/layout/header_about.xml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/feature/about/src/main/res/layout/header_about.xml b/feature/about/src/main/res/layout/header_about.xml index c3cb6ec67..d9bb22e6c 100644 --- a/feature/about/src/main/res/layout/header_about.xml +++ b/feature/about/src/main/res/layout/header_about.xml @@ -8,7 +8,7 @@ android:id="@+id/about_header_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingBottom="12dp"> + android:paddingBottom="20dp"> @@ -69,7 +69,8 @@ android:layout_height="wrap_content" android:src="@drawable/ic_github_black_24dp" android:contentDescription="@null" - android:padding="12dp" + android:layout_marginStart="16dp" + android:padding="4dp" android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_twitter" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" @@ -81,7 +82,8 @@ android:layout_height="wrap_content" android:src="@drawable/ic_youtube_24dp" android:contentDescription="@null" - android:padding="12dp" + android:layout_marginStart="16dp" + android:padding="4dp" android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_github" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" @@ -93,7 +95,8 @@ android:layout_height="wrap_content" android:src="@drawable/ic_medium_24dp" android:contentDescription="@null" - android:padding="12dp" + android:layout_marginStart="16dp" + android:padding="4dp" android:background="?attr/selectableItemBackgroundBorderless" app:layout_constraintStart_toEndOf="@+id/about_this_app_youtube" app:layout_constraintTop_toTopOf="@+id/about_this_app_twitter" From 173ab81ddb896dfe33e9cc184f8c1412fb6b6d0e Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 15:41:35 +0900 Subject: [PATCH 035/143] Enable to use ChromeCustomTabs --- buildSrc/src/main/java/dependencies/Dep.kt | 1 + feature/system/build.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/buildSrc/src/main/java/dependencies/Dep.kt b/buildSrc/src/main/java/dependencies/Dep.kt index 9fd1e23c4..2601e5a10 100644 --- a/buildSrc/src/main/java/dependencies/Dep.kt +++ b/buildSrc/src/main/java/dependencies/Dep.kt @@ -42,6 +42,7 @@ object Dep { val design = "com.google.android.material:material:1.1.0-alpha02" val coreKtx = "androidx.core:core-ktx:1.0.0-alpha1" val preference = "androidx.preference:preference:1.0.0" + val browser = "androidx.browser:browser:1.0.0" val lifecycleExtensions = "androidx.lifecycle:lifecycle-extensions:2.0.0" val lifecycleLiveData = "androidx.lifecycle:lifecycle-livedata:2.0.0" diff --git a/feature/system/build.gradle b/feature/system/build.gradle index d6fdbd989..416586c56 100644 --- a/feature/system/build.gradle +++ b/feature/system/build.gradle @@ -19,6 +19,7 @@ dependencies { api Dep.Kotlin.coroutines implementation Dep.Kotlin.androidCoroutinesDispatcher implementation Dep.AndroidX.appCompat + implementation Dep.AndroidX.browser implementation Dep.Ktor.clientAndroid From ecb57cb7861b500647040396e9290d89a3201c79 Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 15:41:48 +0900 Subject: [PATCH 036/143] Change for using ChromeCustomTabs --- .../system/actioncreator/ActivityActionCreator.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt index 31c37b1f5..6ac1d8bcb 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt @@ -2,14 +2,20 @@ package io.github.droidkaigi.confsched2019.system.actioncreator import android.content.Intent import android.net.Uri +import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import io.github.droidkaigi.confsched2019.system.R import javax.inject.Inject class ActivityActionCreator @Inject constructor(val activity: FragmentActivity) { fun openUrl(url: String) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) - activity.startActivity(intent) + val customTabsIntent = CustomTabsIntent.Builder() + .setShowTitle(true) + .enableUrlBarHiding() + .setToolbarColor(ContextCompat.getColor(activity, R.color.colorPrimary)) + .build() + customTabsIntent.launchUrl(activity, Uri.parse(url)) } fun openVenueOnGoogleMap() { From 5c9b771042aa093feef680750925690729ede36f Mon Sep 17 00:00:00 2001 From: androhi Date: Wed, 9 Jan 2019 15:55:41 +0900 Subject: [PATCH 037/143] Fix not to use Boolean.not() --- .../session/ui/widget/SessionBottomAppBarBehavior.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt index c05d95531..5eb09b02e 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionBottomAppBarBehavior.kt @@ -20,12 +20,12 @@ class SessionBottomAppBarBehavior( child: BottomAppBar, ev: MotionEvent ): Boolean { - if (child.isShown.not() || ev.action != MotionEvent.ACTION_DOWN) { + if (!child.isShown || ev.action != MotionEvent.ACTION_DOWN) { return super.onInterceptTouchEvent(parent, child, ev) } // If screen be able not to scrolled, it makes to slide the bottom app bar. - if (canScroll(parent).not()) { + if (!canScroll(parent)) { state = if (state == STATE_SCROLLED_UP) { super.slideDown(child) STATE_SCROLLED_DOWN From 73c582bdbd351664c3e4033f315cd25c286b74bb Mon Sep 17 00:00:00 2001 From: pg0084 Date: Wed, 9 Jan 2019 16:05:01 +0900 Subject: [PATCH 038/143] Replace SessionMessage with LocaledString --- .../confsched2019/data/repository/mapper/SessionMappers.kt | 5 ++--- .../confsched2019/session/ui/item/SpeechSessionItem.kt | 2 +- .../io/github/droidkaigi/confsched2019/SessionDummyDatas.kt | 3 +-- model/src/commonMain/kotlin/Session.kt | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt index f4641729d..48260a7cf 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt @@ -4,12 +4,11 @@ import com.soywiz.klock.DateTime import io.github.droidkaigi.confsched2019.data.db.entity.SessionWithSpeakers import io.github.droidkaigi.confsched2019.data.db.entity.SpeakerEntity import io.github.droidkaigi.confsched2019.model.Category -import io.github.droidkaigi.confsched2019.model.LocaledString import io.github.droidkaigi.confsched2019.model.Room import io.github.droidkaigi.confsched2019.model.Session -import io.github.droidkaigi.confsched2019.model.SessionMessage import io.github.droidkaigi.confsched2019.model.SessionType import io.github.droidkaigi.confsched2019.model.Speaker +import io.github.droidkaigi.confsched2019.model.LocaledString fun SessionWithSpeakers.toSession( speakerEntities: List, @@ -70,7 +69,7 @@ fun SessionWithSpeakers.toSession( isFavorited = favList!!.map { it.toString() }.contains(session.id), speakers = speakers, message = session.message?.let { - SessionMessage(it.ja, it.en) + LocaledString(it.ja, it.en) } ) } diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt index 546004a1f..c32579ca7 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt @@ -79,7 +79,7 @@ class SpeechSessionItem @AssistedInject constructor( bindSpeaker() speechSession.message?.let { message -> - this@with.message.text = message.getBodyByLang(systemStore.lang) + this@with.message.text = message.getByLang(systemStore.lang) } } } diff --git a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt index 42322a027..378d6793a 100644 --- a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt +++ b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt @@ -6,7 +6,6 @@ import io.github.droidkaigi.confsched2019.model.Category import io.github.droidkaigi.confsched2019.model.LocaledString import io.github.droidkaigi.confsched2019.model.Room import io.github.droidkaigi.confsched2019.model.Session -import io.github.droidkaigi.confsched2019.model.SessionMessage import io.github.droidkaigi.confsched2019.model.SessionType private val startTime = DateTime.createAdjusted(2019, 2, 7, 10, 0) @@ -42,7 +41,7 @@ fun dummySessionData(): List { isInterpretationTarget = true, isFavorited = true, speakers = listOf(), - message = SessionMessage("部屋移動", "room moved") + message = LocaledString("部屋移動", "room moved") ) ) } diff --git a/model/src/commonMain/kotlin/Session.kt b/model/src/commonMain/kotlin/Session.kt index 82785a17b..89e7a86cf 100644 --- a/model/src/commonMain/kotlin/Session.kt +++ b/model/src/commonMain/kotlin/Session.kt @@ -27,7 +27,7 @@ sealed class Session( val isInterpretationTarget: Boolean, val isFavorited: Boolean, val speakers: List, - val message: SessionMessage? + val message: LocaledString? ) : Session(id, dayNumber, startTime, endTime, room) { val hasVideo: Boolean = videoUrl.isNullOrEmpty().not() val hasSlide: Boolean = slideUrl.isNullOrEmpty().not() From 6ef310a2a10eb933c59c1589572b13169aedf500 Mon Sep 17 00:00:00 2001 From: pg0084 Date: Wed, 9 Jan 2019 16:05:25 +0900 Subject: [PATCH 039/143] Delete File SessionMessage.kt --- model/src/commonMain/kotlin/SessionMessage.kt | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 model/src/commonMain/kotlin/SessionMessage.kt diff --git a/model/src/commonMain/kotlin/SessionMessage.kt b/model/src/commonMain/kotlin/SessionMessage.kt deleted file mode 100644 index b9bd1be8c..000000000 --- a/model/src/commonMain/kotlin/SessionMessage.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.github.droidkaigi.confsched2019.model - -data class SessionMessage( - val jaMessage: String, - val enMessage: String -) { - - fun getBodyByLang(lang: Lang): String = if (lang == Lang.JA) { - jaMessage - } else { - enMessage - } -} From 7631e00f8cc8add3d1b681ec2b5bd93cf3e25712 Mon Sep 17 00:00:00 2001 From: Sho Takayanagi Date: Wed, 9 Jan 2019 16:15:15 +0900 Subject: [PATCH 040/143] Close drawer when pressed back key while drawer opened. --- .../github/droidkaigi/confsched2019/ui/MainActivity.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt index ff113f66a..9000cefae 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt @@ -7,6 +7,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.GravityCompat import androidx.core.view.ViewCompat import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil @@ -139,6 +140,14 @@ class MainActivity : DaggerAppCompatActivity() { return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item) } + + override fun onBackPressed() { + if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) { + binding.drawerLayout.closeDrawer(GravityCompat.START) + return + } + super.onBackPressed() + } } @Module From 41eefd0500927218163adfb4343c473335189ba6 Mon Sep 17 00:00:00 2001 From: kikuchy Date: Wed, 9 Jan 2019 16:18:33 +0900 Subject: [PATCH 041/143] Make :api and :api-impl buildable for iOS Framework. --- buildSrc/src/main/java/dependencies/Dep.kt | 3 +- data/api-impl/build.gradle | 46 +++++++++++++------ .../confsched2019/data/api/ApiEndpoint.kt | 3 ++ .../confsched2019/data/api/ApiComponent.kt | 24 ++++++++++ .../confsched2019/data/api/ApiEndpoint.kt | 5 ++ .../confsched2019/data/api/ApiEndpoint.kt | 5 ++ .../confsched2019/data/api/ApiModule.kt | 2 +- data/api/build.gradle | 6 +++ data/db-room/build.gradle | 2 +- data/repository-impl/build.gradle | 2 +- 10 files changed, 80 insertions(+), 18 deletions(-) create mode 100644 data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt create mode 100644 data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiComponent.kt create mode 100644 data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt create mode 100644 data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt diff --git a/buildSrc/src/main/java/dependencies/Dep.kt b/buildSrc/src/main/java/dependencies/Dep.kt index 9fd1e23c4..bd75a6b63 100644 --- a/buildSrc/src/main/java/dependencies/Dep.kt +++ b/buildSrc/src/main/java/dependencies/Dep.kt @@ -76,7 +76,8 @@ object Dep { "org.jetbrains.kotlinx:kotlinx-coroutines-reactive:$coroutinesVersion" val coroutinesPlayServices = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion" - val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.8.1-rc13" + val serializationCommon = "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1" + val serializationIos = "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1" } object Firebase { diff --git a/data/api-impl/build.gradle b/data/api-impl/build.gradle index 52a8407c4..9bcfd76ea 100644 --- a/data/api-impl/build.gradle +++ b/data/api-impl/build.gradle @@ -25,8 +25,36 @@ kotlin { sourceSets { commonMain.dependencies { api project(":data:api") + implementation Dep.Kotlin.stdlibCommon implementation Dep.Ktor.clientCommon - implementation Dep.Kotlin.serialization + implementation Dep.Kotlin.serializationCommon + } + androidMain { + dependsOn commonMain + dependencies { + implementation Dep.Kotlin.stdlibJvm + implementation Dep.Ktor.clientAndroid + implementation Dep.Ktor.jsonJvm + implementation Dep.OkHttp.client + implementation Dep.Stetho.stetho + implementation Dep.Dagger.core + implementation Dep.Dagger.androidSupport + implementation Dep.OkHttp.loggingInterceptor + } + } + androidTest { + dependsOn commonMain + dependencies { + implementation Dep.Test.junit + implementation Dep.Test.slf4j + } + } + iOSMain { + dependsOn commonMain + dependencies { + implementation Dep.Ktor.clientIos + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1" + } } } } @@ -45,20 +73,10 @@ android { } dependencies { - - implementation Dep.Kotlin.stdlibJvm - implementation Dep.Ktor.clientAndroid - implementation Dep.Ktor.jsonJvm - implementation Dep.OkHttp.client - implementation Dep.Stetho.stetho - implementation Dep.Dagger.core - implementation Dep.Dagger.androidSupport - implementation Dep.OkHttp.loggingInterceptor kapt Dep.Dagger.compiler kapt Dep.Dagger.androidProcessor - - testImplementation Dep.Test.junit - testImplementation Dep.Test.slf4j } - +configurations { + compileClasspath +} diff --git a/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt b/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt new file mode 100644 index 000000000..72e59a2f0 --- /dev/null +++ b/data/api-impl/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt @@ -0,0 +1,3 @@ +package io.github.droidkaigi.confsched2019.data.api + +internal expect fun apiEndpoint(): String diff --git a/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiComponent.kt b/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiComponent.kt new file mode 100644 index 000000000..d7d610f46 --- /dev/null +++ b/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiComponent.kt @@ -0,0 +1,24 @@ +package io.github.droidkaigi.confsched2019.data.api + +import io.ktor.client.HttpClient +import io.ktor.client.engine.ios.Ios +import io.ktor.client.features.UserAgent +import platform.Foundation.NSBundle + +// TODO: Replace with DI tools. +internal fun generateHttpClient(): HttpClient { + val version = NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString") as String + return HttpClient(Ios) { + install(UserAgent) { + agent = "official-app-2019/$version" + } + } +} + +fun generateDroidKaigiApi(): DroidKaigiApi { + return KtorDroidKaigiApi(generateHttpClient(), apiEndpoint()) +} + +fun generateGoogleFormApi(): GoogleFormApi { + return KtorGoogleFormApi(generateHttpClient()) +} diff --git a/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt b/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt new file mode 100644 index 000000000..27cab4ecd --- /dev/null +++ b/data/api-impl/src/iosMain/kotlin/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt @@ -0,0 +1,5 @@ +package io.github.droidkaigi.confsched2019.data.api + +// TODO: Replace with code getting endpoint from iOS application build configurations. +// This is temporally implementation. +internal actual fun apiEndpoint(): String = "https://droidkaigi2019-dev.appspot.com/api" diff --git a/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt b/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt new file mode 100644 index 000000000..dac903bbb --- /dev/null +++ b/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiEndpoint.kt @@ -0,0 +1,5 @@ +package io.github.droidkaigi.confsched2019.data.api + +import io.github.droidkaigi.confsched2019.api.BuildConfig + +internal actual fun apiEndpoint(): String = BuildConfig.API_ENDPOINT diff --git a/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiModule.kt b/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiModule.kt index 81e504ad7..c59cbd00f 100644 --- a/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiModule.kt +++ b/data/api-impl/src/main/java/io/github/droidkaigi/confsched2019/data/api/ApiModule.kt @@ -37,7 +37,7 @@ internal abstract class ApiModule { } @JvmStatic @Provides @Named("apiEndpoint") fun apiEndpoint(): String { - return BuildConfig.API_ENDPOINT + return io.github.droidkaigi.confsched2019.data.api.apiEndpoint() } } } diff --git a/data/api/build.gradle b/data/api/build.gradle index 56cced9f4..7498456c8 100644 --- a/data/api/build.gradle +++ b/data/api/build.gradle @@ -8,6 +8,12 @@ apply from: rootProject.file('gradle/android.gradle') kotlin { targets { fromPreset(presets.android, 'android') + final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \ + ? presets.iosArm64 : presets.iosX64 + + fromPreset(iOSTarget, 'iOS') { + compilations.main.outputKinds('FRAMEWORK') + } } sourceSets { commonMain.dependencies { diff --git a/data/db-room/build.gradle b/data/db-room/build.gradle index 673230ddb..ab6c0b9b8 100644 --- a/data/db-room/build.gradle +++ b/data/db-room/build.gradle @@ -14,7 +14,7 @@ dependencies { api project(":ext:android-extension") implementation Dep.Kotlin.stdlibJvm - implementation Dep.Kotlin.serialization + implementation Dep.Kotlin.serializationCommon api Dep.Kotlin.coroutines api Dep.AndroidX.Room.runtime api Dep.AndroidX.Room.coroutine diff --git a/data/repository-impl/build.gradle b/data/repository-impl/build.gradle index f62c40096..81e9c6e7f 100644 --- a/data/repository-impl/build.gradle +++ b/data/repository-impl/build.gradle @@ -15,7 +15,7 @@ dependencies { api project(":model") implementation Dep.Kotlin.stdlibJvm - implementation Dep.Kotlin.serialization + implementation Dep.Kotlin.serializationCommon api Dep.Kotlin.coroutines implementation Dep.AndroidX.lifecycleLiveData kapt Dep.AndroidX.Room.compiler From f976dfbe1a1e6effbce7b21e3e12d1938e74fc58 Mon Sep 17 00:00:00 2001 From: kikuchy Date: Wed, 9 Jan 2019 16:41:57 +0900 Subject: [PATCH 042/143] Make :repository buildable for iOS Framework. --- data/repository/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/repository/build.gradle b/data/repository/build.gradle index 6856c1f99..efd94ad76 100644 --- a/data/repository/build.gradle +++ b/data/repository/build.gradle @@ -8,6 +8,13 @@ apply from: rootProject.file('gradle/android.gradle') kotlin { targets { fromPreset(presets.android, 'android') + + final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \ + ? presets.iosArm64 : presets.iosX64 + + fromPreset(iOSTarget, 'iOS') { + compilations.main.outputKinds('FRAMEWORK') + } } sourceSets { commonMain.dependencies { From 8c3142b9f1d9d0426053d813aae9e7cc2899639c Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 16:42:06 +0900 Subject: [PATCH 043/143] Fixed divider width in session detail screen --- .../src/main/res/layout/fragment_session_detail.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index e8a06f7c6..5ddb58af8 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -106,6 +106,8 @@ android:id="@+id/divider1" android:layout_width="0dp" android:layout_height="4dp" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="48dp" android:contentDescription="@null" android:layerType="software" @@ -138,6 +140,8 @@ android:id="@+id/divider2" android:layout_width="0dp" android:layout_height="4dp" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="28dp" android:contentDescription="@null" android:layerType="software" @@ -223,6 +227,8 @@ android:id="@+id/divider3" android:layout_width="0dp" android:layout_height="4dp" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="24dp" android:contentDescription="@null" android:layerType="software" @@ -262,6 +268,8 @@ android:id="@+id/divider4" android:layout_width="0dp" android:layout_height="4dp" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="26dp" android:contentDescription="@null" android:layerType="software" @@ -315,6 +323,8 @@ android:id="@+id/divider5" android:layout_width="0dp" android:layout_height="4dp" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_marginTop="26dp" android:contentDescription="@null" android:layerType="software" From 8e43f7ada33bb2ed23a59ac239a3ed12a0a6dd2b Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 16:42:22 +0900 Subject: [PATCH 044/143] suppress fragment replacement --- .../confsched2019/session/ui/SessionPageFragment.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index ceb2b2d51..4f3d3292e 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -135,11 +135,14 @@ class SessionPageFragment : DaggerFragment() { } } - childFragmentManager - .beginTransaction() - .replace(R.id.sessions_sheet, fragment) - .disallowAddToBackStack() - .commit() + // suppress fragment replacement + if (childFragmentManager.findFragmentByTag(fragment::javaClass.name) == null) { + childFragmentManager + .beginTransaction() + .replace(R.id.sessions_sheet, fragment, fragment::javaClass.name) + .disallowAddToBackStack() + .commit() + } } bottomSheetBehavior.isHideable = false binding.sessionsSheet.viewTreeObserver.addOnPreDrawListener( From 1974e0b37485199d593725cf7ab45c65509211b7 Mon Sep 17 00:00:00 2001 From: keijumt Date: Wed, 9 Jan 2019 16:42:56 +0900 Subject: [PATCH 045/143] Add AnnouncementStoreTest --- feature/announcement/build.gradle | 3 + .../confsched2019/AnnouncementDummyDatas.kt | 29 +++++++++ .../ui/store/AnnouncementStoreTest.kt | 60 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/AnnouncementDummyDatas.kt create mode 100644 feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/store/AnnouncementStoreTest.kt diff --git a/feature/announcement/build.gradle b/feature/announcement/build.gradle index 91dfa9074..416ec97dc 100644 --- a/feature/announcement/build.gradle +++ b/feature/announcement/build.gradle @@ -45,6 +45,9 @@ dependencies { implementation Dep.Groupie.databinding testImplementation Dep.Test.junit + testImplementation Dep.Test.kotlinTestAssertions + testImplementation Dep.MockK.jvm + testImplementation project(':frontendcomponent:androidtestcomponent') androidTestImplementation Dep.Test.testRunner androidTestImplementation Dep.Test.espressoCore } diff --git a/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/AnnouncementDummyDatas.kt b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/AnnouncementDummyDatas.kt new file mode 100644 index 000000000..aecbfa097 --- /dev/null +++ b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/AnnouncementDummyDatas.kt @@ -0,0 +1,29 @@ +package io.github.droidkaigi.confsched2019 + +import com.soywiz.klock.DateTime +import com.soywiz.klock.minutes +import io.github.droidkaigi.confsched2019.model.Announcement + +private val startTime = DateTime.createAdjusted(2019, 2, 7, 10, 0) +fun dummyAnnouncementsData(): List { + return listOf( + Announcement( + "title1", + "content1", + startTime, + Announcement.Type.NOTIFICATION + ), + Announcement( + "title2", + "content2", + startTime + 30.minutes, + Announcement.Type.ALERT + ), + Announcement( + "title3", + "content3", + startTime + 60.minutes, + Announcement.Type.FEEDBACK + ) + ) +} diff --git a/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/store/AnnouncementStoreTest.kt b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/store/AnnouncementStoreTest.kt new file mode 100644 index 000000000..9e75e3008 --- /dev/null +++ b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/store/AnnouncementStoreTest.kt @@ -0,0 +1,60 @@ +package io.github.droidkaigi.confsched2019.announcement.ui.store + +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import io.github.droidkaigi.confsched2019.action.Action +import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher +import io.github.droidkaigi.confsched2019.dummyAnnouncementsData +import io.github.droidkaigi.confsched2019.ext.android.CoroutinePlugin +import io.github.droidkaigi.confsched2019.ext.android.changedForever +import io.github.droidkaigi.confsched2019.model.Announcement +import io.github.droidkaigi.confsched2019.model.LoadingState +import io.mockk.MockKAnnotations +import io.mockk.mockk +import io.mockk.verifySequence +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class AnnouncementStoreTest { + @JvmField @Rule val instantTaskExecutorRule = InstantTaskExecutorRule() + + @Before fun setUp() { + MockKAnnotations.init(this, relaxUnitFun = true) + CoroutinePlugin.mainDispatcherHandler = { Dispatchers.Default } + } + + @Test fun loadingState() = runBlocking { + val dispatcher = Dispatcher() + val announcementStore = AnnouncementStore(dispatcher) + val observer = mockk<(LoadingState?) -> Unit>(relaxed = true) + + announcementStore.loadingState.changedForever(observer) + + dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADING)) + dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADED)) + + verifySequence { + observer(LoadingState.LOADING) + observer(LoadingState.LOADED) + } + } + + @Test fun announcements() = runBlocking { + val dispatcher = Dispatcher() + val announcementStore = AnnouncementStore(dispatcher) + val observer: (List) -> Unit = mockk(relaxed = true) + announcementStore.announcements.changedForever(observer) + val dummyAnnouncements = dummyAnnouncementsData() + + dispatcher.dispatch( + Action.AnnouncementLoaded(dummyAnnouncements) + ) + + verifySequence { + observer(emptyList()) + observer(dummyAnnouncements) + } + } +} From d3b9e71b7f94b79e1cead4972417d8882343b718 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 14:19:03 +0900 Subject: [PATCH 046/143] Fixed error messages for assertions --- scripts/danger/Dangerfile.assertions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/danger/Dangerfile.assertions b/scripts/danger/Dangerfile.assertions index f2854e2e5..10585d7dd 100644 --- a/scripts/danger/Dangerfile.assertions +++ b/scripts/danger/Dangerfile.assertions @@ -24,9 +24,9 @@ begin if File.exists?(ENV.fetch('MERGED_JUNIT_RESULT_FILE')) # junit report junit.parse ENV.fetch('MERGED_JUNIT_RESULT_FILE') - fail("Failed tests found") unless junit.failures.empty? + fail("Failed tests found. Please fix test failures.") unless junit.failures.empty? else - fail("Test results not found") + fail("The previous test step failed. Please check the CI log.") end end From c53202cb3c0c88f996dd3d0a5866ec71323def54 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 14:19:46 +0900 Subject: [PATCH 047/143] Updated a successful message --- scripts/danger/Dangerfile.assertions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/danger/Dangerfile.assertions b/scripts/danger/Dangerfile.assertions index 10585d7dd..8c3206480 100644 --- a/scripts/danger/Dangerfile.assertions +++ b/scripts/danger/Dangerfile.assertions @@ -44,6 +44,6 @@ end # LGTM begin if status_report[:errors].length.zero? && status_report[:warnings].length.zero? - markdown("ALL GREEN :100:") + markdown("Asserted successfully. :100:") end end From 5be58ed0bc6d370c6c818ce5afd6d5d2a4c0ba63 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 14:28:32 +0900 Subject: [PATCH 048/143] Use download all dependencies and enable offline build --- .circleci/config.yml | 9 ++++----- build.gradle | 8 +++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6594d52b1..204043224 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,5 @@ cache_version_keys: &cache_version_keys - CACHE_VERSION_OF_PROJECT_DEPS: v1 + CACHE_VERSION_OF_PROJECT_DEPS: v1.1 CACHE_VERSION_OF_DANGER_CACHE: v1 cache_keys: @@ -56,18 +56,17 @@ jobs: keys: *all_keys_of_gradle_cache - run: name: Download Dependencies - command: ./gradlew androidDependencies + command: ./gradlew downloadAllDependencies - save_cache: &save_gradle_cache paths: - ~/.android - ~/.gradle - .gradle - - ~/.m2 key: *primary_key_of_gradle_cache - run: name: Assemble apk command: | - ./gradlew assembleDebug # --offline # build with online-mode for now + ./gradlew assembleDebug --offline # build with online-mode for now - store_artifacts: path: frontend/android/build/outputs/apk - run: *download_dpg @@ -108,7 +107,7 @@ jobs: - checkout - run: *init_bash - restore_cache: *restore_gradle_cache - - run: ./gradlew testDebugUnitTest lintDebug ktlint --continue + - run: ./gradlew testDebugUnitTest lintDebug ktlint --continue --offline - run: name: Merge junit report files command: | diff --git a/build.gradle b/build.gradle index b4df50654..4489c311d 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,13 @@ allprojects { main = "com.github.shyiko.ktlint.Main" args "--android", '-F', 'src/main/**/*.kt', 'src/debug/**/*.kt', 'src/release/**/*.kt' } + + task downloadAllDependencies(dependsOn: 'androidDependencies') { + description 'Download extra dependencies for the CI Gradle Cache' + doLast { + configurations.findAll { it.name.matches(/(ktlint|kapt)/) && it.canBeResolved }.files + } + } } } } @@ -81,7 +88,6 @@ allprojects { } } } - } task clean(type: Delete) { From 3169a005b3fc1aff101c4e13272b5896a8b933ad Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 15:19:22 +0900 Subject: [PATCH 049/143] Added internal aapt2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4489c311d..e849d3e39 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ allprojects { task downloadAllDependencies(dependsOn: 'androidDependencies') { description 'Download extra dependencies for the CI Gradle Cache' doLast { - configurations.findAll { it.name.matches(/(ktlint|kapt)/) && it.canBeResolved }.files + configurations.findAll { it.name.matches(/(ktlint|kapt|_internal_aapt2_binary)/) && it.canBeResolved }.files } } } From 62071659deb602873fd315f7ec377f83c49a9d71 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 15:23:24 +0900 Subject: [PATCH 050/143] Added lint and other configurations --- .circleci/config.yml | 8 +++----- build.gradle | 5 +++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 204043224..ae8adbc15 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,5 @@ cache_version_keys: &cache_version_keys - CACHE_VERSION_OF_PROJECT_DEPS: v1.1 + CACHE_VERSION_OF_PROJECT_DEPS: v1.5 CACHE_VERSION_OF_DANGER_CACHE: v1 cache_keys: @@ -8,13 +8,11 @@ cache_keys: keys: &all_keys_of_gradle_cache - *primary_key_of_gradle_cache - gradle-cache-{{ checksum "~/CACHE_VERSION_OF_PROJECT_DEPS" }}- - - gradle-cache- danger_cache: primary: &primary_key_of_danger_cache danger-cache-{{ checksum "~/CACHE_VERSION_OF_DANGER_CACHE" }}-{{ checksum "~/danger_cache" }} keys: &all_keys_of_danger_cache - *primary_key_of_danger_cache - danger-cache-{{ checksum "~/CACHE_VERSION_OF_DANGER_CACHE" }}- - - danger-cache- docker_env: android_defaults: &android_defaults @@ -56,7 +54,7 @@ jobs: keys: *all_keys_of_gradle_cache - run: name: Download Dependencies - command: ./gradlew downloadAllDependencies + command: ./gradlew androidDependenciesExtracs getDependencies - save_cache: &save_gradle_cache paths: - ~/.android @@ -66,7 +64,7 @@ jobs: - run: name: Assemble apk command: | - ./gradlew assembleDebug --offline # build with online-mode for now + ./gradlew clean assembleDebug --offline # build with online-mode for now - store_artifacts: path: frontend/android/build/outputs/apk - run: *download_dpg diff --git a/build.gradle b/build.gradle index e849d3e39..8833b545f 100644 --- a/build.gradle +++ b/build.gradle @@ -69,10 +69,11 @@ allprojects { args "--android", '-F', 'src/main/**/*.kt', 'src/debug/**/*.kt', 'src/release/**/*.kt' } - task downloadAllDependencies(dependsOn: 'androidDependencies') { + task androidDependenciesExtracs(dependsOn: 'androidDependencies') { description 'Download extra dependencies for the CI Gradle Cache' doLast { - configurations.findAll { it.name.matches(/(ktlint|kapt|_internal_aapt2_binary)/) && it.canBeResolved }.files + // androidDependencies do not touch some configurations + configurations.findAll { it.name.matches(/(ktlint|kapt|_internal_aapt2_binary|lintClassPath)/) && it.canBeResolved }.files } } } From 1023efbbceddef0a1dfbbd5bbf5d0ac5887161c1 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 16:53:53 +0900 Subject: [PATCH 051/143] Bump up cache version to v2 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ae8adbc15..846250593 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,5 @@ cache_version_keys: &cache_version_keys - CACHE_VERSION_OF_PROJECT_DEPS: v1.5 + CACHE_VERSION_OF_PROJECT_DEPS: v2 CACHE_VERSION_OF_DANGER_CACHE: v1 cache_keys: From b085da71f409a6123a9880613b6bbbea1c1acddc Mon Sep 17 00:00:00 2001 From: kikuchy Date: Wed, 9 Jan 2019 17:06:06 +0900 Subject: [PATCH 052/143] Make :firestore buildable for iOS Framework. --- data/firestore/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/firestore/build.gradle b/data/firestore/build.gradle index 6856c1f99..efd94ad76 100644 --- a/data/firestore/build.gradle +++ b/data/firestore/build.gradle @@ -8,6 +8,13 @@ apply from: rootProject.file('gradle/android.gradle') kotlin { targets { fromPreset(presets.android, 'android') + + final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \ + ? presets.iosArm64 : presets.iosX64 + + fromPreset(iOSTarget, 'iOS') { + compilations.main.outputKinds('FRAMEWORK') + } } sourceSets { commonMain.dependencies { From 64a7caa0fd455067d3bf079a53bf0bd977f7c6b7 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 17:13:46 +0900 Subject: [PATCH 053/143] Added a retry command --- .circleci/config.yml | 2 +- .circleci/scripts/retry_command | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100755 .circleci/scripts/retry_command diff --git a/.circleci/config.yml b/.circleci/config.yml index 846250593..a9494c8e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: keys: *all_keys_of_gradle_cache - run: name: Download Dependencies - command: ./gradlew androidDependenciesExtracs getDependencies + command: retry_command ./gradlew androidDependenciesExtracs getDependencies - save_cache: &save_gradle_cache paths: - ~/.android diff --git a/.circleci/scripts/retry_command b/.circleci/scripts/retry_command new file mode 100755 index 000000000..e9dd154f6 --- /dev/null +++ b/.circleci/scripts/retry_command @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -eu + +: "${MAX_RETRY_COUNT:=3}" + +retry() { + local retry=0 + + while let "$MAX_RETRY_COUNT > $retry"; do + let "retry=$retry+1" + + "$@" && exit 0 + + sleep 3 + done + + echo "Failed to process : $@" 1>&2 + exit 1 +} + +retry "$@" \ No newline at end of file From a953064df3b0471c260c69506b9f9b2ec92bb9e2 Mon Sep 17 00:00:00 2001 From: kikuchy Date: Wed, 9 Jan 2019 17:13:53 +0900 Subject: [PATCH 054/143] Make :db buildable for iOS Framework. --- data/db/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/db/build.gradle b/data/db/build.gradle index 4eabcd6b3..7e60b98cc 100644 --- a/data/db/build.gradle +++ b/data/db/build.gradle @@ -8,6 +8,13 @@ apply from: rootProject.file('gradle/android.gradle') kotlin { targets { fromPreset(presets.android, 'android') + + final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \ + ? presets.iosArm64 : presets.iosX64 + + fromPreset(iOSTarget, 'iOS') { + compilations.main.outputKinds('FRAMEWORK') + } } sourceSets { commonMain.dependencies { From 7e055657c3be41940710224ef7374587917cea6c Mon Sep 17 00:00:00 2001 From: kikuchy Date: Wed, 9 Jan 2019 17:16:21 +0900 Subject: [PATCH 055/143] Make :ext:log buildable for iOS Framework. --- ext/log/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ext/log/build.gradle b/ext/log/build.gradle index 8470119cf..42bc35c5c 100644 --- a/ext/log/build.gradle +++ b/ext/log/build.gradle @@ -8,6 +8,13 @@ apply from: rootProject.file('gradle/android.gradle') kotlin { targets { fromPreset(presets.android, 'android') + + final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \ + ? presets.iosArm64 : presets.iosX64 + + fromPreset(iOSTarget, 'iOS') { + compilations.main.outputKinds('FRAMEWORK') + } } sourceSets { commonMain.dependencies { From 9bba1c327bc052123613ae7c208c6a602e698fd9 Mon Sep 17 00:00:00 2001 From: Manabu Kayamoto Date: Wed, 9 Jan 2019 17:22:19 +0900 Subject: [PATCH 056/143] fix hide keyboard when search result --- .../confsched2019/session/ui/SessionDetailFragment.kt | 5 +++++ .../droidkaigi/confsched2019/session/ui/SpeakerFragment.kt | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 2ce43da55..441339646 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -1,9 +1,11 @@ package io.github.droidkaigi.confsched2019.session.ui +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.databinding.DataBindingUtil import androidx.lifecycle.Lifecycle @@ -120,6 +122,9 @@ class SessionDetailFragment : DaggerFragment() { activityActionCreator.openUrl(urlString) } } + + val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) } } diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt index 227bfe3df..37b0b6990 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt @@ -1,10 +1,12 @@ package io.github.droidkaigi.confsched2019.session.ui +import android.content.Context import android.os.Bundle import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle @@ -66,6 +68,9 @@ class SpeakerFragment : DaggerFragment() { ) ) } + + val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) } } From f7a1c71ff3e62c2efd799d74e7fd825bb55bf297 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 17:27:29 +0900 Subject: [PATCH 057/143] Fixed a typo --- .circleci/config.yml | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a9494c8e4..e6e0bd764 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: keys: *all_keys_of_gradle_cache - run: name: Download Dependencies - command: retry_command ./gradlew androidDependenciesExtracs getDependencies + command: retry_command ./gradlew androidDependenciesExtra getDependencies - save_cache: &save_gradle_cache paths: - ~/.android @@ -64,7 +64,7 @@ jobs: - run: name: Assemble apk command: | - ./gradlew clean assembleDebug --offline # build with online-mode for now + ./gradlew clean assembleDebug --offline - store_artifacts: path: frontend/android/build/outputs/apk - run: *download_dpg diff --git a/build.gradle b/build.gradle index 8833b545f..a6fcf93e5 100644 --- a/build.gradle +++ b/build.gradle @@ -69,7 +69,7 @@ allprojects { args "--android", '-F', 'src/main/**/*.kt', 'src/debug/**/*.kt', 'src/release/**/*.kt' } - task androidDependenciesExtracs(dependsOn: 'androidDependencies') { + task androidDependenciesExtra(dependsOn: 'androidDependencies') { description 'Download extra dependencies for the CI Gradle Cache' doLast { // androidDependencies do not touch some configurations From 816ae034bb1528ee3d60d4870161dc7cba99a22c Mon Sep 17 00:00:00 2001 From: furusin Date: Wed, 9 Jan 2019 17:33:51 +0900 Subject: [PATCH 058/143] Set toolbar color `white` --- .../confsched2019/system/actioncreator/ActivityActionCreator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt index 6ac1d8bcb..0b7c93d3d 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt @@ -13,7 +13,7 @@ class ActivityActionCreator @Inject constructor(val activity: FragmentActivity) val customTabsIntent = CustomTabsIntent.Builder() .setShowTitle(true) .enableUrlBarHiding() - .setToolbarColor(ContextCompat.getColor(activity, R.color.colorPrimary)) + .setToolbarColor(ContextCompat.getColor(activity, R.color.white)) .build() customTabsIntent.launchUrl(activity, Uri.parse(url)) } From 2764e6534754d5316ed3a933b15ba3e2ed1c8fea Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Wed, 9 Jan 2019 17:44:56 +0900 Subject: [PATCH 059/143] Don't use html reporter of ktlint on CI --- build.gradle | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a6fcf93e5..d165e68f8 100644 --- a/build.gradle +++ b/build.gradle @@ -55,8 +55,16 @@ allprojects { } task ktlint(type: JavaExec, group: "verification") { + def parameters = ["--android", '--editorconfig', "${rootProject.projectDir}/.editorconfig", "--reporter=checkstyle,output=${buildDir}/ktlint/checkstyle.xml"] + + if (System.getenv("CI") != "true") { + parameters += "--reporter=html,artifact=me.cassiano:ktlint-html-reporter:0.2.0,output=${buildDir}/ktlint/checkstyle.html" + } + + parameters += ['src/main/**/*.kt', 'src/debug/**/*.kt', 'src/release/**/*.kt'] + description = 'Check Kotlin code style.' - args "--android", '--editorconfig', "${rootProject.projectDir}/.editorconfig", "--reporter=html,artifact=me.cassiano:ktlint-html-reporter:0.2.0,output=${buildDir}/ktlint/checkstyle.html", "--reporter=checkstyle,output=${buildDir}/ktlint/checkstyle.xml", 'src/main/**/*.kt', 'src/debug/**/*.kt', 'src/release/**/*.kt' + args = parameters // https://github.com/shyiko/ktlint/blob/5fe8d0e203275a1a3337dc9777b50ec2a34a58df/ktlint/src/main/kotlin/com/github/shyiko/ktlint/Main.kt main = 'com.github.shyiko.ktlint.Main' classpath = configurations.ktlint From 039c07e52e86e069aa6e5ebf057d3c2741309005 Mon Sep 17 00:00:00 2001 From: keijumt Date: Wed, 9 Jan 2019 17:50:17 +0900 Subject: [PATCH 060/143] Change the action of Announcement to data class --- .../java/io/github/droidkaigi/confsched2019/action/Action.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt index fce9c1590..718c0fdc6 100644 --- a/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt +++ b/frontendcomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/action/Action.kt @@ -52,8 +52,8 @@ sealed class Action { object UserRegistered : Action() - class AnnouncementLoadingStateChanged(val loadingState: LoadingState) : Action() - class AnnouncementLoaded(val announcements: List) : Action() + data class AnnouncementLoadingStateChanged(val loadingState: LoadingState) : Action() + data class AnnouncementLoaded(val announcements: List) : Action() data class SponsorLoadingStateChanged(val loadingState: LoadingState) : Action() data class SponsorLoaded(val sponsors: List) : Action() From e08c1bf9599440c06c136f61851deb0c9cbd95b3 Mon Sep 17 00:00:00 2001 From: keijumt Date: Wed, 9 Jan 2019 17:51:39 +0900 Subject: [PATCH 061/143] Add AnnouncementActionCreatorTest --- .../AnnouncementActionCreatorTest.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt diff --git a/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt new file mode 100644 index 000000000..14e984d05 --- /dev/null +++ b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt @@ -0,0 +1,48 @@ +package io.github.droidkaigi.confsched2019.announcement.ui.actioncreator + +import androidx.lifecycle.Lifecycle +import io.github.droidkaigi.confsched2019.action.Action +import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher +import io.github.droidkaigi.confsched2019.dummyAnnouncementsData +import io.github.droidkaigi.confsched2019.ext.android.CoroutinePlugin +import io.github.droidkaigi.confsched2019.model.LoadingState +import io.github.droidkaigi.confsched2019.widget.component.TestLifecycleOwner +import io.mockk.MockKAnnotations +import io.mockk.Ordering +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.RelaxedMockK +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test + +class AnnouncementActionCreatorTest { + @RelaxedMockK lateinit var dispatcher: Dispatcher + @RelaxedMockK lateinit var fireStore: FireStore + + @Before fun setUp() { + MockKAnnotations.init(this, relaxUnitFun = true) + CoroutinePlugin.mainDispatcherHandler = { Dispatchers.Default } + } + + @Test fun load() = runBlocking { + val lifecycleOwner = TestLifecycleOwner().handleEvent(Lifecycle.Event.ON_RESUME) + coEvery { fireStore.getAnnouncements() } returns dummyAnnouncementsData() + val announcementActionCreator = AnnouncementActionCreator( + dispatcher, + fireStore, + lifecycleOwner.lifecycle + ) + + announcementActionCreator.load() + + coVerify(ordering = Ordering.SEQUENCE) { + dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADING)) + fireStore.getAnnouncements() + dispatcher.dispatch(Action.AnnouncementLoaded(dummyAnnouncementsData())) + dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADED)) + } + } +} From 2593257fa0ded284f34b63e6a72e5064cd3cf211 Mon Sep 17 00:00:00 2001 From: kazumax1218 Date: Wed, 9 Jan 2019 17:53:53 +0900 Subject: [PATCH 062/143] Remove search menu icon except session top screen --- .../confsched2019/session/ui/SessionPagesFragment.kt | 8 ++++++++ .../session}/src/main/res/menu/menu_toolbar.xml | 0 .../io/github/droidkaigi/confsched2019/ui/MainActivity.kt | 5 ----- 3 files changed, 8 insertions(+), 5 deletions(-) rename {frontend/android => feature/session}/src/main/res/menu/menu_toolbar.xml (100%) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt index 2565f7686..1c12b8b6e 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt @@ -2,6 +2,8 @@ package io.github.droidkaigi.confsched2019.session.ui import android.os.Bundle import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible @@ -51,6 +53,7 @@ class SessionPagesFragment : DaggerFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { + setHasOptionsMenu(true) binding = DataBindingUtil.inflate( inflater, R.layout.fragment_session_pages, @@ -120,6 +123,11 @@ class SessionPagesFragment : DaggerFragment() { } } } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.menu_toolbar, menu) + } } @Module diff --git a/frontend/android/src/main/res/menu/menu_toolbar.xml b/feature/session/src/main/res/menu/menu_toolbar.xml similarity index 100% rename from frontend/android/src/main/res/menu/menu_toolbar.xml rename to feature/session/src/main/res/menu/menu_toolbar.xml diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt index ff113f66a..5a126d525 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt @@ -130,11 +130,6 @@ class MainActivity : DaggerAppCompatActivity() { } } - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.menu_toolbar, menu) - return true - } - override fun onOptionsItemSelected(item: MenuItem): Boolean { return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item) From 82d58f5e96782706602793720153506c2f95e150 Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 18:01:37 +0900 Subject: [PATCH 063/143] modify fragment replace tag --- .../confsched2019/session/ui/SessionPageFragment.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index 4f3d3292e..744d16028 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -136,10 +136,11 @@ class SessionPageFragment : DaggerFragment() { } // suppress fragment replacement - if (childFragmentManager.findFragmentByTag(fragment::javaClass.name) == null) { + val title = SessionPage.pages[args.tabIndex].title + if (childFragmentManager.findFragmentByTag(title) == null) { childFragmentManager .beginTransaction() - .replace(R.id.sessions_sheet, fragment, fragment::javaClass.name) + .replace(R.id.sessions_sheet, fragment, title) .disallowAddToBackStack() .commit() } From 13c9833a07db7c3866580b015f3d491dd941872a Mon Sep 17 00:00:00 2001 From: kazumax1218 Date: Wed, 9 Jan 2019 18:19:28 +0900 Subject: [PATCH 064/143] Remove unused import --- .../java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt index 5a126d525..b0e5db56b 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/ui/MainActivity.kt @@ -3,7 +3,6 @@ package io.github.droidkaigi.confsched2019.ui import android.graphics.PorterDuff import android.os.Build import android.os.Bundle -import android.view.Menu import android.view.MenuItem import android.view.View import androidx.core.content.ContextCompat From e203eeaaddf9cb37ef5baa70fcbcbd7a83b506ff Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 18:19:30 +0900 Subject: [PATCH 065/143] refactor suppress fragment replacement --- .../session/ui/SessionPageFragment.kt | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index 744d16028..bd468b64c 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -121,8 +121,10 @@ class SessionPageFragment : DaggerFragment() { } private fun setupBottomSheet(savedInstanceState: Bundle?) { - if (savedInstanceState == null) { - val fragment: Fragment = when (val tab = SessionPage.pages[args.tabIndex]) { + // suppress fragment replacement + val tab = SessionPage.pages[args.tabIndex] + if (savedInstanceState == null && childFragmentManager.findFragmentByTag(tab.title) == null) { + val fragment: Fragment = when (tab) { is SessionPage.Day -> { BottomSheetDaySessionsFragment.newInstance( BottomSheetDaySessionsFragmentArgs @@ -135,15 +137,11 @@ class SessionPageFragment : DaggerFragment() { } } - // suppress fragment replacement - val title = SessionPage.pages[args.tabIndex].title - if (childFragmentManager.findFragmentByTag(title) == null) { - childFragmentManager - .beginTransaction() - .replace(R.id.sessions_sheet, fragment, title) - .disallowAddToBackStack() - .commit() - } + childFragmentManager + .beginTransaction() + .replace(R.id.sessions_sheet, fragment, tab.title) + .disallowAddToBackStack() + .commit() } bottomSheetBehavior.isHideable = false binding.sessionsSheet.viewTreeObserver.addOnPreDrawListener( From 1f6f815cb39b490b4f729abca4213731420b1fad Mon Sep 17 00:00:00 2001 From: Manabu Kayamoto Date: Wed, 9 Jan 2019 19:00:05 +0900 Subject: [PATCH 066/143] Fix solve only SearchFragment --- .../confsched2019/session/ui/SearchFragment.kt | 16 ++++++++++++++++ .../session/ui/SessionDetailFragment.kt | 5 ----- .../confsched2019/session/ui/SpeakerFragment.kt | 5 ----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt index 4d90f7006..723067a14 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt @@ -1,12 +1,16 @@ package io.github.droidkaigi.confsched2019.session.ui +import android.content.Context +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager import androidx.appcompat.widget.SearchView +import androidx.core.content.systemService import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle @@ -127,6 +131,18 @@ class SearchFragment : DaggerFragment() { searchView.setOnCloseListener { false } } } + + override fun onPause() { + super.onPause() + + android.util.Log.e("hoge", "hoge") + val imm = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + context?.systemService() + } else { + context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + } + imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) + } } @Module diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 441339646..2ce43da55 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -1,11 +1,9 @@ package io.github.droidkaigi.confsched2019.session.ui -import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.databinding.DataBindingUtil import androidx.lifecycle.Lifecycle @@ -122,9 +120,6 @@ class SessionDetailFragment : DaggerFragment() { activityActionCreator.openUrl(urlString) } } - - val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager - imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) } } diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt index 37b0b6990..227bfe3df 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SpeakerFragment.kt @@ -1,12 +1,10 @@ package io.github.droidkaigi.confsched2019.session.ui -import android.content.Context import android.os.Bundle import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle @@ -68,9 +66,6 @@ class SpeakerFragment : DaggerFragment() { ) ) } - - val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager - imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) } } From 07ee9c585d39c33f7872f3055dd63d89de5c7fee Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 19:02:34 +0900 Subject: [PATCH 067/143] fix code style --- .../confsched2019/session/ui/SessionPageFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index bd468b64c..d50dc0b4a 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -123,7 +123,9 @@ class SessionPageFragment : DaggerFragment() { private fun setupBottomSheet(savedInstanceState: Bundle?) { // suppress fragment replacement val tab = SessionPage.pages[args.tabIndex] - if (savedInstanceState == null && childFragmentManager.findFragmentByTag(tab.title) == null) { + if (savedInstanceState == null && + childFragmentManager.findFragmentByTag(tab.title) == null + ) { val fragment: Fragment = when (tab) { is SessionPage.Day -> { BottomSheetDaySessionsFragment.newInstance( From 87249ab134af58d2140f17b2b1bb4a52aecc8a7c Mon Sep 17 00:00:00 2001 From: Manabu Kayamoto Date: Wed, 9 Jan 2019 19:31:40 +0900 Subject: [PATCH 068/143] delete log --- .../github/droidkaigi/confsched2019/session/ui/SearchFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt index 723067a14..bc04cc8fa 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt @@ -135,7 +135,6 @@ class SearchFragment : DaggerFragment() { override fun onPause() { super.onPause() - android.util.Log.e("hoge", "hoge") val imm = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { context?.systemService() } else { From bcc399960c93a4077802b2b6a1c07786e0796fa9 Mon Sep 17 00:00:00 2001 From: takahirom Date: Wed, 9 Jan 2019 20:51:53 +0900 Subject: [PATCH 069/143] Fix firestore conflict --- .../ui/actioncreator/AnnouncementActionCreatorTest.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt index 14e984d05..5547ccc47 100644 --- a/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt +++ b/feature/announcement/src/test/java/io/github/droidkaigi/confsched2019/announcement/ui/actioncreator/AnnouncementActionCreatorTest.kt @@ -2,7 +2,7 @@ package io.github.droidkaigi.confsched2019.announcement.ui.actioncreator import androidx.lifecycle.Lifecycle import io.github.droidkaigi.confsched2019.action.Action -import io.github.droidkaigi.confsched2019.data.firestore.FireStore +import io.github.droidkaigi.confsched2019.data.firestore.Firestore import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher import io.github.droidkaigi.confsched2019.dummyAnnouncementsData import io.github.droidkaigi.confsched2019.ext.android.CoroutinePlugin @@ -20,7 +20,7 @@ import org.junit.Test class AnnouncementActionCreatorTest { @RelaxedMockK lateinit var dispatcher: Dispatcher - @RelaxedMockK lateinit var fireStore: FireStore + @RelaxedMockK lateinit var firestore: Firestore @Before fun setUp() { MockKAnnotations.init(this, relaxUnitFun = true) @@ -29,10 +29,10 @@ class AnnouncementActionCreatorTest { @Test fun load() = runBlocking { val lifecycleOwner = TestLifecycleOwner().handleEvent(Lifecycle.Event.ON_RESUME) - coEvery { fireStore.getAnnouncements() } returns dummyAnnouncementsData() + coEvery { firestore.getAnnouncements() } returns dummyAnnouncementsData() val announcementActionCreator = AnnouncementActionCreator( dispatcher, - fireStore, + firestore, lifecycleOwner.lifecycle ) @@ -40,7 +40,7 @@ class AnnouncementActionCreatorTest { coVerify(ordering = Ordering.SEQUENCE) { dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADING)) - fireStore.getAnnouncements() + firestore.getAnnouncements() dispatcher.dispatch(Action.AnnouncementLoaded(dummyAnnouncementsData())) dispatcher.dispatch(Action.AnnouncementLoadingStateChanged(LoadingState.LOADED)) } From 9d03d23e79d3606c5fa27e47fce8d4193f725108 Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 20:52:26 +0900 Subject: [PATCH 070/143] modify fragment create logic. by receiving great information provided! --- .../session/ui/SessionPageFragment.kt | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index d50dc0b4a..411cf2d15 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -68,6 +68,11 @@ class SessionPageFragment : DaggerFragment() { private val bottomSheetBehavior: BottomSheetBehavior<*> get() = BottomSheetBehavior.from(binding.sessionsSheet) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setupSessionsFragment(savedInstanceState) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -82,7 +87,7 @@ class SessionPageFragment : DaggerFragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - setupBottomSheet(savedInstanceState) + setupBottomSheetBehavior() binding.sessionsFilterReset.setOnClickListener { sessionPagesActionCreator.clearFilters() @@ -120,31 +125,33 @@ class SessionPageFragment : DaggerFragment() { } } - private fun setupBottomSheet(savedInstanceState: Bundle?) { - // suppress fragment replacement + private fun setupSessionsFragment(savedInstanceState: Bundle?) { + if (savedInstanceState != null) { + return + } + val tab = SessionPage.pages[args.tabIndex] - if (savedInstanceState == null && - childFragmentManager.findFragmentByTag(tab.title) == null - ) { - val fragment: Fragment = when (tab) { - is SessionPage.Day -> { - BottomSheetDaySessionsFragment.newInstance( - BottomSheetDaySessionsFragmentArgs - .Builder(tab.day) - .build() - ) - } - SessionPage.Favorite -> { - BottomSheetFavoriteSessionsFragment.newInstance() - } + val fragment: Fragment = when (tab) { + is SessionPage.Day -> { + BottomSheetDaySessionsFragment.newInstance( + BottomSheetDaySessionsFragmentArgs + .Builder(tab.day) + .build() + ) + } + SessionPage.Favorite -> { + BottomSheetFavoriteSessionsFragment.newInstance() } - - childFragmentManager - .beginTransaction() - .replace(R.id.sessions_sheet, fragment, tab.title) - .disallowAddToBackStack() - .commit() } + + childFragmentManager + .beginTransaction() + .replace(R.id.sessions_sheet, fragment, tab.title) + .disallowAddToBackStack() + .commit() + } + + private fun setupBottomSheetBehavior() { bottomSheetBehavior.isHideable = false binding.sessionsSheet.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { From e8fb0179bb13156f89a49c5e77ab0a0b2c0f8fd3 Mon Sep 17 00:00:00 2001 From: phicdy Date: Wed, 9 Jan 2019 21:31:09 +0900 Subject: [PATCH 071/143] Combine loadImage() to bindSpeakerData() --- .../session/ui/item/SpeechSessionItem.kt | 71 +++++++------------ 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt index 38a3fb8cb..a37a88b9d 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/SpeechSessionItem.kt @@ -8,7 +8,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.isVisible import androidx.core.view.size import androidx.navigation.NavController @@ -126,62 +125,34 @@ class SpeechSessionItem @AssistedInject constructor( textView: TextView ) { textView.text = speaker.name + val imageUrl = speaker.imageUrl val context = textView.context - val placeHolder = VectorDrawableCompat.create( - context.resources, - R.drawable.ic_person_outline_black_24dp, - null - ) - val placeHolderColor = ContextCompat.getColor( - context, - R.color.gray2 - ) - loadImage( - textView = textView, - imageUrl = speaker.imageUrl, - circleCrop = true, - rawPlaceHolder = placeHolder, - placeHolderTint = placeHolderColor - ) - } - - private fun loadImage( - textView: TextView, - imageUrl: String?, - circleCrop: Boolean, - rawPlaceHolder: Drawable?, - placeHolderTint: Int, - widthDp: Int = 16, - heightDp: Int = 16 - ) { - fun setDrawable(drawable: Drawable) { - val res = textView.context.resources - val widthPx = (widthDp * res.displayMetrics.density).toInt() - val heightPx = (heightDp * res.displayMetrics.density).toInt() - drawable.setBounds(0, 0, widthPx, heightPx) - textView.setCompoundDrawables(drawable, null, null, null) - } - val placeHolder = run { - DrawableCompat.wrap( - rawPlaceHolder ?: return@run null + VectorDrawableCompat.create( + context.resources, + R.drawable.ic_person_outline_black_24dp, + null )?.apply { - setTint(placeHolderTint) + setTint( + ContextCompat.getColor( + context, + R.color.gray2 + ) + ) } } + imageUrl ?: run { placeHolder?.let { - setDrawable(it) + textView.setLeftDrawable(it) } } Picasso .get() .load(imageUrl) + .transform(CropCircleTransformation()) .apply { - if (circleCrop) { - transform(CropCircleTransformation()) - } if (placeHolder != null) { placeholder(placeHolder) } @@ -189,7 +160,7 @@ class SpeechSessionItem @AssistedInject constructor( .into(object : Target { override fun onPrepareLoad(placeHolderDrawable: Drawable?) { placeHolderDrawable?.let { - setDrawable(it) + textView.setLeftDrawable(it) } } @@ -199,11 +170,21 @@ class SpeechSessionItem @AssistedInject constructor( override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { val res = textView.context.resources val drawable = BitmapDrawable(res, bitmap) - setDrawable(drawable) + textView.setLeftDrawable(drawable) } }) } + fun TextView.setLeftDrawable(drawable: Drawable) { + val res = context.resources + val widthDp = 16 + val heightDp = 16 + val widthPx = (widthDp * res.displayMetrics.density).toInt() + val heightPx = (heightDp * res.displayMetrics.density).toInt() + drawable.setBounds(0, 0, widthPx, heightPx) + setCompoundDrawables(drawable, null, null, null) + } + override fun getLayout(): Int = R.layout.item_session override fun equals(other: Any?): Boolean { From 277a131d1bf9939f3707919ae6e17dcb0268d7b8 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Wed, 9 Jan 2019 21:38:49 +0900 Subject: [PATCH 072/143] Fixed resource title visible --- .../session/src/main/res/layout/fragment_session_detail.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 945203763..15435619b 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -7,8 +7,6 @@ - - Date: Wed, 9 Jan 2019 21:37:53 +0900 Subject: [PATCH 073/143] Add loading ProgressBar in session detail when you favorite --- .../session/ui/SessionDetailFragment.kt | 14 ++++++++++++++ .../main/res/layout/fragment_session_detail.xml | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 2ce43da55..fcb8538c9 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.lifecycle.Lifecycle import com.xwray.groupie.GroupAdapter @@ -14,6 +15,7 @@ import dagger.Provides import dagger.android.support.AndroidSupportInjection import io.github.droidkaigi.confsched2019.di.PageScope import io.github.droidkaigi.confsched2019.ext.android.changed +import io.github.droidkaigi.confsched2019.model.LoadingState import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.model.defaultLang import io.github.droidkaigi.confsched2019.session.R @@ -24,6 +26,7 @@ import io.github.droidkaigi.confsched2019.session.ui.store.SessionContentsStore import io.github.droidkaigi.confsched2019.session.ui.widget.DaggerFragment import io.github.droidkaigi.confsched2019.system.actioncreator.ActivityActionCreator import io.github.droidkaigi.confsched2019.system.store.SystemStore +import io.github.droidkaigi.confsched2019.util.ProgressTimeLatch import javax.inject.Inject class SessionDetailFragment : DaggerFragment() { @@ -35,6 +38,8 @@ class SessionDetailFragment : DaggerFragment() { @Inject lateinit var speakerItemFactory: SpeakerItem.Factory @Inject lateinit var activityActionCreator: ActivityActionCreator + private lateinit var progressTimeLatch: ProgressTimeLatch + private lateinit var sessionDetailFragmentArgs: SessionDetailFragmentArgs private val groupAdapter = GroupAdapter>() @@ -83,8 +88,17 @@ class SessionDetailFragment : DaggerFragment() { .changed(viewLifecycleOwner) { session -> applySessionLayout(session) } + + progressTimeLatch = ProgressTimeLatch { showProgress -> + binding.progressBar.isVisible = showProgress + } + sessionContentsStore.loadingState.changed(viewLifecycleOwner) { + progressTimeLatch.loading = it == LoadingState.LOADING + } + binding.sessionFavorite.setOnClickListener { val session = binding.session ?: return@setOnClickListener + progressTimeLatch.loading = true sessionContentsActionCreator.toggleFavorite(session) } } diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 945203763..6303683e6 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -36,6 +36,14 @@ android:layout_height="match_parent" > + + Date: Wed, 9 Jan 2019 22:06:43 +0900 Subject: [PATCH 074/143] Add icons for applying design --- .../src/main/res/drawable-hdpi/ic_floor1.png | Bin 0 -> 46617 bytes .../src/main/res/drawable-hdpi/ic_floor2.png | Bin 0 -> 51268 bytes .../src/main/res/drawable-xhdpi/ic_floor1.png | Bin 0 -> 49736 bytes .../src/main/res/drawable-xhdpi/ic_floor2.png | Bin 0 -> 69016 bytes .../src/main/res/drawable-xxhdpi/ic_floor1.png | Bin 0 -> 74588 bytes .../src/main/res/drawable-xxhdpi/ic_floor2.png | Bin 0 -> 105193 bytes .../main/res/drawable-hdpi/ic_droidkaigi.png | Bin 0 -> 7055 bytes .../main/res/drawable-xhdpi/ic_droidkaigi.png | Bin 0 -> 10904 bytes .../main/res/drawable-xxhdpi/ic_droidkaigi.png | Bin 0 -> 17422 bytes .../res/drawable-xxxhdpi/ic_droidkaigi.png | Bin 0 -> 24576 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 feature/floormap/src/main/res/drawable-hdpi/ic_floor1.png create mode 100644 feature/floormap/src/main/res/drawable-hdpi/ic_floor2.png create mode 100644 feature/floormap/src/main/res/drawable-xhdpi/ic_floor1.png create mode 100644 feature/floormap/src/main/res/drawable-xhdpi/ic_floor2.png create mode 100644 feature/floormap/src/main/res/drawable-xxhdpi/ic_floor1.png create mode 100644 feature/floormap/src/main/res/drawable-xxhdpi/ic_floor2.png create mode 100644 frontendcomponent/androidcomponent/src/main/res/drawable-hdpi/ic_droidkaigi.png create mode 100644 frontendcomponent/androidcomponent/src/main/res/drawable-xhdpi/ic_droidkaigi.png create mode 100644 frontendcomponent/androidcomponent/src/main/res/drawable-xxhdpi/ic_droidkaigi.png create mode 100644 frontendcomponent/androidcomponent/src/main/res/drawable-xxxhdpi/ic_droidkaigi.png diff --git a/feature/floormap/src/main/res/drawable-hdpi/ic_floor1.png b/feature/floormap/src/main/res/drawable-hdpi/ic_floor1.png new file mode 100644 index 0000000000000000000000000000000000000000..a31fd35d0da4d0c24f74ccb64bc0371a440e67ad GIT binary patch literal 46617 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 literal 0 HcmV?d00001 diff --git a/feature/floormap/src/main/res/drawable-hdpi/ic_floor2.png b/feature/floormap/src/main/res/drawable-hdpi/ic_floor2.png new file mode 100644 index 0000000000000000000000000000000000000000..bffc412dedfaa6840fb07d3d4fac1b47d81ecaec GIT binary patch literal 51268 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%0AiJ{A%4HChQx|+9m1vsd60_|FLe+VsrADnIV# z@FJ%Y>vc3h1H`dx-kKM8@p0a=Z0K|WsB}_sw&cQ#j~_eCH!CiqAB+;`u+#vsWyLHz zTt_A8ctmc|pf@y$PKQEFw+gRSfwJDa!%#5G>`&J}n{?1*_)ni47Aw1x%-cc(Ta^32 zIP1Q=w*p9SBf$jB5&9)(P}la`J-JV>kK4V$49qQawl9I8--ec?lxm#^$*ehdwr+fU<1tVx7PDvNF)p4|_r{U?aR0N4R|FMk0X23#Ad z8f(_LiA*4E>^j|o(JZ{+H87KGT6heJ^0?5#K2cjZ5l}C)1frckj1%+A4#W%*SN8Xu zB7R1g>G2aWz2MzKYuIDDM`^%{mM6@vitXdIqt8Ia^XRZK@Ks5p@;-$t`5b;Nt2ZzD zu*sa3!#e&yRAf)8(+GD0Ac=3bow><2rq&LmyVq@}*~y&+Hf?Vh;7sHJmku$Qx`mA% z47hM-#0NIa#NV67=jmh82H-cK z5UW-pWjViZU>-6SklPpOhYRIZEfcu6dnmUPRd>P;ItlveB%w+IR88OAOU;fw-f4zl zJ<4R#|K!)SNeEmhP(BbLF*P7e4JgEEj^15^d6~;;t6*C7Tkpk%o=|e%)8eKEYmsBL zpbJOP>sukbD?YiIQ}m~p=F?`LT4dj_l9F;~RNgMPaXh-@3T*Mr7q)1l{jn0sPBm}E z=^bRwghenP25`Uk$GaTOO|j%9d0*qsjM%a6dN0W(gGLV&EZINePz(mEm%V3mVjJ)e zkC&$MNpr;D4oN?!E?_PWl!`PdDu@6@1%6w5L=-W@PN0oD{Cq}H0CyQkwBn{(?_J3$ ziW{DHSoZ@d{;|)#f*c>Da!qQhA53Sn&3ST)Gr&>0D~#1_Q`z3og+5zJcoE`_+@7B$ z1%)Tm-)!3XIWi(qKI{gtopTX{wXQ>=ohR;CcYX7fVAd@ZJN&-WU|oZc z(k*10qyI-Z$Ni6Xus-&<;^LZ1cd78T25y04t3k-Kc^)f>oWybx$~pTX6)^W5~g;O zpMW!F&iBdr^Y-q0669E5Y5?8{oO}H=(scJybXYTE54jQ>Jda*5P+yA6xmbP9wSK^o z&qEsXF>eN6Y-=-$QF;xSP~H4gJN9|vcG+4-d(26$Y|3B+`i7R^lWkbA_|7FgH;xK@ zaVUF44&sq*`7y-smhL{8ZGI)!%j)>Fsyv8g!dTCZ9S{*UL~5yFUy)sn z8)bQeQK6*7v|!gl=)TfMB&Px|kOU*JV-nCj*_l@VYwp|Qo*6j?mA)g>zWG2JRfjpV zxsVIlQN9QVeq8TR_ z15zxvxFhB7|4d~OV$kjoDp|3>qZ-aihE|3Tv;A5$xCe6WS$Zrd;-J?T&#osYv{#(a zzIbF7tUW&FvcC7Huoq@*N0vtAj2l?m-`M{lcd=aq_zubVoQw$l0HmuQ;x}sJXt@M1 zELP63r0O$~O&71qq*kgUNN$v;Vyu`&K91l0m6;N%R7)N=zi|o%^Lu&ga=$K)bycAW zh|xT4iCQ+!`8-KKzxfr;3DF$yZaWmwY2Z7O`<|Jw5oq9;6e<9SAY*g}=No8KzR#qw z&NqjH>-BKa9r06%UKgBsWA7~ns~-8&LQRj*dUAfDXD_>aZw-cEB2>7NzBgCBIO`qCb$nSK$B=k&r;1 z1E~5AtbOhQhjVeN(gvA2*B_2}HDO*SuGkl41LZwoZ5JduG6NWrmFLJ~CprcKk!AG8_xF!mM+)A+k$;=9bv`k;0iN*(`XPuTDa|S2kC# z)tTo4NwxtJF;*{J+bOF*cfqhG)Irlsx7r@<(-$!W&8q8OW|Zd{Z&RZSr`eR8uFSOT zJjOs?luhQm*}J%^_lNUjb02bk4gNl!C=E1w!IpHCUHt0a{k0nJhL*0tpv!Q!z^|n` zS|g=E@F8_o66P3LY7r2{sWyC^1w{L1t>n)Z=xVK>7j9h4ooO5Y@qdq+^30+GXH@qR z!*U~*%!J86;~}x8G5Xy)p?&Xl>{PyDJ3rCgIkch}D&>*!E2UCsNMuuw68_zuqaouL zX6nGbxFUkY7eZNYqJg0M5vL?z?}Hiau_aOW9~PZd7|Qz0b~U~5dFE$GmoGSv--)qV zMS4Dxqoq@Sb4^9K<=J}PuNT}Ocds_<?d@2wdzmmKp4aGF)Bt$YVg;=mG0NqU2=r%Y+zq zSXDnu|194LJH8@DqUp?+uP~~hUv1f)0i~UFvv4dNd6x>OK@&3s*Xh+G9A5QBeFaOt zMWrz#XIU}2Yz@;qRG&>42_sq$Hxcf}lr{E=rHQA)ka(i;uKTg!$CBU2pkAmA?skO_ zxmMI|)>xy2rxd6z%Q|qmsK+^VwP#>e_ioCgG8~8blN3&KvZPdt1{&wQy&^9W zXz1TJrjbpoJ%NyPL1*$8ZW?uy!3+`0+Zj^_eHDzQD2*b60#uoQX-#H!iJh*}uTERQ z8a;sbaIrM}gV%R0G$?H5Euf#p4DLh0c zrQBWe_K4ltnWp5ll4ys-Ji;i!m&in9R`bkO2OI3~34RVyMcu)hRrpuzVxrkl}lL2bZ=Zo%DECnFT){^ zb_&qNv5tQ`mj5ZNx3QJ?Mtn318k0^5Hqk9{6BQT--gR!eI%zq2*@ZI?X~6K@yuD1x zGLGF*r5~xF0(-BX+uytZBc1J4CNB|c20#*1H%_T<`Rpj_p#+AKo#acC#`)GhkIPCX6ou2INjVW#jg*`FGv)IVZJBG{EVGx#d8gO9Jxu@&SrO}9r z%pKQ$*)F8SN<8b;x7TTWt9e0w_!Z+tz@PEt^ezk6|5S^Rq6HJI+~pR-z9~ROAEly` zgBgfYU1XDX+=9u@tG;7MV zG)q_?sP2=6YcvQW5cW@I2Of^A?{sWG^ZnM&it>mmr=)(8P~KO}*GbB>^)nTUy94apJV*?#*+mJJ4EyTkwlLnHo0TFtnS4=N zJ#Sg(03>~gJ~P}HUPtyr#Q8cm`%4=CBDtRZi^pdQfraHkW=_OkB41xfCe|I2trlds zvq8wSi9Dk>+hUhj4yOERN##F_uX!C*z-N)O;a8%M7^wyZU4KC7dV3YXiwoOPnY>T2 zlNYsMo==Unwpd*WDVA|X%-kth-m-HKDLf?@`Z>z}&$~T(E1i$^OOq|s553cV?D;Hh zC^o1?|Cyojym5^X&%SG{opS#K0)I8fODHW>7EkrMvq@6-W0aP>v`*4<2E$yJ%p9e) zhqp#|57RV6_DQqGr~#_fDbsQXTqo${KOg)pSisT&OD7J?skh;vLyZiLDtR{u{kgDE zPzzXq-xdkvr<5|96&nZf5_{gb4jdCuc4L{Ig}72{y+QT8w~w1+NjmG){a!&7WA-at zadxIm2{xi>0~B3I2GqKLPxaD&1v7$^pCGvT?U!9gv6L3;VOgx$Fc$-)G0Hf&P0FMhH~_VlVgX#vG0AE3J<=RI;j@lhFi@CYR)Jsn1}& zd)CDmq-K#8G+h7D_{`bl6&un&4vjt#`uJ_|xqshz)9i}$uS`Q)a4a1`??pu}ZmOt+ zfLboqqRc7I!k~78eE%-$$}CT?T~un>I)@}HJ)tNAu<~_R4x`$CPM-i`0zZHm;T;hE zAyno@z4SyBHoycPFcXLtY%XHo0QHzm5mK^w8F6fz5>*jR^aP}IA5Ww?&>H!_0OQX0Bme*a literal 0 HcmV?d00001 diff --git a/feature/floormap/src/main/res/drawable-xhdpi/ic_floor2.png b/feature/floormap/src/main/res/drawable-xhdpi/ic_floor2.png new file mode 100644 index 0000000000000000000000000000000000000000..91117499838db3641721fa90dc3d519dd8d3aa0b GIT binary patch literal 69016 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 literal 0 HcmV?d00001 diff --git a/feature/floormap/src/main/res/drawable-xxhdpi/ic_floor1.png b/feature/floormap/src/main/res/drawable-xxhdpi/ic_floor1.png new file mode 100644 index 0000000000000000000000000000000000000000..4656cca94babcb06a0630819dcaf5b7af93c3ad7 GIT binary patch literal 74588 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%0As7nvcc$4W1(Uqo8k;Y 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 PfbH26?Z?F`76JbcG)D0L literal 0 HcmV?d00001 diff --git a/frontendcomponent/androidcomponent/src/main/res/drawable-hdpi/ic_droidkaigi.png b/frontendcomponent/androidcomponent/src/main/res/drawable-hdpi/ic_droidkaigi.png new file mode 100644 index 0000000000000000000000000000000000000000..f35bfc4deca1315cbb62cd126aef55f3b237ff2e GIT binary patch literal 7055 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 MV2z@@Z32H(`YcV`!d34`H4K;NPs4K7>^VloA= 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 literal 0 HcmV?d00001 From cea1d3f77ae08f0a33ae985d7675557cefc3c5ea Mon Sep 17 00:00:00 2001 From: Akihiroooo Date: Wed, 9 Jan 2019 22:06:48 +0900 Subject: [PATCH 075/143] modify the location of the null check statement --- .../confsched2019/session/ui/SessionPageFragment.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt index 411cf2d15..54769850d 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPageFragment.kt @@ -70,7 +70,9 @@ class SessionPageFragment : DaggerFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setupSessionsFragment(savedInstanceState) + if (savedInstanceState == null) { + setupSessionsFragment() + } } override fun onCreateView( @@ -125,11 +127,7 @@ class SessionPageFragment : DaggerFragment() { } } - private fun setupSessionsFragment(savedInstanceState: Bundle?) { - if (savedInstanceState != null) { - return - } - + private fun setupSessionsFragment() { val tab = SessionPage.pages[args.tabIndex] val fragment: Fragment = when (tab) { is SessionPage.Day -> { From f8ec9a8a39d0512e67cd1ecfe30a84aced2c7065 Mon Sep 17 00:00:00 2001 From: Toshihiro Yagi Date: Wed, 9 Jan 2019 21:56:01 +0900 Subject: [PATCH 076/143] Fix build androidTest, but all tests are empty yet. --- .../ui/ExampleInstrumentedTest.java | 25 ------------------- .../widget/ExampleInstrumentedTest.java | 25 ------------------- .../ui/ExampleInstrumentedTest.java | 25 ------------------- .../widget/ExampleInstrumentedTest.java | 25 ------------------- .../ui/ExampleInstrumentedTest.java | 25 ------------------- .../widget/ExampleInstrumentedTest.java | 25 ------------------- .../ui/ExampleInstrumentedTest.java | 25 ------------------- .../ext/android/ExampleInstrumentedTest.java | 25 ------------------- .../ui/ExampleInstrumentedTest.java | 25 ------------------- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../drawable/ic_room_outline_black_24dp.xml | 12 +++++++++ .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.java | 2 +- .../widget/ExampleInstrumentedTest.kt | 2 +- .../component/ExampleInstrumentedTest.java | 25 ------------------- .../component/ExampleInstrumentedTest.java | 25 ------------------- 21 files changed, 21 insertions(+), 284 deletions(-) delete mode 100644 data/api/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java delete mode 100644 data/db-room/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java delete mode 100644 data/db/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java delete mode 100644 data/firestore-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java delete mode 100644 data/firestore/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java delete mode 100644 data/repository-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java delete mode 100644 data/repository/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java delete mode 100644 ext/android-extension/src/androidTest/java/io/github/droidkaigi/confsched2019/ext/android/ExampleInstrumentedTest.java delete mode 100644 ext/log/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java create mode 100644 feature/session/src/main/res/drawable/ic_room_outline_black_24dp.xml delete mode 100644 frontendcomponent/androidcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java delete mode 100644 frontendcomponent/androidtestcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java diff --git a/data/api/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java b/data/api/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/api/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/db-room/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/data/db-room/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java deleted file mode 100644 index 461cd5732..000000000 --- a/data/db-room/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/db/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java b/data/db/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/db/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/firestore-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/data/firestore-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/firestore-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/firestore/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java b/data/firestore/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/firestore/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/repository-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/data/repository-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/repository-impl/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/data/repository/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java b/data/repository/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/data/repository/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/ext/android-extension/src/androidTest/java/io/github/droidkaigi/confsched2019/ext/android/ExampleInstrumentedTest.java b/ext/android-extension/src/androidTest/java/io/github/droidkaigi/confsched2019/ext/android/ExampleInstrumentedTest.java deleted file mode 100644 index 5346f9796..000000000 --- a/ext/android-extension/src/androidTest/java/io/github/droidkaigi/confsched2019/ext/android/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.ext.android; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ext.android.test", appContext.getPackageName()); - } -} diff --git a/ext/log/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java b/ext/log/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java deleted file mode 100644 index e367b66e7..000000000 --- a/ext/log/src/androidTest/java/io/github/droidkaigi/confsched2019/ui/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); - } -} diff --git a/feature/about/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/about/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..497b0644c 100644 --- a/feature/about/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/about/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.about.test", appContext.getPackageName()); } } diff --git a/feature/announcement/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/announcement/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..332b5c131 100644 --- a/feature/announcement/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/announcement/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.announcement.test", appContext.getPackageName()); } } diff --git a/feature/floormap/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/floormap/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..9057d1743 100644 --- a/feature/floormap/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/floormap/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.floormap.test", appContext.getPackageName()); } } diff --git a/feature/session/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/session/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..e2ee118c1 100644 --- a/feature/session/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/session/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.session.test", appContext.getPackageName()); } } diff --git a/feature/session/src/main/res/drawable/ic_room_outline_black_24dp.xml b/feature/session/src/main/res/drawable/ic_room_outline_black_24dp.xml new file mode 100644 index 000000000..64b261c45 --- /dev/null +++ b/feature/session/src/main/res/drawable/ic_room_outline_black_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/feature/settings/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/settings/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..f237963dd 100644 --- a/feature/settings/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/settings/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.settings.test", appContext.getPackageName()); } } diff --git a/feature/sponsor/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/sponsor/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..3a1c372bc 100644 --- a/feature/sponsor/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/sponsor/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.sponsor.test", appContext.getPackageName()); } } diff --git a/feature/system/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/system/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..7b42d1cf2 100644 --- a/feature/system/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/system/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.system.test", appContext.getPackageName()); } } diff --git a/feature/user/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java b/feature/user/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java index 461cd5732..b84d79025 100644 --- a/feature/user/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java +++ b/feature/user/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.java @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("io.github.droidkaigi.confsched2019.ui.test", appContext.getPackageName()); + assertEquals("io.github.droidkaigi.confsched2019.test", appContext.getPackageName()); } } diff --git a/frontend/android/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.kt b/frontend/android/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.kt index fa966205b..2291937d9 100644 --- a/frontend/android/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.kt +++ b/frontend/android/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/ExampleInstrumentedTest.kt @@ -16,6 +16,6 @@ class ExampleInstrumentedTest { @Test fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getTargetContext() - assertEquals("io.github.droidkaigi.confsched2019.ui", appContext.packageName) + assertEquals("io.github.droidkaigi.confsched2019.debug", appContext.packageName) } } diff --git a/frontendcomponent/androidcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java b/frontendcomponent/androidcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java deleted file mode 100644 index f8a05565d..000000000 --- a/frontendcomponent/androidcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget.component; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.component.test", appContext.getPackageName()); - } -} diff --git a/frontendcomponent/androidtestcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java b/frontendcomponent/androidtestcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java deleted file mode 100644 index f8a05565d..000000000 --- a/frontendcomponent/androidtestcomponent/src/androidTest/java/io/github/droidkaigi/confsched2019/widget/component/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.droidkaigi.confsched2019.widget.component; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("io.github.droidkaigi.confsched2019.ui.component.test", appContext.getPackageName()); - } -} From 0865782bba869a6efd05e7272d2cf6d884ca0390 Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Tue, 8 Jan 2019 23:34:38 +0900 Subject: [PATCH 077/143] Add empty state view to MyPlan --- .../ui/BottomSheetDaySessionsFragment.kt | 2 + .../ui/BottomSheetFavoriteSessionsFragment.kt | 1 + .../layout/fragment_bottom_sheet_sessions.xml | 146 +++++++++++------- .../src/main/res/values-ja/strings.xml | 1 + .../session/src/main/res/values/strings.xml | 1 + 5 files changed, 91 insertions(+), 60 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt index 3c53885b7..06db3eeb5 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt @@ -98,6 +98,8 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { } groupAdapter.update(items) + binding.shouldShowEmptyStateView = false + val titleText = items .asSequence() .filterIsInstance() diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index b8e8abb9a..b26a9021d 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -101,6 +101,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { groupAdapter.update(items) applyTitleText() + binding.shouldShowEmptyStateView = items.isEmpty() } sessionPageStore.filterSheetState.changed(viewLifecycleOwner) { newState -> if (newState == BottomSheetBehavior.STATE_EXPANDED || diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index f573dde03..44d1478dc 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -11,78 +11,104 @@ name="isCollapsed" type="Boolean" /> - + + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/bg_bottom_sheet_dialog_fragment" + tools:context="io.github.droidkaigi.confsched2019.session.ui.SessionPagesFragment" + > + android:id="@+id/sessions_bottom_sheet_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginStart="16dp" + android:fontFamily="@font/lekton" + android:gravity="center_vertical" + android:textAppearance="@style/TextAppearance.App.Headline5" + android:textColor="@color/gray3" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + /> + android:id="@+id/sessions_bottom_sheet_show_filter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:gravity="center_vertical" + android:text="@string/session_filter_button" + android:textColor="@color/gray2" + app:visibleGone="@{!isCollapsed}" + app:chipBackgroundColor="@color/gray4" + app:chipIcon="@drawable/ic_filter_list_black_24dp" + app:chipIconTint="@color/gray3" + app:layout_constraintBaseline_toBaselineOf="@id/sessions_bottom_sheet_title" + app:layout_constraintEnd_toEndOf="parent" + /> + android:id="@+id/sessions_bottom_sheet_hide_filter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:gravity="center_vertical" + android:paddingEnd="@dimen/session_bottom_sheet_filter_text_padding" + android:paddingStart="@dimen/session_bottom_sheet_filter_text_padding" + app:visibleGone="@{isCollapsed}" + app:chipBackgroundColor="@color/gray4" + app:chipIcon="@drawable/ic_arrow_upward_black_24dp" + app:chipIconTint="@color/gray3" + app:iconEndPadding="@dimen/session_bottom_sheet_filter_icon_padding" + app:iconStartPadding="@dimen/session_bottom_sheet_filter_icon_padding" + app:layout_constraintBaseline_toBaselineOf="@id/sessions_bottom_sheet_title" + app:layout_constraintEnd_toEndOf="parent" + app:textEndPadding="@dimen/session_bottom_sheet_filter_text_padding" + app:textStartPadding="@dimen/session_bottom_sheet_filter_text_padding" + /> + + + + diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e27a963fd..22ed5a8e9 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -11,4 +11,5 @@ 検索する… アンケートに回答する 同時通訳 + お気に入りのセッションを登録すると\nあなた専用のプランを作ることが\nできます。 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index dfbeb2206..a652f1f6d 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -25,4 +25,5 @@ Live simultaneous interpretation io.github.droidkaigi.confsched2019.session.ui.widget.SessionBottomAppBarBehavior + Let\'s make your own plan\nby tapping session\'s bookmark button. From a184d11de1d5392a5356349ddeb67a47a2dce3be Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Wed, 9 Jan 2019 00:36:25 +0900 Subject: [PATCH 078/143] Use binding for BottomSheet's isCollapsed --- .../session/ui/BottomSheetFavoriteSessionsFragment.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index b26a9021d..a35ef261a 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.LinearLayoutManager @@ -113,8 +112,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { excludeChildren(binding.sessionsRecycler, true) }) val isCollapsed = newState == BottomSheetBehavior.STATE_COLLAPSED - binding.sessionsBottomSheetShowFilterButton.isVisible = !isCollapsed - binding.sessionsBottomSheetHideFilterButton.isVisible = isCollapsed + binding.isCollapsed = isCollapsed } } } From 4735f2bdb1fc75437f9a6d531e00c7ed3546f2f7 Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Wed, 9 Jan 2019 00:37:20 +0900 Subject: [PATCH 079/143] Apply design of empty state view of MyPlan --- .../layout/fragment_bottom_sheet_sessions.xml | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index 44d1478dc..0f483a357 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -35,6 +35,7 @@ android:gravity="center_vertical" android:textAppearance="@style/TextAppearance.App.Headline5" android:textColor="@color/gray3" + app:visibleGone="@{!shouldShowEmptyStateView}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -47,7 +48,7 @@ android:gravity="center_vertical" android:text="@string/session_filter_button" android:textColor="@color/gray2" - app:visibleGone="@{!isCollapsed}" + app:visibleGone="@{!isCollapsed && !shouldShowEmptyStateView}" app:chipBackgroundColor="@color/gray4" app:chipIcon="@drawable/ic_filter_list_black_24dp" app:chipIconTint="@color/gray3" @@ -63,7 +64,7 @@ android:gravity="center_vertical" android:paddingEnd="@dimen/session_bottom_sheet_filter_text_padding" android:paddingStart="@dimen/session_bottom_sheet_filter_text_padding" - app:visibleGone="@{isCollapsed}" + app:visibleGone="@{isCollapsed && !shouldShowEmptyStateView}" app:chipBackgroundColor="@color/gray4" app:chipIcon="@drawable/ic_arrow_upward_black_24dp" app:chipIconTint="@color/gray3" @@ -100,15 +101,35 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/sessions_bottom_sheet_title"> - + + + + From 211b051e07b1f7be0a17af34595b9fd63602a8ba Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Wed, 9 Jan 2019 01:15:46 +0900 Subject: [PATCH 080/143] Change empty state's English sentence better --- feature/session/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index a652f1f6d..5763ea74c 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -25,5 +25,5 @@ Live simultaneous interpretation io.github.droidkaigi.confsched2019.session.ui.widget.SessionBottomAppBarBehavior - Let\'s make your own plan\nby tapping session\'s bookmark button. + Add sessions to your plan\nby tapping the bookmark button. From 0b21e9e12dc01f4fb3df8956ffcc7c6ceaf7519f Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Wed, 9 Jan 2019 22:42:32 +0900 Subject: [PATCH 081/143] Use ConstraintLayout's group --- .../layout/fragment_bottom_sheet_sessions.xml | 227 ++++++++++-------- 1 file changed, 124 insertions(+), 103 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index 0f483a357..f2997f555 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -8,128 +8,149 @@ + name="isCollapsed" + type="Boolean" + /> + + name="shouldShowEmptyStateView" + type="Boolean" + /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/bg_bottom_sheet_dialog_fragment" + tools:context="io.github.droidkaigi.confsched2019.session.ui.SessionPagesFragment" + > + + + + + android:id="@+id/sessions_bottom_sheet_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:fontFamily="@font/lekton" + android:gravity="center_vertical" + android:textAppearance="@style/TextAppearance.App.Headline5" + android:textColor="@color/gray3" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + /> + android:id="@+id/sessions_bottom_sheet_show_filter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:gravity="center_vertical" + android:text="@string/session_filter_button" + android:textColor="@color/gray2" + app:chipBackgroundColor="@color/gray4" + app:chipIcon="@drawable/ic_filter_list_black_24dp" + app:chipIconTint="@color/gray3" + app:layout_constraintBaseline_toBaselineOf="@id/sessions_bottom_sheet_title" + app:layout_constraintEnd_toEndOf="parent" + app:visibleGone="@{!isCollapsed}" + /> + android:id="@+id/sessions_bottom_sheet_hide_filter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:gravity="center_vertical" + android:paddingEnd="@dimen/session_bottom_sheet_filter_text_padding" + android:paddingStart="@dimen/session_bottom_sheet_filter_text_padding" + app:chipBackgroundColor="@color/gray4" + app:chipIcon="@drawable/ic_arrow_upward_black_24dp" + app:chipIconTint="@color/gray3" + app:iconEndPadding="@dimen/session_bottom_sheet_filter_icon_padding" + app:iconStartPadding="@dimen/session_bottom_sheet_filter_icon_padding" + app:layout_constraintBaseline_toBaselineOf="@id/sessions_bottom_sheet_title" + app:layout_constraintEnd_toEndOf="parent" + app:textEndPadding="@dimen/session_bottom_sheet_filter_text_padding" + app:textStartPadding="@dimen/session_bottom_sheet_filter_text_padding" + app:visibleGone="@{isCollapsed}" + /> + android:id="@+id/sessions_recycler" + android:orientation="vertical" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginTop="16dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/sessions_bottom_sheet_title" + app:visibleGone="@{!shouldShowEmptyStateView}" + /> + android:id="@+id/sessions_empty_state_view" + android:orientation="vertical" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginTop="16dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/sessions_bottom_sheet_title" + > + android:id="@+id/sessions_favorite_image" + android:layout_width="80dp" + android:layout_height="80dp" + android:layout_marginBottom="10dp" + android:contentDescription="@string/session_description_favorite_image" + android:scaleType="fitCenter" + android:src="@drawable/ic_bookmark_black_24dp" + android:tint="@color/gray3" + app:layout_constraintBottom_toTopOf="@+id/sessions_empty_state_text" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.42" + app:layout_constraintVertical_chainStyle="packed" + /> + android:id="@+id/sessions_empty_state_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:text="@string/session_favorite_empty" + android:textColor="@color/gray1" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/sessions_favorite_image" + /> From e82c45cc2fc96dd48c09ec3d57c90825938d248c Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Wed, 9 Jan 2019 23:11:51 +0900 Subject: [PATCH 082/143] Use LinearLayout --- .../layout/fragment_bottom_sheet_sessions.xml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index f2997f555..4d9a56326 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -109,12 +109,12 @@ app:visibleGone="@{!shouldShowEmptyStateView}" /> - - + From e0cd5e4dd110ef37e6f0a3ff7664c47661154daa Mon Sep 17 00:00:00 2001 From: tatsuhama Date: Thu, 10 Jan 2019 00:54:35 +0900 Subject: [PATCH 083/143] Delete language resources that are not Japanese and English by resConfigs Support libraries includes string resources other than Japanese and English Effect : Reduce apk size See : https://developer.android.com/studio/build/shrink-code?#unused-alt-resources https://qiita.com/tatsuhama/items/814471b79c5d572f77e9 https://github.com/DroidKaigi/conference-app-2018/pull/129 --- frontend/android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index bc655515f..1d2355ea6 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -25,6 +25,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true + resConfigs "en", "ja" // For Android Studio Gradle sync applicationIdSuffix ".debug" } From c7b654d218bf4d3fc17ced0860bc1ee5a99cecfd Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 01:00:04 +0900 Subject: [PATCH 084/143] add shareUrl --- .../system/actioncreator/ActivityActionCreator.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt index 0b7c93d3d..78456b1da 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt @@ -3,6 +3,7 @@ package io.github.droidkaigi.confsched2019.system.actioncreator import android.content.Intent import android.net.Uri import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.app.ShareCompat import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import io.github.droidkaigi.confsched2019.system.R @@ -34,4 +35,12 @@ class ActivityActionCreator @Inject constructor(val activity: FragmentActivity) const val LATITUDE_LOCATION = "35.696065" const val LONGITUDE_LOCATION = "139.690426" } + + fun shareUrl(url: String) { + val builder: ShareCompat.IntentBuilder = ShareCompat.IntentBuilder.from(activity) + builder.setChooserTitle("share via") + .setText(url) + .setType("text/plain") + .startChooser() + } } From ac7f044445bc235af3cf0e9b0920e45f9c49b0ac Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 01:08:15 +0900 Subject: [PATCH 085/143] add session_detail_share_url in strings.xml --- feature/session/src/main/res/values-ja/strings.xml | 1 + feature/session/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e27a963fd..b37f61884 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -8,6 +8,7 @@ 資料 動画 スライド + https://droidkaigi.jp/2019/timetable/%d 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index dfbeb2206..88075270c 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ Resources Video Slides + https://droidkaigi.jp/2019/en/timetable/%d Session Share Place From 95a36f9628714aa7e35595d7443653b78c7085dc Mon Sep 17 00:00:00 2001 From: gauravdubey99 Date: Wed, 9 Jan 2019 21:50:55 +0530 Subject: [PATCH 086/143] README.md Minor grammatical change. Removed "are" as it is not needed there. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc7259c21..33729a86b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ You can download the binary built on master branch from [ { + val session = binding.session ?: return@setOnMenuItemClickListener false + activityActionCreator.shareUrl(getString( + R.string.session_detail_share_url, + session.id.toInt() + )) + } R.id.session_place -> Toast.makeText( requireContext(), From b975ed75fc033d72e0e7912c0753511d3e71abc8 Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 01:29:53 +0900 Subject: [PATCH 088/143] add slash at end --- feature/session/src/main/res/values-ja/strings.xml | 2 +- feature/session/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index b37f61884..e7c0d3de8 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -8,7 +8,7 @@ 資料 動画 スライド - https://droidkaigi.jp/2019/timetable/%d + https://droidkaigi.jp/2019/timetable/%d/ 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 88075270c..549a25c81 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Resources Video Slides - https://droidkaigi.jp/2019/en/timetable/%d + https://droidkaigi.jp/2019/en/timetable/%d/ Session Share Place From eff911af88a7b9ec893c9061dbc3d60a3b85b8e8 Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 01:35:33 +0900 Subject: [PATCH 089/143] remove setChooserTitle --- .../system/actioncreator/ActivityActionCreator.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt index 78456b1da..9beddbfa4 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt @@ -38,8 +38,7 @@ class ActivityActionCreator @Inject constructor(val activity: FragmentActivity) fun shareUrl(url: String) { val builder: ShareCompat.IntentBuilder = ShareCompat.IntentBuilder.from(activity) - builder.setChooserTitle("share via") - .setText(url) + builder.setText(url) .setType("text/plain") .startChooser() } From 7ab48192eff737ec44282bb73a586bb451b905c0 Mon Sep 17 00:00:00 2001 From: Sadashi Ota Date: Thu, 10 Jan 2019 01:43:49 +0900 Subject: [PATCH 090/143] Add space on both sides of the session tab. --- feature/session/src/main/res/layout/fragment_session_page.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature/session/src/main/res/layout/fragment_session_page.xml b/feature/session/src/main/res/layout/fragment_session_page.xml index 27b8fe023..d91127554 100644 --- a/feature/session/src/main/res/layout/fragment_session_page.xml +++ b/feature/session/src/main/res/layout/fragment_session_page.xml @@ -10,6 +10,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" + android:paddingStart="8dp" + android:paddingEnd="8dp" tools:context="io.github.droidkaigi.confsched2019.session.ui.SessionPagesFragment" > From ab59fa7be909058521c53d8886d81ead1ef06aa1 Mon Sep 17 00:00:00 2001 From: Takayuki Matsubara Date: Thu, 10 Jan 2019 02:04:23 +0900 Subject: [PATCH 091/143] use Maven Central mirror hosted on Google Cloud Storage for faster build --- build.gradle | 2 ++ frontendcomponent/androidcomponent/build.gradle | 1 + frontendcomponent/androidtestcomponent/build.gradle | 1 + 3 files changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index d165e68f8..6fdc361ad 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ apply from: file('gradle/dependencyGraph.gradle') buildscript { repositories { google() + maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } jcenter() maven { url "https://kotlin.bintray.com/kotlinx" } maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } @@ -28,6 +29,7 @@ buildscript { allprojects { repositories { google() + maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } jcenter() maven { url "https://kotlin.bintray.com/kotlinx" } maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } diff --git a/frontendcomponent/androidcomponent/build.gradle b/frontendcomponent/androidcomponent/build.gradle index d113489e8..e4d1da83e 100644 --- a/frontendcomponent/androidcomponent/build.gradle +++ b/frontendcomponent/androidcomponent/build.gradle @@ -32,6 +32,7 @@ dependencies { androidTestImplementation Dep.Test.espressoCore } repositories { + maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } mavenCentral() } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { diff --git a/frontendcomponent/androidtestcomponent/build.gradle b/frontendcomponent/androidtestcomponent/build.gradle index 0640d3aa6..bd11b22d0 100644 --- a/frontendcomponent/androidtestcomponent/build.gradle +++ b/frontendcomponent/androidtestcomponent/build.gradle @@ -23,6 +23,7 @@ dependencies { } } repositories { + maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } mavenCentral() } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { From 0e26efd809d7d633a88b1d379cca7a91e4843e09 Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 03:01:50 +0900 Subject: [PATCH 092/143] add suppress StringFormatMatches --- .../droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 1c157894b..a75c0bbf4 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -70,6 +70,7 @@ class SessionDetailFragment : DaggerFragment() { when (item.itemId) { R.id.session_share -> { val session = binding.session ?: return@setOnMenuItemClickListener false + @Suppress("StringFormatMatches") // FIXME activityActionCreator.shareUrl(getString( R.string.session_detail_share_url, session.id.toInt() From 4111c3abd7c03d7166768cff2849be5b00e941cc Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 03:02:36 +0900 Subject: [PATCH 093/143] move shareUrl at the top of the companion object --- .../system/actioncreator/ActivityActionCreator.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt index 9beddbfa4..5d958eb16 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ActivityActionCreator.kt @@ -31,15 +31,15 @@ class ActivityActionCreator @Inject constructor(val activity: FragmentActivity) } } - companion object { - const val LATITUDE_LOCATION = "35.696065" - const val LONGITUDE_LOCATION = "139.690426" - } - fun shareUrl(url: String) { val builder: ShareCompat.IntentBuilder = ShareCompat.IntentBuilder.from(activity) builder.setText(url) .setType("text/plain") .startChooser() } + + companion object { + const val LATITUDE_LOCATION = "35.696065" + const val LONGITUDE_LOCATION = "139.690426" + } } From 8513b4820d7d8e07e376b79d3258179f329f1a9b Mon Sep 17 00:00:00 2001 From: Takahiro Menju Date: Thu, 10 Jan 2019 03:05:49 +0900 Subject: [PATCH 094/143] Revert "Add space on both sides of the session tab." --- feature/session/src/main/res/layout/fragment_session_page.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_page.xml b/feature/session/src/main/res/layout/fragment_session_page.xml index d91127554..27b8fe023 100644 --- a/feature/session/src/main/res/layout/fragment_session_page.xml +++ b/feature/session/src/main/res/layout/fragment_session_page.xml @@ -10,8 +10,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" - android:paddingStart="8dp" - android:paddingEnd="8dp" tools:context="io.github.droidkaigi.confsched2019.session.ui.SessionPagesFragment" > From d554a67c71f6b0ab43090e3b4f82e2ae2ab050a4 Mon Sep 17 00:00:00 2001 From: Takafumi Kanda Date: Wed, 9 Jan 2019 23:15:55 +0530 Subject: [PATCH 095/143] Fix SessionsItemDecoration not to draw unexpected time text --- .../ui/widget/SessionsItemDecoration.kt | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt index fd2121f94..89a6fec0b 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt @@ -5,7 +5,10 @@ import android.content.res.Resources import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint +import android.util.SparseArray +import android.view.View import androidx.core.content.res.ResourcesCompat +import androidx.core.util.forEach import androidx.recyclerview.widget.RecyclerView import com.xwray.groupie.GroupAdapter import io.github.droidkaigi.confsched2019.session.R @@ -42,16 +45,24 @@ class SessionsItemDecoration( } } + // Keep SparseArray instance on property to avoid object creation in every onDrawOver() + private val positionToViews = SparseArray() + override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { - var lastTime: String? = null + // Sort child views by adapter position for (i in 0 until parent.childCount) { val view = parent.getChildAt(i) val position = parent.getChildAdapterPosition(view) - if (position == -1 || position >= groupAdapter.itemCount) return + if (position != -1 && position < groupAdapter.itemCount) { + positionToViews.put(position, view) + } + } - val time = getSessionTime(position) ?: continue + var lastTime: String? = null + positionToViews.forEach { position, view -> + val time = getSessionTime(position) ?: return@forEach - if (lastTime == time) continue + if (lastTime == time) return@forEach lastTime = time val nextTime = getSessionTime(position + 1) @@ -68,6 +79,8 @@ class SessionsItemDecoration( paint ) } + + positionToViews.clear() } private fun getSessionTime(position: Int): String? { From f93bd0b694969f97d4e5b20f780d40efbc94003e Mon Sep 17 00:00:00 2001 From: SatoShun Date: Wed, 9 Jan 2019 23:06:53 +0000 Subject: [PATCH 096/143] use Timber but has redundant code not perfect --- buildSrc/src/main/java/dependencies/Dep.kt | 6 +++++ data/repository-impl/build.gradle | 1 - ext/log/build.gradle | 2 ++ ext/log/src/commonMain/kotlin/Logger.kt | 26 +++---------------- feature/session/build.gradle | 3 ++- .../SessionContentsActionCreator.kt | 13 +++++----- .../ui/widget/SessionsItemDecoration.kt | 4 +-- feature/sponsor/build.gradle | 1 - feature/system/build.gradle | 2 ++ .../system/actioncreator/ErrorHandler.kt | 15 ++++++----- frontend/android/build.gradle | 2 ++ .../io/github/droidkaigi/confsched2019/App.kt | 5 ++-- .../droidkaigi/confsched2019/DebugApp.kt | 22 +++------------- 13 files changed, 41 insertions(+), 61 deletions(-) diff --git a/buildSrc/src/main/java/dependencies/Dep.kt b/buildSrc/src/main/java/dependencies/Dep.kt index 9fd1e23c4..0908f5bdc 100644 --- a/buildSrc/src/main/java/dependencies/Dep.kt +++ b/buildSrc/src/main/java/dependencies/Dep.kt @@ -173,4 +173,10 @@ object Dep { val picasso = "com.squareup.picasso:picasso:2.71828" val picassoTransformation = "jp.wasabeef:picasso-transformations:2.2.1" } + + object Timber { + val common = "com.jakewharton.timber:timber-common:5.0.0-SNAPSHOT" + val jdk = "com.jakewharton.timber:timber-jdk:5.0.0-SNAPSHOT" + val android = "com.jakewharton.timber:timber-android:5.0.0-SNAPSHOT" + } } diff --git a/data/repository-impl/build.gradle b/data/repository-impl/build.gradle index f62c40096..d8e004f49 100644 --- a/data/repository-impl/build.gradle +++ b/data/repository-impl/build.gradle @@ -11,7 +11,6 @@ dependencies { implementation project(":data:api") implementation project(":data:db") implementation project(":data:firestore") - implementation project(":ext:log") api project(":model") implementation Dep.Kotlin.stdlibJvm diff --git a/ext/log/build.gradle b/ext/log/build.gradle index 8470119cf..9c8f833ac 100644 --- a/ext/log/build.gradle +++ b/ext/log/build.gradle @@ -12,10 +12,12 @@ kotlin { sourceSets { commonMain.dependencies { api Dep.Kotlin.stdlibCommon + api Dep.Timber.common } androidMain { dependencies { api Dep.Kotlin.stdlibJvm + api Dep.Timber.jdk } } commonTest.dependencies { diff --git a/ext/log/src/commonMain/kotlin/Logger.kt b/ext/log/src/commonMain/kotlin/Logger.kt index eb4839dca..4c56e3372 100644 --- a/ext/log/src/commonMain/kotlin/Logger.kt +++ b/ext/log/src/commonMain/kotlin/Logger.kt @@ -1,25 +1,7 @@ package io.github.droidkaigi.confsched2019.util -enum class LogLevel { - DEBUG, WARN, ERROR -} - -var logHandler = { logLevel: LogLevel, tag: String, e: Throwable?, messageHandler: () -> String -> } - -fun logd( - tag: String = "droidkaigi", - e: Throwable? = null, - messageHandler: () -> String = { "" } -) = logHandler(LogLevel.DEBUG, tag, e, messageHandler) +import timber.log.Timber -fun logw( - tag: String = "droidkaigi", - e: Throwable? = null, - messageHandler: () -> String = { "" } -) = logHandler(LogLevel.WARN, tag, e, messageHandler) - -fun loge( - tag: String = "droidkaigi", - e: Throwable? = null, - messageHandler: () -> String = { "" } -) = logHandler(LogLevel.ERROR, tag, e, messageHandler) +fun Timber.timberd(throwable: Throwable) { + Timber.log(DEBUG, null, throwable, null) +} diff --git a/feature/session/build.gradle b/feature/session/build.gradle index 25229d58f..90b84022a 100644 --- a/feature/session/build.gradle +++ b/feature/session/build.gradle @@ -27,7 +27,6 @@ dependencies { api Dep.AndroidX.emoji implementation Dep.AndroidX.design - api Dep.AndroidX.lifecycleExtensions api Dep.AndroidX.Navigation.runtime api Dep.AndroidX.Navigation.runtimeKtx @@ -49,6 +48,8 @@ dependencies { implementation Dep.Picasso.picasso implementation Dep.Picasso.picassoTransformation + implementation Dep.Timber.android + testImplementation Dep.Test.junit testImplementation Dep.Test.kotlinTestAssertions testImplementation Dep.MockK.jvm diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt index c19170d9a..cc31bd5bd 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt @@ -9,9 +9,10 @@ import io.github.droidkaigi.confsched2019.ext.android.coroutineScope import io.github.droidkaigi.confsched2019.model.LoadingState import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.system.actioncreator.ErrorHandler -import io.github.droidkaigi.confsched2019.util.logd import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import timber.log.Timber +import timber.log.debug import javax.inject.Inject @PageScope @@ -23,22 +24,22 @@ class SessionContentsActionCreator @Inject constructor( ErrorHandler { fun refresh() = launch { try { - logd { "SessionContentsActionCreator: refresh start" } + Timber.debug { "SessionContentsActionCreator: refresh start" } dispatcher.dispatchLoadingState(LoadingState.LOADING) - logd { "SessionContentsActionCreator: At first, load db data" } + Timber.debug { "SessionContentsActionCreator: At first, load db data" } // At first, load db data val sessionContents = sessionRepository.sessionContents() dispatcher.dispatch(Action.SessionContentsLoaded(sessionContents)) // fetch api data - logd { "SessionContentsActionCreator: fetch api data" } + Timber.debug { "SessionContentsActionCreator: fetch api data" } sessionRepository.refresh() // reload db data - logd { "SessionContentsActionCreator: reload db data" } + Timber.debug { "SessionContentsActionCreator: reload db data" } val refreshedSessionContents = sessionRepository.sessionContents() dispatcher.dispatch(Action.SessionContentsLoaded(refreshedSessionContents)) - logd { "SessionContentsActionCreator: refresh end" } + Timber.debug { "SessionContentsActionCreator: refresh end" } dispatcher.dispatchLoadingState(LoadingState.LOADED) } catch (e: Exception) { onError(e) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt index fd2121f94..42cd2f760 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt @@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView import com.xwray.groupie.GroupAdapter import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.session.ui.item.SessionItem -import io.github.droidkaigi.confsched2019.util.logd +import timber.log.Timber class SessionsItemDecoration( val context: Context, @@ -38,7 +38,7 @@ class SessionsItemDecoration( try { typeface = ResourcesCompat.getFont(context, R.font.lekton) } catch (e: Resources.NotFoundException) { - logd(e = e) + Timber.log(Timber.DEBUG, null, e, null) } } diff --git a/feature/sponsor/build.gradle b/feature/sponsor/build.gradle index cf0e069c2..6f38001f5 100644 --- a/feature/sponsor/build.gradle +++ b/feature/sponsor/build.gradle @@ -14,7 +14,6 @@ dependencies { implementation project(":model") implementation project(":data:repository") implementation project(':ext:android-extension') - implementation project(':ext:log') implementation Dep.Kotlin.stdlibJvm api Dep.Kotlin.coroutines diff --git a/feature/system/build.gradle b/feature/system/build.gradle index d6fdbd989..ce643d033 100644 --- a/feature/system/build.gradle +++ b/feature/system/build.gradle @@ -29,6 +29,8 @@ dependencies { kapt Dep.Dagger.compiler kapt Dep.Dagger.androidProcessor + implementation Dep.Timber.android + testImplementation Dep.Test.junit androidTestImplementation Dep.Test.testRunner testImplementation Dep.Test.slf4j diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt index 5ad6c2881..a55f03512 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt @@ -8,10 +8,11 @@ import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher import io.github.droidkaigi.confsched2019.model.ErrorMessage import io.github.droidkaigi.confsched2019.system.BuildConfig import io.github.droidkaigi.confsched2019.system.R -import io.github.droidkaigi.confsched2019.util.logd -import io.github.droidkaigi.confsched2019.util.loge import io.ktor.client.features.BadResponseStatusException import kotlinx.coroutines.CancellationException +import timber.log.Timber +import timber.log.debug +import timber.log.error import java.net.ConnectException import java.net.SocketTimeoutException import java.net.UnknownHostException @@ -20,14 +21,14 @@ interface ErrorHandler { val dispatcher: Dispatcher fun onError(e: Throwable, msg: String? = null) { if (e.cause is CancellationException) { - logd(e = e) { + Timber.debug(e) { "coroutine canceled" } return } when (e) { is CancellationException -> - logd(e = e) { + Timber.debug(e) { "coroutine canceled" } is UnknownHostException, @@ -37,17 +38,17 @@ interface ErrorHandler { is FirebaseApiNotAvailableException, is FirebaseNetworkException -> { val message = ErrorMessage.of(R.string.system_error_network, e) - loge(e = e) + Timber.log(Timber.ERROR, null, e, null) dispatcher.launchAndDispatch(Action.Error(message)) } is BadResponseStatusException -> { val message = ErrorMessage.of(R.string.system_error_server, e) - loge(e = e) + Timber.log(Timber.ERROR, null, e, null) dispatcher.launchAndDispatch(Action.Error(message)) } else -> { val message = ErrorMessage.of(msg ?: e.message ?: e.javaClass.name ?: "", e) - loge(e = e) { + Timber.error(e) { (message as ErrorMessage.Message).message } if (BuildConfig.DEBUG) throw UnknownException(e) diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index bc655515f..bb1c767db 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -107,6 +107,8 @@ dependencies { compileOnly Dep.Dagger.assistedInjectAnnotations kapt Dep.Dagger.assistedInjectProcessor + implementation Dep.Timber.android + testImplementation Dep.Test.junit androidTestImplementation Dep.Test.testRunner diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/App.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/App.kt index 1d83909dd..95d20a66e 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/App.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/App.kt @@ -15,7 +15,8 @@ import io.github.droidkaigi.confsched2019.di.createAppComponent import io.github.droidkaigi.confsched2019.ext.android.changedForever import io.github.droidkaigi.confsched2019.system.actioncreator.SystemActionCreator import io.github.droidkaigi.confsched2019.system.store.SystemStore -import io.github.droidkaigi.confsched2019.util.logd +import timber.log.Timber +import timber.log.debug import javax.inject.Inject open class App : DaggerApplication() { @@ -38,7 +39,7 @@ open class App : DaggerApplication() { // fetch font for cache ResourcesCompat.getFont(this, R.font.lekton, object : ResourcesCompat.FontCallback() { override fun onFontRetrievalFailed(reason: Int) { - logd { "onFontRetrievalFailed$reason" } + Timber.debug { "onFontRetrievalFailed$reason" } } override fun onFontRetrieved(typeface: Typeface) { diff --git a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/DebugApp.kt b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/DebugApp.kt index a2f5696ad..e184c29a2 100644 --- a/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/DebugApp.kt +++ b/frontend/android/src/main/java/io/github/droidkaigi/confsched2019/DebugApp.kt @@ -1,10 +1,9 @@ package io.github.droidkaigi.confsched2019 -import android.util.Log import com.facebook.stetho.Stetho import com.squareup.leakcanary.LeakCanary -import io.github.droidkaigi.confsched2019.util.LogLevel -import io.github.droidkaigi.confsched2019.util.logHandler +import timber.log.LogcatTree +import timber.log.Timber class DebugApp : App() { override fun onCreate() { @@ -26,21 +25,6 @@ class DebugApp : App() { } private fun setupLogHandler() { - logHandler = { logLevel: LogLevel, tag: String, e: Throwable?, logHandler: () -> String -> - val message = if (e != null) { - logHandler() + Log.getStackTraceString(e) - } else { - logHandler() - } - Log.println( - when (logLevel) { - LogLevel.DEBUG -> Log.DEBUG - LogLevel.WARN -> Log.WARN - LogLevel.ERROR -> Log.ERROR - }, - tag, - message - ) - } + Timber.plant(LogcatTree("droidkaigi")) } } From 420c4950861215035fcb2f154347ebd5d587cc4a Mon Sep 17 00:00:00 2001 From: SatoShun Date: Wed, 9 Jan 2019 23:17:22 +0000 Subject: [PATCH 097/143] add helper Timber methods only Exception --- ext/log/src/commonMain/kotlin/Logger.kt | 7 ----- .../droidkaigi/confsched2019/timber/Timber.kt | 29 +++++++++++++++++++ .../ui/widget/SessionsItemDecoration.kt | 3 +- .../system/actioncreator/ErrorHandler.kt | 5 ++-- 4 files changed, 34 insertions(+), 10 deletions(-) delete mode 100644 ext/log/src/commonMain/kotlin/Logger.kt create mode 100644 ext/log/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/timber/Timber.kt diff --git a/ext/log/src/commonMain/kotlin/Logger.kt b/ext/log/src/commonMain/kotlin/Logger.kt deleted file mode 100644 index 4c56e3372..000000000 --- a/ext/log/src/commonMain/kotlin/Logger.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.droidkaigi.confsched2019.util - -import timber.log.Timber - -fun Timber.timberd(throwable: Throwable) { - Timber.log(DEBUG, null, throwable, null) -} diff --git a/ext/log/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/timber/Timber.kt b/ext/log/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/timber/Timber.kt new file mode 100644 index 000000000..8ea4f05dd --- /dev/null +++ b/ext/log/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/timber/Timber.kt @@ -0,0 +1,29 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package io.github.droidkaigi.confsched2019.timber + +import timber.log.Timber + +inline fun Timber.assert(throwable: Throwable) { + Timber.log(ASSERT, null, throwable, null) +} + +inline fun Timber.error(throwable: Throwable) { + Timber.log(ERROR, null, throwable, null) +} + +inline fun Timber.warn(throwable: Throwable) { + Timber.log(WARNING, null, throwable, null) +} + +inline fun Timber.info(throwable: Throwable) { + Timber.log(INFO, null, throwable, null) +} + +inline fun Timber.debug(throwable: Throwable) { + Timber.log(DEBUG, null, throwable, null) +} + +inline fun Timber.verbose(throwable: Throwable) { + Timber.log(VERBOSE, null, throwable, null) +} diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt index 42cd2f760..92dbc32cb 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView import com.xwray.groupie.GroupAdapter import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.session.ui.item.SessionItem +import io.github.droidkaigi.confsched2019.timber.debug import timber.log.Timber class SessionsItemDecoration( @@ -38,7 +39,7 @@ class SessionsItemDecoration( try { typeface = ResourcesCompat.getFont(context, R.font.lekton) } catch (e: Resources.NotFoundException) { - Timber.log(Timber.DEBUG, null, e, null) + Timber.debug(e) } } diff --git a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt index a55f03512..44f2b41e5 100644 --- a/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt +++ b/feature/system/src/main/java/io/github/droidkaigi/confsched2019/system/actioncreator/ErrorHandler.kt @@ -8,6 +8,7 @@ import io.github.droidkaigi.confsched2019.dispatcher.Dispatcher import io.github.droidkaigi.confsched2019.model.ErrorMessage import io.github.droidkaigi.confsched2019.system.BuildConfig import io.github.droidkaigi.confsched2019.system.R +import io.github.droidkaigi.confsched2019.timber.error import io.ktor.client.features.BadResponseStatusException import kotlinx.coroutines.CancellationException import timber.log.Timber @@ -38,12 +39,12 @@ interface ErrorHandler { is FirebaseApiNotAvailableException, is FirebaseNetworkException -> { val message = ErrorMessage.of(R.string.system_error_network, e) - Timber.log(Timber.ERROR, null, e, null) + Timber.error(e) dispatcher.launchAndDispatch(Action.Error(message)) } is BadResponseStatusException -> { val message = ErrorMessage.of(R.string.system_error_server, e) - Timber.log(Timber.ERROR, null, e, null) + Timber.error(e) dispatcher.launchAndDispatch(Action.Error(message)) } else -> { From c1c5622a4b55263243cffa2cb90d05bc3883b275 Mon Sep 17 00:00:00 2001 From: tatsuhama Date: Thu, 10 Jan 2019 09:29:44 +0900 Subject: [PATCH 098/143] "en" is needless. Because, English materials are in the default and "en" folder does not. --- frontend/android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index 1d2355ea6..2ce800fe1 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -25,7 +25,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true - resConfigs "en", "ja" + resConfigs "ja" // For Android Studio Gradle sync applicationIdSuffix ".debug" } From 6ac1d64864cb8a44901698dd1b51c23a71f42cad Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 09:47:00 +0900 Subject: [PATCH 099/143] Added message view in session detail --- .../session/ui/SessionDetailFragment.kt | 4 + .../res/layout/fragment_session_detail.xml | 76 +++++++++++-------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index fcb8538c9..92befab06 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -114,6 +114,10 @@ class SessionDetailFragment : DaggerFragment() { ) binding.categoryChip.text = session.category.name.getByLang(systemStore.lang) + session.message?.let { message -> + binding.sessionMessage.text = message.getByLang(systemStore.lang) + } + val sessionItems = session .speakers .map { diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 17f471716..ab6c28a46 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -38,8 +38,8 @@ android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:visibility="invisible" android:layout_gravity="center" + android:visibility="invisible" /> + + + + @@ -301,43 +331,25 @@ android:orientation="vertical" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/session_speaker_title" /> - - From aa051ab2c95aa3ec790ab888ee956063313bc9b0 Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 10:09:04 +0900 Subject: [PATCH 100/143] delete last / and change format argument --- .../confsched2019/session/ui/SessionDetailFragment.kt | 2 +- feature/session/src/main/res/values-ja/strings.xml | 2 +- feature/session/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index a75c0bbf4..181b8a172 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -73,7 +73,7 @@ class SessionDetailFragment : DaggerFragment() { @Suppress("StringFormatMatches") // FIXME activityActionCreator.shareUrl(getString( R.string.session_detail_share_url, - session.id.toInt() + session.id )) } R.id.session_place -> diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e7c0d3de8..e3389dc44 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -8,7 +8,7 @@ 資料 動画 スライド - https://droidkaigi.jp/2019/timetable/%d/ + https://droidkaigi.jp/2019/timetable/%s 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 549a25c81..9cca4e8da 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Resources Video Slides - https://droidkaigi.jp/2019/en/timetable/%d/ + https://droidkaigi.jp/2019/en/timetable/%s Session Share Place From 45a3842e0076ffc79e80303dbb814fdeeb6e0c77 Mon Sep 17 00:00:00 2001 From: Manabu Kayamoto Date: Thu, 10 Jan 2019 10:32:18 +0900 Subject: [PATCH 101/143] fix for review --- .../confsched2019/session/ui/SearchFragment.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt index bc04cc8fa..bb048ca9d 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt @@ -1,6 +1,7 @@ package io.github.droidkaigi.confsched2019.session.ui import android.content.Context +import android.inputmethodservice.InputMethodService import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -10,6 +11,7 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.appcompat.widget.SearchView +import androidx.core.content.ContextCompat import androidx.core.content.systemService import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentActivity @@ -135,12 +137,9 @@ class SearchFragment : DaggerFragment() { override fun onPause() { super.onPause() - val imm = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - context?.systemService() - } else { - context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager - } - imm?.hideSoftInputFromWindow(binding.root.windowToken, 0) + val imm = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java) + val view = activity?.currentFocus + imm?.hideSoftInputFromWindow(view?.windowToken, 0) } } From 53b1bb0587c2fa499f78665f6ff8059c49afea84 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 10:38:58 +0900 Subject: [PATCH 102/143] Implmented filtered title --- .../session/ui/BottomSheetDaySessionsFragment.kt | 1 + .../session/ui/BottomSheetFavoriteSessionsFragment.kt | 1 + .../src/main/res/layout/fragment_bottom_sheet_sessions.xml | 7 ++++++- feature/session/src/main/res/values-ja/strings.xml | 1 + feature/session/src/main/res/values/strings.xml | 1 + model/src/commonMain/kotlin/Filters.kt | 4 ++++ 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt index 3c53885b7..f8cce4a41 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt @@ -97,6 +97,7 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { } } groupAdapter.update(items) + binding.isFiltered = sessionPagesStore.filtersValue.isFiltered() val titleText = items .asSequence() diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index b8e8abb9a..7c1bcb2c4 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -100,6 +100,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { } groupAdapter.update(items) + binding.isFiltered = sessionPagesStore.filtersValue.isFiltered() applyTitleText() } sessionPageStore.filterSheetState.changed(viewLifecycleOwner) { newState -> diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index f573dde03..66a65f0b7 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -12,6 +12,11 @@ type="Boolean" /> + + @@ -42,7 +47,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:gravity="center_vertical" - android:text="@string/session_filter_button" + android:text="@{isFiltered ? @string/session_filter_button_filtered : @string/session_filter_button }" android:textColor="@color/gray2" app:visibleGone="@{!isCollapsed}" app:chipBackgroundColor="@color/gray4" diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e27a963fd..c35f96ac5 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -3,6 +3,7 @@ フィルター リセット 絞り込む + 絞り込み中 アンケート 回答する 資料 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index dfbeb2206..e09e43f27 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ header image %1$d min / %2$s Filtering + Filtered Filter Reset Room diff --git a/model/src/commonMain/kotlin/Filters.kt b/model/src/commonMain/kotlin/Filters.kt index 55f4c6cf2..b4a9b371f 100644 --- a/model/src/commonMain/kotlin/Filters.kt +++ b/model/src/commonMain/kotlin/Filters.kt @@ -23,4 +23,8 @@ data class Filters( } return roomFilterOk && categoryFilterOk && langFilterOk } + + fun isFiltered(): Boolean { + return rooms.isNotEmpty() || categories.isNotEmpty() || langs.isNotEmpty() + } } From d648d9b373fc6400c7a24823421e31ae4453eac0 Mon Sep 17 00:00:00 2001 From: Manabu Kayamoto Date: Thu, 10 Jan 2019 10:40:16 +0900 Subject: [PATCH 103/143] delete unused import --- .../droidkaigi/confsched2019/session/ui/SearchFragment.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt index bb048ca9d..09ff49e46 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt @@ -1,8 +1,5 @@ package io.github.droidkaigi.confsched2019.session.ui -import android.content.Context -import android.inputmethodservice.InputMethodService -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -12,7 +9,6 @@ import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat -import androidx.core.content.systemService import androidx.databinding.DataBindingUtil import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle From a36ca75f5f9e7380e2c63c09b187ac331f95ac8b Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 11:08:46 +0900 Subject: [PATCH 104/143] Change filter to use LiveData --- .../session/ui/BottomSheetDaySessionsFragment.kt | 4 +++- .../session/ui/BottomSheetFavoriteSessionsFragment.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt index f8cce4a41..bc72d2c0c 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt @@ -97,7 +97,6 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { } } groupAdapter.update(items) - binding.isFiltered = sessionPagesStore.filtersValue.isFiltered() val titleText = items .asSequence() @@ -107,6 +106,9 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { ?.startDayText ?: return@changed binding.sessionsBottomSheetTitle.text = titleText } + sessionPagesStore.filters.changed(viewLifecycleOwner) { + binding.isFiltered = it.isFiltered() + } sessionPageStore.filterSheetState.changed(viewLifecycleOwner) { newState -> if (newState == BottomSheetBehavior.STATE_EXPANDED || newState == BottomSheetBehavior.STATE_COLLAPSED diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index 7c1bcb2c4..330250dc5 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -100,9 +100,11 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { } groupAdapter.update(items) - binding.isFiltered = sessionPagesStore.filtersValue.isFiltered() applyTitleText() } + sessionPagesStore.filters.changed(viewLifecycleOwner) { + binding.isFiltered = it.isFiltered() + } sessionPageStore.filterSheetState.changed(viewLifecycleOwner) { newState -> if (newState == BottomSheetBehavior.STATE_EXPANDED || newState == BottomSheetBehavior.STATE_COLLAPSED From 88427d17dc1cc4fd4e38c1a2bde33755dd18c3d0 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 11:28:49 +0900 Subject: [PATCH 105/143] Added intended audience description --- .../session/ui/SessionDetailFragment.kt | 1 + .../res/layout/fragment_session_detail.xml | 46 ++++++++++++++++++- .../src/main/res/values-ja/strings.xml | 1 + .../session/src/main/res/values/strings.xml | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 92befab06..460343fa4 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -112,6 +112,7 @@ class SessionDetailFragment : DaggerFragment() { session.timeInMinutes, session.room.name ) + binding.sessionIntendedAudienceDescription.text = session.intendedAudience binding.categoryChip.text = session.category.name.getByLang(systemStore.lang) session.message?.let { message -> diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index ab6c28a46..268c13176 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -171,6 +171,48 @@ tools:text="Material is the metaphor A material metaphor is the unifying theory of a rationalized space and a system of motion. The material is grounded in tactile reality, inspired by the study of paper and ink, yet technologically advanced and open to imagination and magic." /> + + + + + フィルター リセット 絞り込む + 対象者 アンケート 回答する 資料 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index dfbeb2206..a8ec64fc4 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ Room Language Category + Intended Audience Tags Survey Go to survey From 6f1a4d00dd9d52d121369be136f0c74f0d6cdabc Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 11:35:41 +0900 Subject: [PATCH 106/143] Renamed divider --- .../res/layout/fragment_session_detail.xml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_session_detail.xml b/feature/session/src/main/res/layout/fragment_session_detail.xml index 268c13176..fe330270b 100644 --- a/feature/session/src/main/res/layout/fragment_session_detail.xml +++ b/feature/session/src/main/res/layout/fragment_session_detail.xml @@ -138,7 +138,7 @@ /> @@ -302,7 +302,7 @@ @@ -343,7 +343,7 @@ /> From 37d0b36f534989ece9513e4191af27dbec81ea7f Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 12:09:05 +0900 Subject: [PATCH 107/143] delete suppress StringFormatMatches --- .../droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt index 181b8a172..46f4695de 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionDetailFragment.kt @@ -70,7 +70,6 @@ class SessionDetailFragment : DaggerFragment() { when (item.itemId) { R.id.session_share -> { val session = binding.session ?: return@setOnMenuItemClickListener false - @Suppress("StringFormatMatches") // FIXME activityActionCreator.shareUrl(getString( R.string.session_detail_share_url, session.id From 322811f729cc59136e2c33207553503ebd519b7b Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 12:09:30 +0900 Subject: [PATCH 108/143] add translatable --- feature/session/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 9cca4e8da..1919c1e97 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Resources Video Slides - https://droidkaigi.jp/2019/en/timetable/%s + https://droidkaigi.jp/2019/en/timetable/%s Session Share Place From ccfd98ffeea345ef34a2d7b9dffc9bf716027a0f Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 12:09:46 +0900 Subject: [PATCH 109/143] delete session_detail_share_url --- feature/session/src/main/res/values-ja/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e3389dc44..e27a963fd 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -8,7 +8,6 @@ 資料 動画 スライド - https://droidkaigi.jp/2019/timetable/%s 検索する… アンケートに回答する 同時通訳 From dcc1d6394229ebdffdfc8979d9c3f1d208891219 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 12:24:16 +0900 Subject: [PATCH 110/143] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 33729a86b..eac7420ad 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [DroidKaigi 2019](https://droidkaigi.jp/2019/en/) is a conference tailored for developers on 7th and 8th February 2019. You can download the binary built on master branch from [Try it on your device via DeployGate](https://dply.me/t6sc7f#install) - +NOTE: PlayProtect show the warning on some of devices when installing the current apk. The detailed specification of PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable PlayProtect from PlayStore's menus. Sorry for your inconvenience. # Features From 1abcaa920c2a32cd8a17489dbb8f68375f661d96 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 12:28:18 +0900 Subject: [PATCH 111/143] [ci skip] Addressed proofreading --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eac7420ad..669c8a8f1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [DroidKaigi 2019](https://droidkaigi.jp/2019/en/) is a conference tailored for developers on 7th and 8th February 2019. You can download the binary built on master branch from [Try it on your device via DeployGate](https://dply.me/t6sc7f#install) -NOTE: PlayProtect show the warning on some of devices when installing the current apk. The detailed specification of PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable PlayProtect from PlayStore's menus. Sorry for your inconvenience. +NOTE: PlayProtect will show a warning on some of devices when installing the current apk. The detailed specification of PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable PlayProtect from PlayStore's menus. Sorry for the inconvenience. # Features From ca3d2c0b64004fd1fca25c45f05325248fb9c53e Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 12:29:09 +0900 Subject: [PATCH 112/143] [ci skip] Use official name of Google products --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 669c8a8f1..eca9d5e60 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [DroidKaigi 2019](https://droidkaigi.jp/2019/en/) is a conference tailored for developers on 7th and 8th February 2019. You can download the binary built on master branch from [Try it on your device via DeployGate](https://dply.me/t6sc7f#install) -NOTE: PlayProtect will show a warning on some of devices when installing the current apk. The detailed specification of PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable PlayProtect from PlayStore's menus. Sorry for the inconvenience. +NOTE: Google PlayProtect will show a warning on some of devices when installing the current apk. The detailed specification of Google PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable Google PlayProtect from Google PlayStore's menus. Sorry for the inconvenience. # Features From bfc5fe1e6dc17f1ec6649001a3a0c6a08712f53f Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 12:30:45 +0900 Subject: [PATCH 113/143] [ci skip] Added spaces between Play and its product name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eca9d5e60..d0edc23c8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [DroidKaigi 2019](https://droidkaigi.jp/2019/en/) is a conference tailored for developers on 7th and 8th February 2019. You can download the binary built on master branch from [Try it on your device via DeployGate](https://dply.me/t6sc7f#install) -NOTE: Google PlayProtect will show a warning on some of devices when installing the current apk. The detailed specification of Google PlayProtect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable Google PlayProtect from Google PlayStore's menus. Sorry for the inconvenience. +NOTE: Google Play Protect will show a warning on some of devices when installing the current apk. The detailed specification of Google Play Protect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable Google Play Protect from Google Play Store's menus. Sorry for the inconvenience. # Features From 192d2cc646324d610e24d0eeea6d063b1b2aec7d Mon Sep 17 00:00:00 2001 From: h3birth Date: Thu, 10 Jan 2019 12:33:08 +0900 Subject: [PATCH 114/143] add session_detail_share_url in values-ja.xml again --- feature/session/src/main/res/values-ja/strings.xml | 1 + feature/session/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/session/src/main/res/values-ja/strings.xml b/feature/session/src/main/res/values-ja/strings.xml index e27a963fd..e3389dc44 100644 --- a/feature/session/src/main/res/values-ja/strings.xml +++ b/feature/session/src/main/res/values-ja/strings.xml @@ -8,6 +8,7 @@ 資料 動画 スライド + https://droidkaigi.jp/2019/timetable/%s 検索する… アンケートに回答する 同時通訳 diff --git a/feature/session/src/main/res/values/strings.xml b/feature/session/src/main/res/values/strings.xml index 1919c1e97..9cca4e8da 100644 --- a/feature/session/src/main/res/values/strings.xml +++ b/feature/session/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Resources Video Slides - https://droidkaigi.jp/2019/en/timetable/%s + https://droidkaigi.jp/2019/en/timetable/%s Session Share Place From 3bf947e947b4221bdfd99a4b598c93849590c419 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 12:44:24 +0900 Subject: [PATCH 115/143] Download dependencies even on vital_check --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e6e0bd764..bcef43d29 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -52,7 +52,7 @@ jobs: - run: *init_bash - restore_cache: &restore_gradle_cache keys: *all_keys_of_gradle_cache - - run: + - run: &download_all_dependencies name: Download Dependencies command: retry_command ./gradlew androidDependenciesExtra getDependencies - save_cache: &save_gradle_cache @@ -105,6 +105,8 @@ jobs: - checkout - run: *init_bash - restore_cache: *restore_gradle_cache + - run: *download_all_dependencies + - save_cache: *save_gradle_cache - run: ./gradlew testDebugUnitTest lintDebug ktlint --continue --offline - run: name: Merge junit report files From 03e4d93a2c95ede0a3bfe3ab6a7d622d3301b2ca Mon Sep 17 00:00:00 2001 From: Takao Chiba Date: Thu, 10 Jan 2019 13:13:58 +0900 Subject: [PATCH 116/143] Add navigation drawer footer --- .../res/drawable/bg_navigation_footer.xml | 17 +++++++ .../src/main/res/layout/activity_main.xml | 3 ++ .../res/layout/layout_navigation_footer.xml | 48 +++++++++++++++++++ .../src/main/res/menu/menu_nav_drawer.xml | 15 +++--- .../src/main/res/values-ja/strings.xml | 3 ++ .../android/src/main/res/values/strings.xml | 1 + 6 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 frontend/android/src/main/res/drawable/bg_navigation_footer.xml create mode 100644 frontend/android/src/main/res/layout/layout_navigation_footer.xml create mode 100644 frontend/android/src/main/res/values-ja/strings.xml diff --git a/frontend/android/src/main/res/drawable/bg_navigation_footer.xml b/frontend/android/src/main/res/drawable/bg_navigation_footer.xml new file mode 100644 index 000000000..8971a41ca --- /dev/null +++ b/frontend/android/src/main/res/drawable/bg_navigation_footer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/frontend/android/src/main/res/layout/activity_main.xml b/frontend/android/src/main/res/layout/activity_main.xml index f7672759d..07403b2ae 100644 --- a/frontend/android/src/main/res/layout/activity_main.xml +++ b/frontend/android/src/main/res/layout/activity_main.xml @@ -74,6 +74,9 @@ app:headerLayout="@layout/layout_navigation_header" app:menu="@menu/menu_nav_drawer" > + + + diff --git a/frontend/android/src/main/res/layout/layout_navigation_footer.xml b/frontend/android/src/main/res/layout/layout_navigation_footer.xml new file mode 100644 index 000000000..062183f3f --- /dev/null +++ b/frontend/android/src/main/res/layout/layout_navigation_footer.xml @@ -0,0 +1,48 @@ + + + + + + + diff --git a/frontend/android/src/main/res/menu/menu_nav_drawer.xml b/frontend/android/src/main/res/menu/menu_nav_drawer.xml index 56cfccac0..e2cd70792 100644 --- a/frontend/android/src/main/res/menu/menu_nav_drawer.xml +++ b/frontend/android/src/main/res/menu/menu_nav_drawer.xml @@ -45,15 +45,14 @@ android:icon="@drawable/ic_settings_outline_black_24px" android:title="@string/setting_label" /> - - + + diff --git a/frontend/android/src/main/res/values-ja/strings.xml b/frontend/android/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..525128fb3 --- /dev/null +++ b/frontend/android/src/main/res/values-ja/strings.xml @@ -0,0 +1,3 @@ + + 全体アンケートに\nご協力ください + diff --git a/frontend/android/src/main/res/values/strings.xml b/frontend/android/src/main/res/values/strings.xml index 2df81721d..589f26d07 100644 --- a/frontend/android/src/main/res/values/strings.xml +++ b/frontend/android/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ DroidKaigi 2019 logo image + Please fill out the entire survey From e6f9fb801ff9ab3befeee907f6914b2e08c1a19e Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 15:02:51 +0900 Subject: [PATCH 117/143] Added coroutine to dic.xml --- .idea/dictionaries/dic.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.idea/dictionaries/dic.xml b/.idea/dictionaries/dic.xml index dc0229ef3..194022d1d 100644 --- a/.idea/dictionaries/dic.xml +++ b/.idea/dictionaries/dic.xml @@ -3,6 +3,7 @@ circleci confsched + coroutine databinding deploygate droidkaigi @@ -16,4 +17,4 @@ stetho - + \ No newline at end of file From fc918d1f05af3a0124f07977f97dbb5ec7f85cb7 Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Thu, 10 Jan 2019 15:15:52 +0900 Subject: [PATCH 118/143] Tweaks --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d0edc23c8..2471a3d7b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ [DroidKaigi 2019](https://droidkaigi.jp/2019/en/) is a conference tailored for developers on 7th and 8th February 2019. You can download the binary built on master branch from [Try it on your device via DeployGate](https://dply.me/t6sc7f#install) -NOTE: Google Play Protect will show a warning on some of devices when installing the current apk. The detailed specification of Google Play Protect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable Google Play Protect from Google Play Store's menus. Sorry for the inconvenience. + +NOTE: Google Play Protect will show a warning dialog on some of devices when installing the current apk. The detailed specification of Google Play Protect is not public so we cannot address this matter. Please ignore the dialog for now. If you cannot install this apk without any error message, please disable Google Play Protect from Google Play Store's menus. Sorry for the inconvenience. # Features From f2a084cb9f06f0264ff0e60531e24c91fdad6b86 Mon Sep 17 00:00:00 2001 From: OldBigBuddha Date: Thu, 10 Jan 2019 08:07:09 +0200 Subject: [PATCH 119/143] Fix name (SpecialSession -> ServiceSession) --- .../session/ui/item/ServiceSessionItem.kt | 16 ++++++++-------- ...cial_session.xml => item_service_session.xml} | 0 .../confsched2019/model/FiltersTest.kt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) rename feature/session/src/main/res/layout/{item_special_session.xml => item_service_session.xml} (100%) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt index ed3839e6a..1e65d7585 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt @@ -3,29 +3,29 @@ package io.github.droidkaigi.confsched2019.session.ui.item import com.xwray.groupie.databinding.BindableItem import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.session.R -import io.github.droidkaigi.confsched2019.session.databinding.ItemSpecialSessionBinding +import io.github.droidkaigi.confsched2019.session.databinding.ItemServiceSessionBinding class ServiceSessionItem( override val session: Session.ServiceSession -) : BindableItem( +) : BindableItem( session.id.hashCode().toLong() ), SessionItem { - val specialSession get() = session + val serviceSession get() = session - override fun bind(viewBinding: ItemSpecialSessionBinding, position: Int) { + override fun bind(viewBinding: ItemServiceSessionBinding, position: Int) { with(viewBinding) { - session = specialSession + session = serviceSession @Suppress("StringFormatMatches") // FIXME timeAndRoom.text = root.context.getString( R.string.session_duration_room_format, - specialSession.timeInMinutes, - specialSession.room.name + serviceSession.timeInMinutes, + serviceSession.room.name ) } } - override fun getLayout(): Int = R.layout.item_special_session + override fun getLayout(): Int = R.layout.item_service_session override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/feature/session/src/main/res/layout/item_special_session.xml b/feature/session/src/main/res/layout/item_service_session.xml similarity index 100% rename from feature/session/src/main/res/layout/item_special_session.xml rename to feature/session/src/main/res/layout/item_service_session.xml diff --git a/model/src/jvmTest/kotlin/io/github/droidkaigi/confsched2019/model/FiltersTest.kt b/model/src/jvmTest/kotlin/io/github/droidkaigi/confsched2019/model/FiltersTest.kt index 907478803..cd833d95c 100644 --- a/model/src/jvmTest/kotlin/io/github/droidkaigi/confsched2019/model/FiltersTest.kt +++ b/model/src/jvmTest/kotlin/io/github/droidkaigi/confsched2019/model/FiltersTest.kt @@ -11,7 +11,7 @@ class FiltersTest { assertTrue { Filters().isPass(mockk()) } } - @Test fun isPass_WhenSpecialSession() { + @Test fun isPass_WhenServiceSession() { assertTrue { Filters().isPass(mockk()) } } From 3b7a44f1b90f04923865de6004a92d157ff2242a Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 16:25:11 +0900 Subject: [PATCH 120/143] Implemented tab anim --- .../session/ui/SessionPagesFragment.kt | 13 -------- .../res/drawable/shape_pill_indicator.xml | 26 +++++++++++++++ .../res/layout/fragment_session_pages.xml | 7 ++-- .../src/main/res/layout/layout_title_chip.xml | 32 ------------------- .../session/src/main/res/values/styles.xml | 4 +++ 5 files changed, 34 insertions(+), 48 deletions(-) create mode 100644 feature/session/src/main/res/drawable/shape_pill_indicator.xml delete mode 100644 feature/session/src/main/res/layout/layout_title_chip.xml diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt index 1c12b8b6e..1817cfeab 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SessionPagesFragment.kt @@ -12,7 +12,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.Lifecycle import androidx.viewpager.widget.ViewPager -import com.google.android.material.chip.Chip import dagger.Module import dagger.Provides import dagger.android.ContributesAndroidInjector @@ -110,18 +109,6 @@ class SessionPagesFragment : DaggerFragment() { } } ) - - (0 until binding.sessionsTabLayout.tabCount).forEach { - val view = layoutInflater.inflate( - R.layout.layout_title_chip, binding.sessionsTabLayout, false - ) as ViewGroup - val chip = view.getChildAt(0) as Chip - val tab = binding.sessionsTabLayout.getTabAt(it) - tab?.let { - chip.text = tab.text - tab.setCustomView(view) - } - } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/feature/session/src/main/res/drawable/shape_pill_indicator.xml b/feature/session/src/main/res/drawable/shape_pill_indicator.xml new file mode 100644 index 000000000..0a9124af2 --- /dev/null +++ b/feature/session/src/main/res/drawable/shape_pill_indicator.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/feature/session/src/main/res/layout/fragment_session_pages.xml b/feature/session/src/main/res/layout/fragment_session_pages.xml index 15b0ea0db..b9c590834 100644 --- a/feature/session/src/main/res/layout/fragment_session_pages.xml +++ b/feature/session/src/main/res/layout/fragment_session_pages.xml @@ -16,13 +16,14 @@ style="@style/Widget.MaterialComponents.TabLayout.Colored" android:layout_width="0dp" android:layout_height="wrap_content" - android:background="?colorPrimary" android:tabStripEnabled="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tabIndicatorColor="@android:color/transparent" - app:tabRippleColor="@null" + app:tabIndicator="@drawable/shape_pill_indicator" + app:tabIndicatorGravity="stretch" + app:tabTextAppearance="@style/TabTextAppearance" + app:tabTextColor="@color/white" /> - - - - diff --git a/feature/session/src/main/res/values/styles.xml b/feature/session/src/main/res/values/styles.xml index f581f7d34..5b487825f 100644 --- a/feature/session/src/main/res/values/styles.xml +++ b/feature/session/src/main/res/values/styles.xml @@ -4,4 +4,8 @@ + + + From 25a2367214fa8840e96eaa21ee67ff41d26f3c9c Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 16:29:28 +0900 Subject: [PATCH 121/143] Removed not need code --- feature/session/src/main/res/drawable/shape_pill_indicator.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/res/drawable/shape_pill_indicator.xml b/feature/session/src/main/res/drawable/shape_pill_indicator.xml index 0a9124af2..c506c2fa6 100644 --- a/feature/session/src/main/res/drawable/shape_pill_indicator.xml +++ b/feature/session/src/main/res/drawable/shape_pill_indicator.xml @@ -1,7 +1,6 @@ - Date: Thu, 10 Jan 2019 16:57:52 +0900 Subject: [PATCH 122/143] Fixed tab button text --- feature/session/src/main/res/values/styles.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/session/src/main/res/values/styles.xml b/feature/session/src/main/res/values/styles.xml index 5b487825f..e6aef88f8 100644 --- a/feature/session/src/main/res/values/styles.xml +++ b/feature/session/src/main/res/values/styles.xml @@ -5,7 +5,9 @@ 8dp - - From 250c2a1b901cc96e9fe82f1dac07be38c8acca96 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 17:10:07 +0900 Subject: [PATCH 123/143] Removed unused file --- feature/session/src/main/res/color/selector_tab_title.xml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 feature/session/src/main/res/color/selector_tab_title.xml diff --git a/feature/session/src/main/res/color/selector_tab_title.xml b/feature/session/src/main/res/color/selector_tab_title.xml deleted file mode 100644 index b9e75233c..000000000 --- a/feature/session/src/main/res/color/selector_tab_title.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From 483af06f32e80dba020bb5def785ec63f3fa2411 Mon Sep 17 00:00:00 2001 From: NUmeroAndDev Date: Thu, 10 Jan 2019 17:51:07 +0900 Subject: [PATCH 124/143] Fixed tab height --- .../session/src/main/res/layout/fragment_session_pages.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/feature/session/src/main/res/layout/fragment_session_pages.xml b/feature/session/src/main/res/layout/fragment_session_pages.xml index b9c590834..6d80fa441 100644 --- a/feature/session/src/main/res/layout/fragment_session_pages.xml +++ b/feature/session/src/main/res/layout/fragment_session_pages.xml @@ -8,6 +8,7 @@ @@ -15,7 +16,7 @@ android:id="@+id/sessions_tab_layout" style="@style/Widget.MaterialComponents.TabLayout.Colored" android:layout_width="0dp" - android:layout_height="wrap_content" + android:layout_height="40dp" android:tabStripEnabled="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -30,6 +31,7 @@ android:id="@+id/sessions_viewpager" android:layout_width="0dp" android:layout_height="0dp" + android:layout_marginTop="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From 4a5a17c98a2a8e6e3554304b4bd740aaef8b6eaa Mon Sep 17 00:00:00 2001 From: kikuchy Date: Thu, 10 Jan 2019 18:11:36 +0900 Subject: [PATCH 125/143] Fix dependency of build target --- data/api-impl/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/api-impl/build.gradle b/data/api-impl/build.gradle index 9bcfd76ea..e03197db0 100644 --- a/data/api-impl/build.gradle +++ b/data/api-impl/build.gradle @@ -43,7 +43,7 @@ kotlin { } } androidTest { - dependsOn commonMain + dependsOn androidMain dependencies { implementation Dep.Test.junit implementation Dep.Test.slf4j From 3dfaff0be0f121f65a9f07bd4ba2adfdcae6e7bf Mon Sep 17 00:00:00 2001 From: tarumzu Date: Thu, 10 Jan 2019 19:52:29 +0900 Subject: [PATCH 126/143] fix version conflict at clean build --- buildSrc/src/main/java/dependencies/Dep.kt | 1 + frontend/android/build.gradle | 2 ++ 2 files changed, 3 insertions(+) diff --git a/buildSrc/src/main/java/dependencies/Dep.kt b/buildSrc/src/main/java/dependencies/Dep.kt index 3251a7db6..fdf9a702b 100644 --- a/buildSrc/src/main/java/dependencies/Dep.kt +++ b/buildSrc/src/main/java/dependencies/Dep.kt @@ -115,6 +115,7 @@ object Dep { val version = "3.11.0" val client = "com.squareup.okhttp3:okhttp:$version" val loggingInterceptor = "com.squareup.okhttp3:logging-interceptor:$version" + val okio = "com.squareup.okio:okio:1.14.0" } val liveDataKtx = "com.shopify:livedata-ktx:2.0.1" diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index f281d46e9..3b2b29953 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -77,6 +77,8 @@ dependencies { implementation Dep.Kotlin.stdlibJvm api Dep.Kotlin.coroutines + implementation Dep.Kotlin.androidCoroutinesDispatcher + implementation Dep.OkHttp.okio implementation Dep.Firebase.fireStore From 49e58360076432e53ecdbe3c73ea12f9a77e780c Mon Sep 17 00:00:00 2001 From: Takafumi Kanda Date: Thu, 10 Jan 2019 17:09:19 +0530 Subject: [PATCH 127/143] Improve code details of SessionsItemDecoration based on review --- .../session/ui/widget/SessionsItemDecoration.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt index 89a6fec0b..ba64adce8 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/widget/SessionsItemDecoration.kt @@ -32,6 +32,8 @@ class SessionsItemDecoration( private val textPaddingBottom = resources.getDimensionPixelSize( R.dimen.session_bottom_sheet_left_time_text_padding_bottom ) + // Keep SparseArray instance on property to avoid object creation in every onDrawOver() + private val adapterPositionToViews = SparseArray() val paint = Paint().apply { style = Paint.Style.FILL @@ -45,21 +47,18 @@ class SessionsItemDecoration( } } - // Keep SparseArray instance on property to avoid object creation in every onDrawOver() - private val positionToViews = SparseArray() - override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { // Sort child views by adapter position for (i in 0 until parent.childCount) { val view = parent.getChildAt(i) val position = parent.getChildAdapterPosition(view) - if (position != -1 && position < groupAdapter.itemCount) { - positionToViews.put(position, view) + if (position != RecyclerView.NO_POSITION && position < groupAdapter.itemCount) { + adapterPositionToViews.put(position, view) } } var lastTime: String? = null - positionToViews.forEach { position, view -> + adapterPositionToViews.forEach { position, view -> val time = getSessionTime(position) ?: return@forEach if (lastTime == time) return@forEach @@ -80,7 +79,7 @@ class SessionsItemDecoration( ) } - positionToViews.clear() + adapterPositionToViews.clear() } private fun getSessionTime(position: Int): String? { From b3bba7bca48560c534fc264fa27c9962a857cb55 Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Thu, 10 Jan 2019 21:22:24 +0900 Subject: [PATCH 128/143] Remove a redundant visibleGone --- .../src/main/res/layout/fragment_bottom_sheet_sessions.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index a1328e293..ebf84c339 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -112,7 +112,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/sessions_bottom_sheet_title" - app:visibleGone="@{!shouldShowEmptyStateView}" /> Date: Thu, 10 Jan 2019 21:44:52 +0900 Subject: [PATCH 129/143] Increase the SNS icon size 24dp -> 36dp --- ...{ic_github_black_24dp.xml => ic_github_black_36dp.xml} | 4 ++-- .../drawable/{ic_medium_24dp.xml => ic_medium_36dp.xml} | 4 ++-- ...{ic_twitter_blue_24dp.xml => ic_twitter_blue_36dp.xml} | 4 ++-- .../drawable/{ic_youtube_24dp.xml => ic_youtube_36dp.xml} | 4 ++-- feature/about/src/main/res/layout/header_about.xml | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) rename feature/about/src/main/res/drawable/{ic_github_black_24dp.xml => ic_github_black_36dp.xml} (95%) rename feature/about/src/main/res/drawable/{ic_medium_24dp.xml => ic_medium_36dp.xml} (93%) rename feature/about/src/main/res/drawable/{ic_twitter_blue_24dp.xml => ic_twitter_blue_36dp.xml} (93%) rename feature/about/src/main/res/drawable/{ic_youtube_24dp.xml => ic_youtube_36dp.xml} (92%) diff --git a/feature/about/src/main/res/drawable/ic_github_black_24dp.xml b/feature/about/src/main/res/drawable/ic_github_black_36dp.xml similarity index 95% rename from feature/about/src/main/res/drawable/ic_github_black_24dp.xml rename to feature/about/src/main/res/drawable/ic_github_black_36dp.xml index 505243e1f..30fed3ee6 100644 --- a/feature/about/src/main/res/drawable/ic_github_black_24dp.xml +++ b/feature/about/src/main/res/drawable/ic_github_black_36dp.xml @@ -1,6 +1,6 @@ Date: Thu, 10 Jan 2019 22:03:50 +0900 Subject: [PATCH 130/143] Fixed tab on landscape --- feature/session/src/main/res/layout/fragment_session_pages.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/session/src/main/res/layout/fragment_session_pages.xml b/feature/session/src/main/res/layout/fragment_session_pages.xml index 6d80fa441..0f048acef 100644 --- a/feature/session/src/main/res/layout/fragment_session_pages.xml +++ b/feature/session/src/main/res/layout/fragment_session_pages.xml @@ -21,6 +21,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + app:tabGravity="fill" app:tabIndicator="@drawable/shape_pill_indicator" app:tabIndicatorGravity="stretch" app:tabTextAppearance="@style/TabTextAppearance" From acba2c6f87c1de81682660f98d1575bcc61c0e6a Mon Sep 17 00:00:00 2001 From: noboru-i Date: Thu, 10 Jan 2019 22:40:39 +0900 Subject: [PATCH 131/143] remove unused architecture.png --- architecture.png | Bin 43582 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 architecture.png diff --git a/architecture.png b/architecture.png deleted file mode 100644 index 78b6fd232c4a3e549d59d5d43c534cb157748bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43582 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 Date: Thu, 10 Jan 2019 23:47:40 +0900 Subject: [PATCH 132/143] Display favorite buttons with codelabs and change so that they can be favorite --- .../data/firestore/FirestoreImpl.kt | 4 +-- .../confsched2019/data/firestore/FireStore.kt | 2 +- .../data/repository/DataSessionRepository.kt | 2 +- .../data/repository/mapper/SessionMappers.kt | 7 +++-- .../data/repository/SessionRepository.kt | 2 +- .../ui/BottomSheetDaySessionsFragment.kt | 3 +- .../ui/BottomSheetFavoriteSessionsFragment.kt | 28 +++++++++++++------ .../session/ui/SearchFragment.kt | 3 +- .../SessionContentsActionCreator.kt | 2 +- .../session/ui/item/ServiceSessionItem.kt | 22 +++++++++++++-- .../session/ui/store/SessionPagesStore.kt | 4 +-- .../main/res/layout/item_service_session.xml | 20 ++++++++++++- model/src/commonMain/kotlin/Session.kt | 12 ++++---- 13 files changed, 81 insertions(+), 30 deletions(-) diff --git a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt index 5a17a8fff..17a6163ba 100644 --- a/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt +++ b/data/firestore-impl/src/main/java/io/github/droidkaigi/confsched2019/data/firestore/FirestoreImpl.kt @@ -15,7 +15,7 @@ import javax.inject.Inject class FirestoreImpl @Inject constructor() : Firestore { - override suspend fun getFavoriteSessionIds(): List { + override suspend fun getFavoriteSessionIds(): List { if (FirebaseAuth.getInstance().currentUser?.uid == null) return listOf() val favoritesRef = getFavoritesRef() val snapshot = favoritesRef @@ -25,7 +25,7 @@ class FirestoreImpl @Inject constructor() : Firestore { } val favorites = favoritesRef.whereEqualTo("favorite", true).fastGet() - return favorites.documents.mapNotNull { it.id.toIntOrNull() } + return favorites.documents.mapNotNull { it.id } } override suspend fun toggleFavorite(sessionId: String) { diff --git a/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt b/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt index 7c1de79d8..62d1cd2fb 100644 --- a/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt +++ b/data/firestore/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/firestore/FireStore.kt @@ -3,7 +3,7 @@ package io.github.droidkaigi.confsched2019.data.firestore import io.github.droidkaigi.confsched2019.model.Announcement interface Firestore { - suspend fun getFavoriteSessionIds(): List + suspend fun getFavoriteSessionIds(): List suspend fun toggleFavorite(sessionId: String) suspend fun getAnnouncements(): List } diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt index d8412db70..bd666e579 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/DataSessionRepository.kt @@ -55,7 +55,7 @@ class DataSessionRepository @Inject constructor( )) } - override suspend fun toggleFavorite(session: Session.SpeechSession) { + override suspend fun toggleFavorite(session: Session) { firestore.toggleFavorite(session.id) } diff --git a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt index 48260a7cf..cb4081f11 100644 --- a/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt +++ b/data/repository-impl/src/main/java/io/github/droidkaigi/confsched2019/data/repository/mapper/SessionMappers.kt @@ -12,7 +12,7 @@ import io.github.droidkaigi.confsched2019.model.LocaledString fun SessionWithSpeakers.toSession( speakerEntities: List, - favList: List?, + favList: List?, firstDay: DateTime ): Session { return if (session.isServiceSession) { @@ -27,7 +27,8 @@ fun SessionWithSpeakers.toSession( room = requireNotNull(session.room).let { room -> Room(room.id, room.name) }, - sessionType = SessionType.of(session.sessionType) + sessionType = SessionType.of(session.sessionType), + isFavorited = favList!!.contains(session.id) ) } else { require(speakerIdList.isNotEmpty()) @@ -66,7 +67,7 @@ fun SessionWithSpeakers.toSession( videoUrl = session.videoUrl, slideUrl = session.slideUrl, isInterpretationTarget = session.isInterpretationTarget, - isFavorited = favList!!.map { it.toString() }.contains(session.id), + isFavorited = favList!!.contains(session.id), speakers = speakers, message = session.message?.let { LocaledString(it.ja, it.en) diff --git a/data/repository/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/repository/SessionRepository.kt b/data/repository/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/repository/SessionRepository.kt index e42ef532d..bd320259d 100644 --- a/data/repository/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/repository/SessionRepository.kt +++ b/data/repository/src/commonMain/kotlin/io/github/droidkaigi/confsched2019/data/repository/SessionRepository.kt @@ -7,7 +7,7 @@ import io.github.droidkaigi.confsched2019.model.SessionFeedback interface SessionRepository { suspend fun sessionContents(): SessionContents suspend fun refresh() - suspend fun toggleFavorite(session: Session.SpeechSession) + suspend fun toggleFavorite(session: Session) suspend fun submitSessionFeedback( session: Session.SpeechSession, sessionFeedback: SessionFeedback diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt index bc72d2c0c..8ac151468 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetDaySessionsFragment.kt @@ -40,6 +40,7 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { @Inject lateinit var sessionPageFragmentProvider: Provider @Inject lateinit var speechSessionItemFactory: SpeechSessionItem.Factory @Inject lateinit var sessionPageStoreFactory: SessionPageStore.Factory + @Inject lateinit var serviceSessionItemFactory: ServiceSessionItem.Factory private val sessionPageStore: SessionPageStore by lazy { sessionPageFragmentProvider.get().injectedViewModelProvider .get(SessionPageStore::class.java.name) { @@ -93,7 +94,7 @@ class BottomSheetDaySessionsFragment : DaggerFragment() { true ) is Session.ServiceSession -> - ServiceSessionItem(session) + serviceSessionItemFactory.create(session) } } groupAdapter.update(items) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index 330250dc5..2350fc7a9 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -12,15 +12,19 @@ import androidx.recyclerview.widget.RecyclerView import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.xwray.groupie.GroupAdapter +import com.xwray.groupie.Item import com.xwray.groupie.databinding.ViewHolder import dagger.Module import dagger.Provides import io.github.droidkaigi.confsched2019.ext.android.changed +import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.model.SessionPage import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.session.databinding.FragmentBottomSheetSessionsBinding import io.github.droidkaigi.confsched2019.session.ui.actioncreator.SessionContentsActionCreator import io.github.droidkaigi.confsched2019.session.ui.actioncreator.SessionPageActionCreator +import io.github.droidkaigi.confsched2019.session.ui.item.ServiceSessionItem +import io.github.droidkaigi.confsched2019.session.ui.item.SessionItem import io.github.droidkaigi.confsched2019.session.ui.item.SpeechSessionItem import io.github.droidkaigi.confsched2019.session.ui.store.SessionContentsStore import io.github.droidkaigi.confsched2019.session.ui.store.SessionPageStore @@ -41,6 +45,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { @Inject lateinit var sessionPageActionCreator: SessionPageActionCreator @Inject lateinit var sessionPageFragmentProvider: Provider @Inject lateinit var speechSessionItemFactory: SpeechSessionItem.Factory + @Inject lateinit var serviceSessionItemFactory: ServiceSessionItem.Factory @Inject lateinit var sessionDetailStoreFactory: SessionPageStore.Factory private val sessionPageStore: SessionPageStore by lazy { @@ -89,14 +94,19 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { sessionPagesStore.filteredFavoritedSessions().changed(viewLifecycleOwner) { sessions -> val items = sessions - .map { session -> - speechSessionItemFactory.create( - session, - SessionPagesFragmentDirections.actionSessionToSessionDetail( - session.id - ), - true - ) + .map> { session -> + when (session) { + is Session.SpeechSession -> + speechSessionItemFactory.create( + session, + SearchFragmentDirections.actionSearchToSessionDetail( + session.id + ), + false + ) + is Session.ServiceSession -> + serviceSessionItemFactory.create(session) + } } groupAdapter.update(items) @@ -128,7 +138,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { return } binding.sessionsBottomSheetTitle.text = (groupAdapter - .getItem(firstPosition) as SpeechSessionItem) + .getItem(firstPosition) as SessionItem) .session .startDayText } diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt index 09ff49e46..91bad4ba3 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/SearchFragment.kt @@ -39,6 +39,7 @@ class SearchFragment : DaggerFragment() { @Inject lateinit var searchActionCreator: SearchActionCreator @Inject lateinit var speechSessionItemFactory: SpeechSessionItem.Factory + @Inject lateinit var serviceSessionItemFactory: ServiceSessionItem.Factory @Inject lateinit var sessionContentsStore: SessionContentsStore private var searchView: SearchView? = null @Inject lateinit var searchStoreProvider: Provider @@ -95,7 +96,7 @@ class SearchFragment : DaggerFragment() { false ) is Session.ServiceSession -> - ServiceSessionItem(session) + serviceSessionItemFactory.create(session) } } groupAdapter.update(items) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt index cc31bd5bd..e7b2d0d71 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/actioncreator/SessionContentsActionCreator.kt @@ -61,7 +61,7 @@ class SessionContentsActionCreator @Inject constructor( } } - fun toggleFavorite(session: Session.SpeechSession) { + fun toggleFavorite(session: Session) { launch { try { dispatcher.dispatchLoadingState(LoadingState.LOADING) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt index 1e65d7585..059080479 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/item/ServiceSessionItem.kt @@ -1,17 +1,32 @@ package io.github.droidkaigi.confsched2019.session.ui.item +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.xwray.groupie.databinding.BindableItem import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.session.R import io.github.droidkaigi.confsched2019.session.databinding.ItemServiceSessionBinding +import io.github.droidkaigi.confsched2019.session.ui.actioncreator.SessionContentsActionCreator -class ServiceSessionItem( - override val session: Session.ServiceSession +class ServiceSessionItem @AssistedInject constructor( + @Assisted override val session: Session.ServiceSession, + sessionContentsActionCreator: SessionContentsActionCreator ) : BindableItem( session.id.hashCode().toLong() ), SessionItem { val serviceSession get() = session + @AssistedInject.Factory + interface Factory { + fun create( + session: Session.ServiceSession + ): ServiceSessionItem + } + + private val onFavoriteClickListener: (Session.ServiceSession) -> Unit = { session -> + sessionContentsActionCreator.toggleFavorite(session) + } + override fun bind(viewBinding: ItemServiceSessionBinding, position: Int) { with(viewBinding) { session = serviceSession @@ -22,6 +37,9 @@ class ServiceSessionItem( serviceSession.timeInMinutes, serviceSession.room.name ) + favorite.setOnClickListener { + onFavoriteClickListener(serviceSession) + } } } diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionPagesStore.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionPagesStore.kt index 6969acea7..258cf81e3 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionPagesStore.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionPagesStore.kt @@ -94,10 +94,10 @@ class SessionPagesStore @Inject constructor( } } - fun filteredFavoritedSessions(): LiveData> { + fun filteredFavoritedSessions(): LiveData> { return filteredSessions .map { sessions -> - sessions.orEmpty().filterIsInstance() + sessions.orEmpty() .filter { session -> session.isFavorited } } } diff --git a/feature/session/src/main/res/layout/item_service_session.xml b/feature/session/src/main/res/layout/item_service_session.xml index fa5120e1a..19c0725fe 100644 --- a/feature/session/src/main/res/layout/item_service_session.xml +++ b/feature/session/src/main/res/layout/item_service_session.xml @@ -7,6 +7,10 @@ + + + + + + , val message: LocaledString? - ) : Session(id, dayNumber, startTime, endTime, room) { + ) : Session(id, dayNumber, startTime, endTime, room, isFavorited) { val hasVideo: Boolean = videoUrl.isNullOrEmpty().not() val hasSlide: Boolean = slideUrl.isNullOrEmpty().not() } @@ -40,8 +41,9 @@ sealed class Session( override val endTime: DateTime, val title: String, override val room: Room, - val sessionType: SessionType - ) : Session(id, dayNumber, startTime, endTime, room) + val sessionType: SessionType, + override val isFavorited: Boolean = true + ) : Session(id, dayNumber, startTime, endTime, room, isFavorited) val startDayText by lazy { startTime.format("yyyy.M.d") } From 23eacfd2a4db8e5a295baaf73aec1e456e305d10 Mon Sep 17 00:00:00 2001 From: kirimin Date: Fri, 11 Jan 2019 00:10:29 +0900 Subject: [PATCH 133/143] Fixed text padding params on favorites --- .../session/ui/BottomSheetFavoriteSessionsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index 2350fc7a9..51395ee87 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -102,7 +102,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { SearchFragmentDirections.actionSearchToSessionDetail( session.id ), - false + true ) is Session.ServiceSession -> serviceSessionItemFactory.create(session) From 24babdb6ea261de9b0f1e3cb532c77e165794d55 Mon Sep 17 00:00:00 2001 From: Kazumasa KUMAMOTO Date: Fri, 11 Jan 2019 00:16:44 +0900 Subject: [PATCH 134/143] Set visibility on individual buttons --- .../src/main/res/layout/fragment_bottom_sheet_sessions.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml index ebf84c339..765c4fb50 100644 --- a/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml +++ b/feature/session/src/main/res/layout/fragment_bottom_sheet_sessions.xml @@ -45,8 +45,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:constraint_referenced_ids="sessions_bottom_sheet_title, - sessions_bottom_sheet_show_filter_button, - sessions_bottom_sheet_hide_filter_button, sessions_recycler" app:visibleGone="@{!shouldShowEmptyStateView}" /> @@ -78,7 +76,7 @@ app:chipIconTint="@color/gray3" app:layout_constraintBaseline_toBaselineOf="@id/sessions_bottom_sheet_title" app:layout_constraintEnd_toEndOf="parent" - app:visibleGone="@{!isCollapsed}" + app:visibleGone="@{!isCollapsed && !shouldShowEmptyStateView}" /> Date: Fri, 11 Jan 2019 00:30:23 +0900 Subject: [PATCH 135/143] fix time format to 24-hour clock --- model/src/commonMain/kotlin/Session.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/src/commonMain/kotlin/Session.kt b/model/src/commonMain/kotlin/Session.kt index 89e7a86cf..e8cd990ae 100644 --- a/model/src/commonMain/kotlin/Session.kt +++ b/model/src/commonMain/kotlin/Session.kt @@ -58,9 +58,9 @@ sealed class Session( append("日") } append(" ") - append(startTime.format("hh:mm")) + append(startTime.format("HH:mm")) append(" - ") - append(endTime.format("hh:mm")) + append(endTime.format("HH:mm")) } fun summary(lang: Lang) = buildString { From 5aae7622225f7ecffa64463e94633ba72162ad7f Mon Sep 17 00:00:00 2001 From: kirimin Date: Fri, 11 Jan 2019 00:33:04 +0900 Subject: [PATCH 136/143] Fixed using wrong FragmentDirections. --- .../session/ui/BottomSheetFavoriteSessionsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt index 51395ee87..f80fa574b 100644 --- a/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt +++ b/feature/session/src/main/java/io/github/droidkaigi/confsched2019/session/ui/BottomSheetFavoriteSessionsFragment.kt @@ -99,7 +99,7 @@ class BottomSheetFavoriteSessionsFragment : DaggerFragment() { is Session.SpeechSession -> speechSessionItemFactory.create( session, - SearchFragmentDirections.actionSearchToSessionDetail( + SessionPagesFragmentDirections.actionSessionToSessionDetail( session.id ), true From 04f55f1ce98265b8bed975b62f223c92fdc7b3d0 Mon Sep 17 00:00:00 2001 From: kudo Date: Fri, 11 Jan 2019 01:05:08 +0900 Subject: [PATCH 137/143] rename ic_settings_outline_black_24px to ic_settings_outline_black_24dp --- ...utline_black_24px.xml => ic_settings_outline_black_24dp.xml} | 0 frontend/android/src/main/res/menu/menu_nav_drawer.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename frontend/android/src/main/res/drawable/{ic_settings_outline_black_24px.xml => ic_settings_outline_black_24dp.xml} (100%) diff --git a/frontend/android/src/main/res/drawable/ic_settings_outline_black_24px.xml b/frontend/android/src/main/res/drawable/ic_settings_outline_black_24dp.xml similarity index 100% rename from frontend/android/src/main/res/drawable/ic_settings_outline_black_24px.xml rename to frontend/android/src/main/res/drawable/ic_settings_outline_black_24dp.xml diff --git a/frontend/android/src/main/res/menu/menu_nav_drawer.xml b/frontend/android/src/main/res/menu/menu_nav_drawer.xml index e2cd70792..80acd0410 100644 --- a/frontend/android/src/main/res/menu/menu_nav_drawer.xml +++ b/frontend/android/src/main/res/menu/menu_nav_drawer.xml @@ -42,7 +42,7 @@ /> From 6eb7d7e5f2c5b947da9810680b847491ab0aeac4 Mon Sep 17 00:00:00 2001 From: kirimin Date: Fri, 11 Jan 2019 01:18:22 +0900 Subject: [PATCH 138/143] Removed unused default value. --- model/src/commonMain/kotlin/Session.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/src/commonMain/kotlin/Session.kt b/model/src/commonMain/kotlin/Session.kt index b23fbafa0..38f4864f0 100644 --- a/model/src/commonMain/kotlin/Session.kt +++ b/model/src/commonMain/kotlin/Session.kt @@ -42,7 +42,7 @@ sealed class Session( val title: String, override val room: Room, val sessionType: SessionType, - override val isFavorited: Boolean = true + override val isFavorited: Boolean ) : Session(id, dayNumber, startTime, endTime, room, isFavorited) val startDayText by lazy { startTime.format("yyyy.M.d") } From d80f98f96de216678b9b488c38fd9a0bf9484c38 Mon Sep 17 00:00:00 2001 From: Takayuki Matsubara Date: Fri, 11 Jan 2019 01:18:25 +0900 Subject: [PATCH 139/143] avoid to use Maven Central mirror when building on the CI server - add `isCi` as an extra property for DRYing up code --- build.gradle | 9 ++++++--- frontend/android/build.gradle | 4 ++-- frontendcomponent/androidcomponent/build.gradle | 2 +- frontendcomponent/androidtestcomponent/build.gradle | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 6fdc361ad..f1db0cb85 100644 --- a/build.gradle +++ b/build.gradle @@ -5,9 +5,12 @@ import dependencies.Dep apply from: file('gradle/dependencyGraph.gradle') buildscript { + ext { + isCi = System.getenv("CI") == "true" + } repositories { google() - maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } + if (!isCi) { maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } } jcenter() maven { url "https://kotlin.bintray.com/kotlinx" } maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } @@ -29,7 +32,7 @@ buildscript { allprojects { repositories { google() - maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } + if (!isCi) { maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } } jcenter() maven { url "https://kotlin.bintray.com/kotlinx" } maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } @@ -59,7 +62,7 @@ allprojects { task ktlint(type: JavaExec, group: "verification") { def parameters = ["--android", '--editorconfig', "${rootProject.projectDir}/.editorconfig", "--reporter=checkstyle,output=${buildDir}/ktlint/checkstyle.xml"] - if (System.getenv("CI") != "true") { + if (!isCi) { parameters += "--reporter=html,artifact=me.cassiano:ktlint-html-reporter:0.2.0,output=${buildDir}/ktlint/checkstyle.html" } diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle index bc655515f..fa4446dd2 100644 --- a/frontend/android/build.gradle +++ b/frontend/android/build.gradle @@ -41,8 +41,8 @@ android { lintOptions { lintConfig file("${project.projectDir}/lint.xml") - xmlReport System.getenv("CI") == "true" - htmlReport System.getenv("CI") != "true" + xmlReport isCi + htmlReport !isCi xmlOutput file("lint-results.xml") htmlOutput file("lint-results.html") diff --git a/frontendcomponent/androidcomponent/build.gradle b/frontendcomponent/androidcomponent/build.gradle index e4d1da83e..945a00a07 100644 --- a/frontendcomponent/androidcomponent/build.gradle +++ b/frontendcomponent/androidcomponent/build.gradle @@ -32,7 +32,7 @@ dependencies { androidTestImplementation Dep.Test.espressoCore } repositories { - maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } + if (!isCi) { maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } } mavenCentral() } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { diff --git a/frontendcomponent/androidtestcomponent/build.gradle b/frontendcomponent/androidtestcomponent/build.gradle index bd11b22d0..b905a6bd3 100644 --- a/frontendcomponent/androidtestcomponent/build.gradle +++ b/frontendcomponent/androidtestcomponent/build.gradle @@ -23,7 +23,7 @@ dependencies { } } repositories { - maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } + if (!isCi) { maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" } } mavenCentral() } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { From 9c2a83f228a7f9b0e019b182061ed9324ccfde7d Mon Sep 17 00:00:00 2001 From: kirimin Date: Fri, 11 Jan 2019 01:20:19 +0900 Subject: [PATCH 140/143] Added isFavoritable parameter to SessionType and use it. --- .../main/res/layout/item_service_session.xml | 2 +- model/src/commonMain/kotlin/SessionType.kt | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/feature/session/src/main/res/layout/item_service_session.xml b/feature/session/src/main/res/layout/item_service_session.xml index 19c0725fe..2e1e77776 100644 --- a/feature/session/src/main/res/layout/item_service_session.xml +++ b/feature/session/src/main/res/layout/item_service_session.xml @@ -73,7 +73,7 @@ android:scaleType="centerInside" android:src="@{session.isFavorited ? @drawable/ic_bookmark_black_24dp : @drawable/ic_bookmark_border_black_24dp}" android:tint="@{session.isFavorited ? @color/colorPrimary : @color/gray1}" - android:visibility="@{session.sessionType == SessionType.Codelabs ? View.VISIBLE : View.GONE}" + android:visibility="@{session.sessionType.isFavoritable ? View.VISIBLE : View.GONE}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/title" /> diff --git a/model/src/commonMain/kotlin/SessionType.kt b/model/src/commonMain/kotlin/SessionType.kt index 89bd3c741..e59fbebb9 100644 --- a/model/src/commonMain/kotlin/SessionType.kt +++ b/model/src/commonMain/kotlin/SessionType.kt @@ -1,15 +1,15 @@ package io.github.droidkaigi.confsched2019.model -enum class SessionType(val id: String) { - Normal("normal"), - WelcomeTalk("welcome_talk"), - Reserved("reserved"), - Codelabs("codelabs"), - FiresideChat("fireside_chat"), - Lunch("lunch"), - Break("break"), - AfterParty("after_party"), - Unknown("unknown"); +enum class SessionType(val id: String, val isFavoritable: Boolean) { + Normal("normal", false), + WelcomeTalk("welcome_talk", false), + Reserved("reserved", false), + Codelabs("codelabs", true), + FiresideChat("fireside_chat", false), + Lunch("lunch", false), + Break("break", false), + AfterParty("after_party", false), + Unknown("unknown", false); companion object { fun of(id: String?) = values().find { it.id == id } ?: Unknown From c30db350e94e9dcbcb714f27aa5da43d66ea0b9e Mon Sep 17 00:00:00 2001 From: kirimin Date: Fri, 11 Jan 2019 01:28:07 +0900 Subject: [PATCH 141/143] Using app:visibleGone. --- feature/session/src/main/res/layout/item_service_session.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/session/src/main/res/layout/item_service_session.xml b/feature/session/src/main/res/layout/item_service_session.xml index 2e1e77776..2544aa856 100644 --- a/feature/session/src/main/res/layout/item_service_session.xml +++ b/feature/session/src/main/res/layout/item_service_session.xml @@ -73,7 +73,7 @@ android:scaleType="centerInside" android:src="@{session.isFavorited ? @drawable/ic_bookmark_black_24dp : @drawable/ic_bookmark_border_black_24dp}" android:tint="@{session.isFavorited ? @color/colorPrimary : @color/gray1}" - android:visibility="@{session.sessionType.isFavoritable ? View.VISIBLE : View.GONE}" + app:visibleGone="@{session.sessionType.isFavoritable}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/title" /> From 96c2c64eddce4227ad9060b5fdd49b5337e6790e Mon Sep 17 00:00:00 2001 From: Jumpei Matsuda Date: Fri, 11 Jan 2019 01:28:12 +0900 Subject: [PATCH 142/143] Added scripts to fetch repos for oss --- scripts/checkout_pr_branch | 41 +++++++++++++++++++++++++++++++++ scripts/fetch_droidkaigi_master | 22 ++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100755 scripts/checkout_pr_branch create mode 100755 scripts/fetch_droidkaigi_master diff --git a/scripts/checkout_pr_branch b/scripts/checkout_pr_branch new file mode 100755 index 000000000..8be069b2b --- /dev/null +++ b/scripts/checkout_pr_branch @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -eu +set -o pipefail + +user_name="${CIRCLE_PROJECT_USERNAME:-DroidKaigi}" +repo_name="${CIRCLE_PROJECT_REPONAME:-conference-app-2019}" + +get_pr() { + local -r pr_number="$1" + + # DANGER_GITHUB_API_TOKEN, GITHUB_API_TOKEN, GITHUB_ACCESS_TOKEN are supported + local -r gh_token="${DANGER_GITHUB_API_TOKEN:-${GITHUB_API_TOKEN:-$GITHUB_ACCESS_TOKEN}}" + + curl -H "Authorization: token $gh_token" \ + "https://api.github.com/repos/$user_name/$repo_name/pulls/$pr_number" +} + +get_pr_meta() { + cat - | jq -r '.head | .repo.full_name, .ref' +} + +sync() { + local -r remote_name="$1" + local full_name= ref= + + read full_name + read ref + + git remote add "$remote_name" "git@github.com:$full_name.git" || : + git fetch "$remote_name" "$ref" + git checkout -b "${remote_name}_${ref}" "$remote_name/$ref" +} + +sync_forked_pr() { + local -r pr_number="$1" + + get_pr "$pr_number" | get_pr_meta | sync "pr_$pr_number" +} + +sync_forked_pr "$1" \ No newline at end of file diff --git a/scripts/fetch_droidkaigi_master b/scripts/fetch_droidkaigi_master new file mode 100755 index 000000000..c8a0eb3ee --- /dev/null +++ b/scripts/fetch_droidkaigi_master @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -eu +set -o pipefail + +user_name="${CIRCLE_PROJECT_USERNAME:-DroidKaigi}" +repo_name="${CIRCLE_PROJECT_REPONAME:-conference-app-2019}" + +sync_origin_master() { + git remote add "$user_name" "git@github.com:$user_name/$repo_name.git" + git fetch "$user_name" master + + cat< Date: Fri, 11 Jan 2019 01:54:15 +0900 Subject: [PATCH 143/143] fix compile error in test class --- .../io/github/droidkaigi/confsched2019/SessionDummyDatas.kt | 3 ++- .../confsched2019/session/ui/store/SessionContentsStoreTest.kt | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt index 378d6793a..7a51a46c0 100644 --- a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt +++ b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/SessionDummyDatas.kt @@ -18,7 +18,8 @@ fun dummySessionData(): List { startTime + 30.minutes, "session", Room(0, "Hall"), - SessionType.WelcomeTalk + SessionType.WelcomeTalk, + true ), firstDummySpeechSession(), Session.SpeechSession( diff --git a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionContentsStoreTest.kt b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionContentsStoreTest.kt index 0bdab1290..0c4f6fcf6 100644 --- a/feature/session/src/test/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionContentsStoreTest.kt +++ b/feature/session/src/test/java/io/github/droidkaigi/confsched2019/session/ui/store/SessionContentsStoreTest.kt @@ -7,7 +7,6 @@ import io.github.droidkaigi.confsched2019.dummySessionData import io.github.droidkaigi.confsched2019.ext.android.CoroutinePlugin import io.github.droidkaigi.confsched2019.ext.android.changedForever import io.github.droidkaigi.confsched2019.model.LoadingState -import io.github.droidkaigi.confsched2019.model.Session import io.github.droidkaigi.confsched2019.model.SessionContents import io.kotlintest.shouldBe import io.mockk.MockKAnnotations

Uaa0G-vIv7xz1Fw-ajh}i8=*DB|2fwpP!|J__7`H#S!2TH~dlCI! zwqPkn1jTwi)4mO*wzp?wzPg`TUY;?rruS+ENqf4=g)+Kx4?n!7w@E( z;O)n6lI&W5KK=fHC3`IL6f)83(4fu;)_J?1WZtk}bAgrR?YBPAJgSxk*u8Sl6?`TK zlk?;Bf2JyvrD7pIlRNCZlm5}#G!ineVqjvITHf<&tSEy1!^mDFDJ$Ab+Kwap;nNk) zTCy+I508DmrLDDzvIiwU*(RWX)=gPk%AgU zal~ky!R$+-9eslCU%O(4_G?3{JjkqWJ5VtID_RGNuD(_V_+c^QYroQYf(110KFdAa z_*b3KllF~?A7)=?-Vh0=a==}!bE#?8tV>Y$Q{mkR6Eu}U@u+O}@^4kK?O|I&j;o1( z=eh-w?rcDEqJ6-uIkqqtB43|ef~A+twBLjDIFO-ZaM613>mRlAoU)@-wA+x0V*75E z<{6S1r>mimaKX+s$;l{kP`HD1?33Fj=)N(maZ{yYo-dPD^1{-Fr~03mgfx}`g`7fJ_#ZW_SFZSCu75$W(Ac%iI@ybz>Ve zytZMasA1J#q+vcgc+H*f{jXo`f(awgX3T$Yh9AQh>m$sY9M`$?A1%tedW$-^csDgs zP9*4D`t0nT!F+}DC7m#>fg$ObuDoL(|IJazwMf1~_s!*m+dr6ASHH*2laq!QgP0z_VN~RxJcictOEYgBc|RfAe^4ohXR7~WTs6S|Z@7NQvh{VHpRDVw z$YngIx}9FIJ11=9u3`1BCdYjX!431;4LZar#|8Kk-}*s}Z{ep$`E7WBBcfEkou4@k S=GPbm7@#B%lPib55BNV=VI&^_ literal 0 HcmV?d00001 diff --git a/feature/floormap/src/main/res/drawable-xxhdpi/ic_floor2.png b/feature/floormap/src/main/res/drawable-xxhdpi/ic_floor2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a5a925bce78515ec22df41863f392a53803d71 GIT binary patch literal 105193 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%0DoVND0ZT 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