package info.guardianproject.securereaderinterface; import info.guardianproject.securereader.Settings.SyncMode; import info.guardianproject.securereader.SocialReader; import info.guardianproject.securereader.SyncService; import info.guardianproject.securereader.FeedFetcher.FeedFetchedCallback; import info.guardianproject.securereaderinterface.models.FeedFilterType; import info.guardianproject.securereaderinterface.ui.ActionProviderFeedFilter; import info.guardianproject.securereaderinterface.ui.ActionProviderShare; import info.guardianproject.securereaderinterface.ui.UICallbackListener; import info.guardianproject.securereaderinterface.ui.UICallbacks; import info.guardianproject.securereaderinterface.ui.UICallbacks.OnCallbackListener; import info.guardianproject.securereaderinterface.views.StoryListHintTorView; import info.guardianproject.securereaderinterface.views.StoryListView; import info.guardianproject.securereaderinterface.views.StoryListHintTorView.OnButtonClickedListener; import info.guardianproject.securereaderinterface.R; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; import com.tinymission.rss.Feed; import com.tinymission.rss.Item; // HockeyApp SDK import net.hockeyapp.android.CrashManager; import net.hockeyapp.android.UpdateManager; public class MainActivity extends ItemExpandActivity implements OnSharedPreferenceChangeListener { public static String INTENT_EXTRA_SHOW_THIS_TYPE = "info.guardianproject.securereaderinterface.showThisFeedType"; public static String INTENT_EXTRA_SHOW_THIS_FEED = "info.guardianproject.securereaderinterface.showThisFeedId"; public static String INTENT_EXTRA_SHOW_THIS_ITEM = "info.guardianproject.securereaderinterface.showThisItemId"; public static String LOGTAG = "MainActivity"; // HockeyApp SDK public static String APP_ID = "NOT FOR MASTER BRANCH"; private boolean mIsInitialized; private long mShowItemId; private long mShowFeedId; private FeedFilterType mShowFeedFilterType; SocialReader socialReader; OnCallbackListener mCallbackListener; /* * The action bar menu item for the "TAG" option. Only show this when a feed * filter is set. */ MenuItem mMenuItemTag; boolean mShowTagMenuItem; MenuItem mMenuItemShare; MenuItem mMenuItemFeed; ActionProviderFeedFilter mAPFeedFilter; FeedFilterType mFeedFilterType; Feed mFeed; ActionProviderShare mShareActionProvider; StoryListView mStoryListView; boolean mIsLoading; private SyncMode mCurrentSyncMode; @Override public void onCreate(Bundle savedInstanceState) { mCurrentSyncMode = App.getSettings().syncMode(); // We do a little song and dance number here - This activity's theme is // set to NoActionBar in the manifest, but here we change to default app // theme again and request the action bar. This is because, at first // startup, the system will show a screen with default action bar and // default background. We don't want that. Instead we want to show solid // color (same as lock screen background) and no action bar. See // AppThemeNoActionBar theme for more information. requestWindowFeature(Window.FEATURE_ACTION_BAR); setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); getSupportActionBar().hide(); addUICallbackListener(); setContentView(R.layout.activity_main); setMenuIdentifier(R.menu.activity_main); mStoryListView = (StoryListView) findViewById(R.id.storyList); mStoryListView.setListener(this); socialReader = ((App) getApplicationContext()).socialReader; socialReader.setSyncServiceListener(new SyncService.SyncServiceListener() { @Override public void syncEvent(SyncService.SyncTask syncTask) { Log.v(LOGTAG, "Got a syncEvent"); if (syncTask.type == SyncService.SyncTask.TYPE_FEED && syncTask.status == SyncService.SyncTask.FINISHED) { refreshListIfCurrent(syncTask.feed); } } }); createFeedSpinner(); updateList(FeedFilterType.ALL_FEEDS, null); // HockeyApp SDK checkForUpdates(); } private void createFeedSpinner() { mAPFeedFilter = new ActionProviderFeedFilter(this); getSupportActionBar().setCustomView(mAPFeedFilter.onCreateActionView()); getSupportActionBar().setDisplayShowCustomEnabled(true); } @Override protected void onDestroy() { super.onDestroy(); removeUICallbackListener(); } @Override public void onResume() { super.onResume(); // If we are in the process of displaying the lock screen isFinishing is // actually // true, so avoid extra work! if (!isFinishing()) { // If we have not shown help yet, open that on top if (!App.getSettings().hasShownHelp()) { Intent intent = new Intent(this, HelpActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra("useLeftSideMenu", false); startActivity(intent); } else { if (!mIsInitialized) { mIsInitialized = true; UICallbacks.setFeedFilter(FeedFilterType.ALL_FEEDS, 0, MainActivity.this); getSupportActionBar().show(); } } } addSettingsChangeListener(); // Called with flags of which item to show? Intent intent = getIntent(); if (intent.hasExtra(INTENT_EXTRA_SHOW_THIS_ITEM) && intent.hasExtra(INTENT_EXTRA_SHOW_THIS_FEED)) { this.mShowFeedId = intent.getLongExtra(INTENT_EXTRA_SHOW_THIS_FEED, 0); this.mShowItemId = intent.getLongExtra(INTENT_EXTRA_SHOW_THIS_ITEM, 0); getIntent().removeExtra(INTENT_EXTRA_SHOW_THIS_FEED); getIntent().removeExtra(INTENT_EXTRA_SHOW_THIS_ITEM); } if (intent.hasExtra(INTENT_EXTRA_SHOW_THIS_TYPE)) { this.mShowFeedFilterType = (FeedFilterType) intent.getSerializableExtra(INTENT_EXTRA_SHOW_THIS_TYPE); getIntent().removeExtra(INTENT_EXTRA_SHOW_THIS_TYPE); } else if (socialReader.getDefaultFeedId() >= 0) { this.mShowFeedId = socialReader.getDefaultFeedId(); } else { this.mShowFeedFilterType = null; } if (this.mShowFeedFilterType != null) { Log.d(LOGTAG, "INTENT_EXTRA_SHOW_THIS_TYPE was set, show type " + this.mShowFeedFilterType.toString()); UICallbacks.setFeedFilter(this.mShowFeedFilterType, -1, MainActivity.this); this.mShowFeedFilterType = null; } else if (this.mShowFeedId != 0) { Log.d(LOGTAG, "INTENT_EXTRA_SHOW_THIS_FEED was set, show feed id " + this.mShowFeedId); UICallbacks.setFeedFilter(FeedFilterType.SINGLE_FEED, this.mShowFeedId, MainActivity.this); } // Resume sync if we are back from Orbot updateTorView(); // HockeyApp SDK checkForCrashes(); } // HockeyApp SDK private void checkForCrashes() { CrashManager.register(this, APP_ID); } // HockeyApp SDK private void checkForUpdates() { //Remove this for store builds! UpdateManager.register(this, APP_ID); } @Override public void onPause() { super.onPause(); removeSettingsChangeListener(); } @Override protected void onAfterResumeAnimation() { super.onAfterResumeAnimation(); if (!isFinishing() && App.getSettings().hasShownHelp()) { boolean willShowMenuHint = false; if (mLeftSideMenu != null) willShowMenuHint = mLeftSideMenu.showMenuHintIfNotShown(); if (socialReader.getFeedsList().size() > 0) { if (willShowMenuHint) { // Allow the menu animation some time before we start the // heavy work! mStoryListView.postDelayed(new Runnable() { @Override public void run() { refreshList(); } }, 6000); } else { refreshList(); } } } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } private void syncSpinnerToCurrentItem() { if (mFeedFilterType == FeedFilterType.ALL_FEEDS) mAPFeedFilter.setCurrentTitle(getString(R.string.feed_filter_all_feeds)); else if (mFeedFilterType == FeedFilterType.POPULAR) mAPFeedFilter.setCurrentTitle(getString(R.string.feed_filter_popular)); else if (mFeedFilterType == FeedFilterType.SHARED) mAPFeedFilter.setCurrentTitle(getString(R.string.feed_filter_shared_stories)); else if (mFeedFilterType == FeedFilterType.FAVORITES) mAPFeedFilter.setCurrentTitle(getString(R.string.feed_filter_favorites)); else if (mFeed != null) mAPFeedFilter.setCurrentTitle(mFeed.getTitle()); else mAPFeedFilter.setCurrentTitle(getString(R.string.feed_filter_all_feeds)); } private Feed getFeedById(long idFeed) { ArrayList<Feed> items = socialReader.getSubscribedFeedsList(); for (Feed feed : items) { if (feed.getDatabaseId() == idFeed) return feed; } return null; } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean ret = super.onCreateOptionsMenu(menu); // Find the tag menu item. Only to be shown when feed filter is set! mMenuItemTag = menu.findItem(R.id.menu_tag); mMenuItemTag.setVisible(mShowTagMenuItem); // Locate MenuItem with ShareActionProvider mMenuItemShare = menu.findItem(R.id.menu_share); if (mMenuItemShare != null) { mShareActionProvider = new ActionProviderShare(this); mShareActionProvider.setFeed(mFeed); mMenuItemShare.setActionProvider(mShareActionProvider); } // Locate MenuItem with ShareActionProvider // mMenuItemFeed = menu.findItem(R.id.menu_feed); // if (mMenuItemFeed != null) // { // mMenuItemFeed.setActionProvider(new ActionProviderFeedFilter(this)); // } return ret; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_tag: { showTagSearchPopup(getSupportActionBar().getCustomView()); return true; } } return super.onOptionsItemSelected(item); } @SuppressLint("NewApi") private void setTagItemVisible(boolean bVisible) { mShowTagMenuItem = bVisible && App.UI_ENABLE_TAGS; if (mMenuItemTag != null) { mMenuItemTag.setVisible(mShowTagMenuItem); if (Build.VERSION.SDK_INT >= 11) invalidateOptionsMenu(); } } @SuppressLint("NewApi") private void addUICallbackListener() { mCallbackListener = new UICallbackListener() { @SuppressLint("NewApi") @Override public void onFeedSelect(FeedFilterType type, long feedId, Object source) { Feed feed = null; boolean visibleTags = false; if (type == FeedFilterType.SINGLE_FEED) { feed = getFeedById(feedId); if (feed != null) { visibleTags = true; } } setTagItemVisible(visibleTags); updateList(type, feed); } @Override public void onItemFavoriteStatusChanged(Item item) { // An item has been marked/unmarked as favorite. Update the list // of favorites to pick // up this change! if (mFeedFilterType == FeedFilterType.FAVORITES) refreshList(); } @Override public void onCommand(int command, Bundle commandParameters) { switch (command) { case R.integer.command_add_feed_manual: { // First add it to reader! App.getInstance().socialReader.addFeedByURL(commandParameters.getString("uri"), MainActivity.this.mFeedFetchedCallback); refreshList(); break; } } } @Override public void onRequestResync(Feed feed) { onResync(feed, (mFeedFilterType == FeedFilterType.ALL_FEEDS || mFeedFilterType == FeedFilterType.SINGLE_FEED) && mFeed == feed); // Only show // spinner // if // updating // current // feed } }; UICallbacks.getInstance().addListener(mCallbackListener); } private void removeUICallbackListener() { if (mCallbackListener != null) UICallbacks.getInstance().removeListener(mCallbackListener); mCallbackListener = null; } private void addSettingsChangeListener() { App.getSettings().registerChangeListener(this); } private void removeSettingsChangeListener() { App.getSettings().unregisterChangeListener(this); } private void showTagSearchPopup(View anchorView) { try { LayoutInflater inflater = getLayoutInflater(); final PopupWindow mMenuPopup = new PopupWindow(inflater.inflate(R.layout.story_search_by_tag, null, false), this.mStoryListView.getWidth(), this.mStoryListView.getHeight(), true); ListView lvTags = (ListView) mMenuPopup.getContentView().findViewById(R.id.lvTags); String[] rgTags = new String[0]; // rgTags[0] = "#one"; // rgTags[1] = "#two"; // rgTags[2] = "#three"; // rgTags[3] = "#four"; ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.story_search_by_tag_item, R.id.tvTag, rgTags); lvTags.setAdapter(adapter); lvTags.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { String tag = (String) arg0.getAdapter().getItem(position); UICallbacks.setTagFilter(tag, null); mMenuPopup.dismiss(); } }); EditText editTag = (EditText) mMenuPopup.getContentView().findViewById(R.id.editTag); editTag.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_SEARCH) { UICallbacks.setTagFilter(v.getText().toString(), null); mMenuPopup.dismiss(); return true; } return false; } }); mMenuPopup.setOutsideTouchable(true); mMenuPopup.setBackgroundDrawable(new ColorDrawable(0x80ffffff)); mMenuPopup.showAsDropDown(anchorView); mMenuPopup.getContentView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMenuPopup.dismiss(); } }); } catch (Exception e) { e.printStackTrace(); } } @Override public void onResync() { if (mFeedFilterType == FeedFilterType.SHARED) refreshList(); else onResync(mFeed, true); } private void onResync(Feed feed, boolean showLoadingSpinner) { if (socialReader.isOnline() == SocialReader.NOT_ONLINE_NO_TOR) { socialReader.connectTor(this); } if (socialReader.isOnline() == SocialReader.ONLINE) { setIsLoading(showLoadingSpinner); if (feed == null) socialReader.manualSyncSubscribedFeeds(mFeedFetchedCallback); else socialReader.manualSyncFeed(feed, mFeedFetchedCallback); } } @Override protected void configureActionBarForFullscreen(boolean fullscreen) { if (mMenuItemFeed != null) mMenuItemFeed.setVisible(!fullscreen); if (mMenuItemShare != null) mMenuItemShare.setVisible(!fullscreen); if (!fullscreen) { getSupportActionBar().setDisplayShowCustomEnabled(true); setDisplayHomeAsUp(false); } else { getSupportActionBar().setDisplayShowCustomEnabled(false); setDisplayHomeAsUp(true); } } private void setIsLoading(boolean isLoading) { mIsLoading = isLoading; if (mStoryListView != null) mStoryListView.setIsLoading(mIsLoading); updateTorView(); } private void showError(String error) { if (mStoryListView != null) { if (TextUtils.isEmpty(error)) mStoryListView.hideError(); else mStoryListView.showError(error); } } private UpdateFeedListTask mUpdateListTask; @SuppressLint({ "InlinedApi", "NewApi" }) private void updateList(FeedFilterType feedFilterType, Feed optionalFeed) { boolean isUpdate = (feedFilterType == mFeedFilterType); mFeedFilterType = feedFilterType; mFeed = optionalFeed; if (!isUpdate) setIsLoading(true); if (mUpdateListTask != null) mUpdateListTask.cancel(true); mUpdateListTask = new UpdateFeedListTask(this, mFeedFilterType, optionalFeed, isUpdate); //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) // mUpdateListTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); //else mUpdateListTask.execute(); syncSpinnerToCurrentItem(); if (mShareActionProvider != null) mShareActionProvider.setFeed(mFeed); mStoryListView.setCurrentFeed(mFeed); } private void refreshList() { updateList(mFeedFilterType, mFeed); } private void refreshListIfCurrent(Feed feed) { if (mFeedFilterType == FeedFilterType.ALL_FEEDS) { refreshList(); } else if (mFeedFilterType == FeedFilterType.SINGLE_FEED && mFeed != null && mFeed.getDatabaseId() == feed.getDatabaseId()) { mFeed = feed; refreshList(); } } private void checkShowStoryFullScreen(ArrayList<Item> items) { if (mShowItemId != 0) { Log.v(LOGTAG, "Loaded feed and INTENT_EXTRA_SHOW_THIS_ITEM was set to " + mShowItemId + ". Try to show it"); for (int itemIndex = 0; itemIndex < items.size(); itemIndex++) { Item item = items.get(itemIndex); if (item.getDatabaseId() == mShowItemId) { Log.v(LOGTAG, "Found item at index " + itemIndex); this.openStoryFullscreen(items, itemIndex, mStoryListView.getListView(), null); } } mShowFeedId = 0; mShowItemId = 0; } } private ArrayList<Item> flattenFeedArray(ArrayList<Feed> listOfFeeds) { ArrayList<Item> items = new ArrayList<Item>(); if (listOfFeeds != null) { Iterator<Feed> itFeed = listOfFeeds.iterator(); while (itFeed.hasNext()) { Feed feed = itFeed.next(); Log.v(LOGTAG, "Adding " + feed.getItemCount() + " items"); items.addAll(feed.getItems()); } } Log.v(LOGTAG, "There are " + items.size() + " items total"); return items; } private boolean showErrorForFeed(Feed feed, boolean onlyRemoveIfAllOk) { if (feed.getStatus() == Feed.STATUS_LAST_SYNC_FAILED_404) { if (!onlyRemoveIfAllOk) this.showError(getString(R.string.error_feed_404)); } else if (feed.getStatus() == Feed.STATUS_LAST_SYNC_FAILED_BAD_URL) { if (!onlyRemoveIfAllOk) this.showError(getString(R.string.error_feed_bad_url)); } else if (feed.getStatus() == Feed.STATUS_LAST_SYNC_FAILED_UNKNOWN) { if (!onlyRemoveIfAllOk) this.showError(getString(R.string.error_feed_unknown)); } else { this.showError(null); return false; } return true; } private final FeedFetchedCallback mFeedFetchedCallback = new FeedFetchedCallback() { @Override public void feedFetched(Feed _feed) { Log.v(LOGTAG, "feedFetched Callback"); refreshListIfCurrent(_feed); } }; private StoryListHintTorView mTorView; @Override protected boolean onCommand(int command, Bundle commandParameters) { if (command == R.integer.command_resync) { onResync(); return true; } return super.onCommand(command, commandParameters); } @Override public void onHeaderCreated(View headerView, int resIdHeader) { if (resIdHeader == R.layout.story_list_hint_tor) { mTorView = (StoryListHintTorView) headerView; updateTorView(); } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Log.v(LOGTAG, "The setting " + key + " has changed."); // if (Settings.KEY_SYNC_MODE.equals(key)) // { // } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // Probably opening a popup (Feed Spinner). Remember what sync mode was // set to when we open. if (!hasFocus) { mCurrentSyncMode = App.getSettings().syncMode(); } else { if (mCurrentSyncMode != App.getSettings().syncMode()) { mCurrentSyncMode = App.getSettings().syncMode(); refreshList(); } } } private void updateTorView() { if (mTorView == null) return; if (!App.getSettings().requireTor() || mIsLoading) { mTorView.setVisibility(View.GONE); } else { mTorView.setOnButtonClickedListener(new OnButtonClickedListener() { private StoryListHintTorView mView; @Override public void onNoNetClicked() { int onlineMode = App.getInstance().socialReader.isOnline(); mView.setIsOnline(!(onlineMode == SocialReader.NOT_ONLINE_NO_WIFI || onlineMode == SocialReader.NOT_ONLINE_NO_WIFI_OR_NETWORK), onlineMode == SocialReader.ONLINE); } @Override public void onGoOnlineClicked() { onResync(); } public OnButtonClickedListener init(StoryListHintTorView view) { mView = view; return this; } }.init(mTorView)); int onlineMode = App.getInstance().socialReader.isOnline(); mTorView.setIsOnline(!(onlineMode == SocialReader.NOT_ONLINE_NO_WIFI || onlineMode == SocialReader.NOT_ONLINE_NO_WIFI_OR_NETWORK), onlineMode == SocialReader.ONLINE); mTorView.setVisibility(View.VISIBLE); } } @Override protected void onWipe() { super.onWipe(); UICallbacks.setFeedFilter(FeedFilterType.SINGLE_FEED, -1, this); } class UpdateFeedListTask extends ThreadedTask<Void, Void, ArrayList<Feed>> { private Context mContext; private FeedFilterType mFeedFilterType; private Feed mFeed; private boolean mIsUpdate; public UpdateFeedListTask(Context context, FeedFilterType feedFilterType, Feed feed, boolean isUpdate) { mContext = context; mFeedFilterType = feedFilterType; mFeed = feed; mIsUpdate = isUpdate; } @Override protected ArrayList<Feed> doInBackground(Void... values) { Log.v(LOGTAG, "UpdateFeedListTask: doInBackground"); ArrayList<Feed> listOfFeeds = null; if (mFeedFilterType == FeedFilterType.SHARED) { listOfFeeds = socialReader.getAllShared(); } else if (mFeedFilterType == FeedFilterType.FAVORITES) { listOfFeeds = socialReader.getAllFavorites(); } else if (mFeedFilterType == FeedFilterType.ALL_FEEDS || mFeed == null) { Log.v(LOGTAG, "UpdateFeedsTask: all subscribed"); listOfFeeds = new ArrayList<Feed>(); listOfFeeds.add(socialReader.getSubscribedFeedItems()); } else { Log.v(LOGTAG, "UpdateFeedsTask: " + mFeed.getTitle()); listOfFeeds = new ArrayList<Feed>(); listOfFeeds.add(socialReader.getFeed(mFeed)); } return listOfFeeds; } @Override protected void onPostExecute(ArrayList<Feed> result) { Log.v(LOGTAG, "RefreshFeedsTask: finished"); switch (mFeedFilterType) { case ALL_FEEDS: case SINGLE_FEED: { Feed _feed = result.get(0); if (mFeed != null && mFeed.getDatabaseId() == _feed.getDatabaseId()) mFeed = _feed; // need to update to get NetworkPullDate // Any errors to show? showError(null); for (Feed feed : result) { if (feed != null) { if (showErrorForFeed(feed, !mIsLoading)) break; } } int headerViewId = 0; ArrayList<Item> items = result.get(0).getItems(); if (items == null || items.size() == 0) { headerViewId = R.layout.story_list_hint_tor; } mStoryListView.updateItems(mContext, items, headerViewId, mIsUpdate); checkShowStoryFullScreen(items); } break; case FAVORITES: { ArrayList<Item> favoriteItems = new ArrayList<Item>(); if (result != null) { Iterator<Feed> itFeed = result.iterator(); while (itFeed.hasNext()) { Feed feed = itFeed.next(); favoriteItems.addAll(feed.getItems()); } } boolean fakedItems = false; if (favoriteItems.size() == 0) { // No real favorites, so we fake some by randomly picking // Items from // the "all items" feed fakedItems = true; Feed allSubscribed = App.getInstance().socialReader.getSubscribedFeedItems(); if (allSubscribed != null) { ArrayList<Item> allSubscribedItems = allSubscribed.getItems(); // Truncate to random 5 items Collections.shuffle(allSubscribedItems); favoriteItems.addAll(allSubscribedItems.subList(0, Math.min(5, allSubscribedItems.size()))); } } boolean shouldShowAddFavoriteHint = fakedItems || favoriteItems == null || favoriteItems.size() == 0; mStoryListView.updateItems(mContext, favoriteItems, shouldShowAddFavoriteHint ? R.layout.story_list_hint_add_favorite : 0, mIsUpdate); break; } case POPULAR: // TODO break; case SHARED: { ArrayList<Item> items = flattenFeedArray(result); boolean shouldShowNoSharedHint = (items == null || items.size() == 0); mStoryListView.updateItems(mContext, items, shouldShowNoSharedHint ? R.layout.story_list_hint_no_shared : 0, mIsUpdate); checkShowStoryFullScreen(items); } break; } setIsLoading(false); } } @Override protected void onUnlocked() { super.onUnlocked(); socialReader = ((App) getApplicationContext()).socialReader; createFeedSpinner(); updateList(FeedFilterType.ALL_FEEDS, null); } }