/**
* Android ownCloud News
*
* @author David Luhmer
* @copyright 2013 David Luhmer david-dev@live.de
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.luhmer.owncloudnewsreader;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.design.widget.Snackbar;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.ViewDragHelper;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.lang.reflect.Field;
import butterknife.Bind;
import butterknife.ButterKnife;
import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter;
import de.luhmer.owncloudnewsreader.LoginDialogFragment.LoginSuccessfullListener;
import de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter;
import de.luhmer.owncloudnewsreader.adapter.RecyclerItemClickListener;
import de.luhmer.owncloudnewsreader.adapter.ViewHolder;
import de.luhmer.owncloudnewsreader.authentication.AccountGeneral;
import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;
import de.luhmer.owncloudnewsreader.database.model.RssItem;
import de.luhmer.owncloudnewsreader.events.podcast.FeedPanelSlideEvent;
import de.luhmer.owncloudnewsreader.helper.DatabaseUtils;
import de.luhmer.owncloudnewsreader.helper.PostDelayHandler;
import de.luhmer.owncloudnewsreader.helper.ThemeChooser;
import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener;
import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader;
import de.luhmer.owncloudnewsreader.services.DownloadImagesService;
import de.luhmer.owncloudnewsreader.services.OwnCloudSyncService;
import de.luhmer.owncloudnewsreader.services.events.SyncFailedEvent;
import de.luhmer.owncloudnewsreader.services.events.SyncFinishedEvent;
import de.luhmer.owncloudnewsreader.services.events.SyncStartedEvent;
import uk.co.deanwild.materialshowcaseview.MaterialShowcaseSequence;
import uk.co.deanwild.materialshowcaseview.ShowcaseConfig;
/**
* An activity representing a list of NewsReader. This activity has different
* presentations for handset and tablet-size devices.
* The activity makes heavy use of fragments. The list of items is a
* {@link NewsReaderListFragment} and the item details (if present) is a
* {@link NewsReaderDetailFragment}.
* <p>
* This activity also implements the required
* {@link NewsReaderListFragment.Callbacks} interface to listen for item
* selections.
*/
public class NewsReaderListActivity extends PodcastFragmentActivity implements
NewsReaderListFragment.Callbacks,RecyclerItemClickListener,SwipeRefreshLayout.OnRefreshListener {
private static final String TAG = NewsReaderListActivity.class.getCanonicalName();
public static final String FOLDER_ID = "FOLDER_ID";
public static final String FEED_ID = "FEED_ID";
public static final String ITEM_ID = "ITEM_ID";
public static final String TITEL = "TITEL";
private static MenuItem menuItemUpdater;
private static MenuItem menuItemDownloadMoreItems;
//private Date mLastSyncDate = new Date(0);
private boolean mSyncOnStartupPerformed = false;
@Bind(R.id.toolbar) Toolbar toolbar;
private ServiceConnection mConnection = null;
@Nullable @Bind(R.id.drawer_layout)
protected DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
ThemeChooser.chooseTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newsreader);
ButterKnife.bind(this);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
initAccountManager();
//Init config --> if nothing is configured start the login dialog.
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if (mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) == null)
StartLoginFragment(NewsReaderListActivity.this);
Bundle args = new Bundle();
String userName = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null);
String url = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null);
args.putString("accountName", String.format("%s\n%s", userName, url));
NewsReaderListFragment newsReaderListFragment = new NewsReaderListFragment();
newsReaderListFragment.setArguments(args);
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.left_drawer, newsReaderListFragment)
.commit();
if (drawerLayout != null) {
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.empty_view_content, R.string.empty_view_content) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
togglePodcastVideoViewAnimation();
syncState();
EventBus.getDefault().post(new FeedPanelSlideEvent(false));
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
togglePodcastVideoViewAnimation();
reloadCountNumbersOfSlidingPaneAdapter();
syncState();
showTapLogoToSyncShowcaseView();
}
};
drawerLayout.setDrawerListener(drawerToggle);
try {
// increase the size of the drag margin to prevent starting a star swipe when
// trying to open the drawer.
Field mDragger = drawerLayout.getClass().getDeclaredField(
"mLeftDragger");
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger
.get(drawerLayout);
Field mEdgeSize = draggerObj.getClass().getDeclaredField(
"mEdgeSize");
mEdgeSize.setAccessible(true);
int edge = mEdgeSize.getInt(draggerObj);
mEdgeSize.setInt(draggerObj, edge * 3);
} catch (Exception e) {
e.printStackTrace();
}
}
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
if (drawerToggle != null)
drawerToggle.syncState();
if (savedInstanceState == null)//When the app starts (no orientation change)
{
StartDetailFragment(SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(), true, null, true);
}
//AppRater.app_launched(this);
//AppRater.rateNow(this);
UpdateButtonLayout();
}
private void showTapLogoToSyncShowcaseView() {
getSlidingListFragment().showTapLogoToSyncShowcaseView();
}
View.OnClickListener mSnackbarListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
//Toast.makeText(getActivity(), "button 1 pressed", 3000).show();
updateCurrentRssView();
}
};
private static final String ID_FEED_STRING = "ID_FEED_STRING";
private static final String IS_FOLDER_BOOLEAN = "IS_FOLDER_BOOLEAN";
private static final String OPTIONAL_FOLDER_ID = "OPTIONAL_FOLDER_ID";
private static final String LIST_ADAPTER_TOTAL_COUNT = "LIST_ADAPTER_TOTAL_COUNT";
private static final String LIST_ADAPTER_PAGE_COUNT = "LIST_ADAPTER_PAGE_COUNT";
/* (non-Javadoc)
* @see com.actionbarsherlock.app.SherlockFragmentActivity#onSaveInstanceState(android.os.Bundle)
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
safeInstanceState(outState);
super.onSaveInstanceState(outState);
}
/**
* Check if the account is in the Android Account Manager. If not it will be added automatically
*/
private void initAccountManager() {
AccountManager mAccountManager = AccountManager.get(this);
boolean isAccountThere = false;
Account[] accounts = mAccountManager.getAccounts();
for (Account account : accounts) {
if (account.type.intern().equals(AccountGeneral.ACCOUNT_TYPE)) {
isAccountThere = true;
}
}
//If the account is not in the Android Account Manager
if (!isAccountThere) {
//Then add the new account
Account account = new Account(getString(R.string.app_name), AccountGeneral.ACCOUNT_TYPE);
mAccountManager.addAccountExplicitly(account, "", new Bundle());
SyncIntervalSelectorActivity.SetAccountSyncInterval(this);
}
}
private void safeInstanceState(Bundle outState) {
NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();
if (ndf != null) {
outState.putLong(OPTIONAL_FOLDER_ID, ndf.getIdFeed() == null ? ndf.getIdFolder() : ndf.getIdFeed());
outState.putBoolean(IS_FOLDER_BOOLEAN, ndf.getIdFeed() == null);
outState.putLong(ID_FEED_STRING, ndf.getIdFeed() != null ? ndf.getIdFeed() : ndf.getIdFolder());
NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) ndf.getRecyclerView().getAdapter();
if (adapter != null) {
outState.putInt(LIST_ADAPTER_TOTAL_COUNT, adapter.getTotalItemCount());
outState.putInt(LIST_ADAPTER_PAGE_COUNT, adapter.getCachedPages());
}
}
}
private void restoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(ID_FEED_STRING) &&
savedInstanceState.containsKey(IS_FOLDER_BOOLEAN) &&
savedInstanceState.containsKey(OPTIONAL_FOLDER_ID)) {
NewsListRecyclerAdapter adapter = new NewsListRecyclerAdapter(this, getNewsReaderDetailFragment().recyclerView, this);
adapter.setTotalItemCount(savedInstanceState.getInt(LIST_ADAPTER_TOTAL_COUNT));
adapter.setCachedPages(savedInstanceState.getInt(LIST_ADAPTER_PAGE_COUNT));
getNewsReaderDetailFragment()
.getRecyclerView()
.setAdapter(adapter);
StartDetailFragment(savedInstanceState.getLong(OPTIONAL_FOLDER_ID),
savedInstanceState.getBoolean(IS_FOLDER_BOOLEAN),
savedInstanceState.getLong(ID_FEED_STRING),
false);
}
}
/* (non-Javadoc)
* @see com.actionbarsherlock.app.SherlockFragmentActivity#onRestoreInstanceState(android.os.Bundle)
*/
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
restoreInstanceState(savedInstanceState);
super.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (drawerToggle != null)
drawerToggle.syncState();
boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
showTapLogoToSyncShowcaseView();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (drawerToggle != null)
drawerToggle.onConfigurationChanged(newConfig);
}
public void reloadCountNumbersOfSlidingPaneAdapter() {
NewsReaderListFragment nlf = getSlidingListFragment();
if (nlf != null) {
nlf.ListViewNotifyDataSetChanged();
}
}
protected void updateCurrentRssView() {
NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();
if (ndf != null) {
//ndf.reloadAdapterFromScratch();
ndf.UpdateCurrentRssView(NewsReaderListActivity.this);
}
}
public void switchToAllUnreadItemsFolder() {
StartDetailFragment(SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(), true, null, true);
}
@Override
protected void onStart() {
Intent serviceIntent = new Intent(this, OwnCloudSyncService.class);
mConnection = generateServiceConnection();
if (!isMyServiceRunning(OwnCloudSyncService.class, this)) {
startService(serviceIntent);
}
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
super.onStart();
}
@Override
protected void onStop() {
unbindService(mConnection);
mConnection = null;
super.onStop();
}
private OwnCloudSyncService ownCloudSyncService;
private ServiceConnection generateServiceConnection() {
return new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
ownCloudSyncService = ((OwnCloudSyncService.OwnCloudSyncServiceBinder)binder).getService();
try {
//Start auto sync if enabled
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(NewsReaderListActivity.this);
if (mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, false)) {
if (!mSyncOnStartupPerformed) {
startSync();
mSyncOnStartupPerformed = true;
}
/*
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(new Date().getTime() - mLastSyncDate.getTime());
if(diffInMinutes >= 60) {
startSync();
mLastSyncDate = new Date();
}*/
}
UpdateButtonLayout();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
private void UpdateButtonLayoutWithHandler() {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run() {
UpdateButtonLayout();
}
});
}
@Subscribe
public void onEvent(SyncFailedEvent event) {
Toast.makeText(NewsReaderListActivity.this, event.exception().getLocalizedMessage(), Toast.LENGTH_LONG).show();
UpdateButtonLayoutWithHandler();
}
@Subscribe
public void onEvent(SyncStartedEvent event) {
UpdateButtonLayoutWithHandler();
}
@Subscribe
public void onEvent(SyncFinishedEvent event) {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run() {
UpdateButtonLayout();
syncFinishedHandler();
}
});
}
/**
* @return true if new items count was greater than 0
*/
private boolean syncFinishedHandler() {
ShowcaseConfig config = new ShowcaseConfig();
config.setDelay(300); // half second between each showcase view
MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(this, "SWIPE_LEFT_RIGHT_AND_PTR");
sequence.setConfig(config);
sequence.addSequenceItem(getNewsReaderDetailFragment().pbLoading,
"Pull-to-Refresh to sync with server", "GOT IT");
sequence.addSequenceItem(getNewsReaderDetailFragment().pbLoading,
"Swipe Left/Right to mark article as read", "GOT IT");
sequence.start();
NewsReaderListFragment newsReaderListFragment = getSlidingListFragment();
newsReaderListFragment.ReloadAdapter();
UpdateItemList();
UpdatePodcastView();
getSlidingListFragment().startAsyncTaskGetUserInfo();
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(NewsReaderListActivity.this);
int newItemsCount = mPrefs.getInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0);
if (newItemsCount > 0) {
int firstVisiblePosition = getNewsReaderDetailFragment().getFirstVisibleScrollPosition();
//Only show the update snackbar if scrollposition is not top.
if (firstVisiblePosition == 0) {
updateCurrentRssView();
} else {
Snackbar snackbar = Snackbar.make(findViewById(R.id.coordinator_layout),
getResources().getQuantityString(R.plurals.message_bar_new_articles_available, newItemsCount, newItemsCount),
Snackbar.LENGTH_LONG);
snackbar.setAction(getString(R.string.message_bar_reload), mSnackbarListener);
snackbar.setActionTextColor(ContextCompat.getColor(this, R.color.accent_material_dark));
// Setting android:TextColor to #000 in the light theme results in black on black
// text on the Snackbar, set the text back to white,
// TODO: find a cleaner way to do this
TextView textView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.WHITE);
snackbar.show();
}
return true;
}
return false;
}
@Override
protected void onResume() {
NewsReaderListFragment newsReaderListFragment = getSlidingListFragment();
if (newsReaderListFragment != null) {
newsReaderListFragment.ReloadAdapter();
newsReaderListFragment.bindUserInfoToUI();
}
invalidateOptionsMenu();
super.onResume();
}
@Override
public void onRefresh() {
startSync();
}
/**
* Callback method from {@link NewsReaderListFragment.Callbacks} indicating
* that the item with the given ID was selected.
*/
@Override
public void onTopItemClicked(long idFeed, boolean isFolder, Long optional_folder_id) {
if (drawerLayout != null)
drawerLayout.closeDrawer(GravityCompat.START);
StartDetailFragment(idFeed, isFolder, optional_folder_id, true);
}
@Override
public void onChildItemClicked(long idFeed, Long optional_folder_id) {
if (drawerLayout != null)
drawerLayout.closeDrawer(GravityCompat.START);
StartDetailFragment(idFeed, false, optional_folder_id, true);
}
@Override
public void onTopItemLongClicked(long idFeed, boolean isFolder, Long optional_folder_id) {
StartDialogFragment(idFeed, isFolder, optional_folder_id);
}
@Override
public void onChildItemLongClicked(long idFeed, Long optional_folder_id) {
StartDialogFragment(idFeed, false, optional_folder_id);
}
private void StartDialogFragment(long idFeed, Boolean isFolder, Long optional_folder_id) {
DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getApplicationContext());
if (isFolder) {
if(idFeed >= 0) {
//currently no actions for folders
//String titel = dbConn.getFolderById(idFeed).getLabel();
}
} else {
String titel = dbConn.getFeedById(idFeed).getFeedTitle();
String iconurl = dbConn.getFeedById(idFeed).getFaviconUrl();
String feedurl = dbConn.getFeedById(idFeed).getLink();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("news_reader_list_dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
NewsReaderListDialogFragment fragment = NewsReaderListDialogFragment.newInstance(idFeed, titel, iconurl, feedurl);
fragment.setActivity(this);
fragment.show(ft, "news_reader_list_dialog");
}
}
private NewsReaderDetailFragment StartDetailFragment(long id, Boolean folder, Long optional_folder_id, boolean updateListView)
{
if(menuItemDownloadMoreItems != null) {
menuItemDownloadMoreItems.setEnabled(true);
}
DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getApplicationContext());
Long feedId = null;
Long folderId;
String titel = null;
if(!folder)
{
feedId = id;
folderId = optional_folder_id;
titel = dbConn.getFeedById(id).getFeedTitle();
}
else
{
folderId = id;
int idFolder = (int) id;
if(idFolder >= 0)
titel = dbConn.getFolderById(id).getLabel();
else if(idFolder == -10)
titel = getString(R.string.allUnreadFeeds);
else if(idFolder == -11)
titel = getString(R.string.starredFeeds);
}
NewsReaderDetailFragment fragment = getNewsReaderDetailFragment();
fragment.setData(feedId, folderId, titel, updateListView);
return fragment;
}
public void UpdateItemList()
{
try {
NewsReaderDetailFragment nrD = getNewsReaderDetailFragment();
if (nrD != null)
nrD.getRecyclerView().getAdapter().notifyDataSetChanged();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void startSync()
{
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if(mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) == null)
StartLoginFragment(this);
else {
if (!ownCloudSyncService.isSyncRunning())
{
new PostDelayHandler(this).stopRunningPostDelayHandler();//Stop pending sync handler
Bundle accBundle = new Bundle();
accBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
AccountManager mAccountManager = AccountManager.get(this);
Account[] accounts = mAccountManager.getAccounts();
for(Account acc : accounts)
if(acc.type.equals(AccountGeneral.ACCOUNT_TYPE))
ContentResolver.requestSync(acc, AccountGeneral.ACCOUNT_TYPE, accBundle);
//http://stackoverflow.com/questions/5253858/why-does-contentresolver-requestsync-not-trigger-a-sync
} else {
UpdateButtonLayout();
}
}
}
public void UpdateButtonLayout()
{
NewsReaderListFragment newsReaderListFragment = getSlidingListFragment();
NewsReaderDetailFragment newsReaderDetailFragment = getNewsReaderDetailFragment();
if(newsReaderListFragment != null && newsReaderDetailFragment != null && ownCloudSyncService != null) {
boolean isSyncRunning = ownCloudSyncService.isSyncRunning();
newsReaderListFragment.setRefreshing(isSyncRunning);
newsReaderDetailFragment.swipeRefresh.setRefreshing(isSyncRunning);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.news_reader, menu);
menuItemUpdater = menu.findItem(R.id.menu_update);
menuItemDownloadMoreItems = menu.findItem(R.id.menu_downloadMoreItems);
menuItemDownloadMoreItems.setEnabled(false);
NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();
if(ndf != null)
ndf.UpdateMenuItemsState();
UpdateButtonLayout();
return true;
}
public MenuItem getMenuItemDownloadMoreItems() {
return menuItemDownloadMoreItems;
}
@Override
public void onBackPressed() {
if(!handlePodcastBackPressed()) {
if (drawerLayout != null) {
if (drawerLayout.isDrawerOpen(GravityCompat.START))
super.onBackPressed();
else
drawerLayout.openDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
private static final int RESULT_SETTINGS = 15642;
private static final int RESULT_ADD_NEW_FEED = 15643;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(drawerToggle != null && drawerToggle.onOptionsItemSelected(item))
return true;
switch (item.getItemId()) {
case android.R.id.home:
if(handlePodcastBackPressed())
return true;
break;
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivityForResult(intent, RESULT_SETTINGS);
return true;
case R.id.menu_update:
startSync();
break;
case R.id.action_login:
StartLoginFragment(NewsReaderListActivity.this);
break;
case R.id.action_add_new_feed:
Intent newFeedIntent = new Intent(this, NewFeedActivity.class);
startActivityForResult(newFeedIntent, RESULT_ADD_NEW_FEED);
break;
case R.id.menu_StartImageCaching:
DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);
long highestItemId = dbConn.getLowestRssItemIdUnread();
Intent service = new Intent(this, DownloadImagesService.class);
service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemId);
service.putExtra(DownloadImagesService.DOWNLOAD_MODE_STRING, DownloadImagesService.DownloadMode.PICTURES_ONLY);
startService(service);
break;
case R.id.menu_CreateDatabaseDump:
DatabaseUtils.CopyDatabaseToSdCard(this);
new AlertDialog.Builder(this)
.setMessage("Created dump at: " + DatabaseUtils.GetPath(this))
.setNeutralButton(getString(android.R.string.ok), null)
.show();
break;
case R.id.menu_About_Changelog:
DialogFragment dialog = new VersionInfoDialogFragment();
dialog.show(getSupportFragmentManager(), "VersionChangelogDialogFragment");
return true;
case R.id.menu_markAllAsRead:
NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();
if(ndf != null)
{
DatabaseConnectionOrm dbConn2 = new DatabaseConnectionOrm(this);
dbConn2.markAllItemsAsReadForCurrentView();
reloadCountNumbersOfSlidingPaneAdapter();
ndf.RefreshCurrentRssView();
}
return true;
case R.id.menu_downloadMoreItems:
DownloadMoreItems();
return true;
}
return super.onOptionsItemSelected(item);
}
private void DownloadMoreItems()
{
String username = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("edt_username", null);
if(username != null) {
NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();
OwnCloud_Reader.getInstance().Start_AsyncTask_GetOldItems(NewsReaderListActivity.this, onAsyncTaskComplete, ndf.getIdFeed(), ndf.getIdFolder());
Toast.makeText(this, getString(R.string.toast_GettingMoreItems), Toast.LENGTH_SHORT).show();
}
}
OnAsyncTaskCompletedListener onAsyncTaskComplete = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(Exception task_result) {
updateCurrentRssView();
Log.v(TAG, "Finished Download extra items..");
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
UpdateListView();
getSlidingListFragment().ListViewNotifyDataSetChanged();
}
if(requestCode == RESULT_SETTINGS)
{
//Update settings of image Loader
((NewsReaderApplication)getApplication()).initImageLoader();
String oldLayout = data.getStringExtra(SettingsActivity.SP_FEED_LIST_LAYOUT);
String newLayout = PreferenceManager.getDefaultSharedPreferences(this).getString(SettingsActivity.SP_FEED_LIST_LAYOUT,"0");
if(ThemeChooser.ThemeRequiresRestartOfUI(this) || !newLayout.equals(oldLayout)) {
finish();
startActivity(getIntent());
}
} else if(requestCode == RESULT_ADD_NEW_FEED) {
if(data != null) {
boolean val = data.getBooleanExtra(NewFeedActivity.ADD_NEW_SUCCESS, false);
if (val)
startSync();
}
}
}
@VisibleForTesting
public NewsReaderListFragment getSlidingListFragment() {
return ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.left_drawer));
}
@VisibleForTesting
public NewsReaderDetailFragment getNewsReaderDetailFragment() {
return (NewsReaderDetailFragment) getSupportFragmentManager().findFragmentById(R.id.content_frame);
}
public static void StartLoginFragment(final FragmentActivity activity)
{
LoginDialogFragment dialog = LoginDialogFragment.getInstance();
dialog.setActivity(activity);
dialog.setListener(new LoginSuccessfullListener() {
@Override
public void LoginSucceeded() {
((NewsReaderListActivity) activity).getSlidingListFragment().ReloadAdapter();
((NewsReaderListActivity) activity).updateCurrentRssView();
((NewsReaderListActivity) activity).startSync();
((NewsReaderListActivity) activity).getSlidingListFragment().bindUserInfoToUI();
}
});
dialog.show(activity.getSupportFragmentManager(), "NoticeDialogFragment");
}
private void UpdateListView()
{
getNewsReaderDetailFragment().notifyDataSetChangedOnAdapter();
}
@Override
public void onClick(ViewHolder vh, int position) {
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if (mPrefs.getBoolean(SettingsActivity.CB_SKIP_DETAILVIEW_AND_OPEN_BROWSER_DIRECTLY_STRING, false)) {
String currentUrl = vh.getRssItem().getLink();
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(currentUrl));
startActivity(browserIntent);
((NewsListRecyclerAdapter) getNewsReaderDetailFragment().getRecyclerView().getAdapter()).ChangeReadStateOfItem(vh, true);
} else {
Intent intentNewsDetailAct = new Intent(this, NewsDetailActivity.class);
intentNewsDetailAct.putExtra(NewsReaderListActivity.ITEM_ID, position);
intentNewsDetailAct.putExtra(NewsReaderListActivity.TITEL, getNewsReaderDetailFragment().getTitel());
startActivityForResult(intentNewsDetailAct, Activity.RESULT_CANCELED);
}
}
@Override
public boolean onLongClick(ViewHolder vh, int position) {
RssItem rssItem = vh.getRssItem();
DialogFragment newFragment =
NewsDetailImageDialogFragment.newInstanceUrl(rssItem.getTitle(), rssItem.getLink());
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("menu_fragment_dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
newFragment.show(ft, "menu_fragment_dialog");
return true;
}
}