From c925ca02ecab740166535463726f520779a1bd41 Mon Sep 17 00:00:00 2001 From: Timon Langlotz Date: Thu, 8 Feb 2018 23:49:58 +0100 Subject: [PATCH] Add empty state behavior. --- .../jakewharton/sdksearch/ui/MainActivity.kt | 38 +++++++++++++++++++ .../res/drawable/ic_search_black_24dp.xml | 4 ++ frontend/android/src/main/res/layout/main.xml | 12 ++++++ .../android/src/main/res/values/strings.xml | 2 + 4 files changed, 56 insertions(+) create mode 100644 frontend/android/src/main/res/drawable/ic_search_black_24dp.xml diff --git a/frontend/android/src/main/java/com/jakewharton/sdksearch/ui/MainActivity.kt b/frontend/android/src/main/java/com/jakewharton/sdksearch/ui/MainActivity.kt index eea06817..b3a4ab5d 100644 --- a/frontend/android/src/main/java/com/jakewharton/sdksearch/ui/MainActivity.kt +++ b/frontend/android/src/main/java/com/jakewharton/sdksearch/ui/MainActivity.kt @@ -11,6 +11,8 @@ import android.support.v7.util.DiffUtil import android.support.v7.widget.DividerItemDecoration import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView +import android.text.Editable +import android.text.TextWatcher import android.view.KeyEvent.KEYCODE_ENTER import android.view.View import android.view.View.INVISIBLE @@ -20,6 +22,7 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_GO import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS import android.widget.EditText +import android.widget.TextView import androidx.content.systemService import com.jakewharton.rxbinding2.support.v7.widget.scrollEvents import com.jakewharton.rxbinding2.view.keys @@ -101,10 +104,45 @@ class MainActivity : Activity() { dividerDecoration.setDrawable(getDrawable(R.drawable.list_divider)) recycler.addItemDecoration(dividerDecoration) + val emptyStateTextView = findViewById(R.id.emptyState) + val queryInput = findViewById(R.id.query) if (savedInstanceState == null) { queryInput.setText(intent.getStringExtra("query") ?: "") } + queryInput.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit + override fun afterTextChanged(s: Editable) { + if (s.isEmpty()) { + emptyStateTextView.text = getString(R.string.enter_class_name) + emptyStateTextView.animate() + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .start() + } else { + emptyStateTextView.animate() + .scaleX(0f) + .scaleY(0f) + .alpha(0f) + .start() + } + } + }) + adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + if (queryInput.length() > 0 && adapter.itemCount == 0) { + emptyStateTextView.visibility = View.VISIBLE + emptyStateTextView.text = getString(R.string.no_results) + emptyStateTextView.animate() + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .start() + } + } + }) val enterKeys = queryInput.keys(Predicate { it.keyCode == KEYCODE_ENTER }) .filter { it.keyCode == KEYCODE_ENTER } diff --git a/frontend/android/src/main/res/drawable/ic_search_black_24dp.xml b/frontend/android/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 00000000..955eb802 --- /dev/null +++ b/frontend/android/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,4 @@ + + + diff --git a/frontend/android/src/main/res/layout/main.xml b/frontend/android/src/main/res/layout/main.xml index cd263355..051839f3 100644 --- a/frontend/android/src/main/res/layout/main.xml +++ b/frontend/android/src/main/res/layout/main.xml @@ -62,4 +62,16 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbar" /> + diff --git a/frontend/android/src/main/res/values/strings.xml b/frontend/android/src/main/res/values/strings.xml index 19dd14a4..5b118b99 100644 --- a/frontend/android/src/main/res/values/strings.xml +++ b/frontend/android/src/main/res/values/strings.xml @@ -7,6 +7,8 @@ Search 1 class… Search %d classes… + Enter a class name + No results Copy Share… %s URL copied to clipboard!