package org.softeg.slartus.forpdaplus.listfragments.news;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.PauseOnScrollListener;
import org.softeg.slartus.forpdaapi.IListItem;
import org.softeg.slartus.forpdaapi.ListInfo;
import org.softeg.slartus.forpdaapi.News;
import org.softeg.slartus.forpdaplus.App;
import org.softeg.slartus.forpdaplus.Client;
import org.softeg.slartus.forpdaplus.IntentActivity;
import org.softeg.slartus.forpdaplus.MainActivity;
import org.softeg.slartus.forpdaplus.R;
import org.softeg.slartus.forpdaplus.classes.MenuListDialog;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.common.AppLog;
import org.softeg.slartus.forpdaplus.controls.ListViewLoadMoreFooter;
import org.softeg.slartus.forpdaplus.db.CacheDbHelper;
import org.softeg.slartus.forpdaplus.fragments.NewsFragment;
import org.softeg.slartus.forpdaplus.listfragments.BaseTaskListFragment;
import org.softeg.slartus.forpdaplus.listfragments.adapters.NewsListAdapter;
import org.softeg.slartus.forpdaplus.listtemplates.NewsBrickInfo;
import org.softeg.slartus.forpdaplus.prefs.Preferences;
import org.softeg.slartus.forpdaplus.tabs.ListViewMethodsBridge;
import org.softeg.sqliteannotations.BaseDao;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*
* Created by slinkin on 20.02.14.
*/
public class NewsListFragment extends BaseTaskListFragment implements ActionBar.OnNavigationListener{
/*
* Ключ подкаталога новостей: news, articles..
*/
public static final String TAG_EXTRA_KEY = "TAG_EXTRA_KEY";
public static final String NEWS_LIST_URL_KEY = "NEWS_LIST_URL_KEY";
protected ArrayList<News> mData = new ArrayList<>();
protected ArrayList<News> mLoadResultList;
protected ArrayList<News> mCacheList = new ArrayList<>();
public class NewsCategoryItem {
public String Path;
public String Title;
public String Tag;
public NewsCategoryItem(String tag, String path, String title) {
this.Tag = tag;
this.Path = path;
this.Title = title;
}
}
public class NavigationListAdapter extends BaseAdapter implements SpinnerAdapter {
private final LayoutInflater mInflater;
public NavigationListAdapter(Context context) {
super();
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return getItems().size();
}
@Override
public Object getItem(int i) {
return getItems().get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder holder;
if (view == null) {
view = mInflater.inflate(R.layout.news_navigation_item, viewGroup, false);
holder = new ViewHolder();
assert view != null;
holder.text1 = (TextView) view.findViewById(R.id.text1);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
NewsCategoryItem item = getItems().get(i);
holder.text1.setText(item.Title);
return view;
}
class ViewHolder {
TextView text1;
}
}
private ArrayList<NewsCategoryItem> mItems = null;
private ArrayList<NewsCategoryItem> getItems() {
if (mItems == null) {
mItems = new ArrayList<>();
mItems.add(new NewsCategoryItem("", "Новости", "Все"));
mItems.add(new NewsCategoryItem("news", "Новости", "Новости"));
mItems.add(new NewsCategoryItem("articles", "Новости", "Статьи"));
mItems.add(new NewsCategoryItem("tag/how-to-android/", "Новости", " Android"));
mItems.add(new NewsCategoryItem("tag/how-to-ios/", "Новости", " iOS"));
mItems.add(new NewsCategoryItem("tag/how-to-wp/", "Новости", " WP"));
mItems.add(new NewsCategoryItem("articles/tag/interview/", "Новости", " Интервью"));
mItems.add(new NewsCategoryItem("software", "Новости", "Программы"));
mItems.add(new NewsCategoryItem("software/tag/programs-for-android", "Новости/Программы", " Android"));
mItems.add(new NewsCategoryItem("software/tag/programs-for-ios", "Новости/Программы", " iOS"));
mItems.add(new NewsCategoryItem("software/tag/programs-for-windows-phone-7", "Новости/Программы", " WP"));
mItems.add(new NewsCategoryItem("software/tag/devstory/", "Новости/Программы", " DevStory"));
mItems.add(new NewsCategoryItem("games", "Новости", "Игры"));
mItems.add(new NewsCategoryItem("games/tag/games-for-android", "Новости/Игры", " Android"));
mItems.add(new NewsCategoryItem("games/tag/games-for-ios", "Новости/Игры", " iOS"));
mItems.add(new NewsCategoryItem("games/tag/games-for-windows-phone-7", "Новости/Игры", " WP"));
mItems.add(new NewsCategoryItem("games/tag/devstory/", "Новости/Игры", " DevStory"));
mItems.add(new NewsCategoryItem("reviews", "Новости", "Обзоры"));
}
return mItems;
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
selectItem(itemPosition);
return true;
}
private void selectItem(int position) {
position = Math.min(position, getItems().size() - 1);// на всякий случай, если изменится в будущем кол-во разделов
String tag = getItems().get(position).Tag;
Preferences.News.setLastSelectedSection(position);
if(!tag.equals(mTag)) {
mTag = tag;
loadData(true);
}
}
NavigationListAdapter listAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getListView().setDivider(null);
getListView().setDividerHeight(0);
getListView().setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), false, true));
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden&getSupportActionBar()!=null){
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setListNavigationCallbacks(listAdapter, this);
getSupportActionBar().setSelectedNavigationItem(Preferences.News.getLastSelectedSection());
}
}
public NewsListFragment() {
super();
}
@Override
public String getListName() {
return "news_" + mTag;
}
@Override
public void onDestroy() {
super.onDestroy();
}
public static Fragment newInstance(String tag) {
NewsListFragment fragment = new NewsListFragment();
fragment.setBrickInfo(new NewsBrickInfo());
Bundle args = new Bundle();
args.putString(TAG_EXTRA_KEY, tag);
fragment.setArguments(args);
return fragment;
}
@Override
public void onResume() {
super.onResume();
removeArrow();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
removeArrow();
if (getArguments() != null) {
if (getArguments().containsKey(TAG_EXTRA_KEY)) {
mTag = getArguments().getString(TAG_EXTRA_KEY);
mTag = getItems().get(Preferences.News.getLastSelectedSection()).Tag;
}
if (getArguments().containsKey(NEWS_LIST_URL_KEY)) {
useCache = false;// не используем кеш для открытого по ссылке списка
mUrl = getArguments().getString(NEWS_LIST_URL_KEY);
}
}
listAdapter = new NavigationListAdapter(getActivity());
onHiddenChanged(false);
}
Boolean useCache = true;
@Override
public void saveCache() throws Exception {
if (!useCache) return;
CacheDbHelper cacheDbHelper = new CacheDbHelper(App.getContext());
SQLiteDatabase db = null;
try {
db = cacheDbHelper.getWritableDatabase();
BaseDao<News> baseDao = new BaseDao<>(App.getContext(), db, getListName(), News.class);
baseDao.createTable(db);
for (IListItem item : mData) {
News news = (News) item;
baseDao.insert(news);
}
} finally {
if (db != null)
db.close();
}
}
@Override
public void loadCache() throws IOException, IllegalAccessException, NoSuchFieldException, java.lang.InstantiationException {
mCacheList = new ArrayList<>();
if (!useCache) return;
CacheDbHelper cacheDbHelper = new CacheDbHelper(App.getContext());
SQLiteDatabase db = null;
try {
db = cacheDbHelper.getReadableDatabase();
BaseDao<News> baseDao = new BaseDao<>(App.getContext(), db, getListName(), News.class);
if (baseDao.isTableExists())
mCacheList.addAll(baseDao.getAll());
} finally {
if (db != null)
db.close();
}
}
@Override
protected void deliveryCache() {
mData.clear();
if (mCacheList != null) {
mData.addAll(mCacheList);
mCacheList.clear();
}
setCount();
mAdapter.notifyDataSetChanged();
}
protected BaseAdapter createAdapter() {
return new NewsListAdapter(getContext(), mData, ImageLoader.getInstance());
}
protected ListInfo mListInfo = new ListInfo();
private String mUrl = "http://4pda.ru/";
private String mTag = "";
@Override
public boolean inBackground(boolean isRefresh) throws Exception {
mListInfo = new ListInfo();
mListInfo.setFrom(isRefresh ? 0 : mData.size());
mLoadResultList = org.softeg.slartus.forpdaapi.NewsApi.getNews(Client.getInstance(), mUrl + mTag, mListInfo);
return true;
}
@Override
protected void deliveryResult(boolean isRefresh) {
if (isRefresh) {
mData.clear();
}
mData.addAll(mLoadResultList);
/*for (News item : mLoadResultList) {
mData.add(item);
}*/
mLoadResultList.clear();
}
@Override
public void setCount() {
int count = Math.max(mListInfo.getOutCount(), mData.size());
mListViewLoadMoreFooter.setCount(mData.size(), count);
mListViewLoadMoreFooter.setState(
mData.size() == count ? ListViewLoadMoreFooter.STATE_FULL_DOWNLOADED :
ListViewLoadMoreFooter.STATE_LOAD_MORE
);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) {
if(!v.hasWindowFocus()) return;
try {
id = ListViewMethodsBridge.getItemId(getActivity(), position, id);
if (id < 0 || getAdapter().getCount() <= id) return;
Object o = getAdapter().getItem((int) id);
if (o == null)
return;
final News news = (News) o;
if (TextUtils.isEmpty(news.getId())) return;
if(!IntentActivity.tryShowSpecial(getMainActivity(), news.getUrl(), false))
MainActivity.addTab(news.getTitle().toString(), news.getUrl(), NewsFragment.newInstance(news.getUrl()));
mAdapter.notifyDataSetChanged();
} catch (Throwable ex) {
AppLog.e(getActivity(), ex);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
if (info.id == -1) return;
Object o = getAdapter().getItem((int) info.id);
if (o == null)
return;
final News news = (News) o;
if (TextUtils.isEmpty(news.getId())) return;
List<MenuListDialog> list = new ArrayList<>();
ExtUrl.addUrlMenu(mHandler, getContext(), list, news.getUrl(), news.getId(),news.getTitle().toString());
ExtUrl.showContextDialog(getContext(), null, list);
}
}