package org.softeg.slartus.forpdaplus.fragments.search;/* * Created by slinkin on 24.04.2014. */ import android.app.Dialog; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.Spinner; import com.afollestad.materialdialogs.MaterialDialog; import org.softeg.slartus.forpdaapi.ListInfo; import org.softeg.slartus.forpdaapi.Topic; import org.softeg.slartus.forpdaapi.search.SearchApi; import org.softeg.slartus.forpdaapi.search.SearchSettings; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.Client; import org.softeg.slartus.forpdaplus.MainActivity; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.classes.common.ArrayUtils; import org.softeg.slartus.forpdaplus.classes.common.StringUtils; import org.softeg.slartus.forpdaplus.db.ForumsTable; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class SearchSettingsDialogFragment extends DialogFragment { private static final String SEARCH_SETTINGS_KEY = "SEARCH_SETTINGS_KEY"; public interface ISearchDialogListener { void doSearchDialogPositiveClick(SearchSettings searchSettings); void doSearchDialogNegativeClick(); } private EditText query_edit, username_edit; private CheckBox subforums_check, topics_check; private Spinner source_spinner, sort_spinner, result_spinner, forumsSpinner; private View forumsProgress, topicsProgress; private View topics_group, forums_group, result_group, sort_group, source_group; private ImageButton forHideButton; private Button rememberButton; private LinearLayout forHide; public static final int FORUMS_DIALOG_REQUEST = 1; protected Bundle args = new Bundle(); public static void showSearchSettingsDialog(FragmentActivity activity, SearchSettings searchSettings) { FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); Fragment prev = activity.getSupportFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } ft.addToBackStack(null); // Create and show the dialog. DialogFragment newFragment = createSettingsFragment(searchSettings); newFragment.show(ft, "dialog"); } @Override public void onCreate(android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); args.clear(); if (getArguments() != null) { args.putAll(getArguments()); } if (savedInstanceState != null) { args.putAll(savedInstanceState); } } @Override public void onSaveInstanceState(android.os.Bundle outState) { if (args != null) outState.putAll(args); } public static SearchSettings createDefaultSearchSettings() { SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_FORUM); searchSettings.load(App.getInstance().getPreferences()); searchSettings.setQuery(""); searchSettings.setUserName(""); searchSettings.getTopicIds().clear(); return searchSettings; } public static SearchSettings createForumSearchSettings() { SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_FORUM); searchSettings.load(App.getInstance().getPreferences()); searchSettings.setQuery(""); searchSettings.setUserName(""); searchSettings.getForumsIds().clear(); searchSettings.getForumsIds().add("all"); searchSettings.getTopicIds().clear(); return searchSettings; } public static SearchSettings createTopicSearchSettings(CharSequence topicId) { SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_TOPIC); searchSettings.setQuery(""); searchSettings.setUserName(""); searchSettings.getForumsIds().clear(); searchSettings.getForumsIds().add("all"); searchSettings.getTopicIds().clear(); if (topicId != null) searchSettings.getTopicIds().add(topicId.toString()); searchSettings.setSource(SearchSettings.SOURCE_POSTS); return searchSettings; } public static SearchSettings createUserTopicsSearchSettings(String userNick) { SharedPreferences prefs = App.getInstance().getPreferences(); SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_USER_TOPICS); searchSettings.load(prefs); searchSettings.setQuery(""); searchSettings.setResultView(SearchSettings.RESULT_VIEW_TOPICS); searchSettings.setSource(SearchSettings.SOURCE_TOPICS); searchSettings.setUserName(userNick); searchSettings.getTopicIds().clear(); searchSettings.getForumsIds().clear(); searchSettings.getForumsIds().add("all"); return searchSettings; } public static SearchSettings createUserPostsSearchSettings(String userNick) { SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_USER_POSTS); searchSettings.load(App.getInstance().getPreferences()); searchSettings.setSort(SearchSettings.RESULT_SORT_DATE_DESC); searchSettings.setQuery(""); searchSettings.setResultView(SearchSettings.RESULT_VIEW_POSTS); searchSettings.setSource(SearchSettings.SOURCE_POSTS); searchSettings.setUserName(userNick); searchSettings.getTopicIds().clear(); searchSettings.getForumsIds().clear(); searchSettings.getForumsIds().add("all"); return searchSettings; } public static SearchSettings createUserPostsInTopicSearchSettings(String userNick, String topic) { SearchSettings searchSettings = new SearchSettings(SearchSettings.SEARCH_TYPE_USER_POSTS); searchSettings.load(App.getInstance().getPreferences()); searchSettings.setSort(SearchSettings.RESULT_SORT_DATE_DESC); searchSettings.setQuery(""); searchSettings.setResultView(SearchSettings.RESULT_VIEW_POSTS); searchSettings.setSource(SearchSettings.SOURCE_POSTS); searchSettings.setUserName(userNick); searchSettings.getTopicIds().clear(); searchSettings.getTopicIds().add(topic); searchSettings.getForumsIds().clear(); searchSettings.getForumsIds().add("all"); return searchSettings; } public static SearchSettingsDialogFragment createSettingsFragment(SearchSettings searchSettings) { Bundle args = new Bundle(); args.putParcelable(SEARCH_SETTINGS_KEY, searchSettings); SearchSettingsDialogFragment fragment = new SearchSettingsDialogFragment(); fragment.setArguments(args); return fragment; } public static SearchSettingsDialogFragment restartSearch(SearchSettings searchSettings) { return createSettingsFragment(searchSettings); } @Override public void onActivityCreated(android.os.Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); loadPreferences(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { if (savedInstanceState != null) { args.putAll(savedInstanceState); } LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.search_settings_fragment, null); assert view != null; query_edit = (EditText) view.findViewById(R.id.query_edit); username_edit = (EditText) view.findViewById(R.id.username_edit); subforums_check = (CheckBox) view.findViewById(R.id.subforums_check); topics_check = (CheckBox) view.findViewById(R.id.topics_check); source_spinner = (Spinner) view.findViewById(R.id.source_spinner); sort_spinner = (Spinner) view.findViewById(R.id.sort_spinner); result_spinner = (Spinner) view.findViewById(R.id.result_spinner); topics_group = view.findViewById(R.id.topics_group); forumsProgress = view.findViewById(R.id.forums_progress); topicsProgress = view.findViewById(R.id.topics_progress); forums_group = view.findViewById(R.id.forums_group); source_group = view.findViewById(R.id.source_group); sort_group = view.findViewById(R.id.sort_group); result_group = view.findViewById(R.id.result_group); forHideButton = (ImageButton) view.findViewById(R.id.forHideButton); forHide = (LinearLayout) view.findViewById(R.id.forHide); rememberButton = (Button) view.findViewById(R.id.remember); final RotateAnimation rotate = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setDuration(250); final Runnable hideRunnable = () -> forHide.setVisibility(View.VISIBLE); forHideButton.setOnClickListener(v -> { if (forHide.getVisibility() == View.VISIBLE) { forHideButton.startAnimation(rotate); forHide.setVisibility(View.GONE); } else { forHideButton.startAnimation(rotate); new Handler().postDelayed(hideRunnable, 250); } }); if (view.findViewById(R.id.forums_button) != null) { view.findViewById(R.id.forums_button).setOnClickListener(view1 -> { DialogFragment newFragment = ForumsTreeDialogFragment.newInstance(true, getSearchSettings().getForumsIds()); newFragment.setTargetFragment(SearchSettingsDialogFragment.this, FORUMS_DIALOG_REQUEST); newFragment.show(getActivity().getSupportFragmentManager(), "dialog"); }); } if (view.findViewById(R.id.forums_spinner) != null) { initSpinner(view); } MaterialDialog adb = new MaterialDialog.Builder(getActivity()) .customView(view, true) .cancelable(true) .title(R.string.search) .positiveText(R.string.find) //.negativeText(R.string.cancel) .onPositive((materialDialog, dialogAction) -> MainActivity.startForumSearch(createSearchSettings())) .build(); // в поиске по теме не показываем "запомнить настройки" if (SearchSettings.SEARCH_TYPE_FORUM.equals(getSearchSettings().getSearchType())) { rememberButton.setVisibility(View.VISIBLE); rememberButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SearchSettings searchSettings = createSearchSettings(); searchSettings.setQuery(""); searchSettings.setUserName(""); searchSettings.save(App.getInstance().getPreferences().edit()).apply(); } }); } adb.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); final MaterialDialog d = adb; return d; } private SearchSettings createSearchSettings() { SearchSettings searchSettings = getSearchSettings(); searchSettings.setQuery(query_edit.getText().toString()); searchSettings.setUserName(username_edit.getText().toString()); searchSettings.setSearchInSubForums(subforums_check.isChecked()); searchSettings.setSource(getResources().getStringArray(R.array.SearchSourceValues)[(int) source_spinner.getSelectedItemId()]); searchSettings.setSort(getResources().getStringArray(R.array.SearchSortValues)[(int) sort_spinner.getSelectedItemId()]); searchSettings.setResultView(getResources().getStringArray(R.array.SearchResultValues)[(int) result_spinner.getSelectedItemId()]); if (!topics_check.isChecked()) searchSettings.getTopicIds().clear(); return searchSettings; } @SuppressWarnings("ConstantConditions") @Override public void onActivityResult(int requestCode, int resultCode, android.content.Intent data) { if (requestCode == FORUMS_DIALOG_REQUEST) { if (resultCode == ForumsTreeDialogFragment.OK_RESULT) { getSearchSettings().getForumsIds().clear(); getSearchSettings().getForumsIds().addAll(Arrays.asList(data.getExtras().getStringArray(ForumsTreeDialogFragment.FORUM_IDS_KEY))); loadForums(getSearchSettings().getForumsIds()); } } else super.onActivityResult(requestCode, resultCode, data); } private SearchSettings getSearchSettings() { return args.getParcelable(SEARCH_SETTINGS_KEY); } private void loadPreferences() { SearchSettings searchSettings = getSearchSettings(); assert searchSettings != null; String query = searchSettings.getQuery(); if (query != null) { query_edit.setText(query); if (query.length() >= 0) { query_edit.setSelection(query.length()); } } String username = searchSettings.getUserName(); if (username != null) { username_edit.setText(username); if (username.length() >= 0) { username_edit.setSelection(username.length()); } } subforums_check.setChecked(searchSettings.getIsSubForums()); source_spinner.setSelection(ArrayUtils.indexOf(searchSettings.getSource(), getResources().getStringArray(R.array.SearchSourceValues))); sort_spinner.setSelection(ArrayUtils.indexOf(searchSettings.getSort(), getResources().getStringArray(R.array.SearchSortValues))); result_spinner.setSelection(ArrayUtils.indexOf(searchSettings.getResultView(), getResources().getStringArray(R.array.SearchResultValues))); loadForums(searchSettings.getForumsIds()); loadTopics(searchSettings.getTopicIds()); switch (searchSettings.getSearchType()) { case SearchSettings.SEARCH_TYPE_TOPIC: forums_group.setVisibility(View.GONE); source_group.setVisibility(View.GONE); result_group.setVisibility(View.GONE); break; case SearchSettings.SEARCH_TYPE_USER_POSTS: source_group.setVisibility(View.GONE); result_group.setVisibility(View.GONE); break; case SearchSettings.SEARCH_TYPE_USER_TOPICS: source_group.setVisibility(View.GONE); result_group.setVisibility(View.GONE); break; default: forums_group.setVisibility(View.VISIBLE); source_group.setVisibility(View.VISIBLE); result_group.setVisibility(View.VISIBLE); } } private void initSpinner(View parentView) { forumsSpinner = (Spinner) parentView.findViewById(R.id.forums_spinner); forumsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { if (i == 0) return; forumsSpinner.setSelection(0); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); } private void loadForums(final Collection<String> checkedForumIds) { final Handler handler = new Handler(); forumsProgress.setVisibility(View.VISIBLE); new Thread(new Runnable() { @Override public void run() { try { final List<String> forums = ForumsTable.loadForumTitlesList(checkedForumIds); if (checkedForumIds.contains("all")) forums.add(0, App.getContext().getString(R.string.all_forums)); forums.add(0, App.getContext().getString(R.string.total) + ": " + forums.size()); handler.post(new Runnable() { @Override public void run() { if (getActivity() == null) return; ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, forums); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); forumsSpinner.setAdapter(adapter); forumsProgress.setVisibility(View.GONE); } }); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void loadTopics(final Collection<String> topicIds) { topics_group.setVisibility(topicIds.size() == 0 ? View.GONE : View.VISIBLE); if (topicIds.size() != 0) { topics_check.setText(StringUtils.join(new ArrayList(topicIds), ",")); topicsProgress.setVisibility(View.VISIBLE); final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { SearchSettings settings = new SearchSettings(SearchSettings.SEARCH_TYPE_FORUM); settings.getTopicIds().addAll(topicIds); settings.setSource(SearchSettings.SOURCE_TOPICS); settings.setResultView(SearchSettings.RESULT_VIEW_TOPICS); ArrayList<Topic> topics = new ArrayList<>(); try { topics = SearchApi.getSearchTopicsResult(Client.getInstance(), settings.getSearchQuery(), new ListInfo()); } catch (IOException | URISyntaxException e) { e.printStackTrace(); } final StringBuilder sb = new StringBuilder(); for (Topic topic : topics) { if (sb.length() > 0) sb.append(", "); sb.append(topic.getTitle()); } handler.post(new Runnable() { @Override public void run() { topics_check.setText(sb.toString()); topicsProgress.setVisibility(View.GONE); } }); } }).start(); } } }