diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/files/paths/RepoFilePathFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/files/paths/RepoFilePathFragment.java index 1585a8bf..f86e2209 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/files/paths/RepoFilePathFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/files/paths/RepoFilePathFragment.java @@ -91,6 +91,8 @@ public class RepoFilePathFragment extends BaseFragment implements SearchFileMvp.View { -public class SearchFileActivity extends BaseActivity { + @BindView(R.id.searchEditText) FontAutoCompleteEditText searchEditText; + @BindView(R.id.clear) ForegroundImageView clear; + + private ArrayAdapter adapter; + private SearchCodeFragment searchCodeFragment; @Override protected int layout() { @@ -40,16 +53,61 @@ public class SearchFileActivity extends BaseActivity { @NonNull @Override - public TiPresenter providePresenter() { - return new BasePresenter(); + public SearchFilePresenter providePresenter() { + return new SearchFilePresenter(); + } + + @OnTextChanged(value = R.id.searchEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) + void onTextChange(Editable s) { + String text = s.toString(); + if (text.length() == 0) { + AnimHelper.animateVisibility(clear, false); + } else { + AnimHelper.animateVisibility(clear, true); + } + } + + @OnEditorAction(R.id.searchEditText) boolean onEditor(int actionId, KeyEvent keyEvent) { + if (keyEvent != null && keyEvent.getAction() == KeyEvent.KEYCODE_SEARCH) { + getPresenter().onSearchClicked(searchEditText, searchCodeFragment); + } else if (actionId == EditorInfo.IME_ACTION_SEARCH) { + getPresenter().onSearchClicked(searchEditText, searchCodeFragment); + } + return false; + } + + @OnClick(value = {R.id.clear}) void onClear(View view) { + if (view.getId() == R.id.clear) { + AppHelper.hideKeyboard(searchEditText); + searchEditText.setText(""); + } } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + searchEditText.setAdapter(getAdapter()); + searchEditText.setOnItemClickListener((parent, view, position, id) -> getPresenter().onSearchClicked(searchEditText, searchCodeFragment)); + getPresenter().onActivityCreated(getIntent().getExtras()); + searchCodeFragment = ((SearchCodeFragment) getSupportFragmentManager().findFragmentById(R.id.filesFragment)); } @OnClick(R.id.back) public void onBackClicked() { onBackPressed(); } + + @OnTextChanged(R.id.searchEditText) public void onSearchTextChanged() { + + } + + @Override + public void onNotifyAdapter(@Nullable SearchHistory query) { + if (query == null) getAdapter().notifyDataSetChanged(); + else getAdapter().add(query); + } + + private ArrayAdapter getAdapter() { + if (adapter == null) adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getPresenter().getHints()); + return adapter; + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/search/files/SearchFilePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/search/files/SearchFilePresenter.java new file mode 100644 index 00000000..25a62304 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/search/files/SearchFilePresenter.java @@ -0,0 +1,73 @@ +package com.fastaccess.ui.modules.search.files; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.widget.AutoCompleteTextView; + +import com.annimon.stream.Stream; +import com.fastaccess.R; +import com.fastaccess.data.dao.model.SearchHistory; +import com.fastaccess.helper.AppHelper; +import com.fastaccess.helper.BundleConstant; +import com.fastaccess.helper.InputHelper; +import com.fastaccess.ui.base.mvp.presenter.BasePresenter; +import com.fastaccess.ui.modules.search.code.SearchCodeFragment; + +import java.util.ArrayList; + +public class SearchFilePresenter extends BasePresenter implements SearchFileMvp.Presenter { + + private ArrayList hints = new ArrayList<>(); + private String repoId; + private String login; + + @Override protected void onAttachView(@NonNull SearchFileMvp.View view) { + super.onAttachView(view); + if (hints.isEmpty()) { + manageSubscription(SearchHistory.getHistory() + .subscribe(strings -> { + hints.clear(); + if (strings != null) hints.addAll(strings); + view.onNotifyAdapter(null); + })); + } + } + + + + @NonNull + @Override + public ArrayList getHints() { + return hints; + } + + @Override + public void onSearchClicked(@NonNull AutoCompleteTextView editText, @NonNull SearchCodeFragment searchCodeFragment) { + boolean isEmpty = InputHelper.isEmpty(editText) || InputHelper.toString(editText).length() < 3; + editText.setError(isEmpty ? editText.getResources().getString(R.string.minimum_three_chars) : null); + if (!isEmpty) { + editText.dismissDropDown(); + AppHelper.hideKeyboard(editText); + String query = InputHelper.toString(editText); + + searchCodeFragment.onSetSearchQuery(modifyQueryForFileSearch(query)); + boolean noneMatch = Stream.of(hints).noneMatch(value -> value.getText().equalsIgnoreCase(query)); + if (noneMatch) { + SearchHistory searchHistory = new SearchHistory(query); + manageSubscription(searchHistory.save(searchHistory).subscribe()); + sendToView(view -> view.onNotifyAdapter(new SearchHistory(query))); + } + } + } + + private String modifyQueryForFileSearch(String query) { + //restrict the search to file paths and the current repo user is looking at + return query + "+" + "in:path" + "+" + "repo:" + login + "/" + repoId; + } + + @Override + public void onActivityCreated(Bundle extras) { + repoId = extras.getString(BundleConstant.ID); + login = extras.getString(BundleConstant.EXTRA); + } +} diff --git a/app/src/main/res/layout/activity_search_file.xml b/app/src/main/res/layout/activity_search_file.xml index 7e479b9b..75ac88bf 100644 --- a/app/src/main/res/layout/activity_search_file.xml +++ b/app/src/main/res/layout/activity_search_file.xml @@ -1,6 +1,7 @@ @@ -35,21 +36,43 @@ android:scaleType="centerCrop" android:src="@drawable/ic_back"/> - + android:textColorHint="?android:textColorSecondary"/> + + + \ No newline at end of file