diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4826623..d798f22 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> diff --git a/app/src/main/java/com/release/keyneez/MainActivity.kt b/app/src/main/java/com/release/keyneez/presentation/main/MainActivity.kt similarity index 85% rename from app/src/main/java/com/release/keyneez/MainActivity.kt rename to app/src/main/java/com/release/keyneez/presentation/main/MainActivity.kt index 10fa87f..627610f 100644 --- a/app/src/main/java/com/release/keyneez/MainActivity.kt +++ b/app/src/main/java/com/release/keyneez/presentation/main/MainActivity.kt @@ -1,8 +1,9 @@ -package com.release.keyneez +package com.release.keyneez.presentation.main import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.kakao.sdk.common.util.Utility +import com.release.keyneez.R import timber.log.Timber class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/release/keyneez/util/DiffCallback.kt b/app/src/main/java/com/release/keyneez/util/DiffCallback.kt new file mode 100644 index 0000000..2a7d780 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/DiffCallback.kt @@ -0,0 +1,14 @@ +package com.release.keyneez.util + +import androidx.recyclerview.widget.DiffUtil + +class DiffCallback( + val onItemsTheSame: (T, T) -> Boolean, + val onContentsTheSame: (T, T) -> Boolean +) : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: T, newItem: T): Boolean = + onItemsTheSame(oldItem, newItem) + + override fun areContentsTheSame(oldItem: T, newItem: T): Boolean = + onContentsTheSame(oldItem, newItem) +} diff --git a/app/src/main/java/com/release/keyneez/util/OnSingleClickListener.kt b/app/src/main/java/com/release/keyneez/util/OnSingleClickListener.kt new file mode 100644 index 0000000..d089d47 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/OnSingleClickListener.kt @@ -0,0 +1,21 @@ +package com.release.keyneez.util + +import android.os.SystemClock +import android.view.View + +class OnSingleClickListener( + private var interval: Int = 600, + private var onSingleClick: (View) -> Unit +) : View.OnClickListener { + + private var lastClickTime: Long = 0 + + override fun onClick(v: View) { + val elapsedRealtime = SystemClock.elapsedRealtime() + if ((elapsedRealtime - lastClickTime) < interval) { + return + } + lastClickTime = elapsedRealtime + onSingleClick(v) + } +} diff --git a/app/src/main/java/com/release/keyneez/util/UiState.kt b/app/src/main/java/com/release/keyneez/util/UiState.kt new file mode 100644 index 0000000..e6db0b7 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/UiState.kt @@ -0,0 +1,7 @@ +package com.release.keyneez.util + +sealed class UiState { + object Success : UiState() + data class Failure(val code: Int?) : UiState() + object Error : UiState() +} diff --git a/app/src/main/java/com/release/keyneez/util/binding/BindingActivity.kt b/app/src/main/java/com/release/keyneez/util/binding/BindingActivity.kt new file mode 100644 index 0000000..c792623 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/binding/BindingActivity.kt @@ -0,0 +1,19 @@ +package com.release.keyneez.util.binding + +import android.os.Bundle +import androidx.annotation.LayoutRes +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding + +abstract class BindingActivity( + @LayoutRes private val layoutRes: Int +) : AppCompatActivity() { + protected lateinit var binding: T + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, layoutRes) + binding.lifecycleOwner = this + } +} diff --git a/app/src/main/java/com/release/keyneez/util/binding/BindingFragment.kt b/app/src/main/java/com/release/keyneez/util/binding/BindingFragment.kt new file mode 100644 index 0000000..143b4f9 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/binding/BindingFragment.kt @@ -0,0 +1,33 @@ +package com.release.keyneez.util.binding + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.Fragment +import com.release.keyneez.R + +abstract class BindingFragment( + @LayoutRes private val layoutRes: Int +) : Fragment() { + private var _binding: T? = null + protected val binding get() = _binding ?: error(getString(R.string.binding_error)) + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = DataBindingUtil.inflate(inflater, layoutRes, container, false) + binding.lifecycleOwner = viewLifecycleOwner + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/java/com/release/keyneez/util/extension/ActivityExt.kt b/app/src/main/java/com/release/keyneez/util/extension/ActivityExt.kt new file mode 100644 index 0000000..c8c74f2 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/extension/ActivityExt.kt @@ -0,0 +1,9 @@ +package com.release.keyneez.util.extension + +import android.app.Activity +import android.view.View + +/** hide keyboard from activity window */ +fun Activity.hideKeyboard() { + hideKeyboard(currentFocus ?: View(this)) +} diff --git a/app/src/main/java/com/release/keyneez/util/extension/ContextExt.kt b/app/src/main/java/com/release/keyneez/util/extension/ContextExt.kt new file mode 100644 index 0000000..573efce --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/extension/ContextExt.kt @@ -0,0 +1,29 @@ +package com.release.keyneez.util.extension + +import android.app.Activity +import android.content.Context +import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.Toast +import com.google.android.material.snackbar.Snackbar + +/** hide keyboard from window */ +fun Context.hideKeyboard(view: View) { + val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) +} + +/** Make a Snackbar to display a message for 1.5 seconds */ +fun Context.showSnackbar(view: View, msg: String) { + Snackbar.make(view, msg, Toast.LENGTH_SHORT).show() +} + +/** Make a Toast to display a message for 1.5 seconds */ +fun Context.showToast(msg: String) { + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() +} + +fun Context.dpToPx(dp: Int): Int { + val scale = resources.displayMetrics.density + return (dp * scale).toInt() +} diff --git a/app/src/main/java/com/release/keyneez/util/extension/MutableLiveDataExt.kt b/app/src/main/java/com/release/keyneez/util/extension/MutableLiveDataExt.kt new file mode 100644 index 0000000..1de3ffb --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/extension/MutableLiveDataExt.kt @@ -0,0 +1,7 @@ +package com.release.keyneez.util.extension + +import androidx.lifecycle.MutableLiveData + +fun MutableLiveData.notifyObserver() { + this.value = this.value +} diff --git a/app/src/main/java/com/release/keyneez/util/extension/ViewExt.kt b/app/src/main/java/com/release/keyneez/util/extension/ViewExt.kt new file mode 100644 index 0000000..70fc8c1 --- /dev/null +++ b/app/src/main/java/com/release/keyneez/util/extension/ViewExt.kt @@ -0,0 +1,15 @@ +package com.release.keyneez.util.extension + +import android.view.View +import com.google.android.material.snackbar.Snackbar +import com.release.keyneez.util.OnSingleClickListener + +/** Register a callback to be invoked when this view is clicked. If this view was clicked within 1 second, the callback will not be invoked. */ +fun View.setOnSingleClickListener(onSingleClick: (View) -> Unit) { + setOnClickListener(OnSingleClickListener { onSingleClick(it) }) +} + +/** Make a Snackbar to display a message for 1.5 seconds */ +fun View.showSnackbar(message: String) { + Snackbar.make(this, message, Snackbar.LENGTH_SHORT).show() +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 17eab17..435ca35 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".presentation.main.MainActivity"> Keyneez + // common + Binding not initialized to reference the view. + // search 제목, 키워드 검색결과