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

HW-4 DataBinding 적용 #543

Merged
merged 13 commits into from
Mar 28, 2020
Merged
5 changes: 3 additions & 2 deletions 2003/mtjin/AndroidArchitectureStudy/app/build.gradle
Expand Up @@ -2,8 +2,6 @@ apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'

android {
Expand All @@ -27,6 +25,9 @@ android {
targetCompatibility = "8"
sourceCompatibility = "8"
}
dataBinding {
enabled = true
}
}

dependencies {
Expand Down
Expand Up @@ -2,51 +2,44 @@ package com.mtjin.androidarchitecturestudy.ui.login

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.mtjin.androidarchitecturestudy.R
import com.mtjin.androidarchitecturestudy.data.login.source.LoginRepository
import com.mtjin.androidarchitecturestudy.data.login.source.LoginRepositoryImpl
import com.mtjin.androidarchitecturestudy.data.login.source.local.LoginLocalDataSource
import com.mtjin.androidarchitecturestudy.data.login.source.local.LoginLocalDataSourceImpl
import com.mtjin.androidarchitecturestudy.databinding.ActivityLoginBinding
import com.mtjin.androidarchitecturestudy.ui.search.MovieSearchActivity
import com.mtjin.androidarchitecturestudy.utils.PreferenceManager

class LoginActivity : AppCompatActivity(), LoginContract.View {
private lateinit var presenter: LoginContract.Presenter
private lateinit var etId: EditText
private lateinit var etPw: EditText
private lateinit var btnLogin: Button

private lateinit var binding: ActivityLoginBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
initView()
initListener()
initDataBinding()
inject()
}

private fun initDataBinding() {
binding =
DataBindingUtil.setContentView(this, R.layout.activity_login)
binding.login = this
}

private fun inject() {
val preferenceManager = PreferenceManager(this)
val loginLocalDataSource: LoginLocalDataSource = LoginLocalDataSourceImpl(preferenceManager)
val loginRepository: LoginRepository = LoginRepositoryImpl(loginLocalDataSource)
presenter = LoginPresenter(this, loginRepository)
}

private fun initView() {
etId = findViewById(R.id.et_id)
etPw = findViewById(R.id.et_pw)
btnLogin = findViewById(R.id.btn_login)
}

private fun initListener() {
btnLogin.setOnClickListener {
val id = etId.text.toString().trim()
val pw = etPw.text.toString().trim()
presenter.doLogin(id, pw)
}
fun onLoginClick() {
val id = binding.etId.text.toString().trim()
val pw = binding.etPw.text.toString().trim()
presenter.doLogin(id, pw)
}


Expand All @@ -56,11 +49,11 @@ class LoginActivity : AppCompatActivity(), LoginContract.View {
}

override fun showIdEmptyError() {
etId.error = getString(R.string.id_empty_error_msg)
binding.etId.error = getString(R.string.id_empty_error_msg)
}

override fun showPwEmptyError() {
etPw.error = getString(R.string.pw_empty_error_msg)
binding.etPw.error = getString(R.string.pw_empty_error_msg)
}

override fun goMovieSearch() {
Expand Down
Expand Up @@ -4,25 +4,21 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mtjin.androidarchitecturestudy.R
import com.mtjin.androidarchitecturestudy.data.search.Movie
import com.mtjin.androidarchitecturestudy.databinding.ActivityMovieSearchBinding
import com.mtjin.androidarchitecturestudy.utils.MyApplication


class MovieSearchActivity : AppCompatActivity(), MovieSearchContract.View {

private lateinit var binding: ActivityMovieSearchBinding
private lateinit var presenter: MovieSearchContract.Presenter
private lateinit var etInput: EditText
private lateinit var btnSearch: Button
private lateinit var rvMovies: RecyclerView
private lateinit var pbLoading: ProgressBar
private lateinit var movieAdapter: MovieAdapter
private lateinit var myApplication: MyApplication
private lateinit var query: String
Expand All @@ -31,54 +27,49 @@ class MovieSearchActivity : AppCompatActivity(), MovieSearchContract.View {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_movie_search)

initView()
initDataBinding()
inject()
initAdapter()
initListener()
presenter = MovieSearchPresenter(this, myApplication.movieRepository)
}

private fun initView() {
private fun initDataBinding() {
binding = DataBindingUtil.setContentView(this, R.layout.activity_movie_search)
binding.search = this
}

private fun inject() {
myApplication = application as MyApplication
etInput = findViewById(R.id.et_input)
btnSearch = findViewById(R.id.btn_search)
rvMovies = findViewById(R.id.rv_movies)
pbLoading = findViewById(R.id.pb_loading)
presenter = MovieSearchPresenter(this, myApplication.movieRepository)
}

private fun initAdapter() {
movieAdapter = MovieAdapter()
movieAdapter = MovieAdapter { movie ->
Intent(Intent.ACTION_VIEW, Uri.parse(movie.link)).takeIf {
it.resolveActivity(packageManager) != null
}?.run(this::startActivity)
}
val linearLayoutManager = LinearLayoutManager(this)
rvMovies.layoutManager = linearLayoutManager
binding.rvMovies.layoutManager = linearLayoutManager
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LayoutManager는 xml에서 설정 할 수 있어요

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5d6aff2
수정했습니다.

scrollListener = object : EndlessRecyclerViewScrollListener(linearLayoutManager) {
override fun onLoadMore(page: Int, totalItemsCount: Int, view: RecyclerView?) {
presenter.requestPagingMovie(query, totalItemsCount + 1)
}
}
rvMovies.addOnScrollListener(scrollListener)
rvMovies.adapter = movieAdapter
binding.rvMovies.addOnScrollListener(scrollListener)
binding.rvMovies.adapter = movieAdapter
}

private fun initListener() {
//어댑터 아이템 클릭리스너
movieAdapter.setItemClickListener { movie ->
Intent(Intent.ACTION_VIEW, Uri.parse(movie.link)).takeIf {
it.resolveActivity(packageManager) != null
}?.run(this::startActivity)
}
//검색버튼
btnSearch.setOnClickListener {
query = etInput.text.toString().trim()
presenter.requestMovie(query)
}
fun onSearchClick() {
query = binding.etInput.text.toString().trim()
presenter.requestMovie(query)
}

override fun showLoading() {
pbLoading.visibility = View.VISIBLE
binding.pbLoading.visibility = View.VISIBLE
}

override fun hideLoading() {
pbLoading.visibility = View.GONE
binding.pbLoading.visibility = View.GONE
}

override fun showToast(msg: String) {
Expand Down Expand Up @@ -111,12 +102,12 @@ class MovieSearchActivity : AppCompatActivity(), MovieSearchContract.View {

override fun searchMovieSuccess(movieList: List<Movie>) {
movieAdapter.clear()
movieAdapter.setItems(movieList)
movieAdapter.addItems(movieList)
Toast.makeText(this, getString(R.string.load_movie_success_msg), Toast.LENGTH_SHORT).show()
}

override fun pagingMovieSuccess(movieList: List<Movie>) {
movieAdapter.setItems(movieList)
movieAdapter.addItems(movieList)
Toast.makeText(this, getString(R.string.load_movie_success_msg), Toast.LENGTH_SHORT).show()
}

Expand Down
@@ -1,51 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="48dp"
android:paddingEnd="48dp"
tools:context=".ui.login.LoginActivity">

<ImageView
android:id="@+id/iv_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:src="@drawable/ic_app_logo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/et_id"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="128dp"
android:hint="아이디(id)"
android:inputType="text"
android:padding="12dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_logo" />

<EditText
android:id="@+id/et_pw"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:hint="패스워드(P@sswOrd)"
android:inputType="textPassword"
android:padding="12dp"
app:layout_constraintTop_toBottomOf="@id/et_id" />

<Button
android:id="@+id/btn_login"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="login"
type="com.mtjin.androidarchitecturestudy.ui.login.LoginActivity" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="로그인"
app:layout_constraintTop_toBottomOf="@id/et_pw" />
android:layout_height="match_parent"
android:paddingLeft="48dp"
android:paddingEnd="48dp"
tools:context=".ui.login.LoginActivity">

<ImageView
android:id="@+id/iv_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:src="@drawable/ic_app_logo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/et_id"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="128dp"
android:hint="아이디(id)"
android:inputType="text"
android:padding="12dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_logo" />

<EditText
android:id="@+id/et_pw"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:hint="패스워드(P@sswOrd)"
android:inputType="textPassword"
android:padding="12dp"
app:layout_constraintTop_toBottomOf="@id/et_id" />

<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="@{()->login.onLoginClick()}"
android:text="로그인"
app:layout_constraintTop_toBottomOf="@id/et_pw" />

</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>