diff --git a/app/build.gradle b/app/build.gradle index 33436acd9..6f9aa5e77 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,6 +22,7 @@ android { buildConfigField "String", "BASE_URL", "\"https://api.themoviedb.org/3/\"" buildConfigField "String", "IMAGE_BASE_PATH", "\"https://image.tmdb.org/t/p/w500\"" buildConfigField "String", "TMDB_SIGNUP_URL", "\"https://www.themoviedb.org/signup\"" + buildConfigField "String", "TMDB_FORGET_PASSWORD_URL", "\"https://www.themoviedb.org/reset-password\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/karrar/movieapp/ui/login/LoginFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/login/LoginFragment.kt index 3c29078db..31ccb7970 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/login/LoginFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/login/LoginFragment.kt @@ -30,11 +30,18 @@ class LoginFragment : BaseFragment() { is LoginUIEvent.LoginEvent -> { findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToProfileFragment()) } + LoginUIEvent.SignUpEvent -> { val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.TMDB_SIGNUP_URL)) startActivity(browserIntent) } + + LoginUIEvent.ForgetPasswordEvent -> { + val browserIntent = + Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.TMDB_FORGET_PASSWORD_URL)) + startActivity(browserIntent) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/login/LoginUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/login/LoginUIEvent.kt index 03214465e..09efcc9d4 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/login/LoginUIEvent.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/login/LoginUIEvent.kt @@ -3,4 +3,5 @@ package com.karrar.movieapp.ui.login sealed interface LoginUIEvent { data class LoginEvent(val login: Int) : LoginUIEvent object SignUpEvent : LoginUIEvent + object ForgetPasswordEvent : LoginUIEvent } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/login/LoginViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/login/LoginViewModel.kt index 33a6887ee..66046f1fd 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/login/LoginViewModel.kt @@ -40,6 +40,10 @@ class LoginViewModel @Inject constructor( login() } + fun onForgetPassword() { + _loginEvent.update { Event(LoginUIEvent.SignUpEvent) } + } + fun onUserNameInputChange(text: CharSequence) { val userNameFieldState = validateFiledUseCase(text.toString()) _loginUIState.update { diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryAdapter.kt index 4c69f4662..e3bd0ed3c 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryAdapter.kt @@ -13,4 +13,6 @@ class WatchHistoryAdapter( interface WatchHistoryInteractionListener : BaseInteractionListener { fun onClickMovie(item: MediaHistoryUiState) + + fun onClickExplore() } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt index fa334ca20..b05e7289e 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt @@ -35,13 +35,17 @@ class WatchHistoryFragment : BaseFragment() { event.movieID ) } + is WatchHistoryUIEvent.TVShowEvent -> { WatchHistoryFragmentDirections.actionWatchHistoryFragmentToTvShowDetailsFragment( event.tvShowID ) } + + is WatchHistoryUIEvent.NavigateExploreEvent -> { + WatchHistoryFragmentDirections.actionWatchHistoryFragmentToExploringFragment() + } } findNavController().navigate(action) } - } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryUIEvent.kt index 0ad5bebaa..c1bd64c2c 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryUIEvent.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryUIEvent.kt @@ -3,4 +3,6 @@ package com.karrar.movieapp.ui.profile.watchhistory sealed interface WatchHistoryUIEvent { data class MovieEvent(val movieID: Int) : WatchHistoryUIEvent data class TVShowEvent(val tvShowID: Int) : WatchHistoryUIEvent + + class NavigateExploreEvent(): WatchHistoryUIEvent } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryViewModel.kt index 19ea5885d..2a8af4218 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryViewModel.kt @@ -53,4 +53,7 @@ class WatchHistoryViewModel @Inject constructor( } } + override fun onClickExplore() { + _watchHistoryUIEvent.update { Event(WatchHistoryUIEvent.NavigateExploreEvent()) } + } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/utilities/view/MovieEditText.kt b/app/src/main/java/com/karrar/movieapp/utilities/view/MovieEditText.kt new file mode 100644 index 000000000..b14b3f97d --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/utilities/view/MovieEditText.kt @@ -0,0 +1,116 @@ +package com.karrar.movieapp.utilities.view + +import android.content.Context +import android.text.Editable +import android.text.TextUtils +import android.text.TextWatcher +import android.text.method.PasswordTransformationMethod +import android.util.AttributeSet +import android.view.View +import android.widget.EditText +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.databinding.BindingAdapter +import androidx.databinding.adapters.ListenerUtil +import com.karrar.movieapp.R + +class MovieEditText @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + + private val editText: EditText + private val helperText: TextView + private val passwordEye: ImageView + + private var isEyeShow = true + + init { + inflate(context, R.layout.view_edit_text, this) + editText = findViewById(R.id.innerEditText) + helperText = findViewById(R.id.helperText) + passwordEye = findViewById(R.id.passwordEye) + + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MovieEditText) + val helperTextValue = typedArray.getString(R.styleable.MovieEditText_helperText) + val showEye = typedArray.getBoolean(R.styleable.MovieEditText_showEye, false) + helperText.text = helperTextValue + passwordEye.visibility = if (showEye) VISIBLE else GONE + + typedArray.recycle() + + passwordEye.setOnClickListener { + val selection = editText.selectionStart + isEyeShow = !isEyeShow + passwordEye.setImageDrawable( + if (isEyeShow) + ContextCompat.getDrawable(getContext(), R.drawable.eye_opened) + else + ContextCompat.getDrawable(getContext(), R.drawable.eye_closed) + ) + + if (isEyeShow) + editText.transformationMethod = null + else + editText.transformationMethod = PasswordTransformationMethod() + + editText.setSelection(selection) + } + } + + fun getText(): String = editText.text.toString() + + fun setText(value: String) { + editText.setText(value) + } + + fun setHelperText(value: String?) { + helperText.text = value + + if (value != null && TextUtils.isEmpty(value.trim())) { + helperText.visibility = GONE + } else { + helperText.visibility = VISIBLE + } + } + + companion object { + @JvmStatic + @BindingAdapter("afterTextChanged") + fun setAfterTextChanged(view: MovieEditText, listener: AfterTextChangedListener?) { + val old = ListenerUtil.trackListener( + view, listener, R.id.textWatcher + ) as? TextWatcher + if (old != null) view.editText.removeTextChangedListener(old) + + if (listener == null) return + + val watcher = object : TextWatcher { + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + listener.afterTextChanged(s) + } + } + + view.editText.addTextChangedListener(watcher) + ListenerUtil.trackListener(view, watcher, R.id.textWatcher) + } + } + + fun interface AfterTextChangedListener { + fun afterTextChanged(s: Editable?) + } + + fun getEditText(): EditText = editText +} \ No newline at end of file diff --git a/app/src/main/res/drawable/cineverse_logo.xml b/app/src/main/res/drawable/cineverse_logo.xml new file mode 100644 index 000000000..a135c3362 --- /dev/null +++ b/app/src/main/res/drawable/cineverse_logo.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/click_ripple.xml b/app/src/main/res/drawable/click_ripple.xml new file mode 100644 index 000000000..86cd55e45 --- /dev/null +++ b/app/src/main/res/drawable/click_ripple.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/eye_closed.xml b/app/src/main/res/drawable/eye_closed.xml new file mode 100644 index 000000000..884d6d5fe --- /dev/null +++ b/app/src/main/res/drawable/eye_closed.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/eye_opened.xml b/app/src/main/res/drawable/eye_opened.xml new file mode 100644 index 000000000..76d4a78cc --- /dev/null +++ b/app/src/main/res/drawable/eye_opened.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml deleted file mode 100644 index 97d52adca..000000000 --- a/app/src/main/res/drawable/ic_history.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_history_colored.xml b/app/src/main/res/drawable/ic_history_colored.xml new file mode 100644 index 000000000..5d996c9dd --- /dev/null +++ b/app/src/main/res/drawable/ic_history_colored.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/icon_circle_background.xml b/app/src/main/res/drawable/icon_circle_background.xml new file mode 100644 index 000000000..1e9829ba0 --- /dev/null +++ b/app/src/main/res/drawable/icon_circle_background.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/lock.xml b/app/src/main/res/drawable/lock.xml new file mode 100644 index 000000000..59708557f --- /dev/null +++ b/app/src/main/res/drawable/lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/password_eye.xml b/app/src/main/res/drawable/password_eye.xml new file mode 100644 index 000000000..8a2d1b8a3 --- /dev/null +++ b/app/src/main/res/drawable/password_eye.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/squircle_button_background.xml b/app/src/main/res/drawable/squircle_button_background.xml new file mode 100644 index 000000000..9a8d9a0fc --- /dev/null +++ b/app/src/main/res/drawable/squircle_button_background.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/squircle_button_background_secondary.xml b/app/src/main/res/drawable/squircle_button_background_secondary.xml new file mode 100644 index 000000000..b4a9a2078 --- /dev/null +++ b/app/src/main/res/drawable/squircle_button_background_secondary.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/squircle_text_field.xml b/app/src/main/res/drawable/squircle_text_field.xml new file mode 100644 index 000000000..b40f4e747 --- /dev/null +++ b/app/src/main/res/drawable/squircle_text_field.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/user.xml b/app/src/main/res/drawable/user.xml new file mode 100644 index 000000000..416a673ea --- /dev/null +++ b/app/src/main/res/drawable/user.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/empty_history_item.xml b/app/src/main/res/layout/empty_history_item.xml new file mode 100644 index 000000000..30a25e687 --- /dev/null +++ b/app/src/main/res/layout/empty_history_item.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + +