package com.lgq.rssreader;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.google.gson.Gson;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
import com.lgq.rssreader.adapter.BlogAdapter;
import com.lgq.rssreader.adapter.ChannelAdapter;
import com.lgq.rssreader.controls.SystemBarTintManager;
import com.lgq.rssreader.core.Config;
import com.lgq.rssreader.core.ReaderApp;
import com.lgq.rssreader.dal.BlogDalHelper;
import com.lgq.rssreader.dal.ImageRecordDalHelper;
import com.lgq.rssreader.entity.Blog;
import com.lgq.rssreader.entity.Channel;
import com.lgq.rssreader.entity.ImageRecord;
import com.lgq.rssreader.enums.RssAction;
import com.lgq.rssreader.enums.RssTab;
import com.lgq.rssreader.enums.Token;
import com.lgq.rssreader.parser.HttpResponseHandler;
import com.lgq.rssreader.parser.FeedlyParser;
import com.lgq.rssreader.parser.RssParser;
import com.lgq.rssreader.task.DownloadService;
import com.lgq.rssreader.task.ImageTask;
import com.lgq.rssreader.utils.FileHelper;
import com.lgq.rssreader.utils.Helper;
import com.lgq.rssreader.utils.NotificationHelper;
import com.viewpagerindicator.TabPageIndicator;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
import android.widget.HeaderViewListAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
/**
* An activity representing a list of Blogs. This activity
* has different presentations for handset and tablet-size devices. On
* handsets, the activity presents a list of items, which when touched,
* lead to a {@link BlogContentActivity} representing
* item details. On tablets, the activity presents the list of items and
* item details side-by-side using two vertical panes.
* <p>
* The activity makes heavy use of fragments. The list of items is a
* {@link FeedListFragment} and the item details
* (if present) is a {@link BlogContentFragment}.
* <p>
* This activity also implements the required
* {@link FeedListFragment.Callbacks} interface
* to listen for item selections.
*/
public class MainActivity extends SlidingFragmentActivity
implements FeedListFragment.Callbacks {
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
*/
private boolean mTwoPane;
public SlidingMenu mSlidingMenu;
private static LinkedHashMap<String, RssTab> CONTENT;
private Channel channel;
private Blog blog;
public boolean isLoaded;
private HashMap<Integer, Fragment> cache = new HashMap<Integer, Fragment>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// }
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//container.setPadding(0, Helper.getStatusBarHeight(), 0, 0);
SystemBarTintManager manager = new SystemBarTintManager(this);
manager.setStatusBarTintEnabled(true);
//manager.setStatusBarTintResource(R.drawable.translucent_status_bar);
manager.setStatusBarTintColor(Color.parseColor("#2DBD60"));
manager.setNavigationBarTintEnabled(true);
manager.setNavigationBarTintResource(R.drawable.transparent_bg);
manager.setNavigationBarAlpha((float) 0.3);
//manager.setNavigationBarTintColor(getResources().getColor(android.R.color.transparent));
}
setContentView(R.layout.activity_main);
//LinearLayout container = (LinearLayout)findViewById(R.id.container);
isLoaded = false;
if (findViewById(R.id.blog_detail_container) != null) {
// The detail container view will be present only in the
// large-screen layouts (res/values-large and
// res/values-sw600dp). If this view is present, then the
// activity should be in two-pane mode.
mTwoPane = true;
// In two-pane mode, list items should be given the
// 'activated' state when touched.
((FeedListFragment) getSupportFragmentManager()
.findFragmentById(R.id.blog_list))
.setActivateOnItemClick(true);
}
//启动线程检测html文件是否存在,检测缓存文件大小是否删除
new Thread(){
@Override
public void run() {
Helper.saveHtml(MainActivity.this, false);
//try to start service
SharedPreferences pref = ReaderApp.getPreferences();
boolean bStartService = ReaderApp.getProfile() != null && !pref.contains("lastDownloaTime");
// if(!bStartService){
// bStartService = !Helper.isServiceRun();
// }
bStartService = true;
if(bStartService){
Intent i = new Intent(MainActivity.this, DownloadService.class);
i.setAction(DownloadService.ACTION_BOOT_COMPLETED);
MainActivity.this.startService(i);
}
final long size = FileHelper.getImageFolderSize();
if(size > ReaderApp.getSettings().CacheSize){
MainActivity.this.runOnUiThread(new Runnable(){
public void run(){
AlertDialog dialog = NotificationHelper.BuildDialogForClean(MainActivity.this, size);
dialog.show();
}
});
}
}
}.start();
initSlidingMenu();
initIndicatorPager();
ImageButton btnLeft =( (ImageButton) findViewById(R.id.ivTitleBtnLeft));
btnLeft.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mSlidingMenu.toggle();
}
});
ImageButton btnRight =((ImageButton) findViewById(R.id.ivTitleBtnRight));
btnRight.setOnClickListener(new OnClickListener(){
@Override
public void onClick(final View v) {
// ViewPager pager = (ViewPager)findViewById(R.id.pager);
// PivotPagerAdapter pivot = (PivotPagerAdapter)pager.getAdapter();
//
// FeedListFragment channel = (FeedListFragment)pivot.getItem(RssTab.Home.ordinal());
//
// Animation anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
// v.startAnimation(anim);
//
// channel.loadChannel();
loadChannel();
}
});
if(ReaderApp.getToken(Token.AccessToken).length() == 0){
Intent i = new Intent(this,LoginActivity.class);
startActivityForResult(i, 0);
}
//loadChannel();
Animation anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
findViewById(R.id.ivTitleBtnRight).startAnimation(anim);
}
private void loadChannel(){
ViewPager pager = (ViewPager)findViewById(R.id.pager);
PivotPagerAdapter pivot = (PivotPagerAdapter)pager.getAdapter();
//FeedListFragment channel = (FeedListFragment)pivot.instantiateItem(pager, RssTab.Home.ordinal());
FeedListFragment channel = (FeedListFragment)pivot.getItem(RssTab.Home.ordinal());
channel.setCallbacks(this);
channel.loadChannel();
Animation anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
findViewById(R.id.ivTitleBtnRight).startAnimation(anim);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case 0:
Toast.makeText(ReaderApp.getAppContext(), ReaderApp.getAppContext().getResources().getString(R.string.main_loadingdata), Toast.LENGTH_SHORT).show();
loadChannel();
break;
case 1:
Log.i("RssReader", "Need to refresh count in list");
boolean needUpdate = false;
if(data != null)
needUpdate = data.getBooleanExtra("NeedUpdate", false);
if(needUpdate){
loadChannel();
}
break;
default:
break;
}
}
@Override
protected void onResume(){
if(ReaderApp.getPreferences().contains("reset_local")){
Boolean val = ReaderApp.getPreferences().getBoolean("reset_local", false);
if(val){
ReaderApp.getPreferences().edit().remove("reset_local").commit();
restartActivity();
}
}
if(ReaderApp.getPreferences().contains("forceRefresh")){
Boolean val = ReaderApp.getPreferences().getBoolean("forceRefresh", false);
if(val){
ReaderApp.getPreferences().edit().remove("forceRefresh").commit();
loadChannel();
}
}
super.onResume();
}
private void initIndicatorPager(){
CONTENT = new LinkedHashMap<String, RssTab>();
CONTENT.put(getString(R.string.home), RssTab.Home);
CONTENT.put(getString(R.string.all),RssTab.All);
//CONTENT.put(this.getString(R.string.recommend),
CONTENT.put(getString(R.string.unread), RssTab.Unread);
CONTENT.put(getString(R.string.star), RssTab.Star);
CONTENT.put(getString(R.string.gallery), RssTab.Gallery);
FragmentPagerAdapter adapter = new PivotPagerAdapter(getSupportFragmentManager(), initTabs());
ViewPager pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
private List<Fragment> initTabs(){
List<Fragment> views=new ArrayList<Fragment>();
RssTab[] values = new RssTab[CONTENT.size()];
CONTENT.values().toArray(values);
FeedListFragment home = new FeedListFragment();
Bundle h = new Bundle();
home.setInflater(this);
h.putInt(FeedListFragment.STATE_TAB, values[0].ordinal());
home.setArguments(h);
FeedListFragment all = new FeedListFragment();
Bundle a = new Bundle();
all.setInflater(this);
a.putInt(FeedListFragment.STATE_TAB, values[1].ordinal());
all.setArguments(a);
FeedListFragment unread = new FeedListFragment();
Bundle u = new Bundle();
unread.setInflater(this);
u.putInt(FeedListFragment.STATE_TAB, values[2].ordinal());
unread.setArguments(u);
FeedListFragment star = new FeedListFragment();
Bundle s = new Bundle();
star.setInflater(this);
s.putInt(FeedListFragment.STATE_TAB, values[3].ordinal());
star.setArguments(s);
ImageListFragment gallery = new ImageListFragment();
Bundle g = new Bundle();
g.putInt(FeedListFragment.STATE_TAB, values[4].ordinal());
gallery.setArguments(g);
views.add(home);
views.add(all);
views.add(unread);
views.add(star);
views.add(gallery);
return views;
}
class PivotPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PivotPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
// Fragment frag = null;
//
// if(cache.get(position) != null)
// return cache.get(position);
//
// RssTab[] values = new RssTab[CONTENT.size()];
// CONTENT.values().toArray(values);
//
// switch(position){
// case 0:
// case 1:
// case 2:
// case 3:
// //case 4:
// FeedListFragment home = new FeedListFragment();
// Bundle f = new Bundle();
// f.putInt(FeedListFragment.STATE_TAB, values[position].ordinal());
// home.setArguments(f);
// frag = home;
// break;
// case 4:
// frag = new ImageListFragment();
// break;
// }
//
// cache.put(position, frag);
//
// return frag;
return fragments.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
String[] keys = new String[CONTENT.keySet().size()];
CONTENT.keySet().toArray(keys);
return keys[position].toUpperCase();
}
@Override
public int getCount() {
return CONTENT.size();
}
}
public class PivotOnClickListener implements View.OnClickListener {
private int index = 0;
public PivotOnClickListener(int i) {
index = i;
}
@Override
public void onClick(View v) {
((ViewPager)findViewById(R.id.pager)).setCurrentItem(index);
}
};
private void initSlidingMenu() {
setBehindContentView(R.layout.activity_left_menu);
FragmentTransaction mFragementTransaction = getSupportFragmentManager().beginTransaction();
Fragment mFrag = new MenuFragment();
mFragementTransaction.replace(R.id.leftmenu, mFrag);
mFragementTransaction.commit();
mSlidingMenu = getSlidingMenu();
mSlidingMenu.setMode(SlidingMenu.LEFT);
mSlidingMenu.setBehindOffsetRes(R.dimen.SlidingMenuOffset);
mSlidingMenu.setFadeDegree(0.35f);
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
//mSlidingMenu .setShadowDrawable(R.drawable.shadow);
mSlidingMenu.setFadeEnabled( true);
mSlidingMenu.setBehindScrollScale(0.333f);
}
/**
* Callback method from {@link FeedListFragment.Callbacks}
* indicating that the item with the given ID was selected.
*/
@Override
public void onItemSelected(Object obj, RssTab tab) {
Serializable s = null;
if(obj instanceof Blog){
blog = (Blog)obj;
s = blog;
Intent detailIntent = new Intent(this, BlogContentActivity.class);
Bundle arguments = new Bundle();
arguments.putSerializable(BlogContentActivity.CURRENT, s);
arguments.putSerializable(BlogContentActivity.ARG_TAB_ID, tab);
detailIntent.putExtras(arguments);
startActivity(detailIntent);
}
if(obj instanceof Channel){
channel = (Channel)obj;
s = channel;
Intent detailIntent = new Intent(this, BlogListActivity.class);
Bundle arguments = new Bundle();
arguments.putSerializable(BlogContentActivity.ARG_ITEM_ID, s);
detailIntent.putExtras(arguments);
//startActivity(detailIntent);
startActivityForResult(detailIntent, 1);
}
}
public boolean IsShowQuitHints=false;
private static Boolean isExit = false;
public static Boolean isRootFolder = true;
private void exitBy2Click()
{
Timer tExit = null;
if(isExit == false )
{
isExit = true;
Toast.makeText(this, getResources().getString(R.string.main_exit), Toast.LENGTH_SHORT).show();
tExit = new Timer();
tExit.schedule(new TimerTask() {
@Override
public void run() {
isExit = false;
}
}, 2000);
}else{
finish();
System.exit(0);
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
if(!isRootFolder){
ViewPager pager = (ViewPager)findViewById(R.id.pager);
if(pager.getCurrentItem() == RssTab.Home.ordinal()){
PivotPagerAdapter adapter = (PivotPagerAdapter)pager.getAdapter();
FeedListFragment fragment = (FeedListFragment)adapter.getItem(RssTab.Home.ordinal());
if(fragment != null && fragment.getListView() != null && fragment.getListView().getAdapter() != null){
HeaderViewListAdapter wrap = (HeaderViewListAdapter)fragment.getListView().getAdapter();
ChannelAdapter channelAdapter = (ChannelAdapter)wrap.getWrappedAdapter();
channelAdapter.ResetData(Helper.getChannels());
isRootFolder = true;
}
}
}else{
exitBy2Click();
}
return true;
}else if(keyCode==KeyEvent.KEYCODE_SEARCH){
Intent intent = new Intent(MainActivity.this,SearchActivity.class);
startActivity(intent);
return true;
}else if(keyCode==KeyEvent.KEYCODE_MENU){
mSlidingMenu.toggle();
return true;
}else {
return super.onKeyDown(keyCode, event);
}
}
private void restartActivity() {
Log.d("RssReader", "Restart activity");
Intent intent = getIntent();
finish();
startActivity(intent);
}
@Override
public void onDestroy(){
super.onDestroy();
ReaderApp.stopListener();
}
public void switchContent(Fragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, fragment).commit();
getSlidingMenu().showContent();
}
@Override
public void onSyncComplete(Object c, RssTab tab) {
ImageButton btnRight =((ImageButton)findViewById(R.id.ivTitleBtnRight));
if(btnRight != null)
btnRight.clearAnimation();
}
}