offline: fix sharingactionprovider

offline: implement list navigation
This commit is contained in:
Andrew Dolgov 2012-06-23 21:19:34 +04:00
parent df79b35b53
commit f3b7106317
2 changed files with 266 additions and 57 deletions

View File

@ -1,7 +1,6 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:id="@+id/menu_group_feeds" > <group android:id="@+id/menu_group_feeds" >
<item <item
android:id="@+id/go_online" android:id="@+id/go_online"
android:icon="@drawable/ic_menu_cloud" android:icon="@drawable/ic_menu_cloud"
@ -9,11 +8,13 @@
android:title="@string/go_online" android:title="@string/go_online"
android:visible="false"/> android:visible="false"/>
<!-- <item <!--
<item
android:id="@+id/back_to_categories" android:id="@+id/back_to_categories"
android:icon="@android:drawable/ic_menu_close_clear_cancel" android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:showAsAction="ifRoom|withText" android:showAsAction="ifRoom|withText"
android:title="@string/back_to_categories"/> --> android:title="@string/back_to_categories"/>
-->
<item <item
android:id="@+id/show_feeds" android:id="@+id/show_feeds"
@ -21,88 +22,72 @@
android:showAsAction="" android:showAsAction=""
android:title="@string/menu_all_feeds"/> android:title="@string/menu_all_feeds"/>
</group> </group>
<group android:id="@+id/menu_group_headlines" > <group android:id="@+id/menu_group_headlines" >
<item <item
android:id="@+id/go_online" android:id="@+id/go_online"
android:icon="@drawable/ic_menu_cloud" android:icon="@drawable/ic_menu_cloud"
android:title="@string/go_online" android:title="@string/go_online"
android:visible="false"/> android:visible="false"/>
<item <item
android:id="@+id/search" android:id="@+id/search"
android:actionViewClass="android.widget.SearchView" android:actionViewClass="android.widget.SearchView"
android:icon="@android:drawable/ic_menu_search" android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView" android:showAsAction="ifRoom|collapseActionView"
android:title="@string/search"/> android:title="@string/search"/>
<item <item
android:id="@+id/headlines_mark_as_read" android:id="@+id/headlines_mark_as_read"
android:icon="@drawable/ic_menu_tick" android:icon="@drawable/ic_menu_tick"
android:title="@string/headlines_mark_as_read"/> android:title="@string/headlines_mark_as_read"/>
<item <item
android:id="@+id/headlines_select" android:id="@+id/headlines_select"
android:icon="@drawable/ic_menu_database" android:icon="@drawable/ic_menu_database"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/headlines_select"/> android:title="@string/headlines_select"/>
</group> </group>
<group android:id="@+id/menu_group_headlines_selection" > <group android:id="@+id/menu_group_headlines_selection" >
<item <item
android:id="@+id/selection_toggle_unread" android:id="@+id/selection_toggle_unread"
android:icon="@drawable/ic_menu_tick" android:icon="@drawable/ic_menu_tick"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/selection_toggle_unread"/> android:title="@string/selection_toggle_unread"/>
<item <item
android:id="@+id/selection_toggle_marked" android:id="@+id/selection_toggle_marked"
android:icon="@drawable/ic_menu_marked" android:icon="@drawable/ic_menu_marked"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/selection_toggle_marked"/> android:title="@string/selection_toggle_marked"/>
<item <item
android:id="@+id/selection_toggle_published" android:id="@+id/selection_toggle_published"
android:icon="@drawable/ic_menu_rss" android:icon="@drawable/ic_menu_rss"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/selection_toggle_published"/> android:title="@string/selection_toggle_published"/>
<item <item
android:id="@+id/selection_select_none" android:id="@+id/selection_select_none"
android:icon="@android:drawable/ic_menu_close_clear_cancel" android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:showAsAction="" android:showAsAction=""
android:title="@string/selection_select_none"/> android:title="@string/selection_select_none"/>
</group> </group>
<group android:id="@+id/menu_group_article" > <group android:id="@+id/menu_group_article" >
<item
android:id="@+id/share_article"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom|collapseActionView"
android:actionProviderClass="android.widget.ShareActionProvider"
android:title="@string/share_article"/>
<item <item
android:id="@+id/toggle_marked" android:id="@+id/toggle_marked"
android:icon="@drawable/ic_menu_marked" android:icon="@drawable/ic_menu_marked"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/article_toggle_marked"/> android:title="@string/article_toggle_marked"/>
<item <item
android:id="@+id/toggle_published" android:id="@+id/toggle_published"
android:icon="@drawable/ic_menu_rss" android:icon="@drawable/ic_menu_rss"
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/article_toggle_published"/> android:title="@string/article_toggle_published"/>
<item
android:id="@+id/share_article"
android:actionProviderClass="android.widget.ShareActionProvider"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom"
android:title="@string/share_article"/>
<item <item
android:id="@+id/set_unread" android:id="@+id/set_unread"
android:icon="@android:drawable/ic_menu_recent_history" android:icon="@android:drawable/ic_menu_recent_history"
android:showAsAction="" android:showAsAction=""
android:title="@string/article_set_unread"/> android:title="@string/article_set_unread"/>
<item <item
android:id="@+id/catchup_above" android:id="@+id/catchup_above"
android:icon="@drawable/ic_menu_tick" android:icon="@drawable/ic_menu_tick"

View File

@ -1,5 +1,7 @@
package org.fox.ttrss.offline; package org.fox.ttrss.offline;
import java.util.ArrayList;
import org.fox.ttrss.DummyFragment; import org.fox.ttrss.DummyFragment;
import org.fox.ttrss.MainActivity; import org.fox.ttrss.MainActivity;
import org.fox.ttrss.OnlineServices; import org.fox.ttrss.OnlineServices;
@ -9,6 +11,7 @@ import org.fox.ttrss.R;
import org.fox.ttrss.util.DatabaseHelper; import org.fox.ttrss.util.DatabaseHelper;
import android.animation.LayoutTransition; import android.animation.LayoutTransition;
import android.app.ActionBar;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.NotificationManager; import android.app.NotificationManager;
@ -36,8 +39,10 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.SearchView; import android.widget.SearchView;
import android.widget.ShareActionProvider;
import android.widget.Toast; import android.widget.Toast;
public class OfflineActivity extends FragmentActivity implements public class OfflineActivity extends FragmentActivity implements
@ -73,6 +78,167 @@ public class OfflineActivity extends FragmentActivity implements
private ActionMode m_headlinesActionMode; private ActionMode m_headlinesActionMode;
private HeadlinesActionModeCallback m_headlinesActionModeCallback; private HeadlinesActionModeCallback m_headlinesActionModeCallback;
private NavigationListener m_navigationListener;
private NavigationAdapter m_navigationAdapter;
private ArrayList<NavigationEntry> m_navigationEntries = new ArrayList<NavigationEntry>();
private class RootNavigationEntry extends NavigationEntry {
public RootNavigationEntry(String title) {
super(title);
}
@Override
public void onItemSelected() {
m_activeFeedId = 0;
m_selectedArticleId = 0;
m_activeCatId = -1;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (m_smallScreenMode) {
if (m_enableCats) {
ft.replace(R.id.fragment_container, new OfflineFeedCategoriesFragment(), FRAG_CATS);
} else {
ft.replace(R.id.fragment_container, new OfflineFeedsFragment(), FRAG_FEEDS);
}
Fragment hf = getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
if (hf != null) ft.remove(hf);
Fragment af = getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
if (af != null) ft.remove(af);
} else {
if (m_enableCats) {
ft.replace(R.id.feeds_fragment, new OfflineFeedCategoriesFragment(), FRAG_CATS);
} else {
ft.replace(R.id.feeds_fragment, new OfflineFeedsFragment(), FRAG_FEEDS);
}
ft.replace(R.id.headlines_fragment, new DummyFragment(), "");
//findViewById(R.id.article_fragment).setVisibility(View.GONE);
ft.replace(R.id.article_fragment, new DummyFragment(), "");
}
ft.commit();
initMainMenu();
}
}
private class CategoryNavigationEntry extends NavigationEntry {
int m_category = -1;
public CategoryNavigationEntry(int category, String title) {
super(title);
m_category = category;
}
@Override
public void onItemSelected() {
m_selectedArticleId = 0;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (m_smallScreenMode) {
Fragment hf = getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
if (hf != null) ft.remove(hf);
Fragment af = getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
if (af != null) ft.remove(af);
if (m_activeFeedIsCat) {
ft.replace(R.id.fragment_container, new OfflineFeedCategoriesFragment());
} else {
ft.replace(R.id.fragment_container, new OfflineFeedsFragment(m_category));
}
} else {
ft.replace(R.id.article_fragment, new DummyFragment(), "");
//findViewById(R.id.article_fragment).setVisibility(View.GONE);
ft.replace(R.id.headlines_fragment, new DummyFragment(), "");
}
ft.commit();
m_activeFeedId = 0;
refreshViews();
initMainMenu();
}
}
private class FeedNavigationEntry extends NavigationEntry {
int m_feed = 0;
public FeedNavigationEntry(int feed, String title) {
super(title);
m_feed = feed;
}
@Override
public void onItemSelected() {
m_selectedArticleId = 0;
if (!m_smallScreenMode)
findViewById(R.id.article_fragment).setVisibility(View.GONE);
viewFeed(m_feed, false);
}
}
private abstract class NavigationEntry {
private String title = null;
private int timesCalled = 0;
public void _onItemSelected(int position, int size) {
Log.d(TAG, "_onItemSelected; TC=" + timesCalled + " P/S=" + position + "/" + size);
if (position == size && timesCalled == 0) {
++timesCalled;
} else {
onItemSelected();
}
}
public NavigationEntry(String title) {
this.title = title;
}
public String toString() {
return title;
}
public abstract void onItemSelected();
}
private class NavigationAdapter extends ArrayAdapter<NavigationEntry> {
public NavigationAdapter(Context context, int textViewResourceId, ArrayList<NavigationEntry> items) {
super(context, textViewResourceId, items);
}
}
private class NavigationListener implements ActionBar.OnNavigationListener {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Log.d(TAG, "onNavigationItemSelected: " + itemPosition);
NavigationEntry entry = m_navigationAdapter.getItem(itemPosition);
entry._onItemSelected(itemPosition, m_navigationAdapter.getCount()-1);
return false;
}
}
private class HeadlinesActionModeCallback implements ActionMode.Callback { private class HeadlinesActionModeCallback implements ActionMode.Callback {
@ -156,6 +322,13 @@ public class OfflineActivity extends FragmentActivity implements
LayoutTransition transitioner = new LayoutTransition(); LayoutTransition transitioner = new LayoutTransition();
((ViewGroup) findViewById(R.id.fragment_container)).setLayoutTransition(transitioner); ((ViewGroup) findViewById(R.id.fragment_container)).setLayoutTransition(transitioner);
m_navigationAdapter = new NavigationAdapter(this, android.R.layout.simple_spinner_dropdown_item, m_navigationEntries);
m_headlinesActionModeCallback = new HeadlinesActionModeCallback();
m_navigationListener = new NavigationListener();
getActionBar().setListNavigationCallbacks(m_navigationAdapter, m_navigationListener);
m_headlinesActionModeCallback = new HeadlinesActionModeCallback(); m_headlinesActionModeCallback = new HeadlinesActionModeCallback();
} }
@ -574,7 +747,9 @@ public class OfflineActivity extends FragmentActivity implements
} }
return true; return true;
case R.id.share_article: case R.id.share_article:
if (android.os.Build.VERSION.SDK_INT < 14) {
shareArticle(m_selectedArticleId); shareArticle(m_selectedArticleId);
}
return true; return true;
case R.id.toggle_marked: case R.id.toggle_marked:
if (m_selectedArticleId != 0) { if (m_selectedArticleId != 0) {
@ -793,7 +968,7 @@ public class OfflineActivity extends FragmentActivity implements
if (!m_compatMode) { if (!m_compatMode) {
if (m_activeFeedId != 0) { /* if (m_activeFeedId != 0) {
if (!m_activeFeedIsCat) { if (!m_activeFeedIsCat) {
Cursor feed = getFeedById(m_activeFeedId); Cursor feed = getFeedById(m_activeFeedId);
@ -816,13 +991,61 @@ public class OfflineActivity extends FragmentActivity implements
} else { } else {
getActionBar().setTitle(R.string.app_name); getActionBar().setTitle(R.string.app_name);
} */
m_navigationAdapter.clear();
if (m_activeCatId != -1 || (m_activeFeedId != 0 && m_smallScreenMode)) {
getActionBar().setDisplayShowTitleEnabled(false);
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
m_navigationAdapter.add(new RootNavigationEntry(getString(R.string.app_name)));
if (m_activeCatId != -1) {
Cursor cat = getCatById(m_activeCatId);
String title = cat.getString(cat.getColumnIndex("title"));
m_navigationAdapter.add(new CategoryNavigationEntry(m_activeCatId, title));
cat.close();
} }
if (!m_smallScreenMode) { if (m_activeFeedId != 0) {
getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0); Cursor feed = null;
if (m_activeFeedIsCat) {
feed = getCatById(m_activeFeedId);
} else { } else {
getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0 || m_activeFeedId != 0 || m_activeCatId != -1); feed = getFeedById(m_activeFeedId);
} }
String title = feed.getString(feed.getColumnIndex("title"));
m_navigationAdapter.add(new FeedNavigationEntry(m_activeFeedId, title));
feed.close();
}
//if (m_selectedArticle != null)
// m_navigationAdapter.add(new ArticleNavigationEntry(m_selectedArticle));
getActionBar().setSelectedNavigationItem(getActionBar().getNavigationItemCount());
} else {
getActionBar().setDisplayShowTitleEnabled(true);
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
getActionBar().setTitle(R.string.app_name);
}
//if (!m_smallScreenMode) {
// getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0);
//} else {
getActionBar().setDisplayHomeAsUpEnabled(m_selectedArticleId != 0 || m_activeFeedId != 0 || m_activeCatId != -1);
//}
if (android.os.Build.VERSION.SDK_INT >= 14) {
ShareActionProvider shareProvider = (ShareActionProvider) m_menu.findItem(R.id.share_article).getActionProvider();
if (m_selectedArticleId != 0) {
Log.d(TAG, "setting up share provider");
shareProvider.setShareIntent(getShareIntent(getArticleById(m_selectedArticleId)));
}
}
} }
} }
} }
@ -1282,6 +1505,7 @@ public class OfflineActivity extends FragmentActivity implements
@Override @Override
public void setSelectedArticleId(int articleId) { public void setSelectedArticleId(int articleId) {
m_selectedArticleId = articleId; m_selectedArticleId = articleId;
initMainMenu();
refreshViews(); refreshViews();
} }