package adonai.diary_browser;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.util.Pair;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.j256.ormlite.android.AndroidDatabaseResults;
import com.j256.ormlite.dao.CloseableIterator;
import com.j256.ormlite.dao.RuntimeExceptionDao;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.sql.SQLException;
import adonai.diary_browser.database.DbProvider;
import adonai.diary_browser.entities.AutocompleteItem;
import adonai.diary_browser.entities.AutocompleteItem.AutocompleteType;
import adonai.diary_browser.pages.CommentsPage;
import adonai.diary_browser.pages.DiaryPage;
/**
* Фрагмент основной активности дайри, отвечающий за обработку пунктов меню и кнопок {@link ActionBar}'a
* <br/>
* По историческим причинам логика всего контента, который присутствует в этом фрагменте, обрабатывается в активности.
*
* @see DiaryListActivity
*
* @author Адонай
*/
public class DiaryListFragment extends DiaryFragment {
public final static int GROUP_PAGE_LINKS = 100;
public final static int ITEM_PAGE_LINKS = 101;
private final URLAutocompleteQueryListener mUrlListener = new URLAutocompleteQueryListener();
private final URLAutocompleteSuggestionListener mUrlSuggestionListener = new URLAutocompleteSuggestionListener();
private URLAutocompleteAdapter mUrlAdapter; // created on attach to activity
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
mUrlAdapter = new URLAutocompleteAdapter(getActivity(), getPersistedUrlCompletions(""));
setHasOptionsMenu(true);
return inflater.inflate(R.layout.fragment_diary_list, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.diary_list_a, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
UserData mUser = ((DiaryActivity) getActivity()).getUser();
if (mUser == null) // not initialized, hide all
{
for (int i = 0; i < menu.size(); ++i)
menu.getItem(i).setVisible(false);
return;
}
// Только если это дневник
if (mCurrentComponent == DiaryListActivity.PART_WEB && mUser.getCurrentDiaryPage().getClass().equals(DiaryPage.class)) {
menu.findItem(R.id.menu_new_post).setVisible(true);
} else {
menu.findItem(R.id.menu_new_post).setVisible(false);
}
// Только если это пост
if (mCurrentComponent == DiaryListActivity.PART_WEB && mUser.getCurrentDiaryPage().getClass().equals(CommentsPage.class))
menu.findItem(R.id.menu_new_comment).setVisible(true);
else
menu.findItem(R.id.menu_new_comment).setVisible(false);
// Для всех веб-страничек
if (mCurrentComponent == DiaryListActivity.PART_WEB)
menu.setGroupVisible(R.id.group_web, true);
else
menu.setGroupVisible(R.id.group_web, false);
// Для всех списков
if (mCurrentComponent == DiaryListActivity.PART_LIST) {
menu.findItem(R.id.menu_share).setVisible(false);
menu.findItem(R.id.menu_subscr_list).setVisible(true);
menu.findItem(R.id.menu_manual_input).setVisible(true);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_manual_input).getActionView();
searchView.setQueryHint(getString(R.string.url_hint));
searchView.setSuggestionsAdapter(mUrlAdapter);
searchView.setOnQueryTextListener(mUrlListener);
searchView.setOnSuggestionListener(mUrlSuggestionListener);
final ImageView v = (ImageView) searchView.findViewById(R.id.search_button);
v.setImageResource(android.R.drawable.ic_menu_edit);
/*
//final EditText text = (EditText) searchView.findViewById(Resources.getSystem().getIdentifier("search_src_text", "id", "android"));
final EditText text = (EditText) searchView.findViewById(R.id.search_src_text);
text.setCursorVisible(false);
text.setHintTextColor(Color.LTGRAY);
text.setTextColor(Color.WHITE);
*/
} else {
menu.findItem(R.id.menu_share).setVisible(true);
menu.findItem(R.id.menu_subscr_list).setVisible(false);
menu.findItem(R.id.menu_manual_input).setVisible(false);
}
menu.removeGroup(GROUP_PAGE_LINKS);
// добавляем ссылки дневника, если они есть
if (mUser.getCurrentDiaryPage() instanceof DiaryPage) {
final SubMenu linksMenu = menu.addSubMenu(GROUP_PAGE_LINKS, 0, 0, R.string.diary_links);
for (String linkName : ((DiaryPage) mUser.getCurrentDiaryPage()).userLinks.keySet())
linksMenu.add(ITEM_PAGE_LINKS, 0, 0, linkName);
}
}
private String convertToSearchQuery(String somethingLikeURL) {
try {
if (!somethingLikeURL.startsWith("http")) {
if (somethingLikeURL.contains("diary.ru"))
somethingLikeURL = "http://" + somethingLikeURL;
else
somethingLikeURL = "http://diary.ru/search/?q=" + URLEncoder.encode(somethingLikeURL, "windows-1251");
}
} catch (UnsupportedEncodingException ignored) {
}
return somethingLikeURL;
}
private class URLAutocompleteAdapter extends CursorAdapter {
public URLAutocompleteAdapter(Context context, Cursor c) {
super(context, c, true);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_2, null);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TypedValue typedValue = new TypedValue();
getActivity().getTheme().resolveAttribute(R.attr.panel_background, typedValue, true);
view.setBackgroundColor(typedValue.data);
TextView urlText = (TextView) view.findViewById(android.R.id.text1);
TextView caption = (TextView) view.findViewById(android.R.id.text2);
RuntimeExceptionDao<AutocompleteItem, Long> acDao = DbProvider.getHelper().getAutocompleteDao();
AndroidDatabaseResults res = new AndroidDatabaseResults(cursor, acDao.getObjectCache());
AutocompleteItem item = acDao.mapSelectStarRow(res);
urlText.setText(item.getText());
if (item.getTitle() != null)
caption.setText(item.getTitle());
}
}
private class URLAutocompleteQueryListener implements SearchView.OnQueryTextListener {
@Override
public boolean onQueryTextSubmit(String query) {
getDiaryActivity().handleBackground(Utils.HANDLE_PICK_URL, new Pair<>(convertToSearchQuery(query), false));
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length() > 0)
mUrlAdapter.changeCursor(getPersistedUrlCompletions(newText));
return true;
}
}
@NonNull
private Cursor getPersistedUrlCompletions(@NonNull String containingText) {
try {
RuntimeExceptionDao<AutocompleteItem, Long> dao = DbProvider.getHelper().getAutocompleteDao();
CloseableIterator<AutocompleteItem> iterator = dao.queryBuilder()
.where()
.eq("type", AutocompleteType.URL)
.and()
.like("text", '%' + containingText + '%')
.iterator();
AndroidDatabaseResults narrowed = (AndroidDatabaseResults) iterator.getRawResults();
return narrowed.getRawCursor();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private class URLAutocompleteSuggestionListener implements SearchView.OnSuggestionListener {
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
@Override
public boolean onSuggestionClick(int position) {
try {
final Cursor cur = (Cursor) mUrlAdapter.getItem(position);
RuntimeExceptionDao<AutocompleteItem, Long> dao = DbProvider.getHelper().getAutocompleteDao();
AutocompleteItem ai = dao.getSelectStarRowMapper().mapRow(new AndroidDatabaseResults(cur, dao.getObjectCache()));
getDiaryActivity().handleBackground(Utils.HANDLE_PICK_URL, new Pair<>(ai.getText(), false));
return true;
} catch (SQLException e) {
Log.e("DB", "Exception mapping row " + position, e);
return false;
}
}
}
}