diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java | 363 |
1 files changed, 241 insertions, 122 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 6f6b68579..254749cd6 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -1,8 +1,11 @@ package de.danoeh.antennapod.activity; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.database.DataSetObserver; import android.media.AudioManager; import android.os.AsyncTask; import android.os.Bundle; @@ -21,15 +24,16 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.Validate; import java.util.List; -import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.NavListAdapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.StorageUtils; @@ -43,37 +47,40 @@ import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; import de.danoeh.antennapod.preferences.PreferenceController; +import de.greenrobot.event.EventBus; /** * The activity that is shown when the user launches the app. */ public class MainActivity extends ActionBarActivity implements NavDrawerActivity { + private static final String TAG = "MainActivity"; + private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.FEED_LIST_UPDATE - | EventDistributor.UNREAD_ITEMS_UPDATE - | EventDistributor.QUEUE_UPDATE; + | EventDistributor.UNREAD_ITEMS_UPDATE; public static final String PREF_NAME = "MainActivityPrefs"; public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch"; - public static final String PREF_LAST_FRAGMENT = "prefMainActivityLastFragment"; + public static final String PREF_LAST_FRAGMENT_TAG = "prefMainActivityLastFragmentTag"; - public static final String EXTRA_NAV_INDEX = "nav_index"; public static final String EXTRA_NAV_TYPE = "nav_type"; + public static final String EXTRA_NAV_INDEX = "nav_index"; + public static final String EXTRA_FRAGMENT_TAG = "fragment_tag"; public static final String EXTRA_FRAGMENT_ARGS = "fragment_args"; public static final String SAVE_BACKSTACK_COUNT = "backstackCount"; - public static final String SAVE_SELECTED_NAV_INDEX = "selectedNavIndex"; public static final String SAVE_TITLE = "title"; - - public static final int POS_QUEUE = 0, - POS_NEW = 1, - POS_ALL_EPISODES = 2, - POS_DOWNLOADS = 3, - POS_HISTORY = 4, - POS_ADD = 5; + public static final String[] NAV_DRAWER_TAGS = { + QueueFragment.TAG, + NewEpisodesFragment.TAG, + AllEpisodesFragment.TAG, + DownloadsFragment.TAG, + PlaybackHistoryFragment.TAG, + AddFeedFragment.TAG + }; private Toolbar toolbar; private ExternalPlayerFragment externalPlayerFragment; @@ -88,7 +95,6 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity private CharSequence drawerTitle; private CharSequence currentTitle; - @Override public void onCreate(Bundle savedInstanceState) { setTheme(UserPreferences.getNoTitleTheme()); @@ -106,30 +112,12 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navList = (ListView) findViewById(R.id.nav_list); navDrawer = findViewById(R.id.nav_layout); - Log.i(TAG, ""); - drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close) { - @Override - public void onDrawerOpened(View drawerView) { - super.onDrawerOpened(drawerView); - currentTitle = getSupportActionBar().getTitle(); - getSupportActionBar().setTitle(drawerTitle); - supportInvalidateOptionsMenu(); - } - - @Override - public void onDrawerClosed(View drawerView) { - super.onDrawerClosed(drawerView); - getSupportActionBar().setTitle(currentTitle); - supportInvalidateOptionsMenu(); - - } - }; + drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close); if (savedInstanceState != null) { int backstackCount = savedInstanceState.getInt(SAVE_BACKSTACK_COUNT, 0); drawerToggle.setDrawerIndicatorEnabled(backstackCount == 0); } - drawerLayout.setDrawerListener(drawerToggle); final FragmentManager fm = getSupportFragmentManager(); @@ -141,25 +129,20 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } }); - FragmentTransaction transaction = fm.beginTransaction(); - - Fragment mainFragment = fm.findFragmentByTag("main"); - if (mainFragment != null) { - transaction.replace(R.id.main_view, mainFragment); - } else { - loadFragment(NavListAdapter.VIEW_TYPE_NAV, getLastNavFragment(), null); - } - - externalPlayerFragment = new ExternalPlayerFragment(); - transaction.replace(R.id.playerFragment, externalPlayerFragment); - transaction.commit(); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); navAdapter = new NavListAdapter(itemAccess, this); navList.setAdapter(navAdapter); navList.setOnItemClickListener(navListClickListener); + navList.setOnItemLongClickListener(newListLongClickListener); + + navAdapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + selectedNavListIndex = getSelectedNavListIndex(); + } + }); findViewById(R.id.nav_settings).setOnClickListener(new View.OnClickListener() { @Override @@ -169,19 +152,40 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } }); + FragmentTransaction transaction = fm.beginTransaction(); + + Fragment mainFragment = fm.findFragmentByTag("main"); + if (mainFragment != null) { + transaction.replace(R.id.main_view, mainFragment); + } else { + String lastFragment = getLastNavFragment(); + if(ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) { + loadFragment(lastFragment, null); + } + // else: lastFragment contains feed id - drawer data is not loaded yet, + // so loading is postponed until then + } + externalPlayerFragment = new ExternalPlayerFragment(); + transaction.replace(R.id.playerFragment, externalPlayerFragment); + transaction.commit(); + checkFirstLaunch(); } - private void saveLastNavFragment(int relPos) { + private void saveLastNavFragment(String tag) { SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor edit = prefs.edit(); - edit.putInt(PREF_LAST_FRAGMENT, relPos); + if(tag != null) { + edit.putString(PREF_LAST_FRAGMENT_TAG, tag); + } else { + edit.remove(PREF_LAST_FRAGMENT_TAG); + } edit.commit(); } - private int getLastNavFragment() { + private String getLastNavFragment() { SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE); - return prefs.getInt(PREF_LAST_FRAGMENT, POS_QUEUE); + return prefs.getString(PREF_LAST_FRAGMENT_TAG, QueueFragment.TAG); } private void checkFirstLaunch() { @@ -200,6 +204,40 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } } + public void showDrawerPreferencesDialog() { + final List<String> hiddenDrawerItems = UserPreferences.getHiddenDrawerItems(); + String[] navLabels = new String[NAV_DRAWER_TAGS.length]; + final boolean[] checked = new boolean[NAV_DRAWER_TAGS.length]; + for (int i = 0; i < NAV_DRAWER_TAGS.length; i++) { + String tag = NAV_DRAWER_TAGS[i]; + navLabels[i] = navAdapter.getLabel(tag); + if (!hiddenDrawerItems.contains(tag)) { + checked[i] = true; + } + } + + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setTitle(R.string.drawer_preferences); + builder.setMultiChoiceItems(navLabels, checked, new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, boolean isChecked) { + if (isChecked) { + hiddenDrawerItems.remove(NAV_DRAWER_TAGS[which]); + } else { + hiddenDrawerItems.add(NAV_DRAWER_TAGS[which]); + } + } + }); + builder.setPositiveButton(R.string.confirm_label, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + UserPreferences.setHiddenDrawerItems(MainActivity.this, hiddenDrawerItems); + } + }); + builder.setNegativeButton(R.string.cancel_label, null); + builder.create().show(); + } + public ActionBar getMainActivtyActionBar() { return getSupportActionBar(); } @@ -212,74 +250,97 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity return (navDrawerData != null) ? navDrawerData.feeds : null; } - private void loadFragment(int viewType, int relPos, Bundle args) { - FragmentManager fragmentManager = getSupportFragmentManager(); - // clear back stack - for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) { - fragmentManager.popBackStack(); + public void loadFragment(int index, Bundle args) { + if (index < navAdapter.getSubscriptionOffset()) { + String tag = navAdapter.getTags().get(index); + loadFragment(tag, args); + } else { + int pos = index - navAdapter.getSubscriptionOffset(); + loadFeedFragmentByPosition(pos, args); } + } - FragmentTransaction fT = fragmentManager.beginTransaction(); + public void loadFragment(final String tag, Bundle args) { + Log.d(TAG, "loadFragment(\"" + tag + "\", " + args + ")"); Fragment fragment = null; - if (viewType == NavListAdapter.VIEW_TYPE_NAV) { - switch (relPos) { - case POS_NEW: - fragment = new NewEpisodesFragment(); - break; - case POS_ALL_EPISODES: - fragment = new AllEpisodesFragment(); - break; - case POS_QUEUE: - fragment = new QueueFragment(); - break; - case POS_DOWNLOADS: - fragment = new DownloadsFragment(); - break; - case POS_HISTORY: - fragment = new PlaybackHistoryFragment(); - break; - case POS_ADD: - fragment = new AddFeedFragment(); - break; - - } - currentTitle = getString(NavListAdapter.NAV_TITLES[relPos]); - selectedNavListIndex = relPos; - saveLastNavFragment(relPos); - - } else if (viewType == NavListAdapter.VIEW_TYPE_SUBSCRIPTION) { - Feed feed = itemAccess.getItem(relPos); - currentTitle = ""; - fragment = ItemlistFragment.newInstance(feed.getId()); - selectedNavListIndex = NavListAdapter.SUBSCRIPTION_OFFSET + relPos; - + switch (tag) { + case QueueFragment.TAG: + fragment = new QueueFragment(); + break; + case NewEpisodesFragment.TAG: + fragment = new NewEpisodesFragment(); + break; + case AllEpisodesFragment.TAG: + fragment = new AllEpisodesFragment(); + break; + case DownloadsFragment.TAG: + fragment = new DownloadsFragment(); + break; + case PlaybackHistoryFragment.TAG: + fragment = new PlaybackHistoryFragment(); + break; + case AddFeedFragment.TAG: + fragment = new AddFeedFragment(); + break; } - if (fragment != null) { - if (args != null) { - fragment.setArguments(args); - } - fT.replace(R.id.main_view, fragment, "main"); - fragmentManager.popBackStack(); - } - fT.commit(); + currentTitle = navAdapter.getLabel(tag); getSupportActionBar().setTitle(currentTitle); - if (navAdapter != null) { - navAdapter.notifyDataSetChanged(); + saveLastNavFragment(tag); + if (args != null) { + fragment.setArguments(args); } + loadFragment(fragment); } - public void loadNavFragment(int position, Bundle args) { - loadFragment(NavListAdapter.VIEW_TYPE_NAV, position, args); + private void loadFeedFragmentByPosition(int relPos, Bundle args) { + if(relPos < 0) { + return; + } + Feed feed = itemAccess.getItem(relPos); + long feedId = feed.getId(); + Fragment fragment = ItemlistFragment.newInstance(feedId); + if(args != null) { + fragment.setArguments(args); + } + saveLastNavFragment(String.valueOf(feed.getId())); + currentTitle = ""; + getSupportActionBar().setTitle(currentTitle); + loadFragment(fragment); } - public void loadFeedFragment(long feedID) { + public void loadFeedFragmentById(long feedId) { if (navDrawerData != null) { - for (int i = 0; i < navDrawerData.feeds.size(); i++) { - if (navDrawerData.feeds.get(i).getId() == feedID) { - loadFragment(NavListAdapter.VIEW_TYPE_SUBSCRIPTION, i, null); - break; + int relPos = -1; + List<Feed> feeds = navDrawerData.feeds; + for (int i = 0; relPos < 0 && i < feeds.size(); i++) { + if (feeds.get(i).getId() == feedId) { + relPos = i; } } + if(relPos >= 0) { + loadFeedFragmentByPosition(relPos, null); + } + } + } + + private void loadFragment(Fragment fragment) { + FragmentManager fragmentManager = getSupportFragmentManager(); + // clear back stack + for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) { + fragmentManager.popBackStack(); + } + FragmentTransaction t = fragmentManager.beginTransaction(); + t.replace(R.id.main_view, fragment, "main"); + fragmentManager.popBackStack(); + // TODO: we have to allow state loss here + // since this function can get called from an AsyncTask which + // could be finishing after our app has already committed state + // and is about to get shutdown. What we *should* do is + // not commit anything in an AsyncTask, but that's a bigger + // change than we want now. + t.commitAllowingStateLoss(); + if (navAdapter != null) { + navAdapter.notifyDataSetChanged(); } } @@ -300,20 +361,52 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity return toolbar; } + private int getSelectedNavListIndex() { + String lastFragment = getLastNavFragment(); + int tagIndex = navAdapter.getTags().indexOf(lastFragment); + if(tagIndex >= 0) { + return tagIndex; + } else if(ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) { + // the fragment was just hidden + return -1; + } else { // last fragment was not a list, but a feed + long feedId = Long.parseLong(lastFragment); + if (navDrawerData != null) { + List<Feed> feeds = navDrawerData.feeds; + for (int i = 0; i < feeds.size(); i++) { + if (feeds.get(i).getId() == feedId) { + return i + navAdapter.getSubscriptionOffset(); + } + } + } + return -1; + } + } + private AdapterView.OnItemClickListener navListClickListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int viewType = parent.getAdapter().getItemViewType(position); if (viewType != NavListAdapter.VIEW_TYPE_SECTION_DIVIDER && position != selectedNavListIndex) { - int relPos = (viewType == NavListAdapter.VIEW_TYPE_NAV) ? position : position - NavListAdapter.SUBSCRIPTION_OFFSET; - loadFragment(viewType, relPos, null); - selectedNavListIndex = position; - navAdapter.notifyDataSetChanged(); + loadFragment(position, null); } drawerLayout.closeDrawer(navDrawer); } }; + private AdapterView.OnItemLongClickListener newListLongClickListener = new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { + if(position < navAdapter.getTags().size()) { + showDrawerPreferencesDialog(); + return true; + } else { + return false; + } + } + }; + + @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); @@ -323,7 +416,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity if (!drawerLayout.isDrawerOpen(navDrawer)) { getSupportActionBar().setTitle(currentTitle); } - selectedNavListIndex = savedInstanceState.getInt(SAVE_SELECTED_NAV_INDEX); + selectedNavListIndex = getSelectedNavListIndex(); } } @@ -337,9 +430,14 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(SAVE_TITLE, getSupportActionBar().getTitle().toString()); - outState.putInt(SAVE_SELECTED_NAV_INDEX, selectedNavListIndex); outState.putInt(SAVE_BACKSTACK_COUNT, getSupportFragmentManager().getBackStackEntryCount()); + } + @Override + public void onStart() { + super.onStart(); + EventDistributor.getInstance().register(contentUpdate); + EventBus.getDefault().register(this); } @Override @@ -351,10 +449,10 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity protected void onResume() { super.onResume(); StorageUtils.checkStorageAvailability(this); - EventDistributor.getInstance().register(contentUpdate); Intent intent = getIntent(); - if (navDrawerData != null && intent.hasExtra(EXTRA_NAV_INDEX) && intent.hasExtra(EXTRA_NAV_TYPE)) { + if (navDrawerData != null && intent.hasExtra(EXTRA_NAV_TYPE) && + (intent.hasExtra(EXTRA_NAV_INDEX) || intent.hasExtra(EXTRA_FRAGMENT_TAG))) { handleNavIntent(); } @@ -366,6 +464,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity super.onStop(); cancelLoadTask(); EventDistributor.getInstance().unregister(contentUpdate); + EventBus.getDefault().unregister(this); } @Override @@ -382,7 +481,6 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } } - private DBReader.NavDrawerData navDrawerData; private AsyncTask<Void, Void, DBReader.NavDrawerData> loadTask; private int selectedNavListIndex = 0; @@ -417,10 +515,14 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } @Override - public int getNumberOfUnreadItems() { - return (navDrawerData != null) ? navDrawerData.numUnreadItems : 0; + public int getNumberOfNewItems() { + return (navDrawerData != null) ? navDrawerData.numNewItems : 0; } + @Override + public int getNumberOfUnreadFeedItems(long feedId) { + return (navDrawerData != null) ? navDrawerData.numUnreadFeedItems.get(feedId) : 0; + } }; @@ -440,6 +542,13 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity navDrawerData = result; navAdapter.notifyDataSetChanged(); + String lastFragment = getLastNavFragment(); + if(!ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) { + long feedId = Long.valueOf(lastFragment); + loadFeedFragmentById(feedId); + saveLastNavFragment(null); + } + if (handleIntent) { handleNavIntent(); } @@ -454,25 +563,35 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } } + public void onEvent(QueueEvent event) { + Log.d(TAG, "onEvent(" + event + ")"); + loadData(); + } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((EVENTS & arg) != 0) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received contentUpdate Intent."); + Log.d(TAG, "Received contentUpdate Intent."); loadData(); } } }; private void handleNavIntent() { + Log.d(TAG, "handleNavIntent()"); Intent intent = getIntent(); - if (intent.hasExtra(EXTRA_NAV_INDEX) && intent.hasExtra(EXTRA_NAV_TYPE)) { - int index = intent.getIntExtra(EXTRA_NAV_INDEX, 0); - int type = intent.getIntExtra(EXTRA_NAV_TYPE, NavListAdapter.VIEW_TYPE_NAV); + if (intent.hasExtra(EXTRA_NAV_TYPE) && + intent.hasExtra(EXTRA_NAV_INDEX) || intent.hasExtra(EXTRA_FRAGMENT_TAG)) { + int index = intent.getIntExtra(EXTRA_NAV_INDEX, -1); + String tag = intent.getStringExtra(EXTRA_FRAGMENT_TAG); Bundle args = intent.getBundleExtra(EXTRA_FRAGMENT_ARGS); - loadFragment(type, index, args); + if (index >= 0) { + loadFragment(index, args); + } else if (tag != null) { + loadFragment(tag, args); + } } setIntent(new Intent(MainActivity.this, MainActivity.class)); // to avoid handling the intent twice when the configuration changes } |