package com.silencedut.knowweather.citys.ui;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.silencedut.knowweather.R;
import com.silencedut.knowweather.citys.adapter.CityHolder;
import com.silencedut.knowweather.citys.adapter.CityInfoData;
import com.silencedut.knowweather.citys.adapter.HeaderData;
import com.silencedut.knowweather.citys.adapter.HeaderHolder;
import com.silencedut.knowweather.citys.ui.presenter.SearchCityView;
import com.silencedut.knowweather.citys.ui.presenter.SearchPresenter;
import com.silencedut.knowweather.common.BaseActivity;
import com.silencedut.knowweather.common.adapter.BaseRecyclerAdapter;
import com.silencedut.knowweather.common.customview.SideLetterBar;
import com.silencedut.knowweather.utils.Check;
import com.silencedut.knowweather.utils.LogHelper;
import java.lang.reflect.Field;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
/**
* Created by SilenceDut on 16/10/19.
*/
public class SearchActivity extends BaseActivity implements SearchCityView {
@BindView(R.id.recyclerView)
RecyclerView mAllCitiesRecyclerView;
@BindView(R.id.tv_letter_overlay)
TextView mTvLetterOverlay;
@BindView(R.id.side)
SideLetterBar mSide;
@BindView(R.id.searchTextView)
EditText mSearchTextView;
@BindView(R.id.action_empty_btn)
ImageButton mActionEmptyBtn;
@BindView(R.id.search_result_view)
RecyclerView mSearchResultView;
@BindView(R.id.empty_view)
LinearLayout mEmptyView;
private SearchPresenter mSearchPresenter;
private BaseRecyclerAdapter mSearchResultAdapter;
public static void navigationActivity(Context from) {
Intent intent = new Intent(from, SearchActivity.class);
from.startActivity(intent);
}
public static void navigationFromApplication(Context from) {
Intent intent = new Intent(from, SearchActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
from.startActivity(intent);
}
@Override
public int getContentViewId() {
return R.layout.activity_search;
}
@Override
public void initBeforeView() {
mSearchPresenter = new SearchPresenter(this);
mSearchPresenter.getAllCities();
}
@Override
public void initViews() {
initSearchView();
}
private int getLetterPosition(String letter, List<CityInfoData> allInfoDatas) {
int position = 0;
for (CityInfoData cityInfoData : allInfoDatas) {
if (cityInfoData.getInitial().equals(letter)) {
position = allInfoDatas.indexOf(cityInfoData);
}
}
return position;
}
@Override
public void onMatched(List<CityInfoData> result) {
if (Check.isNull(result)) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
mEmptyView.setVisibility(View.GONE);
mSearchResultAdapter.setData(result);
}
}
@Override
public void onAllCities(final List<CityInfoData> allInfoDatas) {
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mAllCitiesRecyclerView.setLayoutManager(linearLayoutManager);
BaseRecyclerAdapter citiesAdapter = new BaseRecyclerAdapter(this);
citiesAdapter.registerHolder(HeaderHolder.class, new HeaderData());
citiesAdapter.registerHolder(CityHolder.class, allInfoDatas);
mAllCitiesRecyclerView.setAdapter(citiesAdapter);
LinearLayoutManager resultLayoutManager = new LinearLayoutManager(this);
mSearchResultView.setLayoutManager(resultLayoutManager);
mSearchResultAdapter = new BaseRecyclerAdapter(this);
mSearchResultAdapter.registerHolder(CityHolder.class, R.layout.item_city);
mSearchResultView.setAdapter(mSearchResultAdapter);
mSide.setOverlay(mTvLetterOverlay);
mSide.setOnLetterChangedListener(new SideLetterBar.OnLetterChangedListener() {
@Override
public void onLetterChanged(String letter) {
linearLayoutManager.scrollToPositionWithOffset(getLetterPosition(letter, allInfoDatas), 0);
}
});
}
private void initSearchView() {
setCursorDrawable(R.drawable.color_cursor_white);
mSearchTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
return true;
}
});
mSearchTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
CharSequence text = mSearchTextView.getText();
boolean hasText = !TextUtils.isEmpty(text);
if (hasText) {
mActionEmptyBtn.setVisibility(VISIBLE);
} else {
mActionEmptyBtn.setVisibility(GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
String keyword = s.toString();
if (TextUtils.isEmpty(keyword)) {
mActionEmptyBtn.setVisibility(View.GONE);
mEmptyView.setVisibility(View.GONE);
mSearchResultView.setVisibility(View.GONE);
} else {
mActionEmptyBtn.setVisibility(View.VISIBLE);
mSearchResultView.setVisibility(View.VISIBLE);
mSearchPresenter.matchCities(keyword);
}
}
});
}
public void setCursorDrawable(int drawable) {
try {
// https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
f.setAccessible(true);
f.set(mSearchTextView, drawable);
} catch (Exception ignored) {
LogHelper.e(ignored, ignored.toString());
}
}
@OnClick({R.id.action_back, R.id.action_empty_btn})
public void onClick(View view) {
switch (view.getId()) {
case R.id.action_back:
finish();
break;
case R.id.action_empty_btn:
mSearchTextView.setText("");
break;
}
}
@Override
public Context getContext() {
return this;
}
}