Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add showing snackbar in repo detail #228

Merged
merged 3 commits into from
Mar 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package com.jraska.github.client
import android.content.Intent
import android.net.Uri
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.platform.app.InstrumentationRegistry
import com.jraska.github.client.http.ReplayHttpComponent
Expand Down Expand Up @@ -41,6 +43,10 @@ class DeepLinkLaunchTest {

onView(withText(Matchers.containsString("Language: Java")))
.check(matches(isDisplayed()))

onView(withId(R.id.repo_detail_github_fab)).perform(click())
onView(withText("Open"))
.check(matches(isDisplayed()))
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.jraska.github.client.core.android.snackbar

import android.view.View

interface SnackbarDisplay {
fun showSnackbar(snackbarData: SnackbarData)
}

class SnackbarData(
val text: Int,
val length: Int,
val action: Pair<Int, View.OnClickListener?>? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package com.jraska.github.client.users
import android.app.Activity
import androidx.lifecycle.ViewModel
import com.jraska.github.client.core.android.LinkLauncher
import com.jraska.github.client.core.android.snackbar.SnackbarDisplay
import com.jraska.github.client.users.model.GitHubApiUsersRepository
import com.jraska.github.client.users.model.GitHubUserDetailApi
import com.jraska.github.client.users.model.GitHubUsersApi
import com.jraska.github.client.users.model.RepoDetailViewModel
import com.jraska.github.client.users.model.UsersRepository
import com.jraska.github.client.users.ui.UsersActivity
import com.jraska.github.client.users.widget.TopSnackbarDisplay
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
Expand Down Expand Up @@ -75,4 +77,7 @@ object UsersModule {
}
}
}

@Provides
fun snackbarDisplay(display: TopSnackbarDisplay): SnackbarDisplay = display
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
package com.jraska.github.client.users.model

import android.view.View
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import com.google.android.material.snackbar.Snackbar
import com.jraska.github.client.analytics.AnalyticsEvent
import com.jraska.github.client.analytics.EventAnalytics
import com.jraska.github.client.common.lazyMap
import com.jraska.github.client.core.android.rx.toLiveData
import com.jraska.github.client.core.android.snackbar.SnackbarData
import com.jraska.github.client.core.android.snackbar.SnackbarDisplay
import com.jraska.github.client.navigation.Navigator
import com.jraska.github.client.navigation.Urls
import com.jraska.github.client.rx.AppSchedulers
import com.jraska.github.client.users.R
import javax.inject.Inject

internal class RepoDetailViewModel @Inject constructor(
private val usersRepository: UsersRepository,
private val appSchedulers: AppSchedulers,
private val navigator: Navigator,
private val eventAnalytics: EventAnalytics
private val eventAnalytics: EventAnalytics,
private val snackbarDisplay: SnackbarDisplay
) : ViewModel() {

private val liveDataMap: Map<String, LiveData<ViewState>> = lazyMap(this::createRepoDetailLiveData)
Expand Down Expand Up @@ -43,7 +49,14 @@ internal class RepoDetailViewModel @Inject constructor(

eventAnalytics.report(event)

navigator.launchOnWeb(Urls.repo(fullRepoName))
snackbarDisplay.showSnackbar(
SnackbarData(
R.string.repo_detail_open_web_text,
Snackbar.LENGTH_INDEFINITE,
R.string.repo_detail_open_web_action to View.OnClickListener {
navigator.launchOnWeb(Urls.repo(fullRepoName))
})
)
}

sealed class ViewState {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.jraska.github.client.users.widget

import android.app.Activity
import android.view.View
import android.view.ViewGroup
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
import com.jraska.github.client.core.android.TopActivityProvider
import com.jraska.github.client.core.android.snackbar.SnackbarData
import com.jraska.github.client.core.android.snackbar.SnackbarDisplay
import javax.inject.Inject

class TopSnackbarDisplay @Inject constructor(
private val topActivityProvider: TopActivityProvider
) : SnackbarDisplay {

override fun showSnackbar(snackbarData: SnackbarData) {
topActivityProvider.onTopActivity { showSnackbar(it, snackbarData) }
}

private fun showSnackbar(activity: Activity, snackbarData: SnackbarData) {
val snackbarView = findSnackbarView(activity)

val snackbar = Snackbar.make(snackbarView, snackbarData.text, snackbarData.length)
snackbarData.action?.also { snackbar.setAction(it.first, it.second) }

snackbar.show()
}

private fun findSnackbarView(activity: Activity): View {
val contentView = activity.findViewById<View>(android.R.id.content)
return findCoordinatorLayout(contentView) ?: contentView
}

private fun findCoordinatorLayout(view: View): CoordinatorLayout? {
if (view is CoordinatorLayout) {
return view
}

if (view is ViewGroup) {
val childCount = view.childCount
for (childViewIndex in 0 until childCount) {
val childView = view.getChildAt(childViewIndex)

val coordinatorLayout = findCoordinatorLayout(childView)
if (coordinatorLayout != null) {
return coordinatorLayout
}
}
}

return null
}

}
2 changes: 2 additions & 0 deletions feature/users/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<string name="repos_contributed">Contributed repositories</string>
<string name="repo_detail_language_used_template">Language: %s</string>
<string name="repo_detail_issues_template">Issues Count: %s</string>
<string name="repo_detail_open_web_text">Test: Opens a website</string>
<string name="repo_detail_open_web_action">Open</string>

<string name="settings">Settings</string>
<string name="github_clickable_icon">GitHub clickable icon</string>
Expand Down

This file was deleted.