From c2fdb8550e1aeb93c72274eaa6cb3fa09a0c8758 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 15 Jul 2013 14:38:01 +0200 Subject: [PATCH] Update APIv1 & APIv2 support --- .settings/org.eclipse.jdt.core.prefs | 4 + libs/gson-2.2.4-javadoc.jar | Bin 0 -> 249351 bytes libs/gson-2.2.4-sources.jar | Bin 0 -> 127564 bytes libs/gson-2.2.4.jar | Bin 0 -> 190418 bytes .../NewsDetailActivity.java | 946 +++++----- .../NewsReaderDetailActivity.java | 308 ++-- .../NewsReaderDetailFragment.java | 649 +++---- .../NewsReaderListActivity.java | 666 +++---- .../NewsReaderListFragment.java | 1179 ++++++------ .../cursor/NewsListCursorAdapter.java | 665 +++---- ...ribtionItem.java => ConcreteFeedItem.java} | 38 +- .../database/DatabaseConnection.java | 1613 +++++++++-------- .../MenuUtilsSherlockFragmentActivity.java | 357 ++-- .../interfaces/AsyncUpdateFinished.java | 10 +- .../reader/AsyncTask_Reader.java | 52 +- .../reader/HttpJsonRequest.java | 513 +++--- .../owncloudnewsreader/reader/IReader.java | 49 +- .../reader/InsertIntoDatabase.java | 363 ++-- .../reader/owncloud/API.java | 58 + .../owncloud/AsyncTask_GetApiVersion.java | 33 + .../reader/owncloud/AsyncTask_GetFeeds.java | 86 +- .../owncloud/AsyncTask_GetFolderTags.java | 91 +- .../reader/owncloud/AsyncTask_GetItems.java | 337 ++-- .../owncloud/AsyncTask_GetOldItems.java | 228 ++- .../owncloud/AsyncTask_PerformTagAction.java | 118 +- .../reader/owncloud/GetVersion.java | 21 + .../reader/owncloud/IHandleJsonObject.java | 7 + .../owncloud/InsertFeedIntoDatabase.java | 39 + .../owncloud/InsertFolderIntoDatabase.java | 32 + .../owncloud/InsertItemIntoDatabase.java | 44 + .../owncloud/OwnCloudReaderMethods.java | 771 ++++---- .../reader/owncloud/OwnCloud_Reader.java | 217 +-- .../reader/owncloud/apiv1/APIv1.java | 18 +- .../reader/owncloud/apiv2/APIv2.java | 11 +- .../services/SyncService.java | 54 +- 35 files changed, 4934 insertions(+), 4643 deletions(-) create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 libs/gson-2.2.4-javadoc.jar create mode 100644 libs/gson-2.2.4-sources.jar create mode 100644 libs/gson-2.2.4.jar rename src/de/luhmer/owncloudnewsreader/data/{ConcreteSubscribtionItem.java => ConcreteFeedItem.java} (65%) create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/API.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetApiVersion.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/GetVersion.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/IHandleJsonObject.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFeedIntoDatabase.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFolderIntoDatabase.java create mode 100644 src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertItemIntoDatabase.java diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..b080d2dd --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/libs/gson-2.2.4-javadoc.jar b/libs/gson-2.2.4-javadoc.jar new file mode 100644 index 0000000000000000000000000000000000000000..ce8fa7dbe9f3e89e62f65619cbd5aaa8cfcd152e GIT binary patch literal 249351 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

aVTZ~325k`NU_Xs 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

|j#Do;Hc7xL0n7!@ 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%0A0-rymMDziAfRQ@H7hs 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⁣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 KZ9NPD4ErBa|DsC( literal 0 HcmV?d00001 diff --git a/libs/gson-2.2.4-sources.jar b/libs/gson-2.2.4-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..30b13f653e5792dfe19105787826b101039e4fd9 GIT binary patch literal 127564 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%0D8MXgmqob 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

y)d@^y=s9`#39r;>ehppwbYq0U{|$2}4K7 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

-X*@Tz0V@JE<{JVc!OO7(MCcH*%up!yjaDX0y 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 M$1P8rF<>(NAA9kPA^-pY literal 0 HcmV?d00001 diff --git a/src/de/luhmer/owncloudnewsreader/NewsDetailActivity.java b/src/de/luhmer/owncloudnewsreader/NewsDetailActivity.java index 28947ac9..2cc68ddb 100644 --- a/src/de/luhmer/owncloudnewsreader/NewsDetailActivity.java +++ b/src/de/luhmer/owncloudnewsreader/NewsDetailActivity.java @@ -1,459 +1,487 @@ -package de.luhmer.owncloudnewsreader; - -import java.util.ArrayList; -import java.util.List; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.util.Log; -import android.view.KeyEvent; -import android.widget.Toast; - -import com.actionbarsherlock.app.SherlockFragmentActivity; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; - -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.helper.ThemeChooser; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; - -public class NewsDetailActivity extends SherlockFragmentActivity { - - /** - * The {@link android.support.v4.view.PagerAdapter} that will provide - * fragments for each of the sections. We use a - * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which - * will keep every loaded fragment in memory. If this becomes too memory - * intensive, it may be best to switch to a - * {@link android.support.v4.app.FragmentStatePagerAdapter}. - */ - SectionsPagerAdapter mSectionsPagerAdapter; - - /** - * The {@link ViewPager} that will host the section contents. - */ - public ViewPager mViewPager; - private int currentPosition; - MenuItem menuItem_Starred; - IReader _Reader; - ArrayList databaseItemIds; - DatabaseConnection dbConn; - //public List rssFiles; - - public static final String DATABASE_IDS_OF_ITEMS = "DATABASE_IDS_OF_ITEMS"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - - ThemeChooser.chooseTheme(this); - - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_news_detail); - - _Reader = new OwnCloud_Reader(); - dbConn = new DatabaseConnection(this); - Intent intent = getIntent(); - - //long subsciption_id = -1; - //long folder_id = -1; - int item_id = 0; - - //if(intent.hasExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID)) - // subsciption_id = intent.getExtras().getLong(NewsReaderDetailActivity.SUBSCRIPTION_ID); - //if(intent.hasExtra(NewsReaderDetailActivity.FOLDER_ID)) - // folder_id = intent.getExtras().getLong(NewsReaderDetailActivity.FOLDER_ID); - if(intent.hasExtra(NewsReaderDetailActivity.ITEM_ID)) - item_id = intent.getExtras().getInt(NewsReaderDetailActivity.ITEM_ID); - if(intent.hasExtra(NewsReaderDetailActivity.TITEL)) - getSupportActionBar().setTitle(intent.getExtras().getString(NewsReaderDetailActivity.TITEL)); - //getActionBar().setTitle(intent.getExtras().getString(NewsReaderDetailActivity.TITEL)); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - if(intent.hasExtra(DATABASE_IDS_OF_ITEMS)) - databaseItemIds = intent.getIntegerArrayListExtra(DATABASE_IDS_OF_ITEMS); - - - // Create the adapter that will return a fragment for each of the three - // primary sections of the app. - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - - // Set up the ViewPager with the sections adapter. - mViewPager = (ViewPager) findViewById(R.id.pager); - mViewPager.setAdapter(mSectionsPagerAdapter); - - - //rssFiles = new ArrayList(); - try - { - mViewPager.setCurrentItem(item_id, true); - PageChanged(item_id); - } - catch(Exception ex) - { - ex.printStackTrace(); - } - - mViewPager.setOnPageChangeListener(new OnPageChangeListener() { - - @Override - public void onPageSelected(int pos) { - PageChanged(pos); - } - - @Override - public void onPageScrolled(int arg0, float arg1, int arg2) { - } - - @Override - public void onPageScrollStateChanged(int arg0) { - } - }); - } - - @Override - protected void onDestroy() { - if(dbConn != null) - dbConn.closeDatabase(); - super.onDestroy(); - } - - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this); - if(mPrefs.getBoolean(SettingsActivity.CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING, false)) - { - if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) - { - if(currentPosition < databaseItemIds.size() -1) - { - mViewPager.setCurrentItem(currentPosition + 1, true); - return true; - } - } - - else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) - { - if(currentPosition > 0) - { - mViewPager.setCurrentItem(currentPosition - 1, true); - return true; - } - } - } - if(keyCode == KeyEvent.KEYCODE_BACK) - { - NewsDetailFragment ndf = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); - if(ndf.webview != null) - { - if(ndf.webview.canGoBack()) - { - ndf.webview.goBack(); - if(!ndf.webview.canGoBack())//RssItem - ndf.LoadRssItemInWebView(); - - return true; - } - } - - /* - View vGroup = mViewPager.getChildAt(currentPosition); - - if(vGroup != null) - { - WebView webView = (WebView) vGroup.findViewById(R.id.webview); - if(webView != null) - { - if(webView.canGoBack()) - { - webView.goBack(); - if(!webView.canGoBack())//RssItem - { - NewsDetailFragment ndf = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); - ndf.LoadRssItemInWebView(this); - } - - return true; - } - } - }*/ - } - - return super.onKeyDown(keyCode, event); - } - - private void PageChanged(int position) - { - StopVideoOnCurrentPage(); - currentPosition = position; - ResumeVideoPlayersOnCurrentPage(); - - UpdateActionBarIcons(); - - //String idFeed = String.valueOf(rssFiles.get(position).getDB_Id()); - String idFeed = String.valueOf(databaseItemIds.get(currentPosition)); - - if(!dbConn.isFeedUnreadStarred(idFeed, true)) - { - dbConn.updateIsReadOfFeed(idFeed, true); - - //Cursor cur = dbConn.getArticleByID(idFeed); - //cur.moveToFirst(); - //GoogleReaderMethods.MarkItemAsRead(true, cur, dbConn, getApplicationContext(), asyncTaskCompletedPerformTagRead); - - - /* - List idItems = new ArrayList(); - idItems.add(cur.getString(cur.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID))); - _Reader.Start_AsyncTask_PerformTagActionForSingleItem(5, - this, - asyncTaskCompletedPerformTagRead, - idItems, - FeedItemTags.TAGS.MARK_ITEM_AS_READ); - - - cur.close(); - */ - //dbConn.closeDatabase(); - Log.d("PAGE CHANGED", "PAGE: " + position + " - IDFEED: " + idFeed); - } - } - - private void ResumeVideoPlayersOnCurrentPage() - { - NewsDetailFragment fragment = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); - if(fragment != null) // could be null if not instantiated yet - fragment.ResumeVideoPlayers(); - - } - - private void StopVideoOnCurrentPage() - { - NewsDetailFragment fragment = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); - if(fragment != null) // could be null if not instantiated yet - fragment.StopVideoPlayers(); - } - - public void UpdateActionBarIcons() - { - boolean isStarred = dbConn.isFeedUnreadStarred(String.valueOf(databaseItemIds.get(currentPosition)) , false); - - //if(rssFiles.get(currentPosition).getStarred() && menuItem_Starred != null) - if(isStarred && menuItem_Starred != null) - menuItem_Starred.setIcon(android.R.drawable.star_on); - //menuItem_Starred.setIcon(R.drawable.btn_rating_star_on_normal_holo_light); - else if(menuItem_Starred != null) - menuItem_Starred.setIcon(android.R.drawable.star_off); - //menuItem_Starred.setIcon(R.drawable.btn_rating_star_off_normal_holo_light); - } - - @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_detail, menu); - getSupportMenuInflater().inflate(R.menu.news_detail, menu); - - menuItem_Starred = menu.findItem(R.id.action_starred); - UpdateActionBarIcons(); - - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - Cursor cursor = dbConn.getArticleByID(String.valueOf(databaseItemIds.get(currentPosition))); - - switch (item.getItemId()) { - case android.R.id.home: - super.onBackPressed(); - break; - - case R.id.action_starred: - //String idItem_Db = String.valueOf(rssFiles.get(currentPosition).getDB_Id()); - String idItem_Db = String.valueOf(databaseItemIds.get(currentPosition)); - //String idItem = String.valueOf(rssFiles.get(currentPosition).getItem_Id()); - Boolean curState = dbConn.isFeedUnreadStarred(idItem_Db, false); - - //rssFiles.get(currentPosition).setStarred(!curState); - - dbConn.updateIsStarredOfFeed(idItem_Db, !curState); - - UpdateActionBarIcons(); - - List idItems = new ArrayList(); - cursor.moveToFirst(); - idItems.add(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID))); - cursor.close(); - - /* - if(!curState) - _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, this, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_STARRED); - else - _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, this, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNSTARRED); - - */ - /* - Cursor cur = dbConn.getFeedByID(idFeed); - cur.moveToFirst(); - GoogleReaderMethods.MarkItemAsStarred(!curState, cur, dbConn, getApplicationContext(), asyncTaskCompletedPerformTagStarred); - cur.close();*/ - break; - - case R.id.action_openInBrowser: - //String link = rssFiles.get(currentPosition).getLink(); - String link = ""; - - if(cursor != null) - { - cursor.moveToFirst(); - link = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_LINK)); - cursor.close(); - } - - //if(!link.isEmpty()) - if(link.trim().length() > 0) - { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); - startActivity(browserIntent); - } - break; - - case R.id.action_sendSourceCode: - String description = ""; - if(cursor != null) - { - cursor.moveToFirst(); - description = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_BODY)); - cursor.close(); - } - - - Intent i = new Intent(Intent.ACTION_SEND); - i.setType("message/rfc822"); - i.putExtra(Intent.EXTRA_EMAIL , new String[]{"david-dev@live.de"}); - i.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_sourceCode)); - //i.putExtra(Intent.EXTRA_TEXT , rssFiles.get(currentPosition).getDescription()); - i.putExtra(Intent.EXTRA_TEXT , description); - try { - startActivity(Intent.createChooser(i, getString(R.string.email_sendMail))); - } catch (android.content.ActivityNotFoundException ex) { - Toast.makeText(NewsDetailActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); - } - break; - - case R.id.action_ShareItem: - - String title = ""; - String linkToItem = ""; - if(cursor != null) - { - cursor.moveToFirst(); - title = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE)); - linkToItem = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_LINK)); - cursor.close(); - } - - Intent share = new Intent(Intent.ACTION_SEND); - share.setType("text/plain"); - //share.putExtra(Intent.EXTRA_SUBJECT, rssFiles.get(currentPosition).getTitle()); - //share.putExtra(Intent.EXTRA_TEXT, rssFiles.get(currentPosition).getLink()); - share.putExtra(Intent.EXTRA_SUBJECT, title); - share.putExtra(Intent.EXTRA_TEXT, linkToItem); - - startActivity(Intent.createChooser(share, "Share Item")); - break; - } - return super.onOptionsItemSelected(item); - } - - - /* - OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagRead = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - boolean success = (Boolean) task_result; - if(!success) - Toast.makeText(NewsDetailActivity.this, "Error while changing the read tag..", Toast.LENGTH_LONG).show(); - - Log.d("FINISHED PERFORM TAG READ ", "" + task_result); - } - }; - - OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagStarred = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - Log.d("FINISHED PERFORM TAG STARRED ", "" + task_result); - } - }; - */ - - @Override - public void finish() { - Intent intent = new Intent(); - intent.putExtra("POS", mViewPager.getCurrentItem()); - setResult(RESULT_OK, intent); - super.finish(); - } - - /** - * A {@link FragmentPagerAdapter} that returns a fragment corresponding to - * one of the sections/tabs/pages. - */ - public class SectionsPagerAdapter extends FragmentPagerAdapter { - //public class SectionsPagerAdapter extends FragmentStatePagerAdapter { - - - public SectionsPagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - // getItem is called to instantiate the fragment for the given page. - // Return a DummySectionFragment (defined as a static inner class - // below) with the page number as its lone argument. - Fragment fragment = new NewsDetailFragment(); - Bundle args = new Bundle(); - args.putInt(NewsDetailFragment.ARG_SECTION_NUMBER, position + 1); - fragment.setArguments(args); - return fragment; - } - - - @Override - public int getCount() { - //return 2; - return databaseItemIds.size(); - //return rssFiles.size(); - } - - @Override - public CharSequence getPageTitle(int position) { - /* - Locale l = Locale.getDefault(); - switch (position) { - case 0: - return getString(R.string.title_section1).toUpperCase(l); - case 1: - return getString(R.string.title_section2).toUpperCase(l); - case 2: - return getString(R.string.title_section3).toUpperCase(l); - } - */ - return null; - } - } -} +package de.luhmer.owncloudnewsreader; + +import java.util.ArrayList; +import java.util.List; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.util.Log; +import android.view.KeyEvent; +import android.widget.Toast; + +import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.helper.ThemeChooser; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; + +public class NewsDetailActivity extends SherlockFragmentActivity { + + /** + * The {@link android.support.v4.view.PagerAdapter} that will provide + * fragments for each of the sections. We use a + * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which + * will keep every loaded fragment in memory. If this becomes too memory + * intensive, it may be best to switch to a + * {@link android.support.v4.app.FragmentStatePagerAdapter}. + */ + SectionsPagerAdapter mSectionsPagerAdapter; + + /** + * The {@link ViewPager} that will host the section contents. + */ + public ViewPager mViewPager; + private int currentPosition; + + MenuItem menuItem_Starred; + MenuItem menuItem_Read; + + IReader _Reader; + ArrayList databaseItemIds; + DatabaseConnection dbConn; + //public List rssFiles; + + public static final String DATABASE_IDS_OF_ITEMS = "DATABASE_IDS_OF_ITEMS"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + ThemeChooser.chooseTheme(this); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_news_detail); + + _Reader = new OwnCloud_Reader(); + dbConn = new DatabaseConnection(this); + Intent intent = getIntent(); + + //long subsciption_id = -1; + //long folder_id = -1; + int item_id = 0; + + //if(intent.hasExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID)) + // subsciption_id = intent.getExtras().getLong(NewsReaderDetailActivity.SUBSCRIPTION_ID); + //if(intent.hasExtra(NewsReaderDetailActivity.FOLDER_ID)) + // folder_id = intent.getExtras().getLong(NewsReaderDetailActivity.FOLDER_ID); + if(intent.hasExtra(NewsReaderDetailActivity.ITEM_ID)) + item_id = intent.getExtras().getInt(NewsReaderDetailActivity.ITEM_ID); + if(intent.hasExtra(NewsReaderDetailActivity.TITEL)) + getSupportActionBar().setTitle(intent.getExtras().getString(NewsReaderDetailActivity.TITEL)); + //getActionBar().setTitle(intent.getExtras().getString(NewsReaderDetailActivity.TITEL)); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + if(intent.hasExtra(DATABASE_IDS_OF_ITEMS)) + databaseItemIds = intent.getIntegerArrayListExtra(DATABASE_IDS_OF_ITEMS); + + + // Create the adapter that will return a fragment for each of the three + // primary sections of the app. + mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + + // Set up the ViewPager with the sections adapter. + mViewPager = (ViewPager) findViewById(R.id.pager); + mViewPager.setAdapter(mSectionsPagerAdapter); + + + //rssFiles = new ArrayList(); + try + { + mViewPager.setCurrentItem(item_id, true); + PageChanged(item_id); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + + mViewPager.setOnPageChangeListener(new OnPageChangeListener() { + + @Override + public void onPageSelected(int pos) { + PageChanged(pos); + } + + @Override + public void onPageScrolled(int arg0, float arg1, int arg2) { + } + + @Override + public void onPageScrollStateChanged(int arg0) { + } + }); + } + + @Override + protected void onDestroy() { + if(dbConn != null) + dbConn.closeDatabase(); + super.onDestroy(); + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + if(mPrefs.getBoolean(SettingsActivity.CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING, false)) + { + if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) + { + if(currentPosition < databaseItemIds.size() -1) + { + mViewPager.setCurrentItem(currentPosition + 1, true); + return true; + } + } + + else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) + { + if(currentPosition > 0) + { + mViewPager.setCurrentItem(currentPosition - 1, true); + return true; + } + } + } + if(keyCode == KeyEvent.KEYCODE_BACK) + { + NewsDetailFragment ndf = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); + if(ndf.webview != null) + { + if(ndf.webview.canGoBack()) + { + ndf.webview.goBack(); + if(!ndf.webview.canGoBack())//RssItem + ndf.LoadRssItemInWebView(); + + return true; + } + } + + /* + View vGroup = mViewPager.getChildAt(currentPosition); + + if(vGroup != null) + { + WebView webView = (WebView) vGroup.findViewById(R.id.webview); + if(webView != null) + { + if(webView.canGoBack()) + { + webView.goBack(); + if(!webView.canGoBack())//RssItem + { + NewsDetailFragment ndf = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); + ndf.LoadRssItemInWebView(this); + } + + return true; + } + } + }*/ + } + + return super.onKeyDown(keyCode, event); + } + + private void PageChanged(int position) + { + StopVideoOnCurrentPage(); + currentPosition = position; + ResumeVideoPlayersOnCurrentPage(); + + //String idFeed = String.valueOf(rssFiles.get(position).getDB_Id()); + String idFeed = String.valueOf(databaseItemIds.get(currentPosition)); + + if(!dbConn.isFeedUnreadStarred(idFeed, true)) + { + markItemAsReadUnread(idFeed, true); + + //Cursor cur = dbConn.getArticleByID(idFeed); + //cur.moveToFirst(); + //GoogleReaderMethods.MarkItemAsRead(true, cur, dbConn, getApplicationContext(), asyncTaskCompletedPerformTagRead); + + + /* + List idItems = new ArrayList(); + idItems.add(cur.getString(cur.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID))); + _Reader.Start_AsyncTask_PerformTagActionForSingleItem(5, + this, + asyncTaskCompletedPerformTagRead, + idItems, + FeedItemTags.TAGS.MARK_ITEM_AS_READ); + + + cur.close(); + */ + //dbConn.closeDatabase(); + Log.d("PAGE CHANGED", "PAGE: " + position + " - IDFEED: " + idFeed); + } + else //Only in else because the function markItemAsReas updates the ActionBar items as well + UpdateActionBarIcons(); + } + + private void ResumeVideoPlayersOnCurrentPage() + { + NewsDetailFragment fragment = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); + if(fragment != null) // could be null if not instantiated yet + fragment.ResumeVideoPlayers(); + + } + + private void StopVideoOnCurrentPage() + { + NewsDetailFragment fragment = (NewsDetailFragment) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + currentPosition); + if(fragment != null) // could be null if not instantiated yet + fragment.StopVideoPlayers(); + } + + public void UpdateActionBarIcons() + { + boolean isStarred = dbConn.isFeedUnreadStarred(String.valueOf(databaseItemIds.get(currentPosition)), false); + boolean isRead = dbConn.isFeedUnreadStarred(String.valueOf(databaseItemIds.get(currentPosition)), true); + + //if(rssFiles.get(currentPosition).getStarred() && menuItem_Starred != null) + if(isStarred && menuItem_Starred != null) + menuItem_Starred.setIcon(android.R.drawable.star_on); + //menuItem_Starred.setIcon(R.drawable.btn_rating_star_on_normal_holo_light); + else if(menuItem_Starred != null) + menuItem_Starred.setIcon(android.R.drawable.star_off); + //menuItem_Starred.setIcon(R.drawable.btn_rating_star_off_normal_holo_light); + + if(isRead && menuItem_Read != null) + menuItem_Read.setChecked(true); + else if(menuItem_Read != null) + menuItem_Read.setChecked(false); + } + + @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_detail, menu); + getSupportMenuInflater().inflate(R.menu.news_detail, menu); + + menuItem_Starred = menu.findItem(R.id.action_starred); + menuItem_Read = menu.findItem(R.id.action_read); + UpdateActionBarIcons(); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Cursor cursor = dbConn.getArticleByID(String.valueOf(databaseItemIds.get(currentPosition))); + + switch (item.getItemId()) { + case android.R.id.home: + super.onBackPressed(); + break; + + case R.id.action_starred: + //String idItem_Db = String.valueOf(rssFiles.get(currentPosition).getDB_Id()); + String idItem_Db = String.valueOf(databaseItemIds.get(currentPosition)); + //String idItem = String.valueOf(rssFiles.get(currentPosition).getItem_Id()); + Boolean curState = dbConn.isFeedUnreadStarred(idItem_Db, false); + + //rssFiles.get(currentPosition).setStarred(!curState); + + dbConn.updateIsStarredOfFeed(idItem_Db, !curState); + + UpdateActionBarIcons(); + + List idItems = new ArrayList(); + cursor.moveToFirst(); + idItems.add(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID))); + cursor.close(); + + /* + if(!curState) + _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, this, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_STARRED); + else + _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, this, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNSTARRED); + + */ + /* + Cursor cur = dbConn.getFeedByID(idFeed); + cur.moveToFirst(); + GoogleReaderMethods.MarkItemAsStarred(!curState, cur, dbConn, getApplicationContext(), asyncTaskCompletedPerformTagStarred); + cur.close();*/ + break; + + case R.id.action_openInBrowser: + //String link = rssFiles.get(currentPosition).getLink(); + String link = ""; + + if(cursor != null) + { + cursor.moveToFirst(); + link = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_LINK)); + cursor.close(); + } + + //if(!link.isEmpty()) + if(link.trim().length() > 0) + { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); + startActivity(browserIntent); + } + break; + + case R.id.action_sendSourceCode: + String description = ""; + if(cursor != null) + { + cursor.moveToFirst(); + description = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_BODY)); + cursor.close(); + } + + + Intent i = new Intent(Intent.ACTION_SEND); + i.setType("message/rfc822"); + i.putExtra(Intent.EXTRA_EMAIL , new String[]{"david-dev@live.de"}); + i.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_sourceCode)); + //i.putExtra(Intent.EXTRA_TEXT , rssFiles.get(currentPosition).getDescription()); + i.putExtra(Intent.EXTRA_TEXT , description); + try { + startActivity(Intent.createChooser(i, getString(R.string.email_sendMail))); + } catch (android.content.ActivityNotFoundException ex) { + Toast.makeText(NewsDetailActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); + } + break; + + case R.id.action_ShareItem: + + String title = ""; + String linkToItem = ""; + if(cursor != null) + { + cursor.moveToFirst(); + title = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE)); + linkToItem = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_LINK)); + cursor.close(); + } + + Intent share = new Intent(Intent.ACTION_SEND); + share.setType("text/plain"); + //share.putExtra(Intent.EXTRA_SUBJECT, rssFiles.get(currentPosition).getTitle()); + //share.putExtra(Intent.EXTRA_TEXT, rssFiles.get(currentPosition).getLink()); + share.putExtra(Intent.EXTRA_SUBJECT, title); + share.putExtra(Intent.EXTRA_TEXT, linkToItem); + + startActivity(Intent.createChooser(share, "Share Item")); + break; + + case R.id.action_read: + + if(cursor != null) + { + cursor.moveToFirst(); + String id = cursor.getString(0); + markItemAsReadUnread(id, !menuItem_Read.isChecked()); + cursor.close(); + } + + break; + } + return super.onOptionsItemSelected(item); + } + + + private void markItemAsReadUnread(String item_id, boolean read) { + dbConn.updateIsReadOfFeed(item_id, read); + UpdateActionBarIcons(); + } + + + /* + OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagRead = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + boolean success = (Boolean) task_result; + if(!success) + Toast.makeText(NewsDetailActivity.this, "Error while changing the read tag..", Toast.LENGTH_LONG).show(); + + Log.d("FINISHED PERFORM TAG READ ", "" + task_result); + } + }; + + OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagStarred = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + Log.d("FINISHED PERFORM TAG STARRED ", "" + task_result); + } + }; + */ + + @Override + public void finish() { + Intent intent = new Intent(); + intent.putExtra("POS", mViewPager.getCurrentItem()); + setResult(RESULT_OK, intent); + super.finish(); + } + + /** + * A {@link FragmentPagerAdapter} that returns a fragment corresponding to + * one of the sections/tabs/pages. + */ + public class SectionsPagerAdapter extends FragmentPagerAdapter { + //public class SectionsPagerAdapter extends FragmentStatePagerAdapter { + + + public SectionsPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + // getItem is called to instantiate the fragment for the given page. + // Return a DummySectionFragment (defined as a static inner class + // below) with the page number as its lone argument. + Fragment fragment = new NewsDetailFragment(); + Bundle args = new Bundle(); + args.putInt(NewsDetailFragment.ARG_SECTION_NUMBER, position + 1); + fragment.setArguments(args); + return fragment; + } + + + @Override + public int getCount() { + //return 2; + return databaseItemIds.size(); + //return rssFiles.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + /* + Locale l = Locale.getDefault(); + switch (position) { + case 0: + return getString(R.string.title_section1).toUpperCase(l); + case 1: + return getString(R.string.title_section2).toUpperCase(l); + case 2: + return getString(R.string.title_section3).toUpperCase(l); + } + */ + return null; + } + } +} diff --git a/src/de/luhmer/owncloudnewsreader/NewsReaderDetailActivity.java b/src/de/luhmer/owncloudnewsreader/NewsReaderDetailActivity.java index 4beb594e..c3429eb6 100644 --- a/src/de/luhmer/owncloudnewsreader/NewsReaderDetailActivity.java +++ b/src/de/luhmer/owncloudnewsreader/NewsReaderDetailActivity.java @@ -1,154 +1,154 @@ -package de.luhmer.owncloudnewsreader; - -import android.annotation.TargetApi; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.NavUtils; - -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; - -import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; -import de.luhmer.owncloudnewsreader.helper.ThemeChooser; - -/** - * An activity representing a single NewsReader detail screen. This activity is - * only used on handset devices. On tablet-size devices, item details are - * presented side-by-side with a list of items in a - * {@link NewsReaderListActivity}. - *

- * This activity is mostly just a 'shell' activity containing nothing more than - * a {@link NewsReaderDetailFragment}. - */ -public class NewsReaderDetailActivity extends MenuUtilsSherlockFragmentActivity { - - public static final String FOLDER_ID = "FOLDER_ID"; - public static final String SUBSCRIPTION_ID = "SUBSCRIPTION_ID"; - public static final String ITEM_ID = "ITEM_ID"; - public static final String TITEL = "TITEL"; - protected static final String TAG = "NewsReaderDetailActivity"; - - - String titel; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - - ThemeChooser.chooseTheme(this); - - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_newsreader_detail); - - // Show the Up button in the action bar. - //getActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - // savedInstanceState is non-null when there is fragment state - // saved from previous configurations of this activity - // (e.g. when rotating the screen from portrait to landscape). - // In this case, the fragment will automatically be re-added - // to its container so we don't need to manually add it. - // For more information, see the Fragments API guide at: - // - // http://developer.android.com/guide/components/fragments.html - // - if (savedInstanceState == null) { - - Intent intent = getIntent(); - titel = "Name Missing"; - - String idFeed = null; - String idFolder = null; - - if(intent.hasExtra(SUBSCRIPTION_ID)) - idFeed = intent.getExtras().getString(SUBSCRIPTION_ID); - if(intent.hasExtra(FOLDER_ID)) - idFolder = intent.getExtras().getString(FOLDER_ID); - if(intent.hasExtra(TITEL)) - titel = intent.getExtras().getString(TITEL); - - //getSupportActionBar().setTitle(titel); - - - - // Create the detail fragment and add it to the activity - // using a fragment transaction. - Bundle arguments = new Bundle(); - arguments.putString( - NewsReaderDetailFragment.ARG_ITEM_ID, - getIntent().getStringExtra( - NewsReaderDetailFragment.ARG_ITEM_ID)); - - if(idFeed != null) - arguments.putString(SUBSCRIPTION_ID, idFeed); - if(idFolder != null) - arguments.putString(FOLDER_ID, idFolder); - - arguments.putString(TITEL, titel); - NewsReaderDetailFragment fragment = new NewsReaderDetailFragment(); - fragment.setArguments(arguments); - getSupportFragmentManager().beginTransaction() - .add(R.id.newsreader_detail_container, fragment).commit(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - //getSupportMenuInflater().inflate(R.menu.subscription, menu); - - super.onCreateOptionsMenu(menu, getSupportMenuInflater(), true, this); - - return true; - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - //if (requestCode == 1) { - if(resultCode == RESULT_OK){ - int pos = data.getIntExtra("POS", 0); - UpdateListViewAndScrollToPos(this, pos); - } - if (resultCode == RESULT_CANCELED) { - //Write your code on no result return - } - //} - } - - - @TargetApi(Build.VERSION_CODES.FROYO) - public static void UpdateListViewAndScrollToPos(FragmentActivity act, int pos) - { - ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).lvAdapter.notifyDataSetChanged(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) - ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).getListView().smoothScrollToPosition(pos); - else - ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).getListView().setSelection(pos); - - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean handled = super.onOptionsItemSelected(item, this); - if(!handled) - { - switch (item.getItemId()) { - case android.R.id.home: - // This ID represents the Home or Up button. In the case of this - // activity, the Up button is shown. Use NavUtils to allow users - // to navigate up one level in the application structure. For - // more details, see the Navigation pattern on Android Design: - // - // http://developer.android.com/design/patterns/navigation.html#up-vs-back - // - NavUtils.navigateUpTo(this, new Intent(this, - NewsReaderListActivity.class)); - return true; - } - } - return super.onOptionsItemSelected(item); - } -} +package de.luhmer.owncloudnewsreader; + +import android.annotation.TargetApi; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.NavUtils; + +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; +import de.luhmer.owncloudnewsreader.helper.ThemeChooser; + +/** + * An activity representing a single NewsReader detail screen. This activity is + * only used on handset devices. On tablet-size devices, item details are + * presented side-by-side with a list of items in a + * {@link NewsReaderListActivity}. + *

+ * This activity is mostly just a 'shell' activity containing nothing more than + * a {@link NewsReaderDetailFragment}. + */ +public class NewsReaderDetailActivity extends MenuUtilsSherlockFragmentActivity { + + public static final String FOLDER_ID = "FOLDER_ID"; + public static final String SUBSCRIPTION_ID = "SUBSCRIPTION_ID"; + public static final String ITEM_ID = "ITEM_ID"; + public static final String TITEL = "TITEL"; + protected static final String TAG = "NewsReaderDetailActivity"; + + + String titel; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + + ThemeChooser.chooseTheme(this); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_newsreader_detail); + + // Show the Up button in the action bar. + //getActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + // savedInstanceState is non-null when there is fragment state + // saved from previous configurations of this activity + // (e.g. when rotating the screen from portrait to landscape). + // In this case, the fragment will automatically be re-added + // to its container so we don't need to manually add it. + // For more information, see the Fragments API guide at: + // + // http://developer.android.com/guide/components/fragments.html + // + if (savedInstanceState == null) { + + Intent intent = getIntent(); + titel = "Name Missing"; + + String idFeed = null; + String idFolder = null; + + if(intent.hasExtra(SUBSCRIPTION_ID)) + idFeed = intent.getExtras().getString(SUBSCRIPTION_ID); + if(intent.hasExtra(FOLDER_ID)) + idFolder = intent.getExtras().getString(FOLDER_ID); + if(intent.hasExtra(TITEL)) + titel = intent.getExtras().getString(TITEL); + + //getSupportActionBar().setTitle(titel); + + + + // Create the detail fragment and add it to the activity + // using a fragment transaction. + Bundle arguments = new Bundle(); + arguments.putString( + NewsReaderDetailFragment.ARG_ITEM_ID, + getIntent().getStringExtra( + NewsReaderDetailFragment.ARG_ITEM_ID)); + + if(idFeed != null) + arguments.putString(SUBSCRIPTION_ID, idFeed); + if(idFolder != null) + arguments.putString(FOLDER_ID, idFolder); + + arguments.putString(TITEL, titel); + NewsReaderDetailFragment fragment = new NewsReaderDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .add(R.id.newsreader_detail_container, fragment).commit(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + //getSupportMenuInflater().inflate(R.menu.subscription, menu); + + super.onCreateOptionsMenu(menu, getSupportMenuInflater(), true, this); + + return true; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + //if (requestCode == 1) { + if(resultCode == RESULT_OK){ + int pos = data.getIntExtra("POS", 0); + UpdateListViewAndScrollToPos(this, pos); + } + if (resultCode == RESULT_CANCELED) { + //Write your code on no result return + } + //} + } + + + @TargetApi(Build.VERSION_CODES.FROYO) + public static void UpdateListViewAndScrollToPos(FragmentActivity act, int pos) + { + ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).getLvAdapter().notifyDataSetChanged(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) + ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).getListView().smoothScrollToPosition(pos); + else + ((NewsReaderDetailFragment) act.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)).getListView().setSelection(pos); + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean handled = super.onOptionsItemSelected(item, this); + if(!handled) + { + switch (item.getItemId()) { + case android.R.id.home: + // This ID represents the Home or Up button. In the case of this + // activity, the Up button is shown. Use NavUtils to allow users + // to navigate up one level in the application structure. For + // more details, see the Navigation pattern on Android Design: + // + // http://developer.android.com/design/patterns/navigation.html#up-vs-back + // + NavUtils.navigateUpTo(this, new Intent(this, + NewsReaderListActivity.class)); + return true; + } + } + return super.onOptionsItemSelected(item); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java b/src/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java index 150e467e..dd8cd2a8 100644 --- a/src/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java +++ b/src/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java @@ -1,303 +1,346 @@ -package de.luhmer.owncloudnewsreader; - -import java.util.ArrayList; - -import android.app.Activity; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.CheckBox; -import android.widget.ListView; - -import com.actionbarsherlock.app.SherlockFragmentActivity; -import com.actionbarsherlock.app.SherlockListFragment; - -import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; -import de.luhmer.owncloudnewsreader.cursor.NewsListCursorAdapter; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; - -/** - * A fragment representing a single NewsReader detail screen. This fragment is - * either contained in a {@link NewsReaderListActivity} in two-pane mode (on - * tablets) or a {@link NewsReaderDetailActivity} on handsets. - */ -public class NewsReaderDetailFragment extends SherlockListFragment { - /** - * The fragment argument representing the item ID that this fragment - * represents. - */ - public static final String ARG_ITEM_ID = "item_id"; - - protected static final String TAG = "NewsReaderDetailFragment"; - - DatabaseConnection dbConn; - NewsListCursorAdapter lvAdapter; - String idFeed; - /** - * @return the idFeed - */ - public String getIdFeed() { - return idFeed; - } - - String idFolder; - /** - * @return the idFolder - */ - public String getIdFolder() { - return idFolder; - } - - String titel; - int lastItemPosition; - - ArrayList databaseIdsOfItems; - - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - public NewsReaderDetailFragment() { - databaseIdsOfItems = new ArrayList(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - /* - if (getArguments().containsKey(ARG_ITEM_ID)) { - // Load the dummy content specified by the fragment - // arguments. In a real-world scenario, use a Loader - // to load content from a content provider. - - mItem = DummyContent.ITEM_MAP.get(getArguments().getString( - ARG_ITEM_ID)); - - }*/ - - if (getArguments().containsKey(NewsReaderDetailActivity.SUBSCRIPTION_ID)) { - idFeed = getArguments().getString(NewsReaderDetailActivity.SUBSCRIPTION_ID); - } - if (getArguments().containsKey(NewsReaderDetailActivity.TITEL)) { - titel = getArguments().getString(NewsReaderDetailActivity.TITEL); - } - if (getArguments().containsKey(NewsReaderDetailActivity.FOLDER_ID)) { - idFolder = getArguments().getString(NewsReaderDetailActivity.FOLDER_ID); - } - - dbConn = new DatabaseConnection(getActivity()); - - ((SherlockFragmentActivity) getActivity()).getSupportActionBar().setTitle(titel); - - UpdateMenuItemsState();//Is called on Tablets and Smartphones but on Smartphones the menuItemDownloadMoreItems is null. So it will be ignored - - //getListView().setLayerType(View.LAYER_TYPE_SOFTWARE, null); - - //lvAdapter = new Subscription_ListViewAdapter(this); - UpdateCursor(); - } - - @SuppressWarnings("static-access") - public void UpdateMenuItemsState() - { - MenuUtilsSherlockFragmentActivity mActivity = ((MenuUtilsSherlockFragmentActivity) getActivity()); - - if(mActivity.getMenuItemDownloadMoreItems() != null) - { - if(idFolder.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) - mActivity.getMenuItemDownloadMoreItems().setEnabled(false); - else - mActivity.getMenuItemDownloadMoreItems().setEnabled(true); - } - } - - - /* (non-Javadoc) - * @see android.support.v4.app.ListFragment#onViewCreated(android.view.View, android.os.Bundle) - */ - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - if(mPrefs.getBoolean(SettingsActivity.CB_MARK_AS_READ_WHILE_SCROLLING_STRING, false)) - { - getListView().setOnScrollListener(new AbsListView.OnScrollListener() { - - public void onScrollStateChanged(AbsListView view, int scrollState) { - /* - Log.d(TAG, "LOL" + scrollState); - if(AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL == scrollState) - { - - }*/ - } - - - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - CheckBox cb = getCheckBoxAtPosition(0, view); - ChangeCheckBoxState(cb, true); - - if((firstVisibleItem + visibleItemCount) == totalItemCount) { - for (int i = firstVisibleItem + 1; i < firstVisibleItem + visibleItemCount; i++) { - cb = getCheckBoxAtPosition(i - firstVisibleItem, view); - ChangeCheckBoxState(cb, true); - } - } - } - - /* - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) { - - if(lastItemPosition < firstVisibleItem) - { - lastItemPosition = firstVisibleItem; - - CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_read); - if(!cb.isChecked()) - cb.setChecked(true); - - //dbConn. - } - - //Cursor cursor = (Cursor)view.getItemAtPosition(i); - //long id = cursor.getLong(cursor.getColumnIndex(AlertsContract._ID)); - //String type = cursor.getString(cursor.getColumnIndex(AlertsContract.TYPE)); - //Log.d("VIEWED", "This is viewed "+ type + " id: " + id); - //Log.d("VIEWED", "This is viewed "+ firstVisibleItem + " id: "); - - // here I can get the id and mark the item read - } - }*/ - - - }); - } - - super.onViewCreated(view, savedInstanceState); - } - - private void ChangeCheckBoxState(CheckBox cb, boolean state) - { - if(cb != null) - if(cb.isChecked() != state) - cb.setChecked(state); - } - - private CheckBox getCheckBoxAtPosition(int pos, AbsListView viewLV) - { - ListView lv = (ListView) viewLV; - View view = (View) lv.getChildAt(pos); - if(view != null) - return (CheckBox) view.findViewById(R.id.cb_lv_item_read); - else - return null; - } - - - /* (non-Javadoc) - * @see android.support.v4.app.Fragment#onResume() - */ - @Override - public void onResume() { - lastItemPosition = -1; - super.onResume(); - } - - @Override - public void onDestroy() { - if(lvAdapter != null) - lvAdapter.CloseDatabaseConnection(); - if(dbConn != null) - dbConn.closeDatabase(); - super.onDestroy(); - } - - public void UpdateCursor() - { - try - { - Cursor cursor = getRightCusor(idFolder); - - databaseIdsOfItems.clear(); - if(cursor != null) - while(cursor.moveToNext()) - databaseIdsOfItems.add(cursor.getInt(0)); - - - if(lvAdapter == null) - { - lvAdapter = new NewsListCursorAdapter(getActivity(), cursor); - setListAdapter(lvAdapter); - } - else - lvAdapter.changeCursor(cursor); - - } - catch(Exception ex) - { - ex.printStackTrace(); - } - } - - public Cursor getRightCusor(String ID_FOLDER) - { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - boolean onlyUnreadItems = mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false); - boolean onlyStarredItems = false; - if(ID_FOLDER != null) - if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) - onlyStarredItems = true; - - if(idFeed != null) - return dbConn.getAllItemsForFeed(idFeed, onlyUnreadItems, onlyStarredItems); - else if(idFolder != null) - { - if(idFolder.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) - onlyUnreadItems = false; - return dbConn.getAllItemsForFolder(idFolder, onlyUnreadItems); - } - return null; - } - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_newsreader_detail, container, false); - return rootView; - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - - Intent intentNewsDetailAct = new Intent(getActivity(), NewsDetailActivity.class); - //if(idSubscription != null) - // intentNewsDetailAct.putExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID, Long.valueOf(idSubscription)); - //else if(idFolder != null) - // intentNewsDetailAct.putExtra(NewsReaderDetailActivity.FOLDER_ID, Long.valueOf(idFolder)); - - //intentNewsDetailAct.putIntegerArrayListExtra(NewsDetailActivity.DATABASE_IDS_OF_ITEMS, databaseIdsOfItems); - //Integer[] databaseIdsOfItemsArray = databaseIdsOfItems.toArray(new Integer[databaseIdsOfItems.size()]); - intentNewsDetailAct.putIntegerArrayListExtra(NewsDetailActivity.DATABASE_IDS_OF_ITEMS, databaseIdsOfItems); - - intentNewsDetailAct.putExtra(NewsReaderDetailActivity.ITEM_ID, position); - intentNewsDetailAct.putExtra(NewsReaderDetailActivity.TITEL, titel); - startActivityForResult(intentNewsDetailAct, Activity.RESULT_CANCELED); - - super.onListItemClick(l, v, position, id); - } - - public ArrayList getDatabaseIdsOfItems() { - return databaseIdsOfItems; - } - -} +package de.luhmer.owncloudnewsreader; + +import java.util.ArrayList; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.CheckBox; +import android.widget.ListView; + +import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.actionbarsherlock.app.SherlockListFragment; + +import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; +import de.luhmer.owncloudnewsreader.cursor.NewsListCursorAdapter; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; + +/** + * A fragment representing a single NewsReader detail screen. This fragment is + * either contained in a {@link NewsReaderListActivity} in two-pane mode (on + * tablets) or a {@link NewsReaderDetailActivity} on handsets. + */ +public class NewsReaderDetailFragment extends SherlockListFragment { + /** + * The fragment argument representing the item ID that this fragment + * represents. + */ + public static final String ARG_ITEM_ID = "item_id"; + + protected static final String TAG = "NewsReaderDetailFragment"; + + private DatabaseConnection dbConn; + + private boolean DialogShowedToMarkLastItemsAsRead = false; + + private NewsListCursorAdapter lvAdapter; + /** + * @return the lvAdapter + */ + public NewsListCursorAdapter getLvAdapter() { + return lvAdapter; + } + + String idFeed; + /** + * @return the idFeed + */ + public String getIdFeed() { + return idFeed; + } + + String idFolder; + /** + * @return the idFolder + */ + public String getIdFolder() { + return idFolder; + } + + String titel; + int lastItemPosition; + + ArrayList databaseIdsOfItems; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public NewsReaderDetailFragment() { + databaseIdsOfItems = new ArrayList(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + /* + if (getArguments().containsKey(ARG_ITEM_ID)) { + // Load the dummy content specified by the fragment + // arguments. In a real-world scenario, use a Loader + // to load content from a content provider. + + mItem = DummyContent.ITEM_MAP.get(getArguments().getString( + ARG_ITEM_ID)); + + }*/ + + if (getArguments().containsKey(NewsReaderDetailActivity.SUBSCRIPTION_ID)) { + idFeed = getArguments().getString(NewsReaderDetailActivity.SUBSCRIPTION_ID); + } + if (getArguments().containsKey(NewsReaderDetailActivity.TITEL)) { + titel = getArguments().getString(NewsReaderDetailActivity.TITEL); + } + if (getArguments().containsKey(NewsReaderDetailActivity.FOLDER_ID)) { + idFolder = getArguments().getString(NewsReaderDetailActivity.FOLDER_ID); + } + + dbConn = new DatabaseConnection(getActivity()); + + ((SherlockFragmentActivity) getActivity()).getSupportActionBar().setTitle(titel); + + UpdateMenuItemsState();//Is called on Tablets and Smartphones but on Smartphones the menuItemDownloadMoreItems is null. So it will be ignored + + //getListView().setLayerType(View.LAYER_TYPE_SOFTWARE, null); + + //lvAdapter = new Subscription_ListViewAdapter(this); + UpdateCursor(); + } + + @SuppressWarnings("static-access") + public void UpdateMenuItemsState() + { + MenuUtilsSherlockFragmentActivity mActivity = ((MenuUtilsSherlockFragmentActivity) getActivity()); + + if(mActivity.getMenuItemDownloadMoreItems() != null) + { + if(idFolder.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) + mActivity.getMenuItemDownloadMoreItems().setEnabled(false); + else + mActivity.getMenuItemDownloadMoreItems().setEnabled(true); + } + } + + + /* (non-Javadoc) + * @see android.support.v4.app.ListFragment#onViewCreated(android.view.View, android.os.Bundle) + */ + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + if(mPrefs.getBoolean(SettingsActivity.CB_MARK_AS_READ_WHILE_SCROLLING_STRING, false)) + { + getListView().setOnScrollListener(new AbsListView.OnScrollListener() { + + public void onScrollStateChanged(AbsListView view, int scrollState) { + + //Log.d(TAG, "Scroll: " + scrollState); + /* + if(AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL == scrollState) + { + + }*/ + } + + + public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, int totalItemCount) { + CheckBox cb = getCheckBoxAtPosition(0, view); + NewsListCursorAdapter.ChangeCheckBoxState(cb, true, getActivity()); + + if(((firstVisibleItem + visibleItemCount) == totalItemCount) && !DialogShowedToMarkLastItemsAsRead ){ + + DialogShowedToMarkLastItemsAsRead = true; + + boolean needQuestion = false; + for (int i = firstVisibleItem + 1; i < firstVisibleItem + visibleItemCount; i++) { + cb = getCheckBoxAtPosition(i - firstVisibleItem, view); + if(!cb.isChecked()) + { + needQuestion = true; + break; + } + } + + if(needQuestion) + new AlertDialog.Builder(getActivity()) + .setTitle("Alle als gelesen markieren ?") + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + for (int i = firstVisibleItem + 1; i < firstVisibleItem + visibleItemCount; i++) { + CheckBox cb = getCheckBoxAtPosition(i - firstVisibleItem, view); + NewsListCursorAdapter.ChangeCheckBoxState(cb, true, getActivity()); + } + } + }) + .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + // if this button is clicked, just close + // the dialog box and do nothing + dialog.cancel(); + } + }) + .create() + .show(); + + + + } + } + + /* + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) { + + if(lastItemPosition < firstVisibleItem) + { + lastItemPosition = firstVisibleItem; + + CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_read); + if(!cb.isChecked()) + cb.setChecked(true); + + //dbConn. + } + + //Cursor cursor = (Cursor)view.getItemAtPosition(i); + //long id = cursor.getLong(cursor.getColumnIndex(AlertsContract._ID)); + //String type = cursor.getString(cursor.getColumnIndex(AlertsContract.TYPE)); + //Log.d("VIEWED", "This is viewed "+ type + " id: " + id); + //Log.d("VIEWED", "This is viewed "+ firstVisibleItem + " id: "); + + // here I can get the id and mark the item read + } + }*/ + + + }); + } + + super.onViewCreated(view, savedInstanceState); + } + + + + private CheckBox getCheckBoxAtPosition(int pos, AbsListView viewLV) + { + ListView lv = (ListView) viewLV; + View view = (View) lv.getChildAt(pos); + if(view != null) + return (CheckBox) view.findViewById(R.id.cb_lv_item_read); + else + return null; + } + + + /* (non-Javadoc) + * @see android.support.v4.app.Fragment#onResume() + */ + @Override + public void onResume() { + lastItemPosition = -1; + super.onResume(); + } + + @Override + public void onDestroy() { + if(lvAdapter != null) + lvAdapter.CloseDatabaseConnection(); + if(dbConn != null) + dbConn.closeDatabase(); + super.onDestroy(); + } + + public void UpdateCursor() + { + try + { + Cursor cursor = getRightCusor(idFolder); + + databaseIdsOfItems.clear(); + if(cursor != null) + while(cursor.moveToNext()) + databaseIdsOfItems.add(cursor.getInt(0)); + + + if(lvAdapter == null) + { + lvAdapter = new NewsListCursorAdapter(getActivity(), cursor); + setListAdapter(lvAdapter); + } + else + lvAdapter.changeCursor(cursor); + + } + catch(Exception ex) + { + ex.printStackTrace(); + } + } + + public Cursor getRightCusor(String ID_FOLDER) + { + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + boolean onlyUnreadItems = mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false); + boolean onlyStarredItems = false; + if(ID_FOLDER != null) + if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) + onlyStarredItems = true; + + if(idFeed != null) + return dbConn.getAllItemsForFeed(idFeed, onlyUnreadItems, onlyStarredItems); + else if(idFolder != null) + { + if(idFolder.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) + onlyUnreadItems = false; + return dbConn.getAllItemsForFolder(idFolder, onlyUnreadItems); + } + return null; + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_newsreader_detail, container, false); + return rootView; + } + + @Override + public void onListItemClick(ListView l, View v, int position, long id) { + + Intent intentNewsDetailAct = new Intent(getActivity(), NewsDetailActivity.class); + //if(idSubscription != null) + // intentNewsDetailAct.putExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID, Long.valueOf(idSubscription)); + //else if(idFolder != null) + // intentNewsDetailAct.putExtra(NewsReaderDetailActivity.FOLDER_ID, Long.valueOf(idFolder)); + + //intentNewsDetailAct.putIntegerArrayListExtra(NewsDetailActivity.DATABASE_IDS_OF_ITEMS, databaseIdsOfItems); + //Integer[] databaseIdsOfItemsArray = databaseIdsOfItems.toArray(new Integer[databaseIdsOfItems.size()]); + intentNewsDetailAct.putIntegerArrayListExtra(NewsDetailActivity.DATABASE_IDS_OF_ITEMS, databaseIdsOfItems); + + intentNewsDetailAct.putExtra(NewsReaderDetailActivity.ITEM_ID, position); + intentNewsDetailAct.putExtra(NewsReaderDetailActivity.TITEL, titel); + startActivityForResult(intentNewsDetailAct, Activity.RESULT_CANCELED); + + super.onListItemClick(l, v, position, id); + } + + public ArrayList getDatabaseIdsOfItems() { + return databaseIdsOfItems; + } + +} diff --git a/src/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java b/src/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java index 28852bf6..7dbcbfa1 100644 --- a/src/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java +++ b/src/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java @@ -1,332 +1,334 @@ -package de.luhmer.owncloudnewsreader; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; - -import com.actionbarsherlock.app.SherlockDialogFragment; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuItem; -import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView; - -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; -import de.luhmer.owncloudnewsreader.helper.ThemeChooser; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.services.DownloadImagesService; - -/** - * An activity representing a list of NewsReader. 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 NewsReaderDetailActivity} representing item details. On tablets, the - * activity presents the list of items and item details side-by-side using two - * vertical panes. - *

- * 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}. - *

- * This activity also implements the required - * {@link NewsReaderListFragment.Callbacks} interface to listen for item - * selections. - */ -public class NewsReaderListActivity extends MenuUtilsSherlockFragmentActivity implements - NewsReaderListFragment.Callbacks { - - /** - * Whether or not the activity is in two-pane mode, i.e. running on a tablet - * device. - */ - private boolean mTwoPane; - //IabHelper mHelper; - static final String TAG = "NewsReaderListActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - - ThemeChooser.chooseTheme(this); - - //setTheme(R.style.Theme_Sherlock); - - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_newsreader_list); - - - if (findViewById(R.id.newsreader_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. - - ((NewsReaderListFragment) getSupportFragmentManager() - .findFragmentById(R.id.newsreader_list)) - .setActivateOnItemClick(true); - } - - - //DatabaseUtils.CopyDatabaseToSdCard(this); - - /* - ((NewsReaderListFragment) getSupportFragmentManager() - .findFragmentById(R.id.newsreader_list)).setUpdateFinishedListener(updateFinished); - */ - - /* - AppUpdater au = new AppUpdater(this, false); - au.UpdateApp(); - */ - - /* - // compute your public key and store it in base64EncodedPublicKey - mHelper = new IabHelper(this, Constants.getBase64EncodedPublicKey()); - mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { - public void onIabSetupFinished(IabResult result) { - if (!result.isSuccess()) { - // Oh noes, there was a problem. - Log.d(TAG, "Problem setting up In-app Billing: " + result); - } - } - }); - */ - - //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(); - - //if(mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, false)) - // startSync(); - - } - - - - @Override - protected void onResume() { - ThemeChooser.chooseTheme(this); - - NewsReaderListFragment nlf = ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)); - if(nlf != null) - nlf.lvAdapter.notifyDataSetChanged(); - super.onResume(); - } - - @Override - public void onDestroy() { - //this.unregisterReceiver() - super.onDestroy(); - /* - try - { - if (mHelper != null) - mHelper.dispose(); - mHelper = null; - } - catch(Exception ex) - { - ex.printStackTrace(); - }*/ - } - - - /** - * Callback method from {@link NewsReaderListFragment.Callbacks} indicating - * that the item with the given ID was selected. - */ - @Override - public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id) { - StartDetailFragment(idSubscription, isFolder, optional_folder_id); - } - - @Override - public void onChildItemClicked(String idSubscription, String optional_folder_id) { - StartDetailFragment(idSubscription, false, optional_folder_id); - } - - private void StartDetailFragment(String id, Boolean folder, String optional_folder_id) - { - if(super.getMenuItemMarkAllAsRead() != null) - super.getMenuItemMarkAllAsRead().setEnabled(true); - if(super.getMenuItemDownloadMoreItems() != null) - super.getMenuItemDownloadMoreItems().setEnabled(true); - - DatabaseConnection dbConn = new DatabaseConnection(getApplicationContext()); - - Intent detailIntent = new Intent(this, NewsReaderDetailActivity.class); - //detailIntent.putExtra(NewsReaderDetailFragment.ARG_ITEM_ID, id); - if(!folder) - { - detailIntent.putExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID, id); - detailIntent.putExtra(NewsReaderDetailActivity.FOLDER_ID, optional_folder_id); - detailIntent.putExtra(NewsReaderDetailActivity.TITEL, dbConn.getTitleOfSubscriptionByRowID(id)); - } - else - { - detailIntent.putExtra(NewsReaderDetailActivity.FOLDER_ID, id); - int idFolder = Integer.valueOf(id); - if(idFolder >= 0) - detailIntent.putExtra(NewsReaderDetailActivity.TITEL, dbConn.getTitleOfFolderByID(id)); - else if(idFolder == -10) - detailIntent.putExtra(NewsReaderDetailActivity.TITEL, getString(R.string.allUnreadFeeds)); - else if(idFolder == -11) - detailIntent.putExtra(NewsReaderDetailActivity.TITEL, getString(R.string.starredFeeds)); - } - - - if (mTwoPane) { - // In two-pane mode, show the detail view in this activity by - // adding or replacing the detail fragment using a - // fragment transaction. - Bundle arguments = detailIntent.getExtras(); - - //arguments.putString(NewsReaderDetailFragment.ARG_ITEM_ID, id); - - //getApplicationContext().startActivity(detailIntent); - - NewsReaderDetailFragment fragment = new NewsReaderDetailFragment(); - fragment.setArguments(arguments); - getSupportFragmentManager().beginTransaction() - .replace(R.id.newsreader_detail_container, fragment) - .commit(); - - } else { - // In single-pane mode, simply start the detail activity - // for the selected item ID. - startActivity(detailIntent); - } - - dbConn.closeDatabase(); - } - - - public void UpdateItemList()//Only in use on Tablets - { - if(mTwoPane) - { - NewsReaderDetailFragment nrD = (NewsReaderDetailFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container); - if(nrD != null) - nrD.UpdateCursor(); - } - } - - - void startSync() - { - //menuItemUpdater.setActionView(R.layout.inderterminate_progress); - ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).StartSync(); - } - - @SuppressWarnings("static-access") - public void UpdateButtonSyncLayout() - { - if(super.getMenuItemUpdater() != null) - { - IReader _Reader = ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list))._Reader; - PullToRefreshExpandableListView pullToRefreshView = (PullToRefreshExpandableListView) findViewById(R.id.expandableListView); - if(_Reader.isSyncRunning()) - { - super.getMenuItemUpdater().setActionView(R.layout.inderterminate_progress); - if(pullToRefreshView != null) - pullToRefreshView.setRefreshing(true); - - } - else - { - super.getMenuItemUpdater().setActionView(null); - if(pullToRefreshView != null) - pullToRefreshView.onRefreshComplete(); - } - } - } - - - @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); - //getSupportMenuInflater().inflate(R.menu.news_reader, menu); - - super.onCreateOptionsMenu(menu, getSupportMenuInflater(), mTwoPane, this); - - UpdateButtonSyncLayout(); - - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean handled = super.onOptionsItemSelected(item, this); - if(!handled) - { - switch (item.getItemId()) { - case R.id.action_settings: - Intent intent = new Intent(this, SettingsActivity.class); - //intent.putExtra(EXTRA_MESSAGE, message); - startActivityForResult(intent, RESULT_SETTINGS); - return true; - - case R.id.menu_update: - //menuItemUpdater = item.setActionView(R.layout.inderterminate_progress); - startSync(); - break; - - case R.id.action_login: - StartLoginFragment(); - break; - - case R.id.menu_StartImageCaching: - DatabaseConnection dbConn = new DatabaseConnection(this); - try { - long highestItemId = dbConn.getLowestItemIdUnread(); - Intent service = new Intent(this, DownloadImagesService.class); - service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemId); - startService(service); - } finally { - dbConn.closeDatabase(); - } - break; - } - } - return super.onOptionsItemSelected(item); - } - - private static final int RESULT_SETTINGS = 15642; - - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - //if (requestCode == 1) { - if(resultCode == RESULT_OK){ - int pos = data.getIntExtra("POS", 0); - NewsReaderDetailActivity.UpdateListViewAndScrollToPos(this, pos); - - ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).lvAdapter.notifyDataSetChanged(); - } - else if(requestCode == RESULT_SETTINGS) - { - ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).lvAdapter.ReloadAdapter(); - } - } - - - public void StartLoginFragment() - { - SherlockDialogFragment dialog = new LoginDialogFragment(); - dialog.show(getSupportFragmentManager(), "NoticeDialogFragment"); - } - - /* - AsyncUpdateFinished updateFinished = new AsyncUpdateFinished() { - - @Override - public void FinishedUpdate() { - menuItemUpdater.setActionView(null); - } - };*/ -} +package de.luhmer.owncloudnewsreader; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.handmark.pulltorefresh.library.BlockingExpandableListView; +import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView; + +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.helper.MenuUtilsSherlockFragmentActivity; +import de.luhmer.owncloudnewsreader.helper.ThemeChooser; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.services.DownloadImagesService; + +/** + * An activity representing a list of NewsReader. 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 NewsReaderDetailActivity} representing item details. On tablets, the + * activity presents the list of items and item details side-by-side using two + * vertical panes. + *

+ * 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}. + *

+ * This activity also implements the required + * {@link NewsReaderListFragment.Callbacks} interface to listen for item + * selections. + */ +public class NewsReaderListActivity extends MenuUtilsSherlockFragmentActivity implements + NewsReaderListFragment.Callbacks { + + /** + * Whether or not the activity is in two-pane mode, i.e. running on a tablet + * device. + */ + private boolean mTwoPane; + //IabHelper mHelper; + static final String TAG = "NewsReaderListActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + ThemeChooser.chooseTheme(this); + + //setTheme(R.style.Theme_Sherlock); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_newsreader_list); + + + if (findViewById(R.id.newsreader_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. + + ((NewsReaderListFragment) getSupportFragmentManager() + .findFragmentById(R.id.newsreader_list)) + .setActivateOnItemClick(true); + } + + + //DatabaseUtils.CopyDatabaseToSdCard(this); + + /* + ((NewsReaderListFragment) getSupportFragmentManager() + .findFragmentById(R.id.newsreader_list)).setUpdateFinishedListener(updateFinished); + */ + + /* + AppUpdater au = new AppUpdater(this, false); + au.UpdateApp(); + */ + + /* + // compute your public key and store it in base64EncodedPublicKey + mHelper = new IabHelper(this, Constants.getBase64EncodedPublicKey()); + mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { + public void onIabSetupFinished(IabResult result) { + if (!result.isSuccess()) { + // Oh noes, there was a problem. + Log.d(TAG, "Problem setting up In-app Billing: " + result); + } + } + }); + */ + + //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(); + + //if(mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, false)) + // startSync(); + + } + + public void updateAdapter() { + NewsReaderListFragment nlf = ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)); + if(nlf != null) + { + // Block children layout for now + PullToRefreshExpandableListView ptrel = ((PullToRefreshExpandableListView)nlf.eListView); + BlockingExpandableListView bView = ((BlockingExpandableListView) ptrel.getRefreshableView()); + bView.setBlockLayoutChildren(true); + nlf.lvAdapter.notifyDataSetChanged(); + bView.setBlockLayoutChildren(false); + } + } + + @Override + protected void onResume() { + ThemeChooser.chooseTheme(this); + + updateAdapter(); + + super.onResume(); + } + + @Override + public void onDestroy() { + //this.unregisterReceiver() + super.onDestroy(); + /* + try + { + if (mHelper != null) + mHelper.dispose(); + mHelper = null; + } + catch(Exception ex) + { + ex.printStackTrace(); + }*/ + } + + + /** + * Callback method from {@link NewsReaderListFragment.Callbacks} indicating + * that the item with the given ID was selected. + */ + @Override + public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id) { + StartDetailFragment(idSubscription, isFolder, optional_folder_id); + } + + @Override + public void onChildItemClicked(String idSubscription, String optional_folder_id) { + StartDetailFragment(idSubscription, false, optional_folder_id); + } + + private void StartDetailFragment(String id, Boolean folder, String optional_folder_id) + { + if(super.getMenuItemMarkAllAsRead() != null) + super.getMenuItemMarkAllAsRead().setEnabled(true); + if(super.getMenuItemDownloadMoreItems() != null) + super.getMenuItemDownloadMoreItems().setEnabled(true); + + DatabaseConnection dbConn = new DatabaseConnection(getApplicationContext()); + + Intent detailIntent = new Intent(this, NewsReaderDetailActivity.class); + //detailIntent.putExtra(NewsReaderDetailFragment.ARG_ITEM_ID, id); + if(!folder) + { + detailIntent.putExtra(NewsReaderDetailActivity.SUBSCRIPTION_ID, id); + detailIntent.putExtra(NewsReaderDetailActivity.FOLDER_ID, optional_folder_id); + detailIntent.putExtra(NewsReaderDetailActivity.TITEL, dbConn.getTitleOfSubscriptionByRowID(id)); + } + else + { + detailIntent.putExtra(NewsReaderDetailActivity.FOLDER_ID, id); + int idFolder = Integer.valueOf(id); + if(idFolder >= 0) + detailIntent.putExtra(NewsReaderDetailActivity.TITEL, dbConn.getTitleOfFolderByID(id)); + else if(idFolder == -10) + detailIntent.putExtra(NewsReaderDetailActivity.TITEL, getString(R.string.allUnreadFeeds)); + else if(idFolder == -11) + detailIntent.putExtra(NewsReaderDetailActivity.TITEL, getString(R.string.starredFeeds)); + } + + + if (mTwoPane) { + // In two-pane mode, show the detail view in this activity by + // adding or replacing the detail fragment using a + // fragment transaction. + Bundle arguments = detailIntent.getExtras(); + + //arguments.putString(NewsReaderDetailFragment.ARG_ITEM_ID, id); + + //getApplicationContext().startActivity(detailIntent); + + NewsReaderDetailFragment fragment = new NewsReaderDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.newsreader_detail_container, fragment) + .commit(); + + } else { + // In single-pane mode, simply start the detail activity + // for the selected item ID. + startActivity(detailIntent); + } + + dbConn.closeDatabase(); + } + + + public void UpdateItemList()//Only in use on Tablets + { + if(mTwoPane) + { + NewsReaderDetailFragment nrD = (NewsReaderDetailFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container); + if(nrD != null) + nrD.UpdateCursor(); + } + } + + + void startSync() + { + //menuItemUpdater.setActionView(R.layout.inderterminate_progress); + ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).StartSync(); + } + + @SuppressWarnings("static-access") + public void UpdateButtonSyncLayout() + { + if(super.getMenuItemUpdater() != null) + { + IReader _Reader = ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list))._Reader; + PullToRefreshExpandableListView pullToRefreshView = (PullToRefreshExpandableListView) findViewById(R.id.expandableListView); + if(_Reader.isSyncRunning()) + { + super.getMenuItemUpdater().setActionView(R.layout.inderterminate_progress); + if(pullToRefreshView != null) + pullToRefreshView.setRefreshing(true); + + } + else + { + super.getMenuItemUpdater().setActionView(null); + if(pullToRefreshView != null) + pullToRefreshView.onRefreshComplete(); + } + } + } + + + @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); + //getSupportMenuInflater().inflate(R.menu.news_reader, menu); + + super.onCreateOptionsMenu(menu, getSupportMenuInflater(), mTwoPane, this); + + UpdateButtonSyncLayout(); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean handled = super.onOptionsItemSelected(item, this); + if(!handled) + { + switch (item.getItemId()) { + case R.id.action_settings: + Intent intent = new Intent(this, SettingsActivity.class); + //intent.putExtra(EXTRA_MESSAGE, message); + startActivityForResult(intent, RESULT_SETTINGS); + return true; + + case R.id.menu_update: + //menuItemUpdater = item.setActionView(R.layout.inderterminate_progress); + startSync(); + break; + + case R.id.action_login: + StartLoginFragment(); + break; + + case R.id.menu_StartImageCaching: + DatabaseConnection dbConn = new DatabaseConnection(this); + try { + long highestItemId = dbConn.getLowestItemIdUnread(); + Intent service = new Intent(this, DownloadImagesService.class); + service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemId); + startService(service); + } finally { + dbConn.closeDatabase(); + } + break; + } + } + return super.onOptionsItemSelected(item); + } + + private static final int RESULT_SETTINGS = 15642; + + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + //if (requestCode == 1) { + if(resultCode == RESULT_OK){ + int pos = data.getIntExtra("POS", 0); + NewsReaderDetailActivity.UpdateListViewAndScrollToPos(this, pos); + + ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).lvAdapter.notifyDataSetChanged(); + } + else if(requestCode == RESULT_SETTINGS) + { + ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.newsreader_list)).lvAdapter.ReloadAdapter(); + } + } + + + public void StartLoginFragment() + { + SherlockDialogFragment dialog = new LoginDialogFragment(); + dialog.show(getSupportFragmentManager(), "NoticeDialogFragment"); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java b/src/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java index 3b3e4f9c..5d4c007a 100644 --- a/src/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java +++ b/src/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java @@ -1,589 +1,590 @@ -package de.luhmer.owncloudnewsreader; - -import java.util.List; - -import org.apache.http.client.HttpResponseException; -import org.apache.http.conn.HttpHostConnectException; - -import android.app.Activity; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.widget.ExpandableListView; -import android.widget.ExpandableListView.OnChildClickListener; -import android.widget.ListView; -import android.widget.Toast; - -import com.actionbarsherlock.app.SherlockFragment; -import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; -import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView; - -import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; -import de.luhmer.owncloudnewsreader.data.FolderSubscribtionItem; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.interfaces.ExpListTextClicked; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; -import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; - -/** - * A list fragment representing a list of NewsReader. This fragment also - * supports tablet devices by allowing list items to be given an 'activated' - * state upon selection. This helps indicate which item is currently being - * viewed in a {@link NewsReaderDetailFragment}. - *

- * Activities containing this fragment MUST implement the {@link Callbacks} - * interface. - */ -public class NewsReaderListFragment extends SherlockFragment implements OnCreateContextMenuListener /*, - ExpandableListView.OnChildClickListener, - ExpandableListView.OnGroupCollapseListener, - ExpandableListView.OnGroupExpandListener*/ { - - - - /** - * The serialization (saved instance state) Bundle key representing the - * activated item position. Only used on tablets. - */ - private static final String STATE_ACTIVATED_POSITION = "activated_position"; - - protected static final String TAG = "NewsReaderListFragment"; - - /** - * The fragment's current callback object, which is notified of list item - * clicks. - */ - private Callbacks mCallbacks = sExpListCallbacks; - - /** - * The current activated item position. Only used on tablets. - */ - private int mActivatedPosition = ListView.INVALID_POSITION; - - /** - * A callback interface that all activities containing this fragment must - * implement. This mechanism allows activities to be notified of item - * selections. - */ - public interface Callbacks { - /** - * Callback for when an item has been selected. - */ - public void onChildItemClicked(String idSubscription, String optional_folder_id); - public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id); - } - - /** - * A dummy implementation of the {@link Callbacks} interface that does - * nothing. Used only when this fragment is not attached to an activity. - */ - private static Callbacks sExpListCallbacks = new Callbacks() { - @Override - public void onChildItemClicked(String idSubscription, String optional_folder_id) { - } - - @Override - public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id) { - } - }; - - DatabaseConnection dbConn; - //SubscriptionExpandableListAdapter lvAdapter; - SubscriptionExpandableListAdapter lvAdapter; - //ExpandableListView eListView; - PullToRefreshExpandableListView eListView; - public static IReader _Reader = null; //AsyncTask_GetGReaderTags asyncTask_GetUnreadFeeds = null; - - public static String username; - public static String password; - //AsyncUpdateFinished asyncUpdateFinished; - - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - public NewsReaderListFragment() { - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setRetainInstance(true); - - try - { - dbConn = new DatabaseConnection(getActivity()); - - /* - //Update Database Stuff first - try { - PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - if(mPrefs.getInt("LAST_APP_VERSION", 0) < pInfo.versionCode) - { - dbConn.resetDatabase(); - SharedPreferences.Editor editor = mPrefs.edit(); - editor.putInt("LAST_APP_VERSION", pInfo.versionCode); - editor.commit(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - */ - - - /* - String val = String.valueOf(dbConn.getLongValueBySQL("SELECT COUNT(*) FROM " + - DatabaseConnection.RSS_ITEM_TABLE + - " WHERE " + DatabaseConnection.RSS_ITEM_STARRED_TEMP + " != " + DatabaseConnection.RSS_ITEM_STARRED - )); - Toast.makeText(getActivity(), val, Toast.LENGTH_LONG).show(); - */ - - //dbConn.resetDatabase(); - - //dbConn.clearDatabaseOverSize(); - - username = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("edt_username", ""); - password = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("edt_password", ""); - - //dbConn.resetRssItemsDatabase(); - - lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), dbConn); - lvAdapter.setHandlerListener(expListTextClickedListener); - - if(_Reader == null) - _Reader = new OwnCloud_Reader(); - - - //((NewsReaderListActivity) getActivity()).startSync(); - - //_Reader.Start_AsyncTask_GetFeeds(2, getActivity(), null); - - - /* - new AsyncTask_GetGReaderTags(1, getActivity(), onAsyncTask_GetTopReaderTags).execute(username, password); - new AsyncTask_GetSubReaderTags(1, getActivity(), onAsyncTask_GetSubReaderTags).execute(username, password);*/ - - - } - catch(Exception ex) - { - ex.printStackTrace(); - } - } - - - - public void StartSync() - { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - if(mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) == null) - { - NewsReaderListActivity nla = (NewsReaderListActivity) getActivity(); - nla.StartLoginFragment(); - - } else { - if (!_Reader.isSyncRunning()) - { - DatabaseConnection dbConn = new DatabaseConnection(getActivity()); - try { - //Mark as READ - List item_ids = dbConn.getAllNewReadItems(); - _Reader.Start_AsyncTask_PerformTagAction(-4, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_READ); - - //Mark as UNREAD - item_ids = dbConn.getAllNewUnreadItems(); - _Reader.Start_AsyncTask_PerformTagAction(-3, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_UNREAD); - - //Mark as STARRED - item_ids = dbConn.getAllNewStarredItems(); - _Reader.Start_AsyncTask_PerformTagAction(-2, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_STARRED); - - //Mark as UNSTARRED - item_ids = dbConn.getAllNewUnstarredItems(); - _Reader.Start_AsyncTask_PerformTagAction(-1, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_UNSTARRED); - } finally { - dbConn.closeDatabase(); - } - - if(eListView != null) - eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateTags)); - //_Reader.Start_AsyncTask_GetFolder(0, getActivity(), onAsyncTask_GetTopReaderTags); - } - else - //_Reader.attachToRunningTask(0, getActivity(), onAsyncTask_GetTopReaderTags); - _Reader.attachToRunningTask(-1, getActivity(), onAsyncTask_PerformTagExecute); - } - - UpdateSyncButtonLayout(); - } - - OnAsyncTaskCompletedListener onAsyncTask_PerformTagExecute = new OnAsyncTaskCompletedListener() { - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - if(task_result != null)//task result is null if there was an error - { - if((Boolean) task_result) - { - //dbConn.resetDatabase(); - - if(task_id == -1) - { - _Reader.Start_AsyncTask_GetFolder(1, getActivity(), onAsyncTask_GetTopReaderTags); - if(eListView != null) - eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateFolder)); - } - else - _Reader.setSyncRunning(true); - } - else - UpdateSyncButtonLayout(); - } - else - UpdateSyncButtonLayout(); - } - }; - - OnAsyncTaskCompletedListener onAsyncTask_GetTopReaderTags = new OnAsyncTaskCompletedListener() { - - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - Log.d(TAG, "onAsyncTask_GetTopReaderTags started: " + task_id); - - if(task_result != null) - { - if(task_result instanceof HttpHostConnectException) - ShowToastLong("Cannot connect to the Host !"); - else if(task_result instanceof HttpResponseException) - { - HttpResponseException responseException = (HttpResponseException) task_result; - //if(responseException.getStatusCode() == 401) - // ShowToastLong("Authentication failed"); - //else - ShowToastLong(responseException.getLocalizedMessage()); - } - else - ShowToastLong(((Exception)task_result).getLocalizedMessage()); - - UpdateSyncButtonLayout(); - } - else - { - _Reader.Start_AsyncTask_GetFeeds(1, getActivity(), onAsyncTask_GetSubReaderTags); - if(eListView != null) - eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateFeeds)); - } - - lvAdapter.notifyDataSetChanged(); - Log.d(TAG, "onAsyncTask_GetTopReaderTags Finished"); - } - }; - - public void ShowToastLong(String message) - { - Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); - } - - OnAsyncTaskCompletedListener onAsyncTask_GetSubReaderTags = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - - Log.d(TAG, "onAsyncTask_GetSubReaderTags Finished"); - - if(task_result != null) - { - ShowToastLong(((Exception)task_result).getLocalizedMessage()); - UpdateSyncButtonLayout(); - } - else - { - //dbConn.resetRssItemsDatabase(); - - _Reader.Start_AsyncTask_GetItems(2, getActivity(), onAsyncTask_GetFeeds, TAGS.ALL);//Recieve all unread Items - //_Reader.Start_AsyncTask_GetFeeds(3, getActivity(), onAsyncTask_GetFeeds, TAGS.ALL_STARRED);//Recieve all starred Items - - if(eListView != null) - eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateItems)); - } - - - - lvAdapter.ReloadAdapter(); - //lvAdapter.notifyDataSetChanged(); - //eListView.setAdapter(new SubscriptionExpandableListAdapter(getActivity(), dbConn)); - - //new AsyncTask_GetFeeds(0, getActivity(), onAsyncTask_GetFeeds).execute(username, password, Constants._TAG_LABEL_UNREAD); - //new AsyncTask_GetFeeds(0, getActivity(), onAsyncTask_GetFeeds).execute(username, password, Constants._TAG_LABEL_STARRED); - } - }; - - OnAsyncTaskCompletedListener onAsyncTask_GetFeeds = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - - if(task_result != null) - ShowToastLong(((Exception)task_result).getLocalizedMessage()); - - lvAdapter.notifyDataSetChanged(); - //Activity act = getActivity(); - //lvAdapter = new SubscriptionExpandableListAdapter(act, dbConn); - - Log.d(TAG, "onAsyncTask_GetFeeds Finished"); - - if(eListView != null) - eListView.getLoadingLayoutProxy().setLastUpdatedLabel(null); - - UpdateSyncButtonLayout(); - - lvAdapter.ReloadAdapter(); - - NewsReaderListActivity nlActivity = (NewsReaderListActivity) getActivity(); - nlActivity.UpdateItemList(); - - //fireUpdateFinishedClicked(); - } - }; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View V = null; - try - { - V = inflater.inflate(R.layout.expandable_list_layout, container, false); - //eListView = (ExpandableListView) V.findViewById(R.id.expandableListView); - eListView = (PullToRefreshExpandableListView) V.findViewById(R.id.expandableListView); - - - //eListView.setGroupIndicator(getResources().getDrawable(R.drawable.expandable_group_indicator)); - eListView.setGroupIndicator(null); - - //eListView.demo(); - eListView.setShowIndicator(false); - - eListView.setOnRefreshListener(new OnRefreshListener() { - @Override - public void onRefresh(PullToRefreshBase refreshView) { - StartSync(); - } - }); - - eListView.setOnChildClickListener(onChildClickListener); - //eListView.setSmoothScrollbarEnabled(true); - - View empty = inflater.inflate(R.layout.subscription_list_item_empty, null, false); - getActivity().addContentView(empty, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - eListView.setEmptyView(empty); - /* - eListView.setClickable(true); - eListView.setOnGroupClickListener(new OnGroupClickListener() { - - @Override - public boolean onGroupClick(ExpandableListView parent, View v, - int groupPosition, long id) { - Log.d("hi", String.valueOf(groupPosition)); - //return false; - return true; - } - });*/ - eListView.setExpandableAdapter(lvAdapter); - - - //Start auto sync if enabled - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - if(mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, false)) - StartSync(); - - } - catch(Exception ex) - { - ex.printStackTrace(); - } - - return V; - //return super.onCreateView(inflater, container, savedInstanceState); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - - // Restore the previously serialized activated item position. - if (savedInstanceState != null - && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { - setActivatedPosition(savedInstanceState - .getInt(STATE_ACTIVATED_POSITION)); - } - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - // Activities containing this fragment must implement its callbacks. - if (!(activity instanceof Callbacks)) { - throw new IllegalStateException( - "Activity must implement fragment's callbacks."); - } - - mCallbacks = (Callbacks) activity; - } - - @Override - public void onDetach() { - super.onDetach(); - - // Reset the active callbacks interface to the dummy implementation. - mCallbacks = sExpListCallbacks; - } - - ExpListTextClicked expListTextClickedListener = new ExpListTextClicked() { - - @Override - public void onTextClicked(String idSubscription, Context context, boolean isFolder, String optional_folder_id) { - mCallbacks.onTopItemClicked(idSubscription, isFolder, optional_folder_id); - } - }; - - /* - @Override - public void onListItemClick(ListView listView, View view, int position, - long id) { - super.onListItemClick(listView, view, position, id); - - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - - //mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id); - }*/ - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mActivatedPosition != ListView.INVALID_POSITION) { - // Serialize and persist the activated item position. - outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); - } - } - - OnChildClickListener onChildClickListener = new OnChildClickListener() { - - @Override - public boolean onChildClick(ExpandableListView parent, View v, - int groupPosition, int childPosition, long id) { - - long idItem = lvAdapter.getChildId(groupPosition, childPosition); - - String optional_id_folder = null; - FolderSubscribtionItem groupItem = (FolderSubscribtionItem) lvAdapter.getGroup(groupPosition); - if(groupItem != null) - optional_id_folder = String.valueOf(groupItem.id_database); - - mCallbacks.onChildItemClicked(String.valueOf(idItem), optional_id_folder); - - return false; - } - }; - - /** - * Turns on activate-on-click mode. When this mode is on, list items will be - * given the 'activated' state when touched. - */ - public void setActivateOnItemClick(boolean activateOnItemClick) { - // When setting CHOICE_MODE_SINGLE, ListView will automatically - // give items the 'activated' state when touched. - - - //eListView.setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);//TODO comment this in - } - - private void setActivatedPosition(int position) {/*//TODO comment this in - if (position == ListView.INVALID_POSITION) { - //getListView().setItemChecked(mActivatedPosition, false); - eListView.setItemChecked(mActivatedPosition, false); - } else { - eListView.setItemChecked(position, true); - //getListView().setItemChecked(position, true); - }*/ - - mActivatedPosition = position; - } - - - public void UpdateSyncButtonLayout() - { - if(getActivity() != null) - ((NewsReaderListActivity) getActivity()).UpdateButtonSyncLayout(); - } - - /* - public void setUpdateFinishedListener(AsyncUpdateFinished listener) - { - asyncUpdateFinished = listener; - } - protected void fireUpdateFinishedClicked() - { - if(asyncUpdateFinished != null) - asyncUpdateFinished.FinishedUpdate(); - }*/ -} - - -/* - dbConn.insertNewSubscription("Ungelesene Artikel"); - dbConn.insertNewSubscription("Markierte Artikel"); - dbConn.insertNewSubscription("Android"); - dbConn.insertNewSubscription("Apple"); - dbConn.insertNewSubscription("Bugtracker"); - dbConn.insertNewSubscription("Development"); - dbConn.insertNewSubscription("Linux"); - dbConn.insertNewSubscription("Software"); - dbConn.insertNewSubscription("Owncloud"); - dbConn.insertNewSubscription("Other"); - - dbConn.insertNewSub_Subscription("4droid", dbConn.getIdOfSubscription("Android")); - dbConn.insertNewSub_Subscription("GIGA Rss Feed", dbConn.getIdOfSubscription("Android")); - - dbConn.insertNewSub_Subscription("macnews.de", dbConn.getIdOfSubscription("Apple")); - dbConn.insertNewSub_Subscription("MACNOTES.DE", dbConn.getIdOfSubscription("Apple")); - - dbConn.insertNewSub_Subscription("FS Bugtracker", dbConn.getIdOfSubscription("Bugtracker")); - - dbConn.insertNewSub_Subscription("Code 2 Learn", dbConn.getIdOfSubscription("Development")); - dbConn.insertNewSub_Subscription("Coding Horror", dbConn.getIdOfSubscription("Development")); - - dbConn.insertNewSub_Subscription("Canoncial", dbConn.getIdOfSubscription("Linux")); - - dbConn.insertNewSub_Subscription("iTek Zone", dbConn.getIdOfSubscription("Software")); - - dbConn.insertNewSub_Subscription("CNET", dbConn.getIdOfSubscription("Other")); - - dbConn.insertNewSub_Subscription("ownCloud.org", dbConn.getIdOfSubscription("Owncloud")); - - dbConn.insertNewFeed("Samsung Game Pad pops up on Galaxy S4 site, outs Note 3?", - "http://news.cnet.com/8301-17938_105-57574766-1/samsung-game-pad-pops-up-on-galaxy-s4-site-outs-note-3/?part\u003drss\u0026subj\u003dnews\u0026tag\u003d2547-1_3-0-20", - "The gaming controller works with devices up to 6.3 inches, perhaps suggesting Samsung is planning a bigger phablet, or should we be calling it a \"tabone?\"", - "0", - dbConn.getIdOfSubscription("CNET")); - - */ - +package de.luhmer.owncloudnewsreader; + +import java.util.List; + +import org.apache.http.client.HttpResponseException; +import org.apache.http.conn.HttpHostConnectException; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.ExpandableListView; +import android.widget.ExpandableListView.OnChildClickListener; +import android.widget.ListView; +import android.widget.Toast; + +import com.actionbarsherlock.app.SherlockFragment; +import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView; + +import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; +import de.luhmer.owncloudnewsreader.data.FolderSubscribtionItem; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.interfaces.ExpListTextClicked; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.API; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv1.APIv1; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; + +/** + * A list fragment representing a list of NewsReader. This fragment also + * supports tablet devices by allowing list items to be given an 'activated' + * state upon selection. This helps indicate which item is currently being + * viewed in a {@link NewsReaderDetailFragment}. + *

+ * Activities containing this fragment MUST implement the {@link Callbacks} + * interface. + */ +public class NewsReaderListFragment extends SherlockFragment implements OnCreateContextMenuListener /*, + ExpandableListView.OnChildClickListener, + ExpandableListView.OnGroupCollapseListener, + ExpandableListView.OnGroupExpandListener*/ { + + + + /** + * The serialization (saved instance state) Bundle key representing the + * activated item position. Only used on tablets. + */ + private static final String STATE_ACTIVATED_POSITION = "activated_position"; + + protected static final String TAG = "NewsReaderListFragment"; + + /** + * The fragment's current callback object, which is notified of list item + * clicks. + */ + private Callbacks mCallbacks = sExpListCallbacks; + + /** + * The current activated item position. Only used on tablets. + */ + private int mActivatedPosition = ListView.INVALID_POSITION; + + /** + * A callback interface that all activities containing this fragment must + * implement. This mechanism allows activities to be notified of item + * selections. + */ + public interface Callbacks { + /** + * Callback for when an item has been selected. + */ + public void onChildItemClicked(String idSubscription, String optional_folder_id); + public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id); + } + + /** + * A dummy implementation of the {@link Callbacks} interface that does + * nothing. Used only when this fragment is not attached to an activity. + */ + private static Callbacks sExpListCallbacks = new Callbacks() { + @Override + public void onChildItemClicked(String idSubscription, String optional_folder_id) { + } + + @Override + public void onTopItemClicked(String idSubscription, boolean isFolder, String optional_folder_id) { + } + }; + + DatabaseConnection dbConn; + //SubscriptionExpandableListAdapter lvAdapter; + SubscriptionExpandableListAdapter lvAdapter; + //ExpandableListView eListView; + PullToRefreshExpandableListView eListView; + public static IReader _Reader = null; //AsyncTask_GetGReaderTags asyncTask_GetUnreadFeeds = null; + + public static String username; + public static String password; + //AsyncUpdateFinished asyncUpdateFinished; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public NewsReaderListFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setRetainInstance(true); + + try + { + dbConn = new DatabaseConnection(getActivity()); + + //dbConn.resetDatabase(); + + //dbConn.clearDatabaseOverSize(); + + username = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("edt_username", ""); + password = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("edt_password", ""); + + //dbConn.resetRssItemsDatabase(); + + lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), dbConn); + lvAdapter.setHandlerListener(expListTextClickedListener); + + if(_Reader == null) + _Reader = new OwnCloud_Reader(); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + } + + + + public void StartSync() + { + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + if(mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) == null) + { + NewsReaderListActivity nla = (NewsReaderListActivity) getActivity(); + nla.StartLoginFragment(); + + } else { + if (!_Reader.isSyncRunning()) + { + OwnCloud_Reader ocReader = (OwnCloud_Reader) _Reader; + ocReader.Start_AsyncTask_GetVersion(-10, getActivity(), onAsyncTask_GetVersionFinished, username, password); + } + else + _Reader.attachToRunningTask(-10, getActivity(), onAsyncTask_GetVersionFinished); + } + + UpdateSyncButtonLayout(); + } + + OnAsyncTaskCompletedListener onAsyncTask_GetVersionFinished = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + + if(!(task_result instanceof Exception)) + { + API api = null; + String appVersion = task_result.toString(); + int versionCode = 0; + if(appVersion != null) + { + appVersion = appVersion.replace(".", ""); + versionCode = Integer.parseInt(appVersion); + } + if (versionCode >= 1101) { + api = new APIv2(getActivity()); + } else { + api = new APIv1(getActivity()); + } + + ((OwnCloud_Reader) _Reader).setApi(api); + + DatabaseConnection dbConn = new DatabaseConnection(getActivity()); + try { + //Mark as READ + List item_ids = dbConn.getAllNewReadItems(); + _Reader.Start_AsyncTask_PerformTagAction(-4, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_READ); + + //Mark as UNREAD + item_ids = dbConn.getAllNewUnreadItems(); + _Reader.Start_AsyncTask_PerformTagAction(-3, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_UNREAD); + + //Mark as STARRED + item_ids = dbConn.getAllNewStarredItems(); + _Reader.Start_AsyncTask_PerformTagAction(-2, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_STARRED); + + //Mark as UNSTARRED + item_ids = dbConn.getAllNewUnstarredItems(); + _Reader.Start_AsyncTask_PerformTagAction(-1, getActivity(), onAsyncTask_PerformTagExecute, item_ids, TAGS.MARK_ITEM_AS_UNSTARRED); + } finally { + dbConn.closeDatabase(); + } + + if(eListView != null) + eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateTags)); + //_Reader.Start_AsyncTask_GetFolder(0, getActivity(), onAsyncTask_GetTopReaderTags); + } + UpdateSyncButtonLayout(); + } + }; + + //Sync state of items e.g. read/unread/starred/unstarred + OnAsyncTaskCompletedListener onAsyncTask_PerformTagExecute = new OnAsyncTaskCompletedListener() { + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + if(task_result != null)//task result is null if there was an error + { + if((Boolean) task_result) + { + //dbConn.resetDatabase(); + + if(task_id == -1) + { + _Reader.Start_AsyncTask_GetFolder(1, getActivity(), onAsyncTask_GetFolder); + if(eListView != null) + eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateFolder)); + } + else + _Reader.setSyncRunning(true); + } + else + UpdateSyncButtonLayout(); + } + else + UpdateSyncButtonLayout(); + } + }; + + + OnAsyncTaskCompletedListener onAsyncTask_GetFolder = new OnAsyncTaskCompletedListener() { + + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + Log.d(TAG, "onAsyncTask_GetTopReaderTags started: " + task_id); + + if(task_result != null) + { + if(task_result instanceof HttpHostConnectException) + ShowToastLong("Cannot connect to the Host !"); + else if(task_result instanceof HttpResponseException) + { + HttpResponseException responseException = (HttpResponseException) task_result; + //if(responseException.getStatusCode() == 401) + // ShowToastLong("Authentication failed"); + //else + ShowToastLong(responseException.getLocalizedMessage()); + } + else + ShowToastLong(((Exception)task_result).getLocalizedMessage()); + + UpdateSyncButtonLayout(); + } + else + { + _Reader.Start_AsyncTask_GetFeeds(1, getActivity(), onAsyncTask_GetFeed); + if(eListView != null) + eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateFeeds)); + } + + lvAdapter.notifyDataSetChanged(); + Log.d(TAG, "onAsyncTask_GetTopReaderTags Finished"); + } + }; + + public void ShowToastLong(String message) + { + Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); + } + + OnAsyncTaskCompletedListener onAsyncTask_GetFeed = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + + Log.d(TAG, "onAsyncTask_GetSubReaderTags Finished"); + + if(task_result != null) + { + ShowToastLong(((Exception)task_result).getLocalizedMessage()); + UpdateSyncButtonLayout(); + } + else + { + //dbConn.resetRssItemsDatabase(); + + _Reader.Start_AsyncTask_GetItems(2, getActivity(), onAsyncTask_GetItems, TAGS.ALL);//Recieve all unread Items + //_Reader.Start_AsyncTask_GetFeeds(3, getActivity(), onAsyncTask_GetFeeds, TAGS.ALL_STARRED);//Recieve all starred Items + + if(eListView != null) + eListView.getLoadingLayoutProxy().setLastUpdatedLabel(getString(R.string.pull_to_refresh_updateItems)); + } + + + + lvAdapter.ReloadAdapter(); + //lvAdapter.notifyDataSetChanged(); + //eListView.setAdapter(new SubscriptionExpandableListAdapter(getActivity(), dbConn)); + + //new AsyncTask_GetFeeds(0, getActivity(), onAsyncTask_GetFeeds).execute(username, password, Constants._TAG_LABEL_UNREAD); + //new AsyncTask_GetFeeds(0, getActivity(), onAsyncTask_GetFeeds).execute(username, password, Constants._TAG_LABEL_STARRED); + } + }; + + OnAsyncTaskCompletedListener onAsyncTask_GetItems = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + + if(task_result != null) + ShowToastLong(((Exception)task_result).getLocalizedMessage()); + + lvAdapter.notifyDataSetChanged(); + //Activity act = getActivity(); + //lvAdapter = new SubscriptionExpandableListAdapter(act, dbConn); + + Log.d(TAG, "onAsyncTask_GetFeeds Finished"); + + if(eListView != null) + eListView.getLoadingLayoutProxy().setLastUpdatedLabel(null); + + UpdateSyncButtonLayout(); + + lvAdapter.ReloadAdapter(); + + NewsReaderListActivity nlActivity = (NewsReaderListActivity) getActivity(); + nlActivity.UpdateItemList(); + + //fireUpdateFinishedClicked(); + } + }; + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View V = null; + try + { + V = inflater.inflate(R.layout.expandable_list_layout, container, false); + //eListView = (ExpandableListView) V.findViewById(R.id.expandableListView); + eListView = (PullToRefreshExpandableListView) V.findViewById(R.id.expandableListView); + + + //eListView.setGroupIndicator(getResources().getDrawable(R.drawable.expandable_group_indicator)); + eListView.setGroupIndicator(null); + + //eListView.demo(); + eListView.setShowIndicator(false); + + eListView.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(PullToRefreshBase refreshView) { + StartSync(); + } + }); + + eListView.setOnChildClickListener(onChildClickListener); + //eListView.setSmoothScrollbarEnabled(true); + + View empty = inflater.inflate(R.layout.subscription_list_item_empty, null, false); + getActivity().addContentView(empty, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + eListView.setEmptyView(empty); + /* + eListView.setClickable(true); + eListView.setOnGroupClickListener(new OnGroupClickListener() { + + @Override + public boolean onGroupClick(ExpandableListView parent, View v, + int groupPosition, long id) { + Log.d("hi", String.valueOf(groupPosition)); + //return false; + return true; + } + });*/ + eListView.setExpandableAdapter(lvAdapter); + + + //Start auto sync if enabled + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + if(mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, false)) + StartSync(); + + } + catch(Exception ex) + { + ex.printStackTrace(); + } + + return V; + //return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + + // Restore the previously serialized activated item position. + if (savedInstanceState != null + && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { + setActivatedPosition(savedInstanceState + .getInt(STATE_ACTIVATED_POSITION)); + } + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + // Activities containing this fragment must implement its callbacks. + if (!(activity instanceof Callbacks)) { + throw new IllegalStateException( + "Activity must implement fragment's callbacks."); + } + + mCallbacks = (Callbacks) activity; + } + + @Override + public void onDetach() { + super.onDetach(); + + // Reset the active callbacks interface to the dummy implementation. + mCallbacks = sExpListCallbacks; + } + + ExpListTextClicked expListTextClickedListener = new ExpListTextClicked() { + + @Override + public void onTextClicked(String idSubscription, Context context, boolean isFolder, String optional_folder_id) { + mCallbacks.onTopItemClicked(idSubscription, isFolder, optional_folder_id); + } + }; + + /* + @Override + public void onListItemClick(ListView listView, View view, int position, + long id) { + super.onListItemClick(listView, view, position, id); + + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + + //mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id); + }*/ + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mActivatedPosition != ListView.INVALID_POSITION) { + // Serialize and persist the activated item position. + outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); + } + } + + OnChildClickListener onChildClickListener = new OnChildClickListener() { + + @Override + public boolean onChildClick(ExpandableListView parent, View v, + int groupPosition, int childPosition, long id) { + + long idItem = lvAdapter.getChildId(groupPosition, childPosition); + + String optional_id_folder = null; + FolderSubscribtionItem groupItem = (FolderSubscribtionItem) lvAdapter.getGroup(groupPosition); + if(groupItem != null) + optional_id_folder = String.valueOf(groupItem.id_database); + + mCallbacks.onChildItemClicked(String.valueOf(idItem), optional_id_folder); + + return false; + } + }; + + /** + * Turns on activate-on-click mode. When this mode is on, list items will be + * given the 'activated' state when touched. + */ + public void setActivateOnItemClick(boolean activateOnItemClick) { + // When setting CHOICE_MODE_SINGLE, ListView will automatically + // give items the 'activated' state when touched. + + + //eListView.setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);//TODO comment this in + } + + private void setActivatedPosition(int position) {/*//TODO comment this in + if (position == ListView.INVALID_POSITION) { + //getListView().setItemChecked(mActivatedPosition, false); + eListView.setItemChecked(mActivatedPosition, false); + } else { + eListView.setItemChecked(position, true); + //getListView().setItemChecked(position, true); + }*/ + + mActivatedPosition = position; + } + + + public void UpdateSyncButtonLayout() + { + if(getActivity() != null) + ((NewsReaderListActivity) getActivity()).UpdateButtonSyncLayout(); + } + + /** + * @return the eListView + */ + public PullToRefreshExpandableListView geteListView() { + return eListView; + } + + /* + public void setUpdateFinishedListener(AsyncUpdateFinished listener) + { + asyncUpdateFinished = listener; + } + protected void fireUpdateFinishedClicked() + { + if(asyncUpdateFinished != null) + asyncUpdateFinished.FinishedUpdate(); + }*/ +} + + +/* + dbConn.insertNewSubscription("Ungelesene Artikel"); + dbConn.insertNewSubscription("Markierte Artikel"); + dbConn.insertNewSubscription("Android"); + dbConn.insertNewSubscription("Apple"); + dbConn.insertNewSubscription("Bugtracker"); + dbConn.insertNewSubscription("Development"); + dbConn.insertNewSubscription("Linux"); + dbConn.insertNewSubscription("Software"); + dbConn.insertNewSubscription("Owncloud"); + dbConn.insertNewSubscription("Other"); + + dbConn.insertNewSub_Subscription("4droid", dbConn.getIdOfSubscription("Android")); + dbConn.insertNewSub_Subscription("GIGA Rss Feed", dbConn.getIdOfSubscription("Android")); + + dbConn.insertNewSub_Subscription("macnews.de", dbConn.getIdOfSubscription("Apple")); + dbConn.insertNewSub_Subscription("MACNOTES.DE", dbConn.getIdOfSubscription("Apple")); + + dbConn.insertNewSub_Subscription("FS Bugtracker", dbConn.getIdOfSubscription("Bugtracker")); + + dbConn.insertNewSub_Subscription("Code 2 Learn", dbConn.getIdOfSubscription("Development")); + dbConn.insertNewSub_Subscription("Coding Horror", dbConn.getIdOfSubscription("Development")); + + dbConn.insertNewSub_Subscription("Canoncial", dbConn.getIdOfSubscription("Linux")); + + dbConn.insertNewSub_Subscription("iTek Zone", dbConn.getIdOfSubscription("Software")); + + dbConn.insertNewSub_Subscription("CNET", dbConn.getIdOfSubscription("Other")); + + dbConn.insertNewSub_Subscription("ownCloud.org", dbConn.getIdOfSubscription("Owncloud")); + + dbConn.insertNewFeed("Samsung Game Pad pops up on Galaxy S4 site, outs Note 3?", + "http://news.cnet.com/8301-17938_105-57574766-1/samsung-game-pad-pops-up-on-galaxy-s4-site-outs-note-3/?part\u003drss\u0026subj\u003dnews\u0026tag\u003d2547-1_3-0-20", + "The gaming controller works with devices up to 6.3 inches, perhaps suggesting Samsung is planning a bigger phablet, or should we be calling it a \"tabone?\"", + "0", + dbConn.getIdOfSubscription("CNET")); + + */ + diff --git a/src/de/luhmer/owncloudnewsreader/cursor/NewsListCursorAdapter.java b/src/de/luhmer/owncloudnewsreader/cursor/NewsListCursorAdapter.java index df86c518..e46526c7 100644 --- a/src/de/luhmer/owncloudnewsreader/cursor/NewsListCursorAdapter.java +++ b/src/de/luhmer/owncloudnewsreader/cursor/NewsListCursorAdapter.java @@ -1,318 +1,347 @@ -package de.luhmer.owncloudnewsreader.cursor; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import android.annotation.SuppressLint; -import android.annotation.TargetApi; -import android.content.Context; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.Build; -import android.preference.PreferenceManager; -import android.support.v4.widget.CursorAdapter; -import android.text.Html; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.webkit.WebView; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.LinearLayout; -import android.widget.TextView; -import de.luhmer.owncloudnewsreader.NewsDetailFragment; -import de.luhmer.owncloudnewsreader.R; -import de.luhmer.owncloudnewsreader.SettingsActivity; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; - -public class NewsListCursorAdapter extends CursorAdapter { - DatabaseConnection dbConn; - IReader _Reader; - SimpleDateFormat simpleDateFormat; - final int LengthBody = 300; - ForegroundColorSpan bodyForegroundColor; - - int selectedDesign = 0; - - @SuppressLint("SimpleDateFormat") - @SuppressWarnings("deprecation") - public NewsListCursorAdapter(Context context, Cursor c) { - super(context, c); - - simpleDateFormat = new SimpleDateFormat("EEE, d. MMM HH:mm:ss"); - bodyForegroundColor = new ForegroundColorSpan(context.getResources().getColor(android.R.color.secondary_text_dark)); - - _Reader = new OwnCloud_Reader(); - dbConn = new DatabaseConnection(context); - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); - selectedDesign = Integer.valueOf(mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, "0")); - } - - @Override - public void bindView(View view, final Context context, Cursor cursor) { - final String idItemDb = cursor.getString(0); - //final String idItem = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID)); - - switch (selectedDesign) { - case 0: - setSimpleLayout(view, cursor); - break; - - case 1: - setExtendedLayout(view, cursor); - break; - - case 2: - setExtendedLayoutWebView(view, cursor); - break; - - default: - break; - } - - CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_starred); - cb.setOnCheckedChangeListener(null); - - Boolean isStarred = dbConn.isFeedUnreadStarred(cursor.getString(0), false);//false => starred will be checked - //Log.d("ISSTARRED", "" + isStarred + " - Cursor: " + cursor.getString(0)); - cb.setChecked(isStarred);/* - if(isStarred) - cb.setButtonDrawable(R.drawable.btn_rating_star_on_normal_holo_light); - else - cb.setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); - */ - cb.setClickable(true); - cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - /* - if(isChecked) - buttonView.setButtonDrawable(R.drawable.btn_rating_star_on_normal_holo_light); - else - buttonView.setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); - */ - - dbConn.updateIsStarredOfFeed(idItemDb, isChecked); - - if(isChecked) - UpdateIsReadCheckBox(buttonView, idItemDb); - - /* - List idItems = new ArrayList(); - idItems.add(idItem); - if(isChecked) - _Reader.Start_AsyncTask_PerformTagAction(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_STARRED); - else - _Reader.Start_AsyncTask_PerformTagAction(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNSTARRED); - */ - - } - }); - - - CheckBox cbRead = (CheckBox) view.findViewById(R.id.cb_lv_item_read); - cbRead.setOnCheckedChangeListener(null); - Boolean isChecked = dbConn.isFeedUnreadStarred(cursor.getString(0), true); - //Log.d("ISREAD", "" + isChecked + " - Cursor: " + cursor.getString(0)); - cbRead.setChecked(isChecked); - cbRead.setClickable(true); - cbRead.setOnCheckedChangeListener(new OnCheckedChangeListener() { - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - //GoogleReaderMethods.MarkItemAsRead(isChecked, getCursorForCurrentRow(buttonView), dbConn, context, asyncTaskCompletedPerformTagStarred); - - dbConn.updateIsReadOfFeed(idItemDb, isChecked); - - /* - //TODO THIS IS IMPORTANT CODE ! - List idItems = new ArrayList(); - idItems.add(idItem); - if(isChecked) - _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_READ); - else - _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNREAD); - */ - } - }); - - //Log.d("NewsListCursor", "BIND VIEW.."); - //((CheckBox) view.findViewById(R.id.cb_lv_item_starred)).setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); - } - - public void setSimpleLayout(View view, Cursor cursor) - { - TextView textViewSummary = (TextView) view.findViewById(R.id.summary); - textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); - - TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); - long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); - textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); - - TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); - textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); - textViewSummary.setTag(cursor.getString(0)); - } - - public void setExtendedLayout(View view, Cursor cursor) - { - TextView textViewSummary = (TextView) view.findViewById(R.id.summary); - textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); - - TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); - long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); - textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); - - TextView textViewItemBody = (TextView) view.findViewById(R.id.body); - String body = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_BODY)); - textViewItemBody.setText(getBodyText(body)); - - TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); - textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); - textViewSummary.setTag(cursor.getString(0)); - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public void setExtendedLayoutWebView(View view, Cursor cursor) - { - - /* - TextView textViewSummary = (TextView) view.findViewById(R.id.summary); - textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); - - TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); - long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); - textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); - */ - - WebView webViewContent = (WebView) view.findViewById(R.id.webView_body); - webViewContent.setClickable(false); - webViewContent.setFocusable(false); - //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - // webViewContent.setLayerType(View.LAYER_TYPE_SOFTWARE, null); - - webViewContent.loadDataWithBaseURL("", NewsDetailFragment.getHtmlPage(mContext, dbConn , cursor.getInt(0)), "text/html", "UTF-8", ""); - - /* - TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); - textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); - textViewSummary.setTag(cursor.getString(0)); - */ - } - - - /* - class ItemHolder { - TextView txt_feed; - TextView txt_item_date; - TextView txt_summary; - TextView txt_body; - CheckBox cb_starred; - CheckBox cb_read; - }*/ - - public void CloseDatabaseConnection() - { - if(dbConn != null) - dbConn.closeDatabase(); - } - - private void UpdateIsReadCheckBox(View view, String idItemDb) - { - LinearLayout lLayout = (LinearLayout) view.getParent(); - Boolean isChecked = dbConn.isFeedUnreadStarred(idItemDb, true); - CheckBox cbRead = (CheckBox) lLayout.findViewById(R.id.cb_lv_item_read); - cbRead.setChecked(isChecked); - } - - private String getBodyText(String body) - { - //if(body.length() > LengthBody) - // body = body.substring(0, LengthBody); - - body = body.replaceAll("]*>", ""); - body = body.replaceAll("]*>", ""); - - SpannableString bodyStringSpannable = new SpannableString(Html.fromHtml(body)); - bodyStringSpannable.setSpan(bodyForegroundColor, 0, bodyStringSpannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); - - String bodyString = bodyStringSpannable.toString().trim(); - - if(bodyString.length() > LengthBody) - bodyString = bodyString.substring(0, LengthBody); - - return bodyString; - } - - /* - private Cursor getCursorForCurrentRow(CompoundButton buttonView) - { - TextView tv = (TextView) ((ViewGroup)((ViewGroup) buttonView.getParent()).getChildAt(1)).getChildAt(1); - String id_DB_Feed = (String) tv.getTag(); - //String id_DB_Feed = (String) ((View)buttonView.getParent()).getTag(); - - Cursor cur = dbConn.getFeedByID(id_DB_Feed); - cur.moveToFirst(); - return cur; - }*/ - - @Override - public View newView(Context arg0, Cursor cursor, ViewGroup parent) { - // when the view will be created for first time, - // we need to tell the adapters, how each item will look - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View retView = null; - - switch (selectedDesign) { - case 0: - retView = inflater.inflate(R.layout.subscription_detail_list_item_simple, parent, false); - break; - case 1: - retView = inflater.inflate(R.layout.subscription_detail_list_item_extended, parent, false); - break; - - case 2: - retView = inflater.inflate(R.layout.subscription_detail_list_item_extended_webview, parent, false); - break; - - default: - break; - } - - if(retView != null) - retView.setTag(cursor.getString(0)); - - - - - //retView.getLocationOnScreen(location); - //Log.d("NewsListCursor", "NEW VIEW.."); - - return retView; - } - - /* - OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagRead = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - Log.d("FINISHED PERFORM TAG READ ", "" + task_result); - } - }; - - OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagStarred = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - Log.d("FINISHED PERFORM TAG STARRED ", "" + task_result); - } - };*/ -} +package de.luhmer.owncloudnewsreader.cursor; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.content.Context; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.Build; +import android.preference.PreferenceManager; +import android.support.v4.widget.CursorAdapter; +import android.text.Html; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebView; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.actionbarsherlock.app.SherlockFragmentActivity; + +import de.luhmer.owncloudnewsreader.NewsDetailFragment; +import de.luhmer.owncloudnewsreader.NewsReaderListActivity; +import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; + +public class NewsListCursorAdapter extends CursorAdapter { + DatabaseConnection dbConn; + IReader _Reader; + SimpleDateFormat simpleDateFormat; + final int LengthBody = 300; + ForegroundColorSpan bodyForegroundColor; + + int selectedDesign = 0; + + @SuppressLint("SimpleDateFormat") + @SuppressWarnings("deprecation") + public NewsListCursorAdapter(Context context, Cursor c) { + super(context, c); + + simpleDateFormat = new SimpleDateFormat("EEE, d. MMM HH:mm:ss"); + bodyForegroundColor = new ForegroundColorSpan(context.getResources().getColor(android.R.color.secondary_text_dark)); + + _Reader = new OwnCloud_Reader(); + dbConn = new DatabaseConnection(context); + + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); + selectedDesign = Integer.valueOf(mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, "0")); + } + + @Override + public void bindView(View view, final Context context, Cursor cursor) { + final String idItemDb = cursor.getString(0); + //final String idItem = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_RSSITEM_ID)); + + switch (selectedDesign) { + case 0: + setSimpleLayout(view, cursor); + break; + + case 1: + setExtendedLayout(view, cursor); + break; + + case 2: + setExtendedLayoutWebView(view, cursor); + break; + + default: + break; + } + + CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_starred); + cb.setOnCheckedChangeListener(null); + + Boolean isStarred = dbConn.isFeedUnreadStarred(cursor.getString(0), false);//false => starred will be checked + //Log.d("ISSTARRED", "" + isStarred + " - Cursor: " + cursor.getString(0)); + cb.setChecked(isStarred);/* + if(isStarred) + cb.setButtonDrawable(R.drawable.btn_rating_star_on_normal_holo_light); + else + cb.setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); + */ + + cb.setClickable(true); + cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + /* + if(isChecked) + buttonView.setButtonDrawable(R.drawable.btn_rating_star_on_normal_holo_light); + else + buttonView.setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); + */ + + dbConn.updateIsStarredOfFeed(idItemDb, isChecked); + + if(isChecked) + UpdateIsReadCheckBox(buttonView, idItemDb); + + /* + List idItems = new ArrayList(); + idItems.add(idItem); + if(isChecked) + _Reader.Start_AsyncTask_PerformTagAction(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_STARRED); + else + _Reader.Start_AsyncTask_PerformTagAction(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNSTARRED); + */ + + } + }); + + + CheckBox cbRead = (CheckBox) view.findViewById(R.id.cb_lv_item_read); + cbRead.setOnCheckedChangeListener(null); + Boolean isChecked = dbConn.isFeedUnreadStarred(cursor.getString(0), true); + //Log.d("ISREAD", "" + isChecked + " - Cursor: " + cursor.getString(0)); + cbRead.setChecked(isChecked); + cbRead.setClickable(true); + cbRead.setOnCheckedChangeListener(new OnCheckedChangeListener() { + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + //GoogleReaderMethods.MarkItemAsRead(isChecked, getCursorForCurrentRow(buttonView), dbConn, context, asyncTaskCompletedPerformTagStarred); + + dbConn.updateIsReadOfFeed(idItemDb, isChecked); + UpdateListCursor(mContext); + /* + //TODO THIS IS IMPORTANT CODE ! + List idItems = new ArrayList(); + idItems.add(idItem); + if(isChecked) + _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_READ); + else + _Reader.Start_AsyncTask_PerformTagActionForSingleItem(0, context, asyncTaskCompletedPerformTagRead, idItems, FeedItemTags.TAGS.MARK_ITEM_AS_UNREAD); + */ + } + }); + + //Log.d("NewsListCursor", "BIND VIEW.."); + //((CheckBox) view.findViewById(R.id.cb_lv_item_starred)).setButtonDrawable(R.drawable.btn_rating_star_off_normal_holo_light); + } + + public void setSimpleLayout(View view, Cursor cursor) + { + TextView textViewSummary = (TextView) view.findViewById(R.id.summary); + textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); + + TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); + long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); + textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); + + TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); + textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); + textViewSummary.setTag(cursor.getString(0)); + } + + public void setExtendedLayout(View view, Cursor cursor) + { + TextView textViewSummary = (TextView) view.findViewById(R.id.summary); + textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); + + TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); + long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); + textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); + + TextView textViewItemBody = (TextView) view.findViewById(R.id.body); + String body = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_BODY)); + textViewItemBody.setText(getBodyText(body)); + + TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); + textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); + textViewSummary.setTag(cursor.getString(0)); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public void setExtendedLayoutWebView(View view, Cursor cursor) + { + + /* + TextView textViewSummary = (TextView) view.findViewById(R.id.summary); + textViewSummary.setText(Html.fromHtml(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_TITLE))).toString()); + + TextView textViewItemDate = (TextView) view.findViewById(R.id.tv_item_date); + long pubDate = cursor.getLong(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_PUBDATE)); + textViewItemDate.setText(simpleDateFormat.format(new Date(pubDate))); + */ + + WebView webViewContent = (WebView) view.findViewById(R.id.webView_body); + webViewContent.setClickable(false); + webViewContent.setFocusable(false); + //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + // webViewContent.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + + webViewContent.loadDataWithBaseURL("", NewsDetailFragment.getHtmlPage(mContext, dbConn , cursor.getInt(0)), "text/html", "UTF-8", ""); + + /* + TextView textViewTitle = (TextView) view.findViewById(R.id.tv_subscription); + textViewTitle.setText(dbConn.getTitleOfSubscriptionByRowID(cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)))); + textViewSummary.setTag(cursor.getString(0)); + */ + } + + + /* + class ItemHolder { + TextView txt_feed; + TextView txt_item_date; + TextView txt_summary; + TextView txt_body; + CheckBox cb_starred; + CheckBox cb_read; + }*/ + + public void CloseDatabaseConnection() + { + if(dbConn != null) + dbConn.closeDatabase(); + } + + private void UpdateIsReadCheckBox(View view, String idItemDb) + { + LinearLayout lLayout = (LinearLayout) view.getParent(); + Boolean isChecked = dbConn.isFeedUnreadStarred(idItemDb, true); + CheckBox cbRead = (CheckBox) lLayout.findViewById(R.id.cb_lv_item_read); + //ChangeCheckBoxState(cbRead, isChecked, mContext); + cbRead.setChecked(isChecked); + } + + public static void ChangeCheckBoxState(CheckBox cb, boolean state, Context context) + { + if(cb != null) + { + if(cb.isChecked() != state) + { + cb.setChecked(state); + + UpdateListCursor(context); + } + } + } + + public static void UpdateListCursor(Context context)//TODO make this better + { + SherlockFragmentActivity sfa = (SherlockFragmentActivity) context; + + //if tablet view is enabled --> update the listview + if(sfa instanceof NewsReaderListActivity) + ((NewsReaderListActivity) sfa).updateAdapter(); + } + + + private String getBodyText(String body) + { + //if(body.length() > LengthBody) + // body = body.substring(0, LengthBody); + + body = body.replaceAll("]*>", ""); + body = body.replaceAll("]*>", ""); + + SpannableString bodyStringSpannable = new SpannableString(Html.fromHtml(body)); + bodyStringSpannable.setSpan(bodyForegroundColor, 0, bodyStringSpannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); + + String bodyString = bodyStringSpannable.toString().trim(); + + if(bodyString.length() > LengthBody) + bodyString = bodyString.substring(0, LengthBody); + + return bodyString; + } + + /* + private Cursor getCursorForCurrentRow(CompoundButton buttonView) + { + TextView tv = (TextView) ((ViewGroup)((ViewGroup) buttonView.getParent()).getChildAt(1)).getChildAt(1); + String id_DB_Feed = (String) tv.getTag(); + //String id_DB_Feed = (String) ((View)buttonView.getParent()).getTag(); + + Cursor cur = dbConn.getFeedByID(id_DB_Feed); + cur.moveToFirst(); + return cur; + }*/ + + @Override + public View newView(Context arg0, Cursor cursor, ViewGroup parent) { + // when the view will be created for first time, + // we need to tell the adapters, how each item will look + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + View retView = null; + + switch (selectedDesign) { + case 0: + retView = inflater.inflate(R.layout.subscription_detail_list_item_simple, parent, false); + break; + case 1: + retView = inflater.inflate(R.layout.subscription_detail_list_item_extended, parent, false); + break; + + case 2: + retView = inflater.inflate(R.layout.subscription_detail_list_item_extended_webview, parent, false); + break; + + default: + break; + } + + if(retView != null) + retView.setTag(cursor.getString(0)); + + + + + //retView.getLocationOnScreen(location); + //Log.d("NewsListCursor", "NEW VIEW.."); + + return retView; + } + + /* + OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagRead = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + Log.d("FINISHED PERFORM TAG READ ", "" + task_result); + } + }; + + OnAsyncTaskCompletedListener asyncTaskCompletedPerformTagStarred = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + Log.d("FINISHED PERFORM TAG STARRED ", "" + task_result); + } + };*/ +} diff --git a/src/de/luhmer/owncloudnewsreader/data/ConcreteSubscribtionItem.java b/src/de/luhmer/owncloudnewsreader/data/ConcreteFeedItem.java similarity index 65% rename from src/de/luhmer/owncloudnewsreader/data/ConcreteSubscribtionItem.java rename to src/de/luhmer/owncloudnewsreader/data/ConcreteFeedItem.java index 97826176..0ec87c7d 100644 --- a/src/de/luhmer/owncloudnewsreader/data/ConcreteSubscribtionItem.java +++ b/src/de/luhmer/owncloudnewsreader/data/ConcreteFeedItem.java @@ -1,19 +1,19 @@ -package de.luhmer.owncloudnewsreader.data; - -public class ConcreteSubscribtionItem { - - public String folder_id; - public String subscription_id; - public String favIcon; - public String header; - public long id_database; - - public ConcreteSubscribtionItem(String header, String folder_id, String subscription_id, String favIcon, long id_database/*, String parent_title*/) { - - this.header = header; - this.folder_id = folder_id; - this.subscription_id = subscription_id; - this.favIcon = favIcon; - this.id_database = id_database; - } -} +package de.luhmer.owncloudnewsreader.data; + +public class ConcreteFeedItem { + + public String folder_id; + public String subscription_id; + public String favIcon; + public String header; + public long id_database; + + public ConcreteFeedItem(String header, String folder_id, String subscription_id, String favIcon, long id_database/*, String parent_title*/) { + + this.header = header; + this.folder_id = folder_id; + this.subscription_id = subscription_id; + this.favIcon = favIcon; + this.id_database = id_database; + } +} diff --git a/src/de/luhmer/owncloudnewsreader/database/DatabaseConnection.java b/src/de/luhmer/owncloudnewsreader/database/DatabaseConnection.java index 887697ff..a3a44978 100644 --- a/src/de/luhmer/owncloudnewsreader/database/DatabaseConnection.java +++ b/src/de/luhmer/owncloudnewsreader/database/DatabaseConnection.java @@ -1,806 +1,807 @@ -package de.luhmer.owncloudnewsreader.database; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; -import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; - -public class DatabaseConnection { - private DatabaseHelper openHelper; - private SQLiteDatabase database; - - public static final String FOLDER_TABLE = "folder"; - public static final String FOLDER_LABEL = "label"; - public static final String FOLDER_LABEL_ID = "label_id"; - - public static final String SUBSCRIPTION_TABLE = "subscription"; - public static final String SUBSCRIPTION_HEADERTEXT = "header_text"; - //public static final String SUBSCRIPTION_SUBSCRIPTION_ID = "subscription_id_subscription"; - public static final String SUBSCRIPTION_FOLDER_ID = "folder_idfolder"; - public static final String SUBSCRIPTION_ID = "subscription_id"; - public static final String SUBSCRIPTION_FAVICON_URL = "favicon_url"; - public static final String SUBSCRIPTION_LINK = "link"; - - public static final String RSS_ITEM_TABLE = "rss_item"; - public static final String RSS_ITEM_SUBSCRIPTION_ID = "subscription_id_subscription"; - public static final String RSS_ITEM_TITLE = "title"; - public static final String RSS_ITEM_LINK = "link"; - public static final String RSS_ITEM_BODY = "body"; - public static final String RSS_ITEM_READ = "read"; - public static final String RSS_ITEM_RSSITEM_ID = "rssitem_id"; - public static final String RSS_ITEM_STARRED = "starred"; - public static final String RSS_ITEM_PUBDATE = "pubdate"; - public static final String RSS_ITEM_AUTHOR = "author"; - public static final String RSS_ITEM_GUID = "guid"; - public static final String RSS_ITEM_GUIDHASH = "guidHash"; - public static final String RSS_ITEM_LAST_MODIFIED = "lastModified"; - - public static final String RSS_ITEM_READ_TEMP = "read_temp"; - public static final String RSS_ITEM_STARRED_TEMP = "starred_temp"; - - - public static final boolean DATABASE_DEBUG_MODE = false; //(false && Constants.DEBUG_MODE) ? true: false; - - - public DatabaseConnection(Context aContext) { - openHelper = new DatabaseHelper(aContext); - openDatabase(); - } - - public SQLiteDatabase getDatabase() - { - return database; - } - - - public void clearDatabaseOverSize() - { - //If i have 9023 rows in the database, when i run that query it should delete 8023 rows and leave me with 1000 - //database.execSQL("DELETE FROM " + RSS_ITEM_TABLE + " WHERE " + + "ORDER BY rowid DESC LIMIT 1000 * - - //Let's say it said 1005 - you need to delete 5 rows. - //DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5 - - - int max = 1000; - int total = (int) getLongValueBySQL("SELECT COUNT(*) FROM rss_item"); - int unread = (int) getLongValueBySQL("SELECT COUNT(*) FROM rss_item WHERE read_temp != 1"); - int read = total - unread; - - if(total > max) - { - int overSize = total - max; - //Soll verhindern, dass ungelesene Artikel gelöscht werden - if(overSize > read) - overSize = read; - database.execSQL("DELETE FROM rss_item WHERE read_temp = 1 AND rowid IN (SELECT rowid FROM rss_item WHERE read_temp = 1 ORDER BY rowid asc LIMIT " + overSize + ")"); - /* SELECT * FROM rss_item WHERE read_temp = 1 ORDER BY rowid asc LIMIT 3; */ - } - } - - public void markAllItemsAsRead(List itemIds) - { - if(itemIds != null) - for(Integer idItem : itemIds) - updateIsReadOfFeed(String.valueOf(idItem), true); - } - - public int getCountOfAllItems(boolean execludeStarred) - { - String buildSQL = "SELECT count(*) FROM " + RSS_ITEM_TABLE; - if(execludeStarred) - buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " != 1"; - - int result = 0; - - Cursor cursor = database.rawQuery(buildSQL, null); - try - { - if(cursor != null) - { - cursor.moveToFirst(); - result = cursor.getInt(0); - } - } finally { - cursor.close(); - } - - return result; - } - - public long getLastModfied() - { - String buildSQL = "SELECT MAX(" + RSS_ITEM_LAST_MODIFIED + ") FROM " + RSS_ITEM_TABLE; - long result = 0; - - Cursor cursor = database.rawQuery(buildSQL, null); - try - { - if(cursor != null) - { - cursor.moveToFirst(); - result = cursor.getLong(0); - } - } finally { - cursor.close(); - } - - return result; - } - - public long getItemDbIdAtPosition(int positionXRow) - { - String buildSQL = "SELECT rowid FROM " + RSS_ITEM_TABLE; - long result = -1; - - Cursor cursor = database.rawQuery(buildSQL, null); - try - { - if(cursor != null) - { - if(cursor.move(cursor.getCount() - (positionXRow - 1))) - result = cursor.getLong(0); - } - } finally { - cursor.close(); - } - - return result; - } - - public List getAllNewReadItems() - { - String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " - + RSS_ITEM_READ_TEMP + " = 1 AND " - + RSS_ITEM_READ + " = 0"; - Cursor cursor = database.rawQuery(buildSQL, null); - return convertCursorToStringArray(cursor, 0); - } - - public List getAllNewUnreadItems() - { - String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " - + RSS_ITEM_READ_TEMP + " = 0 AND " - + RSS_ITEM_READ + " = 1"; - Cursor cursor = database.rawQuery(buildSQL, null); - return convertCursorToStringArray(cursor, 0); - } - - public List getAllNewStarredItems() - { - String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " - + RSS_ITEM_STARRED_TEMP + " = 1 AND " - + RSS_ITEM_STARRED + " = 0"; - Cursor cursor = database.rawQuery(buildSQL, null); - return convertCursorToStringArray(cursor, 0); - } - - public List getAllNewUnstarredItems() - { - String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " - + RSS_ITEM_STARRED_TEMP + " = 0 AND " - + RSS_ITEM_STARRED + " = 1"; - Cursor cursor = database.rawQuery(buildSQL, null); - return convertCursorToStringArray(cursor, 0); - } - - public Cursor getAllItemsWithIdHigher(String id_item) { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; - String buildSQL = "SELECT rowid as _id, * FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_RSSITEM_ID + " > " + id_item; - - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllItemsWithIdHigher SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public long getLowestItemId(boolean onlyStarred) - { - String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE; - - if(onlyStarred) - buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1"; - - return getLongValueBySQL(buildSQL); - } - - public long getLowestItemIdByFeed(String id_feed) - { - String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_SUBSCRIPTION_ID + " = " + id_feed; - return getLongValueBySQL(buildSQL); - } - - public long getLowestItemIdByFolder(String id_folder) - { - String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") " + - "FROM " + RSS_ITEM_TABLE + " rss " + - "JOIN " + SUBSCRIPTION_TABLE + " sc ON rss." + RSS_ITEM_SUBSCRIPTION_ID + " = sc.rowid " + - "WHERE " + SUBSCRIPTION_FOLDER_ID + " = " + id_folder; - return getLongValueBySQL(buildSQL); - } - - public long getLowestItemIdStarred() - { - String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_STARRED_TEMP + " == 1"; - return getLongValueBySQL(buildSQL); - } - - public long getLowestItemIdUnread() - { - String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_READ_TEMP + " != 1"; - return getLongValueBySQL(buildSQL); - } - - public long getHighestItemId() - { - String buildSQL = "SELECT MAX(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE; - return getLongValueBySQL(buildSQL); - } - - public int removeAllItemsWithIdLowerThan(String id_db) - { - return database.delete(RSS_ITEM_TABLE, "rowid < ?", new String[] { id_db }); - } - - /* - public Cursor getAllData(String TABLE_NAME) { - String buildSQL = "SELECT rowid as _id, * FROM " + TABLE_NAME; - Log.d("DB_HELPER", "getAllData SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - */ - - public Cursor getAllTopSubscriptions(boolean onlyUnread) { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; - String buildSQL = "SELECT DISTINCT(f.rowid) as _id, * FROM " + FOLDER_TABLE + " f "; - if(onlyUnread) - { - buildSQL += " JOIN " + SUBSCRIPTION_TABLE + " sc ON f.rowid = sc." + SUBSCRIPTION_FOLDER_ID + - " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + - " WHERE " + RSS_ITEM_READ_TEMP + " != 1" + - " GROUP BY f.rowid " + - " HAVING COUNT(*) > 0"; - } - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllTopSubscriptions SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public Cursor getAllTopSubscriptionsWithoutFolder(boolean onlyUnread) { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; - String buildSQL = "SELECT DISTINCT(sc.rowid) as _id, * FROM " + SUBSCRIPTION_TABLE + " sc "; - - if(onlyUnread) - { - buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + - " WHERE " + SUBSCRIPTION_FOLDER_ID + " IS NULL" + - " AND " + RSS_ITEM_READ_TEMP + " != 1" + - " GROUP BY sc.rowid " + - " HAVING COUNT(*) > 0"; - } - else - buildSQL += " WHERE " + SUBSCRIPTION_FOLDER_ID + " IS NULL"; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllTopSubscriptions SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - /* - public Cursor getAllTopSubscriptionsWithUnreadFeeds() { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; - String buildSQL = "SELECT f.rowid as _id, * FROM " + FOLDER_TABLE + " f "+ - " JOIN " + SUBSCRIPTION_TABLE + " sc ON f.rowid = sc." + SUBSCRIPTION_FOLDER_ID + - " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + - " GROUP BY f.rowid " + - " HAVING COUNT(*) > 0"; - Log.d("DB_HELPER", "getAllTopData SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - }*/ - - - public Cursor getAllSubSubscriptions() { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NOT NULL"; - String buildSQL = "SELECT DISTINCT(rowid) as _id, * FROM " + SUBSCRIPTION_TABLE; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllSubSubscriptions SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public Cursor getFeedByDbID(String ID_FEED_DB) {//Feeds - String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + ID_FEED_DB + "'"; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getSubSubscriptionsByID SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public Cursor getFeedByFeedID(String ID_FEED) {//Feeds - String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_ID + " = '" + ID_FEED + "'"; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getSubSubscriptionsByID SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public int getCountItemsForSubscription(String ID_SUBSCRIPTION, boolean onlyUnread, boolean execludeStarredItems) { - - String buildSQL = "SELECT COUNT(*) " + - " FROM " + RSS_ITEM_TABLE + - //" WHERE read != 1" + - " WHERE " + RSS_ITEM_READ_TEMP +" != 1 AND " + RSS_ITEM_STARRED + " != 1" + - " AND subscription_id_subscription IN " + - "(SELECT rowid " + - "FROM subscription " + - "WHERE rowid = " + ID_SUBSCRIPTION + ");"; - - - - if(!onlyUnread) - buildSQL = buildSQL.replace("read_temp != 1 AND", ""); - - if(!execludeStarredItems) - buildSQL = buildSQL.replace(RSS_ITEM_STARRED + " != 1 AND", RSS_ITEM_STARRED_TEMP + " = 1 AND"); - - return (int)getLongValueBySQL(buildSQL); - } - - public Boolean isFeedUnreadStarred(String FEED_ID, Boolean checkUnread) { - String buildSQL; - /* - if(checkUnread) - buildSQL = "SELECT read "; - else//Wenn nicht checkRead auf true steht, soll geprueft werden ob das Feed Markiert ist. - buildSQL = "SELECT starred "; - */ - - if(checkUnread) - buildSQL = "SELECT read_temp "; - else//Wenn nicht checkRead auf true steht, soll geprueft werden ob das Feed Markiert ist. - buildSQL = "SELECT starred_temp "; - - buildSQL += " FROM " + RSS_ITEM_TABLE + - " WHERE rowid = " + FEED_ID; - - return checkSqlForBoolean(buildSQL); - } - - private Boolean checkSqlForBoolean(String buildSQL) - { - Boolean result = false; - Cursor cursor = database.rawQuery(buildSQL, null); - if (cursor != null) - { - if(cursor.moveToFirst()) - { - String val = cursor.getString(0); - if(val != null) - if(val.equals("1")) - result = true; - } - } - cursor.close(); - - return result; - } - - public void updateIsReadOfFeed(String FEED_ID, Boolean isRead) { - ContentValues args = new ContentValues(); - //args.put(RSS_ITEM_READ, isRead); - args.put(RSS_ITEM_READ_TEMP, isRead); - int result = database.update(RSS_ITEM_TABLE, args, "rowid=?", new String[] { FEED_ID }); - - if(DATABASE_DEBUG_MODE) - Log.d("RESULT UPDATE DATABASE", "RESULT: " + result); - } - - public void updateIsStarredOfFeed(String FEED_ID, Boolean isStarred) { - - if(isStarred)//Wenn ein Feed markiert ist muss es auch als gelesen markiert werden. - updateIsReadOfFeed(FEED_ID, true); - - - ContentValues args = new ContentValues(); - //args.put(RSS_ITEM_STARRED, isStarred); - args.put(RSS_ITEM_STARRED_TEMP, isStarred); - int result = database.update(RSS_ITEM_TABLE, args, "rowid=?", new String[] { FEED_ID }); - - if(DATABASE_DEBUG_MODE) - Log.d("RESULT UPDATE DATABASE", "RESULT: " + result); - } - - private String getAllFeedsSelectStatement() - { - return "SELECT DISTINCT(rowid) as _id, " + RSS_ITEM_TITLE + ", " + RSS_ITEM_RSSITEM_ID + ", " + RSS_ITEM_LINK + ", " + RSS_ITEM_BODY + ", " + RSS_ITEM_READ + ", " + RSS_ITEM_SUBSCRIPTION_ID + ", " - + RSS_ITEM_PUBDATE + ", " + RSS_ITEM_STARRED + ", " + RSS_ITEM_GUIDHASH + ", " + RSS_ITEM_GUID + ", " + RSS_ITEM_STARRED_TEMP + ", " + RSS_ITEM_READ_TEMP; - } - - public Cursor getAllItemsForFeed(String ID_SUBSCRIPTION, boolean onlyUnread, boolean onlyStarredItems) { - - String buildSQL = getAllFeedsSelectStatement() + - " FROM " + RSS_ITEM_TABLE + - " WHERE subscription_id_subscription IN " + - "(SELECT rowid " + - "FROM subscription " + - "WHERE rowid = " + ID_SUBSCRIPTION + ")"; - - if(onlyUnread && !onlyStarredItems) - buildSQL += " AND " + RSS_ITEM_READ_TEMP + " != 1"; - else if(onlyStarredItems) - buildSQL += " AND " + RSS_ITEM_STARRED_TEMP + " = 1"; - - buildSQL += " ORDER BY " + RSS_ITEM_PUBDATE + " desc"; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllItemsForFeed SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public Cursor getArticleByID(String ID_FEED) { - String buildSQL = getAllFeedsSelectStatement() + - " FROM " + RSS_ITEM_TABLE + - " WHERE rowid = " + ID_FEED; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getFeedByID SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public String getRowIdOfFeedByItemID(String ID_FEED) - { - String buildSQL = "SELECT rowid " + - " FROM " + RSS_ITEM_TABLE + - " WHERE " + RSS_ITEM_RSSITEM_ID + " = " + ID_FEED; - - return getStringValueBySQL(buildSQL); - } - - /* - public String getCountUnreadFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { //TODO optimize this here !!!! - String buildSQL = "SELECT COUNT(*) " + - " FROM " + RSS_ITEM_TABLE + - " WHERE " + RSS_ITEM_READ_TEMP + " != 1 "; - if(!ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) - buildSQL += " AND subscription_id_subscription IN " + - "(SELECT sc.rowid " + - "FROM subscription sc " + - "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + - "WHERE f.rowid = " + ID_FOLDER + ")"; - - if(onlyUnread) - buildSQL += " AND "; - String result = "0"; - Cursor cursor = database.rawQuery(buildSQL, null); - if (cursor != null) - { - if(cursor.moveToFirst()) - result = cursor.getString(0); - } - cursor.close(); - - return result; - }*/ - - public int getCountFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { - - Cursor cursor = getAllItemsForFolder(ID_FOLDER, onlyUnread); - int count = cursor.getCount(); - cursor.close(); - - return count; - - - } - /* - public String getCountFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { - String buildSQL = "SELECT COUNT(*) " + - " FROM " + RSS_ITEM_TABLE; - - if(!(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS))) - { - buildSQL += " WHERE subscription_id_subscription IN " + - "(SELECT sc.rowid " + - "FROM subscription sc " + - "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + - "WHERE f.rowid = " + ID_FOLDER + ") "; - - if(onlyUnread) - buildSQL += " AND read_temp != 1"; - } - else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS))//UNREAD - buildSQL += " WHERE starred != 1 and read_temp != 1"; - else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS))//STARRED - buildSQL += " WHERE starred_temp = 1"; - // buildSQL += " WHERE starred = 1"; - - - - String result = "0"; - Cursor cursor = database.rawQuery(buildSQL, null); - if (cursor != null) - { - if(cursor.moveToFirst()) - result = cursor.getString(0); - } - cursor.close(); - - return result; - }*/ - - public Cursor getAllItemsForFolder(String ID_FOLDER, boolean onlyUnread) { - String buildSQL = getAllFeedsSelectStatement() + - " FROM " + RSS_ITEM_TABLE; - - if(!(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)))//Wenn nicht Alle Artikel ausgewaehlt wurde (-10) oder (-11) fuer Starred Feeds - { - buildSQL += " WHERE subscription_id_subscription IN " + - "(SELECT sc.rowid " + - "FROM subscription sc " + - "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + - "WHERE f.rowid = " + ID_FOLDER + ")"; - - if(onlyUnread) - buildSQL += " AND " + RSS_ITEM_READ_TEMP + " != 1"; - } - //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) && onlyUnread)//only unRead should only be null when testing the size of items - else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) - buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " != 1 AND " + RSS_ITEM_READ_TEMP + " != 1"; - //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) - // buildSQL += " WHERE " + RSS_ITEM_STARRED + " != 1"; - //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS) && onlyUnread) - // buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1 AND " + RSS_ITEM_READ_TEMP + " != 1"; - else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) - buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1"; - - - buildSQL += " ORDER BY " + RSS_ITEM_PUBDATE + " desc"; - - // buildSQL += " WHERE starred = 1"; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllFeedData SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public Cursor getAllSubscriptionForFolder(String ID_FOLDER, boolean onlyUnread) { - //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_SUBSCRIPTION_ID + "=" + ID_SUBSCRIPTION; - String buildSQL = "SELECT sc.rowid as _id, sc.* " + - "FROM " + SUBSCRIPTION_TABLE + " sc " + - "LEFT OUTER JOIN folder f ON sc.folder_idfolder = f.rowid "; - - if(ID_FOLDER.equals("-11"))//Starred - { - buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + - " WHERE rss." + RSS_ITEM_STARRED_TEMP + " = 1" + - " GROUP BY sc.rowid " + - " HAVING COUNT(*) > 0"; - } - else if(onlyUnread || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) /*ID_SUBSCRIPTION.matches("-10|-11")*/) - { - buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + - " WHERE f.rowid = " + ID_FOLDER + " AND rss." + RSS_ITEM_READ_TEMP + " != 1" + - " GROUP BY sc.rowid " + - " HAVING COUNT(*) > 0"; - - if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) - buildSQL = buildSQL.replace("f.rowid = " + ID_FOLDER + " AND", "");//Remove to ID stuff because i want the result of all feeds where are unread items in - } - else - buildSQL += "WHERE f.rowid = " + ID_FOLDER; - - if(DATABASE_DEBUG_MODE) - Log.d("DB_HELPER", "getAllSub_SubscriptionForSubscription SQL: " + buildSQL); - return database.rawQuery(buildSQL, null); - } - - public void insertNewFolder (String label, String label_path) { - ContentValues contentValues = new ContentValues(); - contentValues.put(FOLDER_LABEL, label); - contentValues.put(FOLDER_LABEL_ID, label_path); - database.insert(FOLDER_TABLE, null, contentValues); - } - - /* - public int updateFolder (String label, String label_path) { - ContentValues contentValues = new ContentValues(); - contentValues.put(FOLDER_LABEL, label); - return database.update(FOLDER_TABLE, contentValues, FOLDER_LABEL_ID + "=?", new String[] { label_path }); - }*/ - - public void insertNewFeed (String headerText, String ID_FOLDER, String subscription_id, String FAVICON_URL) { - ContentValues contentValues = new ContentValues(); - contentValues.put(SUBSCRIPTION_HEADERTEXT, headerText); - contentValues.put(SUBSCRIPTION_FOLDER_ID, ID_FOLDER); - contentValues.put(SUBSCRIPTION_ID , subscription_id); - contentValues.put(SUBSCRIPTION_FAVICON_URL, FAVICON_URL); - database.insert(SUBSCRIPTION_TABLE, null, contentValues); - } - - public int updateFeed (String headerText, String ID_FOLDER, String subscription_id, String FAVICON_URL) { - ContentValues contentValues = new ContentValues(); - contentValues.put(SUBSCRIPTION_HEADERTEXT, headerText); - contentValues.put(SUBSCRIPTION_FOLDER_ID, ID_FOLDER); - contentValues.put(SUBSCRIPTION_FAVICON_URL, FAVICON_URL); - return database.update(SUBSCRIPTION_TABLE, contentValues, SUBSCRIPTION_ID + "= ?", new String[] { subscription_id }); - } - - public void insertNewItem (String Titel, String link, String description, Boolean isRead, String ID_SUBSCRIPTION, String ID_RSSITEM, Date timestamp, Boolean isStarred, String guid, String guidHash, String lastModified) { - ContentValues contentValues = new ContentValues(); - contentValues.put(RSS_ITEM_TITLE, Titel); - contentValues.put(RSS_ITEM_LINK, link); - contentValues.put(RSS_ITEM_BODY, description); - contentValues.put(RSS_ITEM_READ, isRead); - contentValues.put(RSS_ITEM_SUBSCRIPTION_ID, ID_SUBSCRIPTION); - contentValues.put(RSS_ITEM_RSSITEM_ID, ID_RSSITEM); - contentValues.put(RSS_ITEM_PUBDATE, timestamp.getTime()); - contentValues.put(RSS_ITEM_STARRED, isStarred); - contentValues.put(RSS_ITEM_GUID, guid); - contentValues.put(RSS_ITEM_GUIDHASH, guidHash); - contentValues.put(RSS_ITEM_LAST_MODIFIED, lastModified); - - contentValues.put(RSS_ITEM_READ_TEMP, isRead); - contentValues.put(RSS_ITEM_STARRED_TEMP, isStarred); - - database.insert(RSS_ITEM_TABLE, null, contentValues); - } - - public String getIdOfFolder (String FolderName) { - //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; - String buildSQL = "SELECT rowid as _id FROM " + FOLDER_TABLE + " WHERE " + FOLDER_LABEL + " = '" + FolderName + "'"; - - return getStringValueBySQL(buildSQL); - } - - public String getIdOfFolderByLabelPath (String FolderLabelPath) { - //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; - String buildSQL = "SELECT rowid as _id FROM " + FOLDER_TABLE + " WHERE " + FOLDER_LABEL_ID + " = '" + FolderLabelPath + "'"; - - return getStringValueBySQL(buildSQL); - } - - public String getRowIdBySubscriptionID (String StreamID) { - //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; - String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_ID + " = '" + StreamID + "'"; - return getStringValueBySQL(buildSQL); - } - - public String getSubscriptionIdByRowID (String ID) { - - String buildSQL = "SELECT " + SUBSCRIPTION_ID + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + ID + "'"; - return getStringValueBySQL(buildSQL); - } - - public String getTitleOfFolderByID (String FolderID) { - //String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + SubscriptionID + "'"; - String buildSQL = "SELECT " + FOLDER_LABEL + " FROM " + FOLDER_TABLE + " WHERE rowid = '" + FolderID + "'"; - return getStringValueBySQL(buildSQL); - } - - public String getTitleOfSubscriptionByRowID (String SubscriptionID) { - String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + SubscriptionID + "'"; - return getStringValueBySQL(buildSQL); - } - - public String getTitleOfSubscriptionByFeedItemID (String SubscriptionID) { - String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " sc " + - "JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + " " + - "WHERE rss.rowid = '" + SubscriptionID + "'"; - return getStringValueBySQL(buildSQL); - } - - public int removeTopSubscriptionItemByTag(String TAG) - { - return database.delete(SUBSCRIPTION_TABLE, SUBSCRIPTION_HEADERTEXT + " = ?", new String[] { TAG }); - } - - public int removeFolderByFolderLabel(String FolderLabel) - { - return database.delete(FOLDER_TABLE, FOLDER_LABEL + " = ?", new String[] { FolderLabel }); - } - - public int removeItemByItemId(String idRssItem) - { - return database.delete(RSS_ITEM_TABLE, RSS_ITEM_RSSITEM_ID + " = ?", new String[] { idRssItem }); - } - - public List convertCursorToStringArray(Cursor cursor, int column_id) - { - List items = new ArrayList(); - try - { - if(cursor != null) - { - if(cursor.getCount() > 0) - { - cursor.moveToFirst(); - do { - items.add(cursor.getString(column_id)); - } while(cursor.moveToNext()); - } - } - } finally { - cursor.close(); - } - return items; - - } - - private String getStringValueBySQL(String buildSQL) - { - String result = null; - - Cursor cursor = database.rawQuery(buildSQL, null); - try - { - if(cursor != null) - { - if(cursor.moveToFirst()) - result = cursor.getString(0); - } - } finally { - cursor.close(); - } - - return result; - } - - public long getLongValueBySQL(String buildSQL) - { - long result = -1; - - Cursor cursor = database.rawQuery(buildSQL, null); - try - { - if(cursor != null) - { - if(cursor.moveToFirst()) - result = cursor.getLong(0); - } - } finally { - cursor.close(); - } - - return result; - } - - public Boolean doesRssItemAlreadyExsists(String idRssItem)//idRssItem = id aus dem Google Reader Stream - { - String buildSQL = "SELECT " + RSS_ITEM_TITLE + " FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_RSSITEM_ID + " = '" + idRssItem + "'"; - Cursor cursor = database.rawQuery(buildSQL, null); - int count = cursor.getCount(); - cursor.close(); - if(count > 0) - return true; - else - return false; - } - - public int resetRssItemsDatabase() - { - int result = database.delete(RSS_ITEM_TABLE, null, null); - return result; - } - - public void resetDatabase() - { - openHelper.resetDatabase(database); - } - - public void openDatabase() - { - database = openHelper.getWritableDatabase(); - } - - public void closeDatabase() - { - database.close(); - } -} +package de.luhmer.owncloudnewsreader.database; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; +import de.luhmer.owncloudnewsreader.Constants; +import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; + +public class DatabaseConnection { + private DatabaseHelper openHelper; + private SQLiteDatabase database; + + public static final String FOLDER_TABLE = "folder"; + public static final String FOLDER_LABEL = "label"; + public static final String FOLDER_LABEL_ID = "label_id"; + + public static final String SUBSCRIPTION_TABLE = "subscription"; + public static final String SUBSCRIPTION_HEADERTEXT = "header_text"; + //public static final String SUBSCRIPTION_SUBSCRIPTION_ID = "subscription_id_subscription"; + public static final String SUBSCRIPTION_FOLDER_ID = "folder_idfolder"; + public static final String SUBSCRIPTION_ID = "subscription_id"; + public static final String SUBSCRIPTION_FAVICON_URL = "favicon_url"; + public static final String SUBSCRIPTION_LINK = "link"; + + public static final String RSS_ITEM_TABLE = "rss_item"; + public static final String RSS_ITEM_SUBSCRIPTION_ID = "subscription_id_subscription"; + public static final String RSS_ITEM_TITLE = "title"; + public static final String RSS_ITEM_LINK = "link"; + public static final String RSS_ITEM_BODY = "body"; + public static final String RSS_ITEM_READ = "read"; + public static final String RSS_ITEM_RSSITEM_ID = "rssitem_id"; + public static final String RSS_ITEM_STARRED = "starred"; + public static final String RSS_ITEM_PUBDATE = "pubdate"; + public static final String RSS_ITEM_AUTHOR = "author"; + public static final String RSS_ITEM_GUID = "guid"; + public static final String RSS_ITEM_GUIDHASH = "guidHash"; + public static final String RSS_ITEM_LAST_MODIFIED = "lastModified"; + + public static final String RSS_ITEM_READ_TEMP = "read_temp"; + public static final String RSS_ITEM_STARRED_TEMP = "starred_temp"; + + + public static final boolean DATABASE_DEBUG_MODE = false; //(false && Constants.DEBUG_MODE) ? true: false; + + + public DatabaseConnection(Context aContext) { + openHelper = new DatabaseHelper(aContext); + openDatabase(); + } + + public SQLiteDatabase getDatabase() + { + return database; + } + + + public void clearDatabaseOverSize() + { + //If i have 9023 rows in the database, when i run that query it should delete 8023 rows and leave me with 1000 + //database.execSQL("DELETE FROM " + RSS_ITEM_TABLE + " WHERE " + + "ORDER BY rowid DESC LIMIT 1000 * + + //Let's say it said 1005 - you need to delete 5 rows. + //DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5 + + + int max = Constants.maxItemsCount; + int total = (int) getLongValueBySQL("SELECT COUNT(*) FROM rss_item"); + int unread = (int) getLongValueBySQL("SELECT COUNT(*) FROM rss_item WHERE read_temp != 1"); + int read = total - unread; + + if(total > max) + { + int overSize = total - max; + //Soll verhindern, dass ungelesene Artikel gelöscht werden + if(overSize > read) + overSize = read; + database.execSQL("DELETE FROM rss_item WHERE read_temp = 1 AND rowid IN (SELECT rowid FROM rss_item WHERE read_temp = 1 ORDER BY rowid asc LIMIT " + overSize + ")"); + /* SELECT * FROM rss_item WHERE read_temp = 1 ORDER BY rowid asc LIMIT 3; */ + } + } + + public void markAllItemsAsRead(List itemIds) + { + if(itemIds != null) + for(Integer idItem : itemIds) + updateIsReadOfFeed(String.valueOf(idItem), true); + } + + public int getCountOfAllItems(boolean execludeStarred) + { + String buildSQL = "SELECT count(*) FROM " + RSS_ITEM_TABLE; + if(execludeStarred) + buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " != 1"; + + int result = 0; + + Cursor cursor = database.rawQuery(buildSQL, null); + try + { + if(cursor != null) + { + cursor.moveToFirst(); + result = cursor.getInt(0); + } + } finally { + cursor.close(); + } + + return result; + } + + public long getLastModfied() + { + String buildSQL = "SELECT MAX(" + RSS_ITEM_LAST_MODIFIED + ") FROM " + RSS_ITEM_TABLE; + long result = 0; + + Cursor cursor = database.rawQuery(buildSQL, null); + try + { + if(cursor != null) + { + cursor.moveToFirst(); + result = cursor.getLong(0); + } + } finally { + cursor.close(); + } + + return result; + } + + public long getItemDbIdAtPosition(int positionXRow) + { + String buildSQL = "SELECT rowid FROM " + RSS_ITEM_TABLE; + long result = -1; + + Cursor cursor = database.rawQuery(buildSQL, null); + try + { + if(cursor != null) + { + if(cursor.move(cursor.getCount() - (positionXRow - 1))) + result = cursor.getLong(0); + } + } finally { + cursor.close(); + } + + return result; + } + + public List getAllNewReadItems() + { + String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " + + RSS_ITEM_READ_TEMP + " = 1 AND " + + RSS_ITEM_READ + " = 0"; + Cursor cursor = database.rawQuery(buildSQL, null); + return convertCursorToStringArray(cursor, 0); + } + + public List getAllNewUnreadItems() + { + String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " + + RSS_ITEM_READ_TEMP + " = 0 AND " + + RSS_ITEM_READ + " = 1"; + Cursor cursor = database.rawQuery(buildSQL, null); + return convertCursorToStringArray(cursor, 0); + } + + public List getAllNewStarredItems() + { + String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " + + RSS_ITEM_STARRED_TEMP + " = 1 AND " + + RSS_ITEM_STARRED + " = 0"; + Cursor cursor = database.rawQuery(buildSQL, null); + return convertCursorToStringArray(cursor, 0); + } + + public List getAllNewUnstarredItems() + { + String buildSQL = "SELECT " + RSS_ITEM_RSSITEM_ID + " FROM " + RSS_ITEM_TABLE + " WHERE " + + RSS_ITEM_STARRED_TEMP + " = 0 AND " + + RSS_ITEM_STARRED + " = 1"; + Cursor cursor = database.rawQuery(buildSQL, null); + return convertCursorToStringArray(cursor, 0); + } + + public Cursor getAllItemsWithIdHigher(String id_item) { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; + String buildSQL = "SELECT rowid as _id, * FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_RSSITEM_ID + " > " + id_item; + + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllItemsWithIdHigher SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public long getLowestItemId(boolean onlyStarred) + { + String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE; + + if(onlyStarred) + buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1"; + + return getLongValueBySQL(buildSQL); + } + + public long getLowestItemIdByFeed(String id_feed) + { + String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_SUBSCRIPTION_ID + " = " + id_feed; + return getLongValueBySQL(buildSQL); + } + + public long getLowestItemIdByFolder(String id_folder) + { + String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") " + + "FROM " + RSS_ITEM_TABLE + " rss " + + "JOIN " + SUBSCRIPTION_TABLE + " sc ON rss." + RSS_ITEM_SUBSCRIPTION_ID + " = sc.rowid " + + "WHERE " + SUBSCRIPTION_FOLDER_ID + " = " + id_folder; + return getLongValueBySQL(buildSQL); + } + + public long getLowestItemIdStarred() + { + String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_STARRED_TEMP + " == 1"; + return getLongValueBySQL(buildSQL); + } + + public long getLowestItemIdUnread() + { + String buildSQL = "SELECT MIN(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_READ_TEMP + " != 1"; + return getLongValueBySQL(buildSQL); + } + + public long getHighestItemId() + { + String buildSQL = "SELECT MAX(" + RSS_ITEM_RSSITEM_ID + ") FROM " + RSS_ITEM_TABLE; + return getLongValueBySQL(buildSQL); + } + + public int removeAllItemsWithIdLowerThan(String id_db) + { + return database.delete(RSS_ITEM_TABLE, "rowid < ?", new String[] { id_db }); + } + + /* + public Cursor getAllData(String TABLE_NAME) { + String buildSQL = "SELECT rowid as _id, * FROM " + TABLE_NAME; + Log.d("DB_HELPER", "getAllData SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + */ + + public Cursor getAllTopSubscriptions(boolean onlyUnread) { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; + String buildSQL = "SELECT DISTINCT(f.rowid) as _id, * FROM " + FOLDER_TABLE + " f "; + if(onlyUnread) + { + buildSQL += " JOIN " + SUBSCRIPTION_TABLE + " sc ON f.rowid = sc." + SUBSCRIPTION_FOLDER_ID + + " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + + " WHERE " + RSS_ITEM_READ_TEMP + " != 1" + + " GROUP BY f.rowid " + + " HAVING COUNT(*) > 0"; + } + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllTopSubscriptions SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public Cursor getAllTopSubscriptionsWithoutFolder(boolean onlyUnread) { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; + String buildSQL = "SELECT DISTINCT(sc.rowid) as _id, * FROM " + SUBSCRIPTION_TABLE + " sc "; + + if(onlyUnread) + { + buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + + " WHERE " + SUBSCRIPTION_FOLDER_ID + " IS NULL" + + " AND " + RSS_ITEM_READ_TEMP + " != 1" + + " GROUP BY sc.rowid " + + " HAVING COUNT(*) > 0"; + } + else + buildSQL += " WHERE " + SUBSCRIPTION_FOLDER_ID + " IS NULL"; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllTopSubscriptions SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + /* + public Cursor getAllTopSubscriptionsWithUnreadFeeds() { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NULL"; + String buildSQL = "SELECT f.rowid as _id, * FROM " + FOLDER_TABLE + " f "+ + " JOIN " + SUBSCRIPTION_TABLE + " sc ON f.rowid = sc." + SUBSCRIPTION_FOLDER_ID + + " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + + " GROUP BY f.rowid " + + " HAVING COUNT(*) > 0"; + Log.d("DB_HELPER", "getAllTopData SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + }*/ + + + public Cursor getAllSubSubscriptions() { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE subscription_id_subscription IS NOT NULL"; + String buildSQL = "SELECT DISTINCT(rowid) as _id, * FROM " + SUBSCRIPTION_TABLE; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllSubSubscriptions SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public Cursor getFeedByDbID(String ID_FEED_DB) {//Feeds + String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + ID_FEED_DB + "'"; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getSubSubscriptionsByID SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public Cursor getFeedByFeedID(String ID_FEED) {//Feeds + String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_ID + " = '" + ID_FEED + "'"; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getSubSubscriptionsByID SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public int getCountItemsForSubscription(String ID_SUBSCRIPTION, boolean onlyUnread, boolean execludeStarredItems) { + + String buildSQL = "SELECT COUNT(*) " + + " FROM " + RSS_ITEM_TABLE + + //" WHERE read != 1" + + " WHERE " + RSS_ITEM_READ_TEMP +" != 1 AND " + RSS_ITEM_STARRED + " != 1" + + " AND subscription_id_subscription IN " + + "(SELECT rowid " + + "FROM subscription " + + "WHERE rowid = " + ID_SUBSCRIPTION + ");"; + + + + if(!onlyUnread) + buildSQL = buildSQL.replace("read_temp != 1 AND", ""); + + if(!execludeStarredItems) + buildSQL = buildSQL.replace(RSS_ITEM_STARRED + " != 1 AND", RSS_ITEM_STARRED_TEMP + " = 1 AND"); + + return (int)getLongValueBySQL(buildSQL); + } + + public Boolean isFeedUnreadStarred(String FEED_ID, Boolean checkUnread) { + String buildSQL; + /* + if(checkUnread) + buildSQL = "SELECT read "; + else//Wenn nicht checkRead auf true steht, soll geprueft werden ob das Feed Markiert ist. + buildSQL = "SELECT starred "; + */ + + if(checkUnread) + buildSQL = "SELECT read_temp "; + else//Wenn nicht checkRead auf true steht, soll geprueft werden ob das Feed Markiert ist. + buildSQL = "SELECT starred_temp "; + + buildSQL += " FROM " + RSS_ITEM_TABLE + + " WHERE rowid = " + FEED_ID; + + return checkSqlForBoolean(buildSQL); + } + + private Boolean checkSqlForBoolean(String buildSQL) + { + Boolean result = false; + Cursor cursor = database.rawQuery(buildSQL, null); + if (cursor != null) + { + if(cursor.moveToFirst()) + { + String val = cursor.getString(0); + if(val != null) + if(val.equals("1")) + result = true; + } + } + cursor.close(); + + return result; + } + + public void updateIsReadOfFeed(String FEED_ID, Boolean isRead) { + ContentValues args = new ContentValues(); + //args.put(RSS_ITEM_READ, isRead); + args.put(RSS_ITEM_READ_TEMP, isRead); + int result = database.update(RSS_ITEM_TABLE, args, "rowid=?", new String[] { FEED_ID }); + + if(DATABASE_DEBUG_MODE) + Log.d("RESULT UPDATE DATABASE", "RESULT: " + result); + } + + public void updateIsStarredOfFeed(String FEED_ID, Boolean isStarred) { + + if(isStarred)//Wenn ein Feed markiert ist muss es auch als gelesen markiert werden. + updateIsReadOfFeed(FEED_ID, true); + + + ContentValues args = new ContentValues(); + //args.put(RSS_ITEM_STARRED, isStarred); + args.put(RSS_ITEM_STARRED_TEMP, isStarred); + int result = database.update(RSS_ITEM_TABLE, args, "rowid=?", new String[] { FEED_ID }); + + if(DATABASE_DEBUG_MODE) + Log.d("RESULT UPDATE DATABASE", "RESULT: " + result); + } + + private String getAllFeedsSelectStatement() + { + return "SELECT DISTINCT(rowid) as _id, " + RSS_ITEM_TITLE + ", " + RSS_ITEM_RSSITEM_ID + ", " + RSS_ITEM_LINK + ", " + RSS_ITEM_BODY + ", " + RSS_ITEM_READ + ", " + RSS_ITEM_SUBSCRIPTION_ID + ", " + + RSS_ITEM_PUBDATE + ", " + RSS_ITEM_STARRED + ", " + RSS_ITEM_GUIDHASH + ", " + RSS_ITEM_GUID + ", " + RSS_ITEM_STARRED_TEMP + ", " + RSS_ITEM_READ_TEMP; + } + + public Cursor getAllItemsForFeed(String ID_SUBSCRIPTION, boolean onlyUnread, boolean onlyStarredItems) { + + String buildSQL = getAllFeedsSelectStatement() + + " FROM " + RSS_ITEM_TABLE + + " WHERE subscription_id_subscription IN " + + "(SELECT rowid " + + "FROM subscription " + + "WHERE rowid = " + ID_SUBSCRIPTION + ")"; + + if(onlyUnread && !onlyStarredItems) + buildSQL += " AND " + RSS_ITEM_READ_TEMP + " != 1"; + else if(onlyStarredItems) + buildSQL += " AND " + RSS_ITEM_STARRED_TEMP + " = 1"; + + buildSQL += " ORDER BY " + RSS_ITEM_PUBDATE + " desc"; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllItemsForFeed SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public Cursor getArticleByID(String ID_FEED) { + String buildSQL = getAllFeedsSelectStatement() + + " FROM " + RSS_ITEM_TABLE + + " WHERE rowid = " + ID_FEED; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getFeedByID SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public String getRowIdOfFeedByItemID(String ID_FEED) + { + String buildSQL = "SELECT rowid " + + " FROM " + RSS_ITEM_TABLE + + " WHERE " + RSS_ITEM_RSSITEM_ID + " = " + ID_FEED; + + return getStringValueBySQL(buildSQL); + } + + /* + public String getCountUnreadFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { //TODO optimize this here !!!! + String buildSQL = "SELECT COUNT(*) " + + " FROM " + RSS_ITEM_TABLE + + " WHERE " + RSS_ITEM_READ_TEMP + " != 1 "; + if(!ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) + buildSQL += " AND subscription_id_subscription IN " + + "(SELECT sc.rowid " + + "FROM subscription sc " + + "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + + "WHERE f.rowid = " + ID_FOLDER + ")"; + + if(onlyUnread) + buildSQL += " AND "; + String result = "0"; + Cursor cursor = database.rawQuery(buildSQL, null); + if (cursor != null) + { + if(cursor.moveToFirst()) + result = cursor.getString(0); + } + cursor.close(); + + return result; + }*/ + + public int getCountFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { + + Cursor cursor = getAllItemsForFolder(ID_FOLDER, onlyUnread); + int count = cursor.getCount(); + cursor.close(); + + return count; + + + } + /* + public String getCountFeedsForFolder(String ID_FOLDER, boolean onlyUnread) { + String buildSQL = "SELECT COUNT(*) " + + " FROM " + RSS_ITEM_TABLE; + + if(!(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS))) + { + buildSQL += " WHERE subscription_id_subscription IN " + + "(SELECT sc.rowid " + + "FROM subscription sc " + + "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + + "WHERE f.rowid = " + ID_FOLDER + ") "; + + if(onlyUnread) + buildSQL += " AND read_temp != 1"; + } + else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS))//UNREAD + buildSQL += " WHERE starred != 1 and read_temp != 1"; + else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS))//STARRED + buildSQL += " WHERE starred_temp = 1"; + // buildSQL += " WHERE starred = 1"; + + + + String result = "0"; + Cursor cursor = database.rawQuery(buildSQL, null); + if (cursor != null) + { + if(cursor.moveToFirst()) + result = cursor.getString(0); + } + cursor.close(); + + return result; + }*/ + + public Cursor getAllItemsForFolder(String ID_FOLDER, boolean onlyUnread) { + String buildSQL = getAllFeedsSelectStatement() + + " FROM " + RSS_ITEM_TABLE; + + if(!(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)))//Wenn nicht Alle Artikel ausgewaehlt wurde (-10) oder (-11) fuer Starred Feeds + { + buildSQL += " WHERE subscription_id_subscription IN " + + "(SELECT sc.rowid " + + "FROM subscription sc " + + "JOIN folder f ON sc." + SUBSCRIPTION_FOLDER_ID + " = f.rowid " + + "WHERE f.rowid = " + ID_FOLDER + ")"; + + if(onlyUnread) + buildSQL += " AND " + RSS_ITEM_READ_TEMP + " != 1"; + } + //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) && onlyUnread)//only unRead should only be null when testing the size of items + else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) + buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " != 1 AND " + RSS_ITEM_READ_TEMP + " != 1"; + //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) + // buildSQL += " WHERE " + RSS_ITEM_STARRED + " != 1"; + //else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS) && onlyUnread) + // buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1 AND " + RSS_ITEM_READ_TEMP + " != 1"; + else if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) + buildSQL += " WHERE " + RSS_ITEM_STARRED_TEMP + " = 1"; + + + buildSQL += " ORDER BY " + RSS_ITEM_PUBDATE + " desc"; + + // buildSQL += " WHERE starred = 1"; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllFeedData SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public Cursor getAllSubscriptionForFolder(String ID_FOLDER, boolean onlyUnread) { + //String buildSQL = "SELECT rowid as _id, * FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_SUBSCRIPTION_ID + "=" + ID_SUBSCRIPTION; + String buildSQL = "SELECT sc.rowid as _id, sc.* " + + "FROM " + SUBSCRIPTION_TABLE + " sc " + + "LEFT OUTER JOIN folder f ON sc.folder_idfolder = f.rowid "; + + if(ID_FOLDER.equals("-11"))//Starred + { + buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + + " WHERE rss." + RSS_ITEM_STARRED_TEMP + " = 1" + + " GROUP BY sc.rowid " + + " HAVING COUNT(*) > 0"; + } + else if(onlyUnread || ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS) /*ID_SUBSCRIPTION.matches("-10|-11")*/) + { + buildSQL += " JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + + " WHERE f.rowid = " + ID_FOLDER + " AND rss." + RSS_ITEM_READ_TEMP + " != 1" + + " GROUP BY sc.rowid " + + " HAVING COUNT(*) > 0"; + + if(ID_FOLDER.equals(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS)) + buildSQL = buildSQL.replace("f.rowid = " + ID_FOLDER + " AND", "");//Remove to ID stuff because i want the result of all feeds where are unread items in + } + else + buildSQL += "WHERE f.rowid = " + ID_FOLDER; + + if(DATABASE_DEBUG_MODE) + Log.d("DB_HELPER", "getAllSub_SubscriptionForSubscription SQL: " + buildSQL); + return database.rawQuery(buildSQL, null); + } + + public void insertNewFolder (String label, String label_path) { + ContentValues contentValues = new ContentValues(); + contentValues.put(FOLDER_LABEL, label); + contentValues.put(FOLDER_LABEL_ID, label_path); + database.insert(FOLDER_TABLE, null, contentValues); + } + + /* + public int updateFolder (String label, String label_path) { + ContentValues contentValues = new ContentValues(); + contentValues.put(FOLDER_LABEL, label); + return database.update(FOLDER_TABLE, contentValues, FOLDER_LABEL_ID + "=?", new String[] { label_path }); + }*/ + + public void insertNewFeed (String headerText, String ID_FOLDER, String subscription_id, String FAVICON_URL) { + ContentValues contentValues = new ContentValues(); + contentValues.put(SUBSCRIPTION_HEADERTEXT, headerText); + contentValues.put(SUBSCRIPTION_FOLDER_ID, ID_FOLDER); + contentValues.put(SUBSCRIPTION_ID , subscription_id); + contentValues.put(SUBSCRIPTION_FAVICON_URL, FAVICON_URL); + database.insert(SUBSCRIPTION_TABLE, null, contentValues); + } + + public int updateFeed (String headerText, String ID_FOLDER, String subscription_id, String FAVICON_URL) { + ContentValues contentValues = new ContentValues(); + contentValues.put(SUBSCRIPTION_HEADERTEXT, headerText); + contentValues.put(SUBSCRIPTION_FOLDER_ID, ID_FOLDER); + contentValues.put(SUBSCRIPTION_FAVICON_URL, FAVICON_URL); + return database.update(SUBSCRIPTION_TABLE, contentValues, SUBSCRIPTION_ID + "= ?", new String[] { subscription_id }); + } + + public void insertNewItem (String Titel, String link, String description, Boolean isRead, String ID_SUBSCRIPTION, String ID_RSSITEM, Date timestamp, Boolean isStarred, String guid, String guidHash, String lastModified) { + ContentValues contentValues = new ContentValues(); + contentValues.put(RSS_ITEM_TITLE, Titel); + contentValues.put(RSS_ITEM_LINK, link); + contentValues.put(RSS_ITEM_BODY, description); + contentValues.put(RSS_ITEM_READ, isRead); + contentValues.put(RSS_ITEM_SUBSCRIPTION_ID, ID_SUBSCRIPTION); + contentValues.put(RSS_ITEM_RSSITEM_ID, ID_RSSITEM); + contentValues.put(RSS_ITEM_PUBDATE, timestamp.getTime()); + contentValues.put(RSS_ITEM_STARRED, isStarred); + contentValues.put(RSS_ITEM_GUID, guid); + contentValues.put(RSS_ITEM_GUIDHASH, guidHash); + contentValues.put(RSS_ITEM_LAST_MODIFIED, lastModified); + + contentValues.put(RSS_ITEM_READ_TEMP, isRead); + contentValues.put(RSS_ITEM_STARRED_TEMP, isStarred); + + database.insert(RSS_ITEM_TABLE, null, contentValues); + } + + public String getIdOfFolder (String FolderName) { + //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; + String buildSQL = "SELECT rowid as _id FROM " + FOLDER_TABLE + " WHERE " + FOLDER_LABEL + " = '" + FolderName + "'"; + + return getStringValueBySQL(buildSQL); + } + + public String getIdOfFolderByLabelPath (String FolderLabelPath) { + //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; + String buildSQL = "SELECT rowid as _id FROM " + FOLDER_TABLE + " WHERE " + FOLDER_LABEL_ID + " = '" + FolderLabelPath + "'"; + + return getStringValueBySQL(buildSQL); + } + + public String getRowIdBySubscriptionID (String StreamID) { + //String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_HEADERTEXT + " = '" + SubscriptionName + "'"; + String buildSQL = "SELECT rowid as _id FROM " + SUBSCRIPTION_TABLE + " WHERE " + SUBSCRIPTION_ID + " = '" + StreamID + "'"; + return getStringValueBySQL(buildSQL); + } + + public String getSubscriptionIdByRowID (String ID) { + + String buildSQL = "SELECT " + SUBSCRIPTION_ID + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + ID + "'"; + return getStringValueBySQL(buildSQL); + } + + public String getTitleOfFolderByID (String FolderID) { + //String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + SubscriptionID + "'"; + String buildSQL = "SELECT " + FOLDER_LABEL + " FROM " + FOLDER_TABLE + " WHERE rowid = '" + FolderID + "'"; + return getStringValueBySQL(buildSQL); + } + + public String getTitleOfSubscriptionByRowID (String SubscriptionID) { + String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " WHERE rowid = '" + SubscriptionID + "'"; + return getStringValueBySQL(buildSQL); + } + + public String getTitleOfSubscriptionByFeedItemID (String SubscriptionID) { + String buildSQL = "SELECT " + SUBSCRIPTION_HEADERTEXT + " FROM " + SUBSCRIPTION_TABLE + " sc " + + "JOIN " + RSS_ITEM_TABLE + " rss ON sc.rowid = rss." + RSS_ITEM_SUBSCRIPTION_ID + " " + + "WHERE rss.rowid = '" + SubscriptionID + "'"; + return getStringValueBySQL(buildSQL); + } + + public int removeTopSubscriptionItemByTag(String TAG) + { + return database.delete(SUBSCRIPTION_TABLE, SUBSCRIPTION_HEADERTEXT + " = ?", new String[] { TAG }); + } + + public int removeFolderByFolderLabel(String FolderLabel) + { + return database.delete(FOLDER_TABLE, FOLDER_LABEL + " = ?", new String[] { FolderLabel }); + } + + public int removeItemByItemId(String idRssItem) + { + return database.delete(RSS_ITEM_TABLE, RSS_ITEM_RSSITEM_ID + " = ?", new String[] { idRssItem }); + } + + public List convertCursorToStringArray(Cursor cursor, int column_id) + { + List items = new ArrayList(); + try + { + if(cursor != null) + { + if(cursor.getCount() > 0) + { + cursor.moveToFirst(); + do { + items.add(cursor.getString(column_id)); + } while(cursor.moveToNext()); + } + } + } finally { + cursor.close(); + } + return items; + + } + + private String getStringValueBySQL(String buildSQL) + { + String result = null; + + Cursor cursor = database.rawQuery(buildSQL, null); + try + { + if(cursor != null) + { + if(cursor.moveToFirst()) + result = cursor.getString(0); + } + } finally { + cursor.close(); + } + + return result; + } + + public long getLongValueBySQL(String buildSQL) + { + long result = -1; + + Cursor cursor = database.rawQuery(buildSQL, null); + try + { + if(cursor != null) + { + if(cursor.moveToFirst()) + result = cursor.getLong(0); + } + } finally { + cursor.close(); + } + + return result; + } + + public Boolean doesRssItemAlreadyExsists(String idRssItem)//idRssItem = id aus dem Google Reader Stream + { + String buildSQL = "SELECT " + RSS_ITEM_TITLE + " FROM " + RSS_ITEM_TABLE + " WHERE " + RSS_ITEM_RSSITEM_ID + " = '" + idRssItem + "'"; + Cursor cursor = database.rawQuery(buildSQL, null); + int count = cursor.getCount(); + cursor.close(); + if(count > 0) + return true; + else + return false; + } + + public int resetRssItemsDatabase() + { + int result = database.delete(RSS_ITEM_TABLE, null, null); + return result; + } + + public void resetDatabase() + { + openHelper.resetDatabase(database); + } + + public void openDatabase() + { + database = openHelper.getWritableDatabase(); + } + + public void closeDatabase() + { + database.close(); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/helper/MenuUtilsSherlockFragmentActivity.java b/src/de/luhmer/owncloudnewsreader/helper/MenuUtilsSherlockFragmentActivity.java index 4b01b9e4..797eb907 100644 --- a/src/de/luhmer/owncloudnewsreader/helper/MenuUtilsSherlockFragmentActivity.java +++ b/src/de/luhmer/owncloudnewsreader/helper/MenuUtilsSherlockFragmentActivity.java @@ -1,158 +1,201 @@ -package de.luhmer.owncloudnewsreader.helper; - -import android.support.v4.app.FragmentActivity; -import android.util.Log; -import android.widget.Toast; - -import com.actionbarsherlock.app.SherlockDialogFragment; -import com.actionbarsherlock.app.SherlockFragmentActivity; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import de.luhmer.owncloudnewsreader.NewsReaderDetailActivity; -import de.luhmer.owncloudnewsreader.NewsReaderDetailFragment; -import de.luhmer.owncloudnewsreader.NewsReaderListActivity; -import de.luhmer.owncloudnewsreader.R; -import de.luhmer.owncloudnewsreader.VersionInfoDialogFragment; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; -import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; - -public class MenuUtilsSherlockFragmentActivity extends SherlockFragmentActivity { - protected static final String TAG = "MenuUtils"; - - static FragmentActivity activity; - - static MenuItem menuItemSettings; - static MenuItem menuItemLogin; - static MenuItem menuItemStartImageCaching; - - - private static MenuItem menuItemUpdater; - private static MenuItem menuItemMarkAllAsRead; - private static MenuItem menuItemDownloadMoreItems; - - /** - * @return the menuItemUpdater - */ - public static MenuItem getMenuItemUpdater() { - return menuItemUpdater; - } - - /** - * @return the menuItemMarkAllAsRead - */ - public static MenuItem getMenuItemMarkAllAsRead() { - return menuItemMarkAllAsRead; - } - - /** - * @return the menuItemDownloadMoreItems - */ - public static MenuItem getMenuItemDownloadMoreItems() { - return menuItemDownloadMoreItems; - } - - - - - public static void onCreateOptionsMenu(Menu menu, MenuInflater inflater, boolean mTwoPane, FragmentActivity act) { - inflater.inflate(R.menu.news_reader, menu); - - activity = act; - - menuItemSettings = menu.findItem(R.id.action_settings); - menuItemLogin = menu.findItem(R.id.action_login); - menuItemStartImageCaching = menu.findItem(R.id.menu_StartImageCaching); - - menuItemUpdater = menu.findItem(R.id.menu_update); - menuItemMarkAllAsRead = menu.findItem(R.id.menu_markAllAsRead); - menuItemDownloadMoreItems = menu.findItem(R.id.menu_downloadMoreItems); - - - menuItemMarkAllAsRead.setEnabled(false); - menuItemDownloadMoreItems.setEnabled(false); - - if(!mTwoPane && act instanceof NewsReaderListActivity)//On Smartphones disable this... - { - menuItemMarkAllAsRead.setVisible(false); - menuItemDownloadMoreItems.setVisible(false); - - menuItemDownloadMoreItems = null; - menuItemMarkAllAsRead = null; - } else if(act instanceof NewsReaderDetailActivity) { - menuItemLogin.setVisible(false); - menuItemSettings.setVisible(false); - menuItemStartImageCaching.setVisible(false); - menuItemUpdater.setVisible(false); - - menuItemMarkAllAsRead.setEnabled(true); - menuItemDownloadMoreItems.setEnabled(true); - } - - NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); - if(ndf != null) - ndf.UpdateMenuItemsState();//Is called on Smartphones - } - - public static boolean onOptionsItemSelected(MenuItem item, FragmentActivity activity) { - switch (item.getItemId()) { - case R.id.menu_About_Changelog: - SherlockDialogFragment dialog = new VersionInfoDialogFragment(); - dialog.show(activity.getSupportFragmentManager(), "VersionChangelogDialogFragment"); - return true; - - case R.id.menu_markAllAsRead: - NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); - if(ndf != null) - { - /* - for(int i = 0; i < ndf.getListView().getChildCount(); i++) - { - View view = ndf.getListView().getChildAt(i); - CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_read); - if(!cb.isChecked()) - cb.setChecked(true); - } - */ - - DatabaseConnection dbConn = new DatabaseConnection(activity); - try { - dbConn.markAllItemsAsRead(ndf.getDatabaseIdsOfItems()); - } finally { - dbConn.closeDatabase(); - } - ndf.UpdateCursor(); - - } - return true; - - case R.id.menu_downloadMoreItems: - DownloadMoreItems(); - return true; - } - return false; - } - - private static void DownloadMoreItems() - { - NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); - IReader _Reader = new OwnCloud_Reader(); - _Reader.Start_AsyncTask_GetOldItems(0, activity, onAsyncTaskComplete, ndf.getIdFeed(), ndf.getIdFolder()); - - Toast.makeText(activity, activity.getString(R.string.toast_GettingMoreItems), Toast.LENGTH_SHORT).show(); - } - - static OnAsyncTaskCompletedListener onAsyncTaskComplete = new OnAsyncTaskCompletedListener() { - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); - if(ndf != null) - ndf.UpdateCursor(); - - Log.d(TAG, "Finished Download extra items.."); - } - }; +package de.luhmer.owncloudnewsreader.helper; + +import android.annotation.TargetApi; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Build; +import android.support.v4.app.FragmentActivity; +import android.util.Log; +import android.widget.Toast; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +import de.luhmer.owncloudnewsreader.Constants; +import de.luhmer.owncloudnewsreader.NewsReaderDetailActivity; +import de.luhmer.owncloudnewsreader.NewsReaderDetailFragment; +import de.luhmer.owncloudnewsreader.NewsReaderListActivity; +import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.VersionInfoDialogFragment; +import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader; + +public class MenuUtilsSherlockFragmentActivity extends SherlockFragmentActivity { + /* (non-Javadoc) + * @see android.support.v4.app.FragmentActivity#onResume() + */ + + protected static final String TAG = "MenuUtils"; + + static FragmentActivity activity; + + static MenuItem menuItemSettings; + static MenuItem menuItemLogin; + static MenuItem menuItemStartImageCaching; + + + private static MenuItem menuItemUpdater; + private static MenuItem menuItemMarkAllAsRead; + private static MenuItem menuItemDownloadMoreItems; + + /** + * @return the menuItemUpdater + */ + public static MenuItem getMenuItemUpdater() { + return menuItemUpdater; + } + + /** + * @return the menuItemMarkAllAsRead + */ + public static MenuItem getMenuItemMarkAllAsRead() { + return menuItemMarkAllAsRead; + } + + /** + * @return the menuItemDownloadMoreItems + */ + public static MenuItem getMenuItemDownloadMoreItems() { + return menuItemDownloadMoreItems; + } + + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + protected void onResume() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + invalidateOptionsMenu(); + } + super.onResume(); + } + + + public static void onCreateOptionsMenu(Menu menu, MenuInflater inflater, boolean mTwoPane, FragmentActivity act) { + inflater.inflate(R.menu.news_reader, menu); + + activity = act; + + menuItemSettings = menu.findItem(R.id.action_settings); + menuItemLogin = menu.findItem(R.id.action_login); + menuItemStartImageCaching = menu.findItem(R.id.menu_StartImageCaching); + + menuItemUpdater = menu.findItem(R.id.menu_update); + menuItemMarkAllAsRead = menu.findItem(R.id.menu_markAllAsRead); + menuItemDownloadMoreItems = menu.findItem(R.id.menu_downloadMoreItems); + + + menuItemMarkAllAsRead.setEnabled(false); + menuItemDownloadMoreItems.setEnabled(false); + + if(!mTwoPane && act instanceof NewsReaderListActivity)//On Smartphones disable this... + { + menuItemMarkAllAsRead.setVisible(false); + menuItemDownloadMoreItems.setVisible(false); + + menuItemDownloadMoreItems = null; + menuItemMarkAllAsRead = null; + } else if(act instanceof NewsReaderDetailActivity) { + menuItemLogin.setVisible(false); + menuItemSettings.setVisible(false); + menuItemStartImageCaching.setVisible(false); + menuItemUpdater.setVisible(false); + + menuItemMarkAllAsRead.setEnabled(true); + menuItemDownloadMoreItems.setEnabled(true); + } + + NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); + if(ndf != null) + ndf.UpdateMenuItemsState();//Is called on Smartphones + } + + public static boolean onOptionsItemSelected(MenuItem item, FragmentActivity activity) { + switch (item.getItemId()) { + case R.id.menu_About_Changelog: + SherlockDialogFragment dialog = new VersionInfoDialogFragment(); + dialog.show(activity.getSupportFragmentManager(), "VersionChangelogDialogFragment"); + return true; + + case R.id.menu_markAllAsRead: + NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); + if(ndf != null) + { + /* + for(int i = 0; i < ndf.getListView().getChildCount(); i++) + { + View view = ndf.getListView().getChildAt(i); + CheckBox cb = (CheckBox) view.findViewById(R.id.cb_lv_item_read); + if(!cb.isChecked()) + cb.setChecked(true); + } + */ + + DatabaseConnection dbConn = new DatabaseConnection(activity); + try { + dbConn.markAllItemsAsRead(ndf.getDatabaseIdsOfItems()); + } finally { + dbConn.closeDatabase(); + } + ndf.UpdateCursor(); + + //If tablet view is enabled update the listview as well + if(activity instanceof NewsReaderListActivity) + ((NewsReaderListActivity) activity).updateAdapter(); + + } + return true; + + case R.id.menu_downloadMoreItems: + DownloadMoreItems(); + return true; + } + return false; + } + + private static void DownloadMoreItems() + { + NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); + + DatabaseConnection dbConn = new DatabaseConnection(activity); + int count = dbConn.getCountFeedsForFolder(SubscriptionExpandableListAdapter.ALL_UNREAD_ITEMS, true); + if(count > Constants.maxItemsCount) + { + String text = activity.getString(R.string.max_items_count_reached); + text = text.replace("XX", "" + Constants.maxItemsCount); + new AlertDialog.Builder(activity) + .setTitle(activity.getString(R.string.empty_view_header)) + .setMessage(text) + .setPositiveButton(activity.getString(android.R.string.ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + } + }) + .create() + .show(); + //Toast.makeText(activity, text, Toast.LENGTH_LONG).show(); + } + else + { + IReader _Reader = new OwnCloud_Reader(); + _Reader.Start_AsyncTask_GetOldItems(0, activity, onAsyncTaskComplete, ndf.getIdFeed(), ndf.getIdFolder()); + + Toast.makeText(activity, activity.getString(R.string.toast_GettingMoreItems), Toast.LENGTH_SHORT).show(); + } + } + + static OnAsyncTaskCompletedListener onAsyncTaskComplete = new OnAsyncTaskCompletedListener() { + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + NewsReaderDetailFragment ndf = ((NewsReaderDetailFragment) activity.getSupportFragmentManager().findFragmentById(R.id.newsreader_detail_container)); + if(ndf != null) + ndf.UpdateCursor(); + + Log.d(TAG, "Finished Download extra items.."); + } + }; } \ No newline at end of file diff --git a/src/de/luhmer/owncloudnewsreader/interfaces/AsyncUpdateFinished.java b/src/de/luhmer/owncloudnewsreader/interfaces/AsyncUpdateFinished.java index a0e5e1ca..faad4742 100644 --- a/src/de/luhmer/owncloudnewsreader/interfaces/AsyncUpdateFinished.java +++ b/src/de/luhmer/owncloudnewsreader/interfaces/AsyncUpdateFinished.java @@ -1,5 +1,5 @@ -package de.luhmer.owncloudnewsreader.interfaces; - -public interface AsyncUpdateFinished { - public void FinishedUpdate(); -} +package de.luhmer.owncloudnewsreader.interfaces; + +public interface AsyncUpdateFinished { + public void FinishedUpdate(); +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/AsyncTask_Reader.java b/src/de/luhmer/owncloudnewsreader/reader/AsyncTask_Reader.java index fb6ddcd2..c4c95547 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/AsyncTask_Reader.java +++ b/src/de/luhmer/owncloudnewsreader/reader/AsyncTask_Reader.java @@ -1,7 +1,45 @@ -package de.luhmer.owncloudnewsreader.reader; - -import android.app.Activity; - -public interface AsyncTask_Reader { - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener); -} +package de.luhmer.owncloudnewsreader.reader; + +import android.app.Activity; +import android.os.AsyncTask; + +public abstract class AsyncTask_Reader extends AsyncTask { + protected Activity context; + protected int task_id; + protected OnAsyncTaskCompletedListener[] listener; + + public AsyncTask_Reader(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { + this.context = context; + this.task_id = task_id; + this.listener = listener; + } + + //public abstract void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener); + + //Activity meldet sich zurueck nach OrientationChange + public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { + this.context = context; + this.listener = listener; + } + + //Activity meldet sich ab + public void detach() { + if (context != null) { + context = null; + } + + if (listener != null) { + listener = null; + } + } + + @Override + protected void onPostExecute(Object ex) { + for (OnAsyncTaskCompletedListener listenerInstance : listener) { + if(listenerInstance != null) + listenerInstance.onAsyncTaskCompleted(task_id, ex); + } + + detach(); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/HttpJsonRequest.java b/src/de/luhmer/owncloudnewsreader/reader/HttpJsonRequest.java index f57bebc3..7675e245 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/HttpJsonRequest.java +++ b/src/de/luhmer/owncloudnewsreader/reader/HttpJsonRequest.java @@ -1,260 +1,253 @@ -package de.luhmer.owncloudnewsreader.reader; - -import java.net.URL; -import java.util.List; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSession; - -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; -import org.json.JSONObject; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import de.luhmer.owncloudnewsreader.SettingsActivity; -import de.luhmer.owncloudnewsreader.helper.SSLHttpClient; - -public class HttpJsonRequest { - //private static final String TAG = "HttpJsonRequest"; - - - @SuppressLint("DefaultLocale") - public static JSONObject PerformJsonRequest(String urlString, List nameValuePairs, String username, String password, Context context) throws Exception - { - if(nameValuePairs != null) - { - urlString += "&" + URLEncodedUtils.format(nameValuePairs, "utf-8"); - /* - JSONObject jObj = new JSONObject(); - - for (NameValuePair nameValuePair : nameValuePairs) { - jObj.put(nameValuePair.getName(), nameValuePair.getValue()); - }*/ - - //request.setEntity(new ByteArrayEntity(jObj.toString().getBytes("UTF8"))); - - //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); - } - - URL url = new URL(urlString); - - // Instantiate an HttpClient - //HttpClient httpclient = new DefaultHttpClient(p); - DefaultHttpClient httpClient = null; - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - if(sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false) && url.getProtocol().toLowerCase().equals("https")) - httpClient = new SSLHttpClient(context); - else - httpClient = new DefaultHttpClient(); - - if(username != null && password != null) - httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials(username,password)); - - //HttpGet request = new HttpGet(url); - //HttpPost request = new HttpPost(url); - //httpClient.setParams(params) - - /* - HttpParams params = new BasicHttpParams(); - for (NameValuePair nameValuePair : nameValuePairs) { - params.setIntParameter(nameValuePair.getName(), Integer.parseInt(nameValuePair.getValue())); - } - - httpClient.setParams(params);*/ - - // Instantiate a GET HTTP method - HttpGet request = new HttpGet(url.toString()); - - ResponseHandler responseHandler = new BasicResponseHandler(); - String responseBody = httpClient.execute(request, responseHandler); - JSONObject json = new JSONObject(responseBody); - return json; - //HttpResponse response = httpClient.execute(request); - //return null; - - // Log.i(getClass().getSimpleName(), "send task - end"); - - - /* - URLConnection conn = null; - InputStream inputStream = null; - URL urlInstance = new URL(url); - conn = urlInstance.openConnection(); - HttpURLConnection httpConn = (HttpURLConnection) conn; - httpConn.setRequestMethod("GET"); - httpConn.connect(); - if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) { - inputStream = httpConn.getInputStream(); - - BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); - StringBuilder total = new StringBuilder(); - String line; - while ((line = r.readLine()) != null) { - total.append(line); - } - - return new JSONObject(total.toString()); - } - else - Log.d(TAG, "Response Code: " + httpConn.getResponseCode()); - */ - } - - /* - public static int performTagChangeRequest(String url) - { - try - { - URLConnection conn = null; - //InputStream inputStream = null; - URL urlInstance = new URL(url); - conn = urlInstance.openConnection(); - HttpURLConnection httpConn = (HttpURLConnection) conn; - httpConn.setRequestMethod("GET"); - httpConn.connect(); - return httpConn.getResponseCode(); - } - catch(Exception ex) - { - ex.printStackTrace(); - } - return -1; - } - */ - - - @SuppressLint("DefaultLocale") - public static int performTagChangeRequest(String urlString, String username, String password, Context context, String content) throws Exception - { - //url = "http://192.168.10.126/owncloud/ocs/v1.php/apps/news/items/3787/read"; -/* - String authString = username + ":" + password; - String authStringEnc = Base64.encode(authString.getBytes()); - - URL urlConn = new URL(url); - - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - - HttpURLConnection httpConnection = null; - if (urlConn.getProtocol().toLowerCase().equals("https") && sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false)) { - trustAllHosts(); - HttpsURLConnection https = (HttpsURLConnection) urlConn.openConnection(); - https.setHostnameVerifier(DO_NOT_VERIFY); - httpConnection = https; - } else { - httpConnection = (HttpURLConnection) urlConn.openConnection(); - } - - httpConnection.setRequestProperty("Authorization", "Basic " + authStringEnc); - httpConnection.setRequestMethod("PUT"); - - if(nameValuePairs != null) - { - httpConnection.setEntity(new UrlEncodedFormEntity(nameValuePairs)); - } - - InputStreamReader in = new InputStreamReader((InputStream) httpConnection.getContent()); - BufferedReader buff = new BufferedReader(in); - String text = ""; - String line; - do { - line = buff.readLine(); - if(line != null) - text += line + "\n"; - } while (line != null); - Log.d(TAG, text); - - - return httpConnection.getResponseCode(); - */ - - - URL url = new URL(urlString); - DefaultHttpClient httpClient; - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - if(sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false) && url.getProtocol().toLowerCase().equals("https")) - httpClient = new SSLHttpClient(context); - else - httpClient = new DefaultHttpClient(); - - if(username != null && password != null) - httpClient.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials(username,password)); - - /* - HttpParams params = new BasicHttpParams(); - if(nameValuePairs != null) - for (NameValuePair nameValuePair : nameValuePairs) - params.setParameter(nameValuePair.getName(), nameValuePair.getValue()); - httpClient.setParams(params); - */ - - HttpPut request = new HttpPut(url.toString()); - //if(nameValuePairs != null) - // request.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); - request.setEntity(new StringEntity(content)); - request.addHeader("Accept", "application/json"); - - - HttpResponse response = httpClient.execute(request); - //ResponseHandler responseHandler = new BasicResponseHandler(); - //String responseBody = httpClient.execute(request, responseHandler); - - //Thread.sleep(5000); - - return response.getStatusLine().getStatusCode(); - //return 200; - } - - - - - // always verify the host - dont check for certificate - final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - return true; - } - }; - - /** - * Trust every server - dont check for any certificate - */ - /* - private static void trustAllHosts() { - // Create a trust manager that does not validate certificate chains - TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[] {}; - } - - public void checkClientTrusted(X509Certificate[] chain, - String authType) throws CertificateException { - } - - public void checkServerTrusted(X509Certificate[] chain, - String authType) throws CertificateException { - } - } }; - - // Install the all-trusting trust manager - try { - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - HttpsURLConnection - .setDefaultSSLSocketFactory(sc.getSocketFactory()); - } catch (Exception e) { - e.printStackTrace(); - } - }*/ -} +package de.luhmer.owncloudnewsreader.reader; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSession; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.DefaultHttpClient; +import org.json.JSONObject; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.helper.SSLHttpClient; +import de.luhmer.owncloudnewsreader.util.Base64; + +public class HttpJsonRequest { + //private static final String TAG = "HttpJsonRequest"; + + public static InputStream PerformJsonRequest(String urlString, List nameValuePairs, final String username, final String password, Context context) throws Exception + { + if(nameValuePairs != null) + urlString += "&" + URLEncodedUtils.format(nameValuePairs, "utf-8"); + + URL url = new URL(urlString); + + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + + + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + /* + if(sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false) && url.getProtocol().toLowerCase().equals("https")) + httpClient = new SSLHttpClient(context); + else + httpClient = new DefaultHttpClient(); + */ + + //urlConnection.setDefaultSSLSocketFactory(new MySSLSocketFactory()); getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials(username,password)); + + if(username != null && password != null) + urlConnection.setRequestProperty("Authorization", "Basic " + Base64.encode((username + ":" + password).getBytes())); + /* + Authenticator.setDefault(new Authenticator(){ + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password.toCharArray()); + }});*/ + + urlConnection.setDoOutput(false); + urlConnection.setDoInput(true); + urlConnection.setRequestMethod("GET"); + //urlConnection.setFollowRedirects(true); + urlConnection.setUseCaches(false); + urlConnection.setConnectTimeout(10000); + urlConnection.setReadTimeout(120000);//2min + urlConnection.setRequestProperty("Content-Type","application/json"); + + //urlConnection.setRequestProperty("Host", "de.luhmer.ownCloudNewsReader"); + urlConnection.connect(); + + int HttpResult = urlConnection.getResponseCode(); + if(HttpResult == HttpURLConnection.HTTP_OK) { + return urlConnection.getInputStream(); + } else { + throw new Exception(urlConnection.getResponseMessage()); + } + } + + + @SuppressLint("DefaultLocale") + public static JSONObject PerformJsonRequest_old(String urlString, List nameValuePairs, String username, String password, Context context) throws Exception + { + if(nameValuePairs != null) + urlString += "&" + URLEncodedUtils.format(nameValuePairs, "utf-8"); + + URL url = new URL(urlString); + + // Instantiate an HttpClient + //HttpClient httpclient = new DefaultHttpClient(p); + DefaultHttpClient httpClient = null; + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + if(sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false) && url.getProtocol().toLowerCase().equals("https")) + httpClient = new SSLHttpClient(context); + else + httpClient = new DefaultHttpClient(); + + if(username != null && password != null) + httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials(username,password)); + + //HttpGet request = new HttpGet(url); + //HttpPost request = new HttpPost(url); + //httpClient.setParams(params) + + /* + HttpParams params = new BasicHttpParams(); + for (NameValuePair nameValuePair : nameValuePairs) { + params.setIntParameter(nameValuePair.getName(), Integer.parseInt(nameValuePair.getValue())); + } + + httpClient.setParams(params);*/ + + // Instantiate a GET HTTP method + HttpGet request = new HttpGet(url.toString()); + + ResponseHandler responseHandler = new BasicResponseHandler(); + String responseBody = httpClient.execute(request, responseHandler); + JSONObject json = new JSONObject(responseBody); + return json; + //HttpResponse response = httpClient.execute(request); + //return null; + + // Log.i(getClass().getSimpleName(), "send task - end"); + } + + + + @SuppressLint("DefaultLocale") + public static int performTagChangeRequest(String urlString, String username, String password, Context context, String content) throws Exception + { + //url = "http://192.168.10.126/owncloud/ocs/v1.php/apps/news/items/3787/read"; +/* + String authString = username + ":" + password; + String authStringEnc = Base64.encode(authString.getBytes()); + + URL urlConn = new URL(url); + + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + + HttpURLConnection httpConnection = null; + if (urlConn.getProtocol().toLowerCase().equals("https") && sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false)) { + trustAllHosts(); + HttpsURLConnection https = (HttpsURLConnection) urlConn.openConnection(); + https.setHostnameVerifier(DO_NOT_VERIFY); + httpConnection = https; + } else { + httpConnection = (HttpURLConnection) urlConn.openConnection(); + } + + httpConnection.setRequestProperty("Authorization", "Basic " + authStringEnc); + httpConnection.setRequestMethod("PUT"); + + if(nameValuePairs != null) + { + httpConnection.setEntity(new UrlEncodedFormEntity(nameValuePairs)); + } + + InputStreamReader in = new InputStreamReader((InputStream) httpConnection.getContent()); + BufferedReader buff = new BufferedReader(in); + String text = ""; + String line; + do { + line = buff.readLine(); + if(line != null) + text += line + "\n"; + } while (line != null); + Log.d(TAG, text); + + + return httpConnection.getResponseCode(); + */ + + + URL url = new URL(urlString); + DefaultHttpClient httpClient; + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + if(sp.getBoolean(SettingsActivity.CB_ALLOWALLSSLCERTIFICATES_STRING, false) && url.getProtocol().toLowerCase().equals("https")) + httpClient = new SSLHttpClient(context); + else + httpClient = new DefaultHttpClient(); + + if(username != null && password != null) + httpClient.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials(username,password)); + + /* + HttpParams params = new BasicHttpParams(); + if(nameValuePairs != null) + for (NameValuePair nameValuePair : nameValuePairs) + params.setParameter(nameValuePair.getName(), nameValuePair.getValue()); + httpClient.setParams(params); + */ + + HttpPut request = new HttpPut(url.toString()); + //if(nameValuePairs != null) + // request.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); + request.setEntity(new StringEntity(content)); + request.addHeader("Accept", "application/json"); + + + HttpResponse response = httpClient.execute(request); + //ResponseHandler responseHandler = new BasicResponseHandler(); + //String responseBody = httpClient.execute(request, responseHandler); + + //Thread.sleep(5000); + + return response.getStatusLine().getStatusCode(); + //return 200; + } + + + + + // always verify the host - dont check for certificate + final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + + /** + * Trust every server - dont check for any certificate + */ + /* + private static void trustAllHosts() { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[] {}; + } + + public void checkClientTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + } }; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection + .setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + } + }*/ +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/IReader.java b/src/de/luhmer/owncloudnewsreader/reader/IReader.java index ef6bd1c2..40a31a9d 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/IReader.java +++ b/src/de/luhmer/owncloudnewsreader/reader/IReader.java @@ -1,25 +1,24 @@ -package de.luhmer.owncloudnewsreader.reader; - -import java.util.List; - -import android.app.Activity; -import android.content.Context; -import android.util.SparseArray; - -public interface IReader { - public boolean isSyncRunning(); - public void setSyncRunning(boolean status); - - public SparseArray getRunningAsyncTasks(); - public void attachToRunningTask(int task_id, Activity activity, OnAsyncTaskCompletedListener listener); - - public void Start_AsyncTask_GetItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener, FeedItemTags.TAGS tag); - public void Start_AsyncTask_GetOldItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener, String feed_id, String folder_id); - - public void Start_AsyncTask_GetFolder(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); - public void Start_AsyncTask_GetFeeds(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); - public void Start_AsyncTask_PerformTagAction(final int task_id, final Context context, final OnAsyncTaskCompletedListener listener, List itemIds, FeedItemTags.TAGS tag); - public void Start_AsyncTask_Authenticate(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); - - public abstract void onAsyncTaskCompleted(final int task_id, final Object task_result); -} +package de.luhmer.owncloudnewsreader.reader; + +import java.util.List; + +import android.app.Activity; +import android.util.SparseArray; + +public interface IReader { + public boolean isSyncRunning(); + public void setSyncRunning(boolean status); + + public SparseArray getRunningAsyncTasks(); + public void attachToRunningTask(int task_id, Activity activity, OnAsyncTaskCompletedListener listener); + + public void Start_AsyncTask_GetItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener, FeedItemTags.TAGS tag); + public void Start_AsyncTask_GetOldItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener, String feed_id, String folder_id); + + public void Start_AsyncTask_GetFolder(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); + public void Start_AsyncTask_GetFeeds(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); + public void Start_AsyncTask_PerformTagAction(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener, List itemIds, FeedItemTags.TAGS tag); + public void Start_AsyncTask_Authenticate(final int task_id, final Activity context, final OnAsyncTaskCompletedListener listener); + + public abstract void onAsyncTaskCompleted(final int task_id, final Object task_result); +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/InsertIntoDatabase.java b/src/de/luhmer/owncloudnewsreader/reader/InsertIntoDatabase.java index caa01131..82a7831e 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/InsertIntoDatabase.java +++ b/src/de/luhmer/owncloudnewsreader/reader/InsertIntoDatabase.java @@ -1,182 +1,181 @@ -package de.luhmer.owncloudnewsreader.reader; - -import java.util.ArrayList; -import java.util.List; - -import android.app.Activity; -import android.util.Log; -import de.luhmer.owncloudnewsreader.data.ConcreteSubscribtionItem; -import de.luhmer.owncloudnewsreader.data.RssFile; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; - -/** - * Created by David on 24.05.13. - */ -public class InsertIntoDatabase { - private static final String TAG = "InsertIntoDatabase"; - - public static void InsertFoldersIntoDatabase(List tags, Activity activity) - { - DatabaseConnection dbConn = new DatabaseConnection(activity); - - - //List tags = (List) task_result; - List tagsAvailable = dbConn.convertCursorToStringArray(dbConn.getAllTopSubscriptions(false), 1); - - //dbConn.getDatabase().beginTransaction(); - try - { - if(tags != null) - { - List tagsToAdd = new ArrayList(); - for(String[] t : tags) - { - String label = t[0]; - String label_path = t[1]; - if(!tagsAvailable.contains(label)) - { - tagsToAdd.add(label); - dbConn.insertNewFolder(label, label_path); - } - } - - List tagsToRemove = new ArrayList(); - - - List newLabelList = new ArrayList(); - for(String[] subTag : tags) - newLabelList.add(subTag[0]); - - for(String tag : tagsAvailable) - { - if(!newLabelList.contains(tag)) - { - tagsToRemove.add(tag); - int result = dbConn.removeFolderByFolderLabel(tag); - Log.d(TAG, "Result delete: " + result); - } - } - - Log.d("ADD", ""+ tagsToAdd.size()); - Log.d("REMOVE", ""+ tagsToRemove.size()); - } - //dbConn.getDatabase().setTransactionSuccessful(); - } finally { - //dbConn.getDatabase().endTransaction(); - } - - - dbConn.closeDatabase(); - } - - public static void InsertSubscriptionsIntoDatabase(ArrayList tags, Activity activity) - { - DatabaseConnection dbConn = new DatabaseConnection(activity); - - List tagsAvailable = dbConn.convertCursorToStringArray(dbConn.getAllSubSubscriptions(), 1); - - //dbConn.getDatabase().beginTransaction(); - try - { - if(tags != null) - { - for(ConcreteSubscribtionItem tag : tags) - { - if(!tagsAvailable.contains(tag.header)) - { - String folderID_db = dbConn.getIdOfFolderByLabelPath(String.valueOf(tag.folder_id)); - dbConn.insertNewFeed(tag.header, folderID_db, tag.subscription_id, tag.favIcon); - } else { - String folderID_db = dbConn.getIdOfFolderByLabelPath(String.valueOf(tag.folder_id)); - int result = dbConn.updateFeed(tag.header, folderID_db, tag.subscription_id, tag.favIcon); - Log.d(TAG, "Affected Rows: " + result); - } - } - - //tags.clear(); - - for(String tag : tagsAvailable) - { - boolean found = false; - for(int i = 0; i < tags.size(); i++) - { - if(tags.get(i).header.contains(tag)) - { - found = true; - break; - } - } - if(!found) - { - int result = dbConn.removeTopSubscriptionItemByTag(tag); - Log.d(TAG, "Remove Subscription: " + result); - } - } - - //lvAdapter.notifyDataSetChanged(); - - //lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), dbConn); - } - //dbConn.getDatabase().setTransactionSuccessful(); - } finally { - //dbConn.getDatabase().endTransaction(); - } - dbConn.closeDatabase(); - } - - - public static void InsertFeedItemsIntoDatabase(List files, Activity activity) - { - DatabaseConnection dbConn = new DatabaseConnection(activity); - - //dbConn.getDatabase().beginTransaction(); - try - { - if(files != null) - { - for (RssFile rssFile : files) - InsertSingleFeedItemIntoDatabase(rssFile, dbConn); - } - //dbConn.getDatabase().setTransactionSuccessful(); - } finally { - //dbConn.getDatabase().endTransaction(); - } - - dbConn.closeDatabase(); - } - - public static void InsertSingleFeedItemIntoDatabase(RssFile rssFile, DatabaseConnection dbConn) - { - if(rssFile != null) - { - Boolean isFeedAlreadyInDatabase = dbConn.doesRssItemAlreadyExsists(rssFile.getItem_Id()); - - if(isFeedAlreadyInDatabase) - { - int result = dbConn.removeItemByItemId(rssFile.getItem_Id()); - Log.d(TAG, "Delete Item: " + result); - } - - String FeedId_Db = dbConn.getRowIdBySubscriptionID(String.valueOf(rssFile.getFeedID())); - //String IdSubscription = dbConn.getIdSubscriptionByStreamID(rssFile.getFeedID()); - if(FeedId_Db != null) - { - rssFile.setFeedID_Db(FeedId_Db); - //if(!dbConn.doesRssItemAlreadyExsists(rssFile.getFeedID())) - dbConn.insertNewItem(rssFile.getTitle(), - rssFile.getLink(), - rssFile.getDescription(), - rssFile.getRead(), - String.valueOf(rssFile.getFeedID_Db()), - rssFile.getItem_Id(), - rssFile.getDate(), - rssFile.getStarred(), - rssFile.getGuid(), - rssFile.getGuidHash(), - rssFile.getLastModified()); - - dbConn.clearDatabaseOverSize(); - } - } - } -} +package de.luhmer.owncloudnewsreader.reader; + +import java.util.ArrayList; +import java.util.List; + +import android.app.Activity; +import android.util.Log; +import de.luhmer.owncloudnewsreader.data.ConcreteFeedItem; +import de.luhmer.owncloudnewsreader.data.RssFile; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; + +/** + * Created by David on 24.05.13. + */ +public class InsertIntoDatabase { + private static final String TAG = "InsertIntoDatabase"; + + public static void InsertFoldersIntoDatabase(List tags, DatabaseConnection dbConn) + { + //DatabaseConnection dbConn = new DatabaseConnection(activity); + + //List tags = (List) task_result; + List tagsAvailable = dbConn.convertCursorToStringArray(dbConn.getAllTopSubscriptions(false), 1); + + //dbConn.getDatabase().beginTransaction(); + try + { + if(tags != null) + { + List tagsToAdd = new ArrayList(); + for(String[] t : tags) + { + String label = t[0]; + String label_path = t[1]; + if(!tagsAvailable.contains(label)) + { + tagsToAdd.add(label); + dbConn.insertNewFolder(label, label_path); + } + } + + List tagsToRemove = new ArrayList(); + + + List newLabelList = new ArrayList(); + for(String[] subTag : tags) + newLabelList.add(subTag[0]); + + for(String tag : tagsAvailable) + { + if(!newLabelList.contains(tag)) + { + tagsToRemove.add(tag); + int result = dbConn.removeFolderByFolderLabel(tag); + Log.d(TAG, "Result delete: " + result); + } + } + + Log.d("ADD", ""+ tagsToAdd.size()); + Log.d("REMOVE", ""+ tagsToRemove.size()); + } + //dbConn.getDatabase().setTransactionSuccessful(); + } finally { + //dbConn.getDatabase().endTransaction(); + } + + + //dbConn.closeDatabase(); + } + + public static void InsertSubscriptionsIntoDatabase(ArrayList tags, DatabaseConnection dbConn) + { + //DatabaseConnection dbConn = new DatabaseConnection(activity); + + List tagsAvailable = dbConn.convertCursorToStringArray(dbConn.getAllSubSubscriptions(), 1); + + //dbConn.getDatabase().beginTransaction(); + try + { + if(tags != null) + { + for(ConcreteFeedItem tag : tags) + { + if(!tagsAvailable.contains(tag.header)) + { + String folderID_db = dbConn.getIdOfFolderByLabelPath(String.valueOf(tag.folder_id)); + dbConn.insertNewFeed(tag.header, folderID_db, tag.subscription_id, tag.favIcon); + } else { + String folderID_db = dbConn.getIdOfFolderByLabelPath(String.valueOf(tag.folder_id)); + int result = dbConn.updateFeed(tag.header, folderID_db, tag.subscription_id, tag.favIcon); + Log.d(TAG, "Affected Rows: " + result); + } + } + + //tags.clear(); + + for(String tag : tagsAvailable) + { + boolean found = false; + for(int i = 0; i < tags.size(); i++) + { + if(tags.get(i).header.contains(tag)) + { + found = true; + break; + } + } + if(!found) + { + int result = dbConn.removeTopSubscriptionItemByTag(tag); + Log.d(TAG, "Remove Subscription: " + result); + } + } + + //lvAdapter.notifyDataSetChanged(); + + //lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), dbConn); + } + //dbConn.getDatabase().setTransactionSuccessful(); + } finally { + //dbConn.getDatabase().endTransaction(); + } + //dbConn.closeDatabase(); + } + + + public static void InsertFeedItemsIntoDatabase(List files, Activity activity) + { + DatabaseConnection dbConn = new DatabaseConnection(activity); + + //dbConn.getDatabase().beginTransaction(); + try + { + if(files != null) + { + for (RssFile rssFile : files) + InsertSingleFeedItemIntoDatabase(rssFile, dbConn); + } + //dbConn.getDatabase().setTransactionSuccessful(); + } finally { + //dbConn.getDatabase().endTransaction(); + } + + dbConn.closeDatabase(); + } + + public static void InsertSingleFeedItemIntoDatabase(RssFile rssFile, DatabaseConnection dbConn) + { + if(rssFile != null) + { + Boolean isFeedAlreadyInDatabase = dbConn.doesRssItemAlreadyExsists(rssFile.getItem_Id()); + + if(isFeedAlreadyInDatabase) + { + int result = dbConn.removeItemByItemId(rssFile.getItem_Id()); + Log.d(TAG, "Delete Item: " + result); + } + + String FeedId_Db = dbConn.getRowIdBySubscriptionID(String.valueOf(rssFile.getFeedID())); + //String IdSubscription = dbConn.getIdSubscriptionByStreamID(rssFile.getFeedID()); + if(FeedId_Db != null) + { + rssFile.setFeedID_Db(FeedId_Db); + //if(!dbConn.doesRssItemAlreadyExsists(rssFile.getFeedID())) + dbConn.insertNewItem(rssFile.getTitle(), + rssFile.getLink(), + rssFile.getDescription(), + rssFile.getRead(), + String.valueOf(rssFile.getFeedID_Db()), + rssFile.getItem_Id(), + rssFile.getDate(), + rssFile.getStarred(), + rssFile.getGuid(), + rssFile.getGuidHash(), + rssFile.getLastModified()); + + dbConn.clearDatabaseOverSize(); + } + } + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/API.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/API.java new file mode 100644 index 00000000..4ae8cb6b --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/API.java @@ -0,0 +1,58 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.List; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; + +public abstract class API { + protected SharedPreferences mPrefs; + + public API(Activity act) { + mPrefs = PreferenceManager.getDefaultSharedPreferences(act); + } + + protected abstract String getItemUrl(); + protected abstract String getItemUpdatedUrl(); + protected abstract String getFeedUrl(); + protected abstract String getFolderUrl(); + + protected abstract String getTagBaseUrl(); + + //public abstract void markSingleItemAsReadApiv1(); + + public String getUsername() { + return mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); + } + + public String getPassword() { + return mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); + } + + public int GetFeeds(Activity act, API api) throws Exception { + return OwnCloudReaderMethods.GetFeeds(act, api); + } + + public int GetFolderTags(Activity act, API api) throws Exception { + return OwnCloudReaderMethods.GetFolderTags(act, api); + } + + public int GetItems(TAGS tag, Activity act, String offset, boolean getRead, String id, String type, API api) throws Exception { + return OwnCloudReaderMethods.GetItems(tag, act, offset, getRead, id, type, api); + } + + public int GetUpdatedItems(TAGS tag, Activity act, long lastSync, API api) throws Exception { + return OwnCloudReaderMethods.GetUpdatedItems(tag, act, lastSync, api); + } + + public abstract boolean PerformTagExecution(List itemIds, FeedItemTags.TAGS tag, Context context, API api); + /* + public boolean PerformTagExecution(List itemIds, FeedItemTags.TAGS tag, Context context, API api) { + return OwnCloudReaderMethods.PerformTagExecution(itemIds, tag, context, api); + }*/ +} \ No newline at end of file diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetApiVersion.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetApiVersion.java new file mode 100644 index 00000000..086309ea --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetApiVersion.java @@ -0,0 +1,33 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; + +public class AsyncTask_GetApiVersion extends AsyncTask_Reader { + + private String username; + private String password; + + public AsyncTask_GetApiVersion(final int task_id, final Activity context, String username, String password, final OnAsyncTaskCompletedListener[] listener) { + super(task_id, context, listener); + + this.username = username; + this.password = password; + } + + @Override + protected Object doInBackground(Object... params) { + try { + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); + String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); + return OwnCloudReaderMethods.GetVersionNumber(context, username, password, oc_root_path); + } catch (Exception ex) { + return ex; + } + } +} + diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFeeds.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFeeds.java index 0e8405ed..0db99e75 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFeeds.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFeeds.java @@ -1,60 +1,26 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import android.app.Activity; -import android.os.AsyncTask; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; - -public class AsyncTask_GetFeeds extends AsyncTask implements AsyncTask_Reader { - - private Activity context; - private int task_id; - private OnAsyncTaskCompletedListener[] listener; - - public AsyncTask_GetFeeds(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { - super(); - - this.context = context; - this.task_id = task_id; - this.listener = listener; - } - - //Activity meldet sich zurueck nach OrientationChange - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { - this.context = context; - this.listener = listener; - } - - //Activity meldet sich ab - public void detach() { - if (context != null) { - context = null; - } - - if (listener != null) { - listener = null; - } - } - - - @Override - protected Exception doInBackground(Object... params) { - try { - InsertIntoDatabase.InsertSubscriptionsIntoDatabase(OwnCloudReaderMethods.GetSubscriptionTags(context), context); - } catch (Exception ex) { - return ex; - } - return null; - } - - @Override - protected void onPostExecute(Exception ex) { - for (OnAsyncTaskCompletedListener listenerInstance : listener) { - if(listenerInstance != null) - listenerInstance.onAsyncTaskCompleted(task_id, ex); - } - - detach(); - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import android.app.Activity; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; + +public class AsyncTask_GetFeeds extends AsyncTask_Reader { + + public AsyncTask_GetFeeds(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { + super(task_id, context, listener); + } + + @Override + protected Exception doInBackground(Object... params) { + API api = new APIv2(context); + + try { + api.GetFeeds(context, api); + //OwnCloudReaderMethods.GetFeeds(context, api); + } catch (Exception ex) { + return ex; + } + return null; + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFolderTags.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFolderTags.java index b3af5388..94b22cfb 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFolderTags.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetFolderTags.java @@ -1,65 +1,26 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import android.app.Activity; -import android.os.AsyncTask; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; - -public class AsyncTask_GetFolderTags extends AsyncTask implements AsyncTask_Reader { - - private Activity context; - private int task_id; - private OnAsyncTaskCompletedListener[] listener; - - public AsyncTask_GetFolderTags(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { - super(); - - this.context = context; - this.task_id = task_id; - this.listener = listener; - } - - //Activity meldet sich zurueck nach OrientationChange - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { - this.context = context; - this.listener = listener; - } - - //Activity meldet sich ab - public void detach() { - if (context != null) { - context = null; - } - - if (listener != null) { - listener = null; - } - } - - - @Override - protected Exception doInBackground(Object... params) { - /* - String username = (String) params[0]; - String password = (String) params[1]; - */ - - try { - InsertIntoDatabase.InsertFoldersIntoDatabase(OwnCloudReaderMethods.GetFolderTags(context), context); - } catch(Exception ex) { - return ex; - } - return null; - } - - @Override - protected void onPostExecute(Exception ex) { - for (OnAsyncTaskCompletedListener listenerInstance : listener) { - if(listenerInstance != null) - listenerInstance.onAsyncTaskCompleted(task_id, ex); - } - - detach(); - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import android.app.Activity; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; + +public class AsyncTask_GetFolderTags extends AsyncTask_Reader { + + public AsyncTask_GetFolderTags(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { + super(task_id, context, listener); + } + + @Override + protected Exception doInBackground(Object... params) { + API api = new APIv2(context); + + try { + //OwnCloudReaderMethods.GetFolderTags(context, api); + api.GetFolderTags(context, api); + } catch(Exception ex) { + return ex; + } + return null; + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetItems.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetItems.java index a115ad88..76b922d5 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetItems.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetItems.java @@ -1,204 +1,133 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.AsyncTask; -import android.preference.PreferenceManager; -import de.luhmer.owncloudnewsreader.R; -import de.luhmer.owncloudnewsreader.SettingsActivity; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.helper.NetworkConnection; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; -import de.luhmer.owncloudnewsreader.services.DownloadImagesService; - -public class AsyncTask_GetItems extends AsyncTask implements AsyncTask_Reader { - - private Activity context; - private int task_id; - private OnAsyncTaskCompletedListener[] listener; - private long highestItemIdBeforeSync; - - public AsyncTask_GetItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { - super(); - - this.context = context; - this.task_id = task_id; - this.listener = listener; - } - - //Activity meldet sich zurueck nach OrientationChange - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { - this.context = context; - this.listener = listener; - } - - //Activity meldet sich ab - public void detach() { - if (context != null) { - context = null; - } - - if (listener != null) { - listener = null; - } - } - - @Override - protected Exception doInBackground(Object... params) { - //FeedItemTags.TAGS tag = (TAGS) params[0]; - /* - String username = (String) params[0]; - String password = (String) params[1]; - String _TAG_LABEL = (String) params[2]; - */ - - DatabaseConnection dbConn = new DatabaseConnection(context); - try { - //String authKey = AuthenticationManager.getGoogleAuthKey(username, password); - //SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); - //int maxItemsInDatabase = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_MAX_ITEMS_SYNC, "200")); - - long lastModified = dbConn.getLastModfied(); - - //List files; - long offset = dbConn.getLowestItemId(false); - //int totalCount = 0; - int requestCount = 0; - int maxSyncSize = Integer.parseInt(OwnCloudReaderMethods.maxSizePerSync); - - highestItemIdBeforeSync = dbConn.getHighestItemId(); - - if(lastModified == 0) - { - //init startup - do { - requestCount = OwnCloudReaderMethods.GetItems(TAGS.ALL, context, String.valueOf(offset), false, "0", "3"); - if(requestCount > 0) - offset = dbConn.getLowestItemId(false); - //totalCount += requestCount; - } while(requestCount == maxSyncSize /*&& totalCount < maxItemsInDatabase*/); - - do { - offset = dbConn.getLowestItemId(true); - requestCount = OwnCloudReaderMethods.GetItems(TAGS.ALL_STARRED, context, String.valueOf(offset), true, "0", "2"); - if(requestCount > 0) - offset = dbConn.getLowestItemId(true); - } while(requestCount == maxSyncSize); - } - else - { - //OwnCloudReaderMethods.GetUpdatedItems(tag, context, lastModified, true); - OwnCloudReaderMethods.GetUpdatedItems(TAGS.ALL, context, lastModified); - //OwnCloudReaderMethods.GetUpdatedItems(TAGS.ALL_STARRED, context, lastModified); - } - - /* - //Get all unread items which are older then the latest item id in db - do { - requestCount = OwnCloudReaderMethods.GetItems(tag, context, String.valueOf(offset), false); - //InsertIntoDatabase.InsertFeedItemsIntoDatabase(files, context); - - if(requestCount > 0) - offset = dbConn.getLowestItemId(); - - totalCount += requestCount; - } while(requestCount == maxSyncSize && totalCount < maxItemsInDatabase); - - - if(lastModified == 0 && totalCount < maxItemsInDatabase)//If the app should sync all the items in past. - { - do { - requestCount = OwnCloudReaderMethods.GetItems(tag, context, String.valueOf(offset), true); - //InsertIntoDatabase.InsertFeedItemsIntoDatabase(files, context); - - if(requestCount > 0) - offset = dbConn.getLowestItemId(); - - totalCount += requestCount; - } while(requestCount == maxSyncSize && totalCount < maxItemsInDatabase); - } - else if(lastModified != 0) - { - OwnCloudReaderMethods.GetUpdatedItems(tag, context, lastModified, true); - //InsertIntoDatabase.InsertFeedItemsIntoDatabase(files, context); - } - - if(dbConn.getCountOfAllItems(true) > maxItemsInDatabase && !tag.equals(FeedItemTags.TAGS.ALL_STARRED))//Remove all old items which are over the limit of maxItemsInDatabase - { - String id_db = String.valueOf(dbConn.getItemDbIdAtPosition(maxItemsInDatabase)); - dbConn.removeAllItemsWithIdLowerThan(id_db); - }*/ - } catch (Exception ex) { - return ex; - } finally { - dbConn.closeDatabase(); - } - return null; - } - - @Override - protected void onPostExecute(Exception ex) { - for (OnAsyncTaskCompletedListener listenerInstance : listener) { - if(listenerInstance != null) - listenerInstance.onAsyncTaskCompleted(task_id, ex); - } - /* - if(task_id == 3)//All Starred Item request was performed - { - Intent service = new Intent(context, DownloadImagesService.class); - context.startService(service); - }*/ - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); - if(mPrefs.getBoolean(SettingsActivity.CB_CACHE_IMAGES_OFFLINE_STRING, false)) - { - if(!NetworkConnection.isWLANConnected(context) && NetworkConnection.isNetworkAvailable(context)) - ShowDownloadImageWithoutWifiQuestion(); - else if(NetworkConnection.isNetworkAvailable(context)) - StartDownloadingImages(); - } - - - detach(); - } - - private void StartDownloadingImages() - { - DatabaseConnection dbConn = new DatabaseConnection(context); - try { - Intent service = new Intent(context, DownloadImagesService.class); - service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemIdBeforeSync); - context.startService(service); - } finally { - dbConn.closeDatabase(); - } - } - - - private void ShowDownloadImageWithoutWifiQuestion() - { - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); - - // set title - alertDialogBuilder.setTitle(context.getString(R.string.no_wifi_available)); - - // set dialog message - alertDialogBuilder - .setMessage(context.getString(R.string.do_you_want_to_download_without_wifi)) - .setCancelable(true) - .setPositiveButton("Yes",new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - StartDownloadingImages(); - } - }); - - AlertDialog alertDialog = alertDialogBuilder.create(); - - alertDialog.show(); - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import de.luhmer.owncloudnewsreader.Constants; +import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.helper.NetworkConnection; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; +import de.luhmer.owncloudnewsreader.services.DownloadImagesService; + +public class AsyncTask_GetItems extends AsyncTask_Reader { + private long highestItemIdBeforeSync; + + public AsyncTask_GetItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { + super(task_id, context, listener); + } + + @Override + protected Exception doInBackground(Object... params) { + DatabaseConnection dbConn = new DatabaseConnection(context); + try { + //String authKey = AuthenticationManager.getGoogleAuthKey(username, password); + //SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); + //int maxItemsInDatabase = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_MAX_ITEMS_SYNC, "200")); + + long lastModified = dbConn.getLastModfied(); + + //List files; + long offset = dbConn.getLowestItemId(false); + int totalCount = 0; + int requestCount = 0; + int maxSyncSize = Integer.parseInt(OwnCloudReaderMethods.maxSizePerSync); + int maxItemsInDatabase = Constants.maxItemsCount; + + highestItemIdBeforeSync = dbConn.getHighestItemId(); + + API api = new APIv2(context); + + if(lastModified == 0) + { + do { + requestCount = api.GetItems(TAGS.ALL, context, String.valueOf(offset), false, "0", "3", api); + if(requestCount > 0) + offset = dbConn.getLowestItemId(false); + totalCount += requestCount; + } while(requestCount == maxSyncSize /* && totalCount < maxItemsInDatabase */); + + do { + offset = dbConn.getLowestItemId(true); + requestCount = api.GetItems(TAGS.ALL_STARRED, context, String.valueOf(offset), true, "0", "2", api); + if(requestCount > 0) + offset = dbConn.getLowestItemId(true); + totalCount += requestCount; + } while(requestCount == maxSyncSize && totalCount < maxItemsInDatabase); + } + else + { + api.GetUpdatedItems(TAGS.ALL, context, lastModified, api); + //OwnCloudReaderMethods.GetUpdatedItems(TAGS.ALL, context, lastModified, api); + + } + } catch (Exception ex) { + return ex; + } finally { + dbConn.closeDatabase(); + } + return null; + } + + @Override + protected void onPostExecute(Object ex) { + for (OnAsyncTaskCompletedListener listenerInstance : listener) { + if(listenerInstance != null) + listenerInstance.onAsyncTaskCompleted(task_id, ex); + } + + SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); + if(mPrefs.getBoolean(SettingsActivity.CB_CACHE_IMAGES_OFFLINE_STRING, false)) + { + if(!NetworkConnection.isWLANConnected(context) && NetworkConnection.isNetworkAvailable(context)) + ShowDownloadImageWithoutWifiQuestion(); + else if(NetworkConnection.isNetworkAvailable(context)) + StartDownloadingImages(); + } + + + detach(); + } + + private void StartDownloadingImages() + { + DatabaseConnection dbConn = new DatabaseConnection(context); + try { + Intent service = new Intent(context, DownloadImagesService.class); + service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemIdBeforeSync); + context.startService(service); + } finally { + dbConn.closeDatabase(); + } + } + + + private void ShowDownloadImageWithoutWifiQuestion() + { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); + + // set title + alertDialogBuilder.setTitle(context.getString(R.string.no_wifi_available)); + + // set dialog message + alertDialogBuilder + .setMessage(context.getString(R.string.do_you_want_to_download_without_wifi)) + .setCancelable(true) + .setPositiveButton("Yes",new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + StartDownloadingImages(); + } + }); + + AlertDialog alertDialog = alertDialogBuilder.create(); + + alertDialog.show(); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetOldItems.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetOldItems.java index ea007cc6..a2791979 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetOldItems.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_GetOldItems.java @@ -1,125 +1,103 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import android.app.Activity; -import android.os.AsyncTask; -import android.widget.Toast; -import de.luhmer.owncloudnewsreader.R; -import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; - -public class AsyncTask_GetOldItems extends AsyncTask implements AsyncTask_Reader { - - private Activity context; - private int task_id; - private OnAsyncTaskCompletedListener[] listener; - public String feed_id; - public String folder_id; - private int downloadedItemsCount = 0; - - public AsyncTask_GetOldItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener, String feed_id, String folder_id) { - super(); - - this.context = context; - this.task_id = task_id; - this.listener = listener; - this.feed_id = feed_id; - this.folder_id = folder_id; - } - - //Activity meldet sich zurueck nach OrientationChange - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { - this.context = context; - this.listener = listener; - } - - //Activity meldet sich ab - public void detach() { - if (context != null) { - context = null; - } - - if (listener != null) { - listener = null; - } - } - - @Override - protected Exception doInBackground(Object... params) { - DatabaseConnection dbConn = new DatabaseConnection(context); - try { - long offset = 0; - //int requestCount = 0; - //int maxSyncSize = Integer.parseInt(OwnCloudReaderMethods.maxSizePerSync); - String id = null; - String type = null; - - if(feed_id != null) - { - offset = dbConn.getLowestItemIdByFeed(feed_id); - id = dbConn.getSubscriptionIdByRowID(feed_id); - type = "0"; - } - else if(folder_id != null) - { - if(folder_id.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) - { - offset = dbConn.getLowestItemIdStarred(); - id = "0"; - type = "2"; - } else { - offset = dbConn.getLowestItemIdByFolder(folder_id); - id = dbConn.getIdOfFolderByLabelPath(folder_id); - type = "1"; - } - } - - - downloadedItemsCount = OwnCloudReaderMethods.GetItems(TAGS.ALL, context, String.valueOf(offset), true, id, type); - - - //do { - //requestCount = OwnCloudReaderMethods.GetItems(TAGS.ALL, context, String.valueOf(offset), true, feed_id); - // if(requestCount > 0) - // offset = dbConn.getLowestItemIdByFeed(feed_id); - //} while(requestCount == maxSyncSize); - - } catch (Exception ex) { - return ex; - } finally { - dbConn.closeDatabase(); - } - return null; - } - - @Override - protected void onPostExecute(Exception ex) { - for (OnAsyncTaskCompletedListener listenerInstance : listener) { - if(listenerInstance != null) - listenerInstance.onAsyncTaskCompleted(task_id, ex); - } - - if(downloadedItemsCount == 0) - Toast.makeText(context, context.getString(R.string.toast_no_more_downloads_available), Toast.LENGTH_LONG).show(); - else - { - String text = context.getString(R.string.toast_downloaded_x_items).replace("X", String.valueOf(downloadedItemsCount)); - Toast.makeText(context, text, Toast.LENGTH_LONG).show(); - } - - /* - DatabaseConnection dbConn = new DatabaseConnection(context); - try { - Intent service = new Intent(context, DownloadImagesService.class); - service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemIdBeforeSync); - context.startService(service); - } finally { - dbConn.closeDatabase(); - } - */ - - detach(); - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import android.app.Activity; +import android.widget.Toast; +import de.luhmer.owncloudnewsreader.R; +import de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; + +public class AsyncTask_GetOldItems extends AsyncTask_Reader { + + public String feed_id; + public String folder_id; + private int downloadedItemsCount = 0; + + public AsyncTask_GetOldItems(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener, String feed_id, String folder_id) { + super(task_id, context, listener); + + this.feed_id = feed_id; + this.folder_id = folder_id; + } + + @Override + protected Exception doInBackground(Object... params) { + DatabaseConnection dbConn = new DatabaseConnection(context); + try { + long offset = 0; + //int requestCount = 0; + //int maxSyncSize = Integer.parseInt(OwnCloudReaderMethods.maxSizePerSync); + String id = null; + String type = null; + + if(feed_id != null) + { + offset = dbConn.getLowestItemIdByFeed(feed_id); + id = dbConn.getSubscriptionIdByRowID(feed_id); + type = "0"; + } + else if(folder_id != null) + { + if(folder_id.equals(SubscriptionExpandableListAdapter.ALL_STARRED_ITEMS)) + { + offset = dbConn.getLowestItemIdStarred(); + id = "0"; + type = "2"; + } else { + offset = dbConn.getLowestItemIdByFolder(folder_id); + id = dbConn.getIdOfFolderByLabelPath(folder_id); + type = "1"; + } + } + + API api = new APIv2(context); + downloadedItemsCount = api.GetItems(TAGS.ALL, context, String.valueOf(offset), true, id, type, api); + //downloadedItemsCount = OwnCloudReaderMethods.GetItems(TAGS.ALL, context, String.valueOf(offset), true, id, type, api); + + + //do { + //requestCount = OwnCloudReaderMethods.GetItems(TAGS.ALL, context, String.valueOf(offset), true, feed_id); + // if(requestCount > 0) + // offset = dbConn.getLowestItemIdByFeed(feed_id); + //} while(requestCount == maxSyncSize); + + } catch (Exception ex) { + return ex; + } finally { + dbConn.closeDatabase(); + } + return null; + } + + @Override + protected void onPostExecute(Object ex) { + for (OnAsyncTaskCompletedListener listenerInstance : listener) { + if(listenerInstance != null) + listenerInstance.onAsyncTaskCompleted(task_id, ex); + } + + if(downloadedItemsCount == 0) + Toast.makeText(context, context.getString(R.string.toast_no_more_downloads_available), Toast.LENGTH_LONG).show(); + else + { + String text = context.getString(R.string.toast_downloaded_x_items).replace("X", String.valueOf(downloadedItemsCount)); + Toast.makeText(context, text, Toast.LENGTH_LONG).show(); + } + + /* + DatabaseConnection dbConn = new DatabaseConnection(context); + try { + Intent service = new Intent(context, DownloadImagesService.class); + service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemIdBeforeSync); + context.startService(service); + } finally { + dbConn.closeDatabase(); + } + */ + + detach(); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_PerformTagAction.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_PerformTagAction.java index 79fe91bb..a81ebb6b 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_PerformTagAction.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/AsyncTask_PerformTagAction.java @@ -1,71 +1,47 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import java.util.List; - -import android.app.Activity; -import android.content.Context; -import android.os.AsyncTask; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; - -public class AsyncTask_PerformTagAction extends AsyncTask implements AsyncTask_Reader { - - private Context context; - private int task_id; - private OnAsyncTaskCompletedListener[] listener; - - public AsyncTask_PerformTagAction(final int task_id, final Context context, final OnAsyncTaskCompletedListener[] listener) { - super(); - - this.context = context; - this.task_id = task_id; - this.listener = listener; - } - - //Activity meldet sich zurueck nach OrientationChange - public void attach(final Activity context, final OnAsyncTaskCompletedListener[] listener) { - this.context = context; - this.listener = listener; - } - - //Activity meldet sich ab - public void detach() { - if (context != null) { - context = null; - } - - if (listener != null) { - listener = null; - } - } - - - @SuppressWarnings("unchecked") - @Override - protected Boolean doInBackground(Object... params) { - List itemIds = (List) params[0]; - TAGS tag = (TAGS) params[1]; - - try { - //String authKey = AuthenticationManager.getGoogleAuthKey(username, password); - if(itemIds.size() > 0) - return OwnCloudReaderMethods.PerformTagExecution(itemIds, tag, context); - else - return true; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - @Override - protected void onPostExecute(Boolean values) { - for (OnAsyncTaskCompletedListener listenerInstance : listener) { - if(listenerInstance != null) - listenerInstance.onAsyncTaskCompleted(task_id, values); - } - - detach(); - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.List; + +import android.app.Activity; +import android.os.AsyncTask; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; +import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2; + +public class AsyncTask_PerformTagAction extends AsyncTask_Reader { + + public AsyncTask_PerformTagAction(final int task_id, final Activity context, final OnAsyncTaskCompletedListener[] listener) { + super(task_id, context, listener); + } + + @SuppressWarnings("unchecked") + @Override + protected Boolean doInBackground(Object... params) { + List itemIds = (List) params[0]; + TAGS tag = (TAGS) params[1]; + + try { + //String authKey = AuthenticationManager.getGoogleAuthKey(username, password); + API api = new APIv2(context); + + if(itemIds.size() > 0) + return api.PerformTagExecution(itemIds, tag, context, api); + else + return true; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + protected void onPostExecute(Object values) { + for (OnAsyncTaskCompletedListener listenerInstance : listener) { + if(listenerInstance != null) + listenerInstance.onAsyncTaskCompleted(task_id, values); + } + + detach(); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/GetVersion.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/GetVersion.java new file mode 100644 index 00000000..eb9c8233 --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/GetVersion.java @@ -0,0 +1,21 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import org.json.JSONObject; + +public class GetVersion implements IHandleJsonObject{ + + String version; + + @Override + public void performAction(JSONObject jObj) { + this.version = jObj.optString("version"); + } + + /** + * @return the version + */ + public String getVersion() { + return version; + } + +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/IHandleJsonObject.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/IHandleJsonObject.java new file mode 100644 index 00000000..f4ad987c --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/IHandleJsonObject.java @@ -0,0 +1,7 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import org.json.JSONObject; + +public interface IHandleJsonObject { + public void performAction(JSONObject jObj); +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFeedIntoDatabase.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFeedIntoDatabase.java new file mode 100644 index 00000000..4be98ea6 --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFeedIntoDatabase.java @@ -0,0 +1,39 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.ArrayList; + +import org.json.JSONObject; + +import de.luhmer.owncloudnewsreader.data.ConcreteFeedItem; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; + +public class InsertFeedIntoDatabase implements IHandleJsonObject{ + + DatabaseConnection dbConn; + ArrayList feeds = new ArrayList(); + + public InsertFeedIntoDatabase(DatabaseConnection dbConn) { + this.dbConn = dbConn; + } + + private static ConcreteFeedItem parseFeed(JSONObject e) + { + String faviconLink = e.optString("faviconLink"); + if(faviconLink != null) + if(faviconLink.equals("null") || faviconLink.trim().equals("")) + faviconLink = null; + + return new ConcreteFeedItem(e.optString("title"), e.optString("folderId"), e.optString("id"), faviconLink, -1); + } + + @Override + public void performAction(JSONObject jObj) { + ConcreteFeedItem rssFeed = parseFeed(jObj); + feeds.add(rssFeed); + } + + public void WriteAllToDatabaseNow() { + InsertIntoDatabase.InsertSubscriptionsIntoDatabase(feeds, dbConn); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFolderIntoDatabase.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFolderIntoDatabase.java new file mode 100644 index 00000000..d6885084 --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertFolderIntoDatabase.java @@ -0,0 +1,32 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.ArrayList; + +import org.json.JSONObject; + +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; + +public class InsertFolderIntoDatabase implements IHandleJsonObject{ + + DatabaseConnection dbConn; + ArrayList folders = new ArrayList(); + + public InsertFolderIntoDatabase(DatabaseConnection dbConn) { + this.dbConn = dbConn; + } + + private static String[] parseFolder(JSONObject e) + { + return new String[] { e.optString("name"), e.optString("id") }; + } + + @Override + public void performAction(JSONObject jObj) { + folders.add(parseFolder(jObj)); + } + + public void WriteAllToDatabaseNow() { + InsertIntoDatabase.InsertFoldersIntoDatabase(folders, dbConn); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertItemIntoDatabase.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertItemIntoDatabase.java new file mode 100644 index 00000000..83f3d58e --- /dev/null +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/InsertItemIntoDatabase.java @@ -0,0 +1,44 @@ +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.Date; + +import org.json.JSONObject; + +import de.luhmer.owncloudnewsreader.data.RssFile; +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; + +public class InsertItemIntoDatabase implements IHandleJsonObject { + + DatabaseConnection dbConn; + + public InsertItemIntoDatabase(DatabaseConnection dbConn) { + this.dbConn = dbConn; + } + + private static RssFile parseItem(JSONObject e) + { + Date date = new Date(e.optLong("pubDate") * 1000); + + String content = e.optString("body"); + content = content.replaceAll("]*feedsportal.com.*>", ""); + content = content.replaceAll("]*statisches.auslieferung.commindo-media-ressourcen.de.*>", ""); + content = content.replaceAll("]*auslieferung.commindo-media-ressourcen.de.*>", ""); + content = content.replaceAll("]*rss.buysellads.com.*>", ""); + + return new RssFile(0, e.optString("id"), + e.optString("title"), + e.optString("url"), content, + !e.optBoolean("unread"), null, + e.optString("feedId"), null, + date, e.optBoolean("starred"), + e.optString("guid"), e.optString("guidHash"), + e.optString("lastModified")); + } + + @Override + public void performAction(JSONObject jObj) { + RssFile rssFile = parseItem(jObj); + InsertIntoDatabase.InsertSingleFeedItemIntoDatabase(rssFile, dbConn); + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloudReaderMethods.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloudReaderMethods.java index e3d1f17d..686986c1 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloudReaderMethods.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloudReaderMethods.java @@ -1,370 +1,401 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.http.NameValuePair; -import org.apache.http.message.BasicNameValuePair; -import org.json.JSONArray; -import org.json.JSONObject; - -import android.app.Activity; -import android.content.Context; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.preference.PreferenceManager; -import de.luhmer.owncloudnewsreader.SettingsActivity; -import de.luhmer.owncloudnewsreader.data.ConcreteSubscribtionItem; -import de.luhmer.owncloudnewsreader.data.RssFile; -import de.luhmer.owncloudnewsreader.database.DatabaseConnection; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; -import de.luhmer.owncloudnewsreader.reader.HttpJsonRequest; -import de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase; - -public class OwnCloudReaderMethods { - public static String maxSizePerSync = "200"; - - public static int GetUpdatedItems(TAGS tag, Activity act, long lastSync) throws Exception - { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(act); - //ArrayList rssFiles = new ArrayList(); - - List nVPairs = new ArrayList(); - nVPairs.add(new BasicNameValuePair("batchSize", maxSizePerSync)); - if(tag.equals(TAGS.ALL_STARRED)) - { - nVPairs.add(new BasicNameValuePair("type", "2")); - nVPairs.add(new BasicNameValuePair("id", "0")); - } - else if(tag.equals(TAGS.ALL)) - { - nVPairs.add(new BasicNameValuePair("type", "3")); - nVPairs.add(new BasicNameValuePair("id", "0")); - } - nVPairs.add(new BasicNameValuePair("lastModified", String.valueOf(lastSync))); - - String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); - String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); - String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); - - - String requestURL = oc_root_path + OwnCloudConstants.FEED_PATH_UPDATED_ITEMS + OwnCloudConstants.JSON_FORMAT; - - JSONObject jsonObj = HttpJsonRequest.PerformJsonRequest(requestURL, nVPairs, username, password, act); - - DatabaseConnection dbConn = new DatabaseConnection(act); - try - { - return parseItems(jsonObj, dbConn, act); - } finally { - dbConn.closeDatabase(); - } - //return rssFiles; - } - - //"type": 1, // the type of the query (Feed: 0, Folder: 1, Starred: 2, All: 3) - public static int GetItems(TAGS tag, Activity act, String offset, boolean getRead, String id, String type) throws Exception - { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(act); - //ArrayList rssFiles = new ArrayList(); - - List nVPairs = new ArrayList(); - nVPairs.add(new BasicNameValuePair("batchSize", maxSizePerSync)); - if(tag.equals(TAGS.ALL_STARRED)) - { - nVPairs.add(new BasicNameValuePair("type", type)); - nVPairs.add(new BasicNameValuePair("id", id)); - } - else if(tag.equals(TAGS.ALL)) - { - nVPairs.add(new BasicNameValuePair("type", type)); - nVPairs.add(new BasicNameValuePair("id", id)); - } - nVPairs.add(new BasicNameValuePair("offset", offset)); - if(getRead) - nVPairs.add(new BasicNameValuePair("getRead", "true")); - else - nVPairs.add(new BasicNameValuePair("getRead", "false")); - - - String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); - String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); - String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); - - String requestURL = oc_root_path + OwnCloudConstants.FEED_PATH + OwnCloudConstants.JSON_FORMAT; - - JSONObject jsonObj = HttpJsonRequest.PerformJsonRequest(requestURL, nVPairs, username, password, act); - - DatabaseConnection dbConn = new DatabaseConnection(act); - try - { - return parseItems(jsonObj, dbConn, act); - } finally { - dbConn.closeDatabase(); - } - //return rssFiles; - } - - private static int parseItems(JSONObject jsonObj, DatabaseConnection dbConn, Context context) - { - //ArrayList rssFiles = new ArrayList(); - int count = 0; - - //jsonObj = jsonObj.optJSONObject("ocs"); - //jsonObj = jsonObj.optJSONObject("data"); - JSONArray jsonArr = jsonObj.optJSONArray("items"); - - if(jsonArr != null) - { - for (int i = 0; i < jsonArr.length(); i++) { - JSONObject e = jsonArr.optJSONObject(i); - - //rssFiles.add(parseItem(e)); - - RssFile rssFile = parseItem(e); - InsertIntoDatabase.InsertSingleFeedItemIntoDatabase(rssFile, dbConn); - - //new AsyncTask_DownloadImages(rssFile.getDescription(), context).execute(); - - count++; - } - } - - return count; - //return rssFiles; - } - - private static RssFile parseItem(JSONObject e) - { - Date date = new Date(e.optLong("pubDate") * 1000); - - String content = e.optString("body"); - content = content.replaceAll("]*feedsportal.com.*>", ""); - content = content.replaceAll("]*statisches.auslieferung.commindo-media-ressourcen.de.*>", ""); - content = content.replaceAll("]*auslieferung.commindo-media-ressourcen.de.*>", ""); - content = content.replaceAll("]*rss.buysellads.com.*>", ""); - - return new RssFile(0, e.optString("id"), - e.optString("title"), - e.optString("url"), content, - !e.optBoolean("unread"), null, - e.optString("feedId"), null, - date, e.optBoolean("starred"), - e.optString("guid"), e.optString("guidHash"), - e.optString("lastModified")); - } - - - public static ArrayList GetFolderTags(Activity act) throws Exception - { - ArrayList folderTags = null; - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(act); - String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); - String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); - String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); - - if(oc_root_path.endsWith("/")) - oc_root_path = oc_root_path.substring(0, oc_root_path.length() - 1); - - String requestUrl = oc_root_path + OwnCloudConstants.FOLDER_PATH + OwnCloudConstants.JSON_FORMAT; - JSONObject jsonObj = HttpJsonRequest.PerformJsonRequest(requestUrl, null, username, password, act); - - //jsonObj = jsonObj.optJSONObject("ocs"); - //jsonObj = jsonObj.optJSONObject("data"); - JSONArray jsonArr = jsonObj.optJSONArray("folders"); - - folderTags = new ArrayList(); - for (int i = 0; i < jsonArr.length(); i++) { - JSONObject e = jsonArr.optJSONObject(i); - folderTags.add(new String[] { e.optString("name"), e.optString("id") }); - } - - return folderTags; - } - - public static ArrayList GetSubscriptionTags(Activity act) throws Exception - { - ArrayList subscriptionTags = new ArrayList(); - - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(act); - String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); - String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); - String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); - - JSONObject jsonObj = HttpJsonRequest.PerformJsonRequest(oc_root_path + OwnCloudConstants.SUBSCRIPTION_PATH + OwnCloudConstants.JSON_FORMAT, null, username, password, act); - - //jsonObj = jsonObj.optJSONObject("ocs"); - //jsonObj = jsonObj.optJSONObject("data"); - JSONArray jsonArr = jsonObj.optJSONArray("feeds"); - - for (int i = 0; i < jsonArr.length(); i++) { - JSONObject e = jsonArr.optJSONObject(i); - String faviconLink = e.optString("faviconLink"); - if(faviconLink != null) - if(faviconLink.equals("null") || faviconLink.trim().equals("")) - faviconLink = null; - subscriptionTags.add(new ConcreteSubscribtionItem(e.optString("title"), e.optString("folderId"), e.optString("id"), faviconLink, -1)); - } - - return subscriptionTags; - } - - public static boolean PerformTagExecution(List itemIds, FeedItemTags.TAGS tag, Context context) - { - SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); - String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null); - String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, null); - String oc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, ""); - - - //List nameValuePairs = null; - String jsonIds = null; - - - String url = oc_root_path + OwnCloudConstants.FEED_PATH + "/"; - if(tag.equals(TAGS.MARK_ITEM_AS_READ) || tag.equals(TAGS.MARK_ITEM_AS_UNREAD)) - { - jsonIds = buildIdsToJSONArray(itemIds); - /* - if(jsonIds != null) - { - nameValuePairs = new ArrayList(); - nameValuePairs.add(new BasicNameValuePair("itemIds", jsonIds)); - }*/ - //url += itemIds.get(0) + "/read"; - - if(tag.equals(TAGS.MARK_ITEM_AS_READ)) - url += "read/multiple"; - else - url += "unread/multiple"; - } - //else if(tag.equals(TAGS.MARK_ITEM_AS_UNREAD)) - // url += itemIds.get(0) + "/unread";//TODO HERE... - else - { - DatabaseConnection dbConn = new DatabaseConnection(context); - - HashMap items = new HashMap(); - for(String idItem : itemIds) - { - Cursor cursor = dbConn.getArticleByID(dbConn.getRowIdOfFeedByItemID(idItem)); - //Cursor cursor = dbConn.getFeedByID itemID); - cursor.moveToFirst(); - - String idSubscription = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)); - String guidHash = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_GUIDHASH)); - - cursor.close(); - - String subscription_id = dbConn.getSubscriptionIdByRowID(idSubscription); - //url += subscription_id; - - items.put(guidHash, subscription_id); - } - dbConn.closeDatabase(); - - jsonIds = buildIdsToJSONArrayWithGuid(items); - /* - if(jsonIds != null) - { - nameValuePairs = new ArrayList(); - nameValuePairs.add(new BasicNameValuePair("itemIds", jsonIds)); - }*/ - - if(tag.equals(TAGS.MARK_ITEM_AS_STARRED)) - url += "star/multiple"; - else if(tag.equals(TAGS.MARK_ITEM_AS_UNSTARRED)) - url += "unstar/multiple"; - - - /* - url += "/" + guidHash; - - if(tag.equals(TAGS.MARK_ITEM_AS_STARRED)) - url += "/star"; - else if(tag.equals(TAGS.MARK_ITEM_AS_UNSTARRED)) - url += "/unstar"; - */ - - } - try - { - int result = HttpJsonRequest.performTagChangeRequest(url, username, password, context, jsonIds); - //if(result != -1 || result != 405) - if(result == 200) - return true; - else - return false; - } - catch (Exception ex) - { - ex.printStackTrace(); - return false; - } - } - - - public static String GetVersionNumber(Activity act, String username, String password, String oc_root_path) throws Exception - { - if(oc_root_path.endsWith("/")) - oc_root_path = oc_root_path.substring(0, oc_root_path.length() - 1); - - String requestUrl = oc_root_path + OwnCloudConstants.VERSION_PATH; - JSONObject jsonObj = HttpJsonRequest.PerformJsonRequest(requestUrl, null, username, password, act); - - return jsonObj.optString("version"); - } - - - private static String buildIdsToJSONArray(List ids) - { - try - { - JSONArray jArr = new JSONArray(); - for(String id : ids) - jArr.put(Integer.parseInt(id)); - - - JSONObject jObj = new JSONObject(); - jObj.put("items", jArr); - - return jObj.toString(); - } - catch(Exception ex) - { - ex.printStackTrace(); - } - return null; - } - - private static String buildIdsToJSONArrayWithGuid(HashMap items) - { - try - { - JSONArray jArr = new JSONArray(); - for(Map.Entry entry : items.entrySet()) - { - JSONObject jOb = new JSONObject(); - jOb.put("feedId", Integer.parseInt(entry.getValue())); - jOb.put("guidHash", entry.getKey()); - jArr.put(jOb); - } - - - JSONObject jObj = new JSONObject(); - jObj.put("items", jArr); - - return jObj.toString(); - } - catch(Exception ex) - { - ex.printStackTrace(); - } - return null; - } -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.Activity; +import android.content.Context; +import android.database.Cursor; + +import com.google.gson.stream.JsonReader; + +import de.luhmer.owncloudnewsreader.database.DatabaseConnection; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; +import de.luhmer.owncloudnewsreader.reader.HttpJsonRequest; + +public class OwnCloudReaderMethods { + public static String maxSizePerSync = "200"; + + public static int GetUpdatedItems(TAGS tag, Activity act, long lastSync, API api) throws Exception + { + List nVPairs = new ArrayList(); + //nVPairs.add(new BasicNameValuePair("batchSize", maxSizePerSync)); + if(tag.equals(TAGS.ALL_STARRED)) + { + nVPairs.add(new BasicNameValuePair("type", "2")); + nVPairs.add(new BasicNameValuePair("id", "0")); + } + else if(tag.equals(TAGS.ALL)) + { + nVPairs.add(new BasicNameValuePair("type", "3")); + nVPairs.add(new BasicNameValuePair("id", "0")); + } + nVPairs.add(new BasicNameValuePair("lastModified", String.valueOf(lastSync))); + + + InputStream is = HttpJsonRequest.PerformJsonRequest(api.getItemUpdatedUrl(), nVPairs, api.getUsername(), api.getPassword(), act); + + DatabaseConnection dbConn = new DatabaseConnection(act); + try + { + return readJsonStream(is, new InsertItemIntoDatabase(dbConn)); + } finally { + dbConn.closeDatabase(); + is.close(); + } + } + + //"type": 1, // the type of the query (Feed: 0, Folder: 1, Starred: 2, All: 3) + public static int GetItems(TAGS tag, Activity act, String offset, boolean getRead, String id, String type, API api) throws Exception + { + List nVPairs = new ArrayList(); + nVPairs.add(new BasicNameValuePair("batchSize", maxSizePerSync)); + if(tag.equals(TAGS.ALL_STARRED)) + { + nVPairs.add(new BasicNameValuePair("type", type)); + nVPairs.add(new BasicNameValuePair("id", id)); + } + else if(tag.equals(TAGS.ALL)) + { + nVPairs.add(new BasicNameValuePair("type", type)); + nVPairs.add(new BasicNameValuePair("id", id)); + } + nVPairs.add(new BasicNameValuePair("offset", offset)); + if(getRead) + nVPairs.add(new BasicNameValuePair("getRead", "true")); + else + nVPairs.add(new BasicNameValuePair("getRead", "false")); + + + InputStream is = HttpJsonRequest.PerformJsonRequest(api.getItemUrl(), nVPairs, api.getUsername(), api.getPassword(), act); + + DatabaseConnection dbConn = new DatabaseConnection(act); + try + { + return readJsonStream(is, new InsertItemIntoDatabase(dbConn)); + } finally { + dbConn.closeDatabase(); + is.close(); + } + } + + + public static int GetFolderTags(Activity act, API api) throws Exception + { + InputStream is = HttpJsonRequest.PerformJsonRequest(api.getFolderUrl(), null, api.getUsername(), api.getPassword(), act); + DatabaseConnection dbConn = new DatabaseConnection(act); + int result = 0; + try + { + InsertFolderIntoDatabase ifid = new InsertFolderIntoDatabase(dbConn); + result = readJsonStream(is, ifid); + ifid.WriteAllToDatabaseNow(); + } finally { + dbConn.closeDatabase(); + is.close(); + } + + return result; + } + + public static int GetFeeds(Activity act, API api) throws Exception + { + InputStream inputStream = HttpJsonRequest.PerformJsonRequest(api.getFeedUrl() , null, api.getUsername(), api.getPassword(), act); + + DatabaseConnection dbConn = new DatabaseConnection(act); + int result = 0; + try { + InsertFeedIntoDatabase ifid = new InsertFeedIntoDatabase(dbConn); + result = readJsonStream(inputStream, ifid); + ifid.WriteAllToDatabaseNow(); + } finally { + dbConn.closeDatabase(); + inputStream.close(); + } + return result; + } + + /** + * can parse json like {"items":[{"id":6782}]} + * @param in + * @param iJoBj + * @return + * @throws IOException + * @throws JSONException + */ + public static int readJsonStream(InputStream in, IHandleJsonObject iJoBj) throws IOException, JSONException { + int count = 0; + JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8")); + reader.beginObject(); + reader.nextName(); + reader.beginArray(); + while (reader.hasNext()) { + reader.beginObject(); + + JSONObject e = getJSONObjectFromReader(reader); + + iJoBj.performAction(e); + + reader.endObject(); + count++; + } + reader.endArray(); + reader.close(); + + return count; + } + + /** + * can read json like {"version":"1.101"} + * @param in + * @param iJoBj + * @return + * @throws IOException + * @throws JSONException + */ + private static int readJsonStreamSimple(InputStream in, IHandleJsonObject iJoBj) throws IOException, JSONException { + int count = 0; + JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8")); + reader.beginObject(); + + JSONObject e = getJSONObjectFromReader(reader); + + iJoBj.performAction(e); + + reader.endObject(); + reader.close(); + + return count; + } + + private static JSONObject getJSONObjectFromReader(JsonReader jsonReader) { + JSONObject jObj = new JSONObject(); + try { + while(jsonReader.hasNext()) { + try { + jObj.put(jsonReader.nextName(), jsonReader.nextString()); + } catch(Exception ex) { + //ex.printStackTrace(); + jsonReader.skipValue(); + } + } + return jObj; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + + public static boolean PerformTagExecutionAPIv2(List itemIds, FeedItemTags.TAGS tag, Context context, API api) + { + String jsonIds = null; + + + String url = api.getTagBaseUrl(); + if(tag.equals(TAGS.MARK_ITEM_AS_READ) || tag.equals(TAGS.MARK_ITEM_AS_UNREAD)) + { + jsonIds = buildIdsToJSONArray(itemIds); + + if(tag.equals(TAGS.MARK_ITEM_AS_READ)) + url += "read/multiple"; + else + url += "unread/multiple"; + } else { + DatabaseConnection dbConn = new DatabaseConnection(context); + + HashMap items = new HashMap(); + for(String idItem : itemIds) + { + Cursor cursor = dbConn.getArticleByID(dbConn.getRowIdOfFeedByItemID(idItem)); + //Cursor cursor = dbConn.getFeedByID itemID); + cursor.moveToFirst(); + + String idSubscription = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)); + String guidHash = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_GUIDHASH)); + + cursor.close(); + + String subscription_id = dbConn.getSubscriptionIdByRowID(idSubscription); + //url += subscription_id; + + items.put(guidHash, subscription_id); + } + dbConn.closeDatabase(); + + jsonIds = buildIdsToJSONArrayWithGuid(items); + /* + if(jsonIds != null) + { + nameValuePairs = new ArrayList(); + nameValuePairs.add(new BasicNameValuePair("itemIds", jsonIds)); + }*/ + + if(tag.equals(TAGS.MARK_ITEM_AS_STARRED)) + url += "star/multiple"; + else if(tag.equals(TAGS.MARK_ITEM_AS_UNSTARRED)) + url += "unstar/multiple"; + + + /* + url += "/" + guidHash; + + if(tag.equals(TAGS.MARK_ITEM_AS_STARRED)) + url += "/star"; + else if(tag.equals(TAGS.MARK_ITEM_AS_UNSTARRED)) + url += "/unstar"; + */ + + } + try + { + int result = HttpJsonRequest.performTagChangeRequest(url, api.getUsername(), api.getPassword(), context, jsonIds); + //if(result != -1 || result != 405) + if(result == 200) + return true; + else + return false; + } + catch (Exception ex) + { + ex.printStackTrace(); + return false; + } + } + + public static boolean PerformTagExecutionAPIv1(String itemId, FeedItemTags.TAGS tag, Context context, API api) + { + String url = api.getTagBaseUrl(); + if(tag.equals(TAGS.MARK_ITEM_AS_READ) || tag.equals(TAGS.MARK_ITEM_AS_UNREAD)) + { + if(tag.equals(TAGS.MARK_ITEM_AS_READ)) + url += itemId + "/read"; + else + url += itemId + "/unread"; + } else { + DatabaseConnection dbConn = new DatabaseConnection(context); + + Cursor cursor = dbConn.getArticleByID(dbConn.getRowIdOfFeedByItemID(itemId)); + cursor.moveToFirst(); + + String idSubscription = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_SUBSCRIPTION_ID)); + String guidHash = cursor.getString(cursor.getColumnIndex(DatabaseConnection.RSS_ITEM_GUIDHASH)); + cursor.close(); + + String subscription_id = dbConn.getSubscriptionIdByRowID(idSubscription); + url += subscription_id; + + dbConn.closeDatabase(); + + url += "/" + guidHash; + if(tag.equals(TAGS.MARK_ITEM_AS_STARRED)) + url += "/star"; + else if(tag.equals(TAGS.MARK_ITEM_AS_UNSTARRED)) + url += "/unstar"; + } + try + { + int result = HttpJsonRequest.performTagChangeRequest(url, api.getUsername(), api.getPassword(), context, null); + if(result == 200) + return true; + else + return false; + } + catch (Exception ex) + { + ex.printStackTrace(); + return false; + } + } + + + public static String GetVersionNumber(Activity act, String username, String password, String oc_root_path) throws Exception + { + if(oc_root_path.endsWith("/")) + oc_root_path = oc_root_path.substring(0, oc_root_path.length() - 1); + + //Try APIv2 + try { + String requestUrl = oc_root_path + OwnCloudConstants.ROOT_PATH_APIv2 + OwnCloudConstants.VERSION_PATH; + InputStream is = HttpJsonRequest.PerformJsonRequest(requestUrl, null, username, password, act); + try { + GetVersion gv = new GetVersion(); + readJsonStreamSimple(is, gv); + return gv.getVersion(); + } finally { + is.close(); + } + } catch(Exception ex) { //TODO GET HERE THE RIGHT EXCEPTION + String requestUrl = oc_root_path + OwnCloudConstants.ROOT_PATH_APIv1 + OwnCloudConstants.VERSION_PATH; + InputStream is = HttpJsonRequest.PerformJsonRequest(requestUrl, null, username, password, act); + try { + GetVersion gv = new GetVersion(); + readJsonStreamSimple(is, gv); + return gv.getVersion(); + } finally { + is.close(); + } + } + } + + + + private static String buildIdsToJSONArray(List ids) + { + try + { + JSONArray jArr = new JSONArray(); + for(String id : ids) + jArr.put(Integer.parseInt(id)); + + + JSONObject jObj = new JSONObject(); + jObj.put("items", jArr); + + return jObj.toString(); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + return null; + } + + private static String buildIdsToJSONArrayWithGuid(HashMap items) + { + try + { + JSONArray jArr = new JSONArray(); + for(Map.Entry entry : items.entrySet()) + { + JSONObject jOb = new JSONObject(); + jOb.put("feedId", Integer.parseInt(entry.getValue())); + jOb.put("guidHash", entry.getKey()); + jArr.put(jOb); + } + + JSONObject jObj = new JSONObject(); + jObj.put("items", jArr); + + return jObj.toString(); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + return null; + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloud_Reader.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloud_Reader.java index 4db25848..e799f780 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloud_Reader.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/OwnCloud_Reader.java @@ -1,102 +1,115 @@ -package de.luhmer.owncloudnewsreader.reader.owncloud; - -import java.util.List; - -import android.app.Activity; -import android.content.Context; -import android.util.SparseArray; -import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; -import de.luhmer.owncloudnewsreader.reader.FeedItemTags; -import de.luhmer.owncloudnewsreader.reader.IReader; -import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; - -public class OwnCloud_Reader implements IReader { - boolean isSyncRunning = false; - - SparseArray AsyncTasksRunning; - - public OwnCloud_Reader() { - AsyncTasksRunning = new SparseArray(); - } - - @Override - public void Start_AsyncTask_GetItems(int task_id, - Activity context, OnAsyncTaskCompletedListener listener, FeedItemTags.TAGS tag) { - setSyncRunning(true); - AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetItems(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute(tag)); - } - - @Override - public void Start_AsyncTask_GetOldItems(int task_id, - Activity context, OnAsyncTaskCompletedListener listener, String feed_id, String folder_id) { - setSyncRunning(true); - AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetOldItems(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener }, feed_id, folder_id).execute()); - } - - @Override - public void Start_AsyncTask_GetFolder(int task_id, - Activity context, OnAsyncTaskCompletedListener listener) { - setSyncRunning(true); - AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetFolderTags(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute()); - } - - @Override - public void Start_AsyncTask_GetFeeds(int task_id, - Activity context, OnAsyncTaskCompletedListener listener) { - setSyncRunning(true); - AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetFeeds(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute()); - } - - @Override - public void Start_AsyncTask_PerformTagAction(int task_id, - Context context, OnAsyncTaskCompletedListener listener, - List itemIds, FeedItemTags.TAGS tag) { - setSyncRunning(true); - AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_PerformTagAction(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute(itemIds, tag)); - } - - @Override - public void Start_AsyncTask_Authenticate(int task_id, Activity context, - OnAsyncTaskCompletedListener listener) { - // TODO Auto-generated method stub - - } - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - // TODO Auto-generated method stub - - } - - @Override - public boolean isSyncRunning() { - return isSyncRunning; - } - - @Override - public void setSyncRunning(boolean isSyncRunning) { - this.isSyncRunning = isSyncRunning; - } - - OnAsyncTaskCompletedListener AsyncTask_finished = new OnAsyncTaskCompletedListener() { - - @Override - public void onAsyncTaskCompleted(int task_id, Object task_result) { - setSyncRunning(false); - AsyncTasksRunning.remove(task_id); - } - }; - - @Override - public SparseArray getRunningAsyncTasks() { - return AsyncTasksRunning; - } - - @Override - public void attachToRunningTask(int task_id, Activity activity, OnAsyncTaskCompletedListener listener) { - if(AsyncTasksRunning.get(task_id) != null) - AsyncTasksRunning.get(task_id).attach(activity, new OnAsyncTaskCompletedListener[] { listener, AsyncTask_finished }); - } - - -} +package de.luhmer.owncloudnewsreader.reader.owncloud; + +import java.util.List; + +import android.app.Activity; +import android.util.SparseArray; +import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags; +import de.luhmer.owncloudnewsreader.reader.IReader; +import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; + +public class OwnCloud_Reader implements IReader { + boolean isSyncRunning = false; + private API api = null; + + SparseArray AsyncTasksRunning; + + public OwnCloud_Reader() { + AsyncTasksRunning = new SparseArray(); + } + + @Override + public void Start_AsyncTask_GetItems(int task_id, + Activity context, OnAsyncTaskCompletedListener listener, FeedItemTags.TAGS tag) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetItems(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute(tag)); + } + + @Override + public void Start_AsyncTask_GetOldItems(int task_id, + Activity context, OnAsyncTaskCompletedListener listener, String feed_id, String folder_id) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetOldItems(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener }, feed_id, folder_id).execute()); + } + + @Override + public void Start_AsyncTask_GetFolder(int task_id, + Activity context, OnAsyncTaskCompletedListener listener) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetFolderTags(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute()); + } + + @Override + public void Start_AsyncTask_GetFeeds(int task_id, + Activity context, OnAsyncTaskCompletedListener listener) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetFeeds(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute()); + } + + @Override + public void Start_AsyncTask_PerformTagAction(int task_id, + Activity context, OnAsyncTaskCompletedListener listener, + List itemIds, FeedItemTags.TAGS tag) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_PerformTagAction(task_id, context, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute(itemIds, tag)); + } + + + public void Start_AsyncTask_GetVersion(int task_id, + Activity context, OnAsyncTaskCompletedListener listener, String username, String password) { + setSyncRunning(true); + AsyncTasksRunning.append(task_id, (AsyncTask_Reader) new AsyncTask_GetApiVersion(task_id, context, username, password, new OnAsyncTaskCompletedListener[] { AsyncTask_finished, listener } ).execute()); + } + + @Override + public void Start_AsyncTask_Authenticate(int task_id, Activity context, + OnAsyncTaskCompletedListener listener) { + // TODO Auto-generated method stub + + } + + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + + } + + @Override + public boolean isSyncRunning() { + return isSyncRunning; + } + + @Override + public void setSyncRunning(boolean isSyncRunning) { + this.isSyncRunning = isSyncRunning; + } + + OnAsyncTaskCompletedListener AsyncTask_finished = new OnAsyncTaskCompletedListener() { + + @Override + public void onAsyncTaskCompleted(int task_id, Object task_result) { + setSyncRunning(false); + AsyncTasksRunning.remove(task_id); + } + }; + + @Override + public SparseArray getRunningAsyncTasks() { + return AsyncTasksRunning; + } + + @Override + public void attachToRunningTask(int task_id, Activity activity, OnAsyncTaskCompletedListener listener) { + if(AsyncTasksRunning.get(task_id) != null) + AsyncTasksRunning.get(task_id).attach(activity, new OnAsyncTaskCompletedListener[] { listener, AsyncTask_finished }); + } + + public API getApi() { + return api; + } + + public void setApi(API api) { + this.api = api; + } +} diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv1/APIv1.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv1/APIv1.java index c0c154e5..8fba40ee 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv1/APIv1.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv1/APIv1.java @@ -1,9 +1,15 @@ package de.luhmer.owncloudnewsreader.reader.owncloud.apiv1; +import java.util.ArrayList; +import java.util.List; + import android.app.Activity; +import android.content.Context; import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; import de.luhmer.owncloudnewsreader.reader.owncloud.API; import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloudConstants; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloudReaderMethods; public class APIv1 extends API { @@ -46,7 +52,17 @@ public class APIv1 extends API { } @Override - public void markSingleItemAsReadApiv1() { + public boolean PerformTagExecution(List itemIds, TAGS tag, + Context context, API api) { + List succeeded = new ArrayList(); + for(String item : itemIds) { + succeeded.add(OwnCloudReaderMethods.PerformTagExecutionAPIv1(item, tag, context, api)); + } + + if(succeeded.contains(false)) + return false; + else + return true; } } diff --git a/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv2/APIv2.java b/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv2/APIv2.java index 76f4a504..b68a9cd0 100644 --- a/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv2/APIv2.java +++ b/src/de/luhmer/owncloudnewsreader/reader/owncloud/apiv2/APIv2.java @@ -1,9 +1,14 @@ package de.luhmer.owncloudnewsreader.reader.owncloud.apiv2; +import java.util.List; + import android.app.Activity; +import android.content.Context; import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS; import de.luhmer.owncloudnewsreader.reader.owncloud.API; import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloudConstants; +import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloudReaderMethods; public class APIv2 extends API { @@ -46,6 +51,8 @@ public class APIv2 extends API { } @Override - public void markSingleItemAsReadApiv1() { - } + public boolean PerformTagExecution(List itemIds, TAGS tag, + Context context, API api) { + return OwnCloudReaderMethods.PerformTagExecutionAPIv2(itemIds, tag, context, api); + } } diff --git a/src/de/luhmer/owncloudnewsreader/services/SyncService.java b/src/de/luhmer/owncloudnewsreader/services/SyncService.java index 347b8f5e..e044c752 100644 --- a/src/de/luhmer/owncloudnewsreader/services/SyncService.java +++ b/src/de/luhmer/owncloudnewsreader/services/SyncService.java @@ -1,27 +1,27 @@ -package de.luhmer.owncloudnewsreader.services; - -import android.app.Service; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; - -public class SyncService extends Service { - // Binder given to clients - private final IBinder mBinder = new LocalBinder(); - - /** - * Class used for the client Binder. Because we know this service always - * runs in the same process as its clients, we don't need to deal with IPC. - */ - public class LocalBinder extends Binder { - public SyncService getService() { - // Return this instance of LocalService so clients can call public methods - return SyncService.this; - } - } - - @Override - public IBinder onBind(Intent intent) { - return mBinder; - } -} +package de.luhmer.owncloudnewsreader.services; + +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; + +public class SyncService extends Service { + // Binder given to clients + private final IBinder mBinder = new LocalBinder(); + + /** + * Class used for the client Binder. Because we know this service always + * runs in the same process as its clients, we don't need to deal with IPC. + */ + public class LocalBinder extends Binder { + public SyncService getService() { + // Return this instance of LocalService so clients can call public methods + return SyncService.this; + } + } + + @Override + public IBinder onBind(Intent intent) { + return mBinder; + } +}

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