package com.mercandalli.android.apps.files.file.local; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.common.animation.ScaleAnimationAdapter; import com.mercandalli.android.apps.files.common.listener.ResultCallback; import com.mercandalli.android.apps.files.file.FileManager; import com.mercandalli.android.apps.files.file.FileModel; import com.mercandalli.android.apps.files.file.FileModelAdapter; import com.mercandalli.android.apps.files.file.FileModelListener; import java.util.ArrayList; import java.util.List; import static com.mercandalli.android.library.base.input.KeyboardUtils.hideSoftInput; public class SearchActivity extends AppCompatActivity implements FileModelAdapter.OnFileClickListener, ResultCallback<List<FileModel>>, View.OnClickListener, FileModelListener, FileLocalOverflowActions.FileLocalActionCallback { private FileManager mFileManager; /** * The search {@link EditText}. */ private EditText mSearchEditText; /** * A {@link List} of result. */ @NonNull private final List<FileModel> mFileModelList = new ArrayList<>(); private RecyclerView mRecyclerView; private FileModelAdapter mFileModelAdapter; @NonNull private final Handler mSearchDelayHandler = new Handler(); private Runnable mSearchDelayRunnable; private ProgressBar mProgressBar; private ImageView mClearImageView; private TextView mEmptyTextView; private FileLocalOverflowActions mFileLocalOverflowActions; private String mLastSearch; public static void start(final Context context) { final Intent intent = new Intent(context, SearchActivity.class); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); mFileManager = FileManager.getInstance(this); mFileLocalOverflowActions = new FileLocalOverflowActions(this, this); mFileLocalOverflowActions.setShowCopyCut(false); mSearchDelayRunnable = new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { if (!TextUtils.isEmpty(mSearchEditText.getText())) { performSearch(mSearchEditText.getText().toString()); } } }); } }; findViews(); final Toolbar toolbar = (Toolbar) findViewById(R.id.activity_search_toolbar); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(""); } mFileModelAdapter = new FileModelAdapter(this, mFileModelList, this, this, null); mRecyclerView.setHasFixedSize(true); final int nbColumn = getResources().getInteger(R.integer.column_number_card); if (nbColumn <= 1) { mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); } else { mRecyclerView.setLayoutManager(new GridLayoutManager(this, nbColumn)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { final ScaleAnimationAdapter scaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileModelAdapter); scaleAnimationAdapter.setDuration(220); scaleAnimationAdapter.setOffsetDuration(32); mRecyclerView.setAdapter(scaleAnimationAdapter); } else { mRecyclerView.setAdapter(mFileModelAdapter); } mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy != 0) { hideSoftInput(mSearchEditText); } } }); mSearchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH && !TextUtils.isEmpty(v.getText())) { final String search = v.getText().toString(); mSearchDelayHandler.removeCallbacks(mSearchDelayRunnable); performSearch(search); return true; } return false; } }); mSearchEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Nothing here. } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mSearchDelayHandler.removeCallbacks(mSearchDelayRunnable); if (TextUtils.isEmpty(mSearchEditText.getText())) { mClearImageView.setVisibility(View.GONE); } else { mClearImageView.setVisibility(View.VISIBLE); } } @Override public void afterTextChanged(Editable s) { mSearchDelayHandler.removeCallbacks(mSearchDelayRunnable); mSearchDelayHandler.postDelayed(mSearchDelayRunnable, 400); } }); mClearImageView.setOnClickListener(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (!super.onOptionsItemSelected(item) && item.getItemId() == android.R.id.home) { onBackPressed(); return true; } return false; } @Override public void success(List<FileModel> result) { mFileModelList.clear(); mFileModelList.addAll(result); mRecyclerView.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); mFileModelAdapter.setList(result); if (result.isEmpty()) { mEmptyTextView.setVisibility(View.VISIBLE); } } @Override public void failure() { mFileModelList.clear(); mFileModelAdapter.setList(mFileModelList); mProgressBar.setVisibility(View.GONE); } @Override public void onFileClick(View view, int position) { if (mFileModelList.get(position).isDirectory()) { // TODO - Click folder search } else { mFileManager.execute(this, position, mFileModelList, view); } } @Override public void onClick(View v) { final int viewId = v.getId(); switch (viewId) { case R.id.activity_search_toolbar_btn_clear: clearSearch(); break; } } @Override public void executeFileModel(FileModel fileModel, View view) { mFileLocalOverflowActions.show(fileModel, view, false); } @Override public void refreshFab() { } @Override public void refreshData() { performSearch(mLastSearch); } @Override public void addCopyFile(FileModel fileModel) { } @Override public void addCutFile(FileModel fileModel) { } @Override public boolean isFileToCut() { return false; } @Override public boolean isFileToCopy() { return false; } @Override public void clearFileToCut() { } @Override public void clearFileToCopy() { } /** * Find all the {@link View}s. */ private void findViews() { mRecyclerView = (RecyclerView) findViewById(R.id.activity_search_recycler_view); mSearchEditText = (EditText) findViewById(R.id.activity_search_edit_text); mProgressBar = (ProgressBar) findViewById(R.id.activity_search_progress_bar); mClearImageView = (ImageView) findViewById(R.id.activity_search_toolbar_btn_clear); mEmptyTextView = (TextView) findViewById(R.id.activity_search_empty_view); } /** * Call the {@link #mFileManager} to perform the search. */ private void performSearch(final String search) { mLastSearch = search; mRecyclerView.setVisibility(View.GONE); mEmptyTextView.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); mFileManager.searchLocal(this, search, this); } /** * Clear the search. */ private void clearSearch() { mRecyclerView.setVisibility(View.GONE); mSearchEditText.setText(""); } }