com.audiokernel.euphonyrmt.MainMenuActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.audiokernel.euphonyrmt.MainMenuActivity.java

Source

/*
 * Copyright (C) 2010-2014 The MPDroid Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.audiokernel.euphonyrmt;

import com.audiokernel.euphonyrmt.fragments.BrowseFragment;
import com.audiokernel.euphonyrmt.fragments.LibraryFragment;
import com.audiokernel.euphonyrmt.fragments.OutputsFragment;
import com.audiokernel.euphonyrmt.fragments.QueueFragment;
import com.audiokernel.euphonyrmt.helpers.MPDConnectionHandler;
import com.audiokernel.euphonyrmt.helpers.MPDControl;
import com.audiokernel.euphonyrmt.library.ILibraryFragmentActivity;
import com.audiokernel.euphonyrmt.library.ILibraryTabActivity;
import com.audiokernel.euphonyrmt.tools.LibraryTabsUtil;
import com.audiokernel.euphonyrmt.tools.Tools;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;

import org.a0z.mpd.MPD;
import org.a0z.mpd.MPDStatus;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentManager.OnBackStackChangedListener;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.PopupMenuCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

public class MainMenuActivity extends MPDroidActivities.MPDroidActivity
        implements ActionBar.OnNavigationListener, ILibraryFragmentActivity, ILibraryTabActivity,
        OnBackStackChangedListener, PopupMenu.OnMenuItemClickListener {

    private final MPDApplication mApp = MPDApplication.getInstance();
    public static final int ARTISTS = 2;

    public static final int LIBRARY = 7;

    public static final int PLAYLIST = 1;

    public static final int STREAM = 6;

    private static final int CONNECT = 8;

    private static final boolean DEBUG = false;

    private static final String EXTRA_DISPLAY_MODE = "displaymode";

    private static final String EXTRA_SLIDING_PANEL_EXPANDED = "slidingpanelexpanded";

    private static final String FRAGMENT_TAG_LIBRARY = "library";

    private static final String FRAGMENT_TAG_OUTPUTS = "outputs";

    private static final int SETTINGS = 5;

    private static final List<String> TAB_LIST;

    private static final String TAG = "MainMenuActivity";

    private int mBackPressExitCount;

    private DisplayMode mCurrentDisplayMode;

    private DrawerLayout mDrawerLayout;

    private ListView mDrawerList;

    private ActionBarDrawerToggle mDrawerToggle;

    private Handler mExitCounterReset = new Handler();

    private FragmentManager mFragmentManager;

    private View mHeaderDragView;

    private PopupMenu mHeaderOverflowPopupMenu;

    private ImageButton mHeaderPlayQueue;

    private TextView mHeaderTitle;

    private boolean mIsDualPaneMode;

    private LibraryFragment mLibraryFragment;

    private View mLibraryRootFrame;

    private ViewPager mNowPlayingPager;

    private int mOldDrawerPosition = 0;

    private OutputsFragment mOutputsFragment;

    private View mOutputsRootFrame;

    private QueueFragment mQueueFragment;

    private SlidingUpPanelLayout mSlidingLayout;

    private TextView mTextView;

    static {
        // Get the list of the currently visible tabs
        TAB_LIST = LibraryTabsUtil.getCurrentLibraryTabs();

        final StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    private static void setMenuChecked(final MenuItem item, final boolean checked) {
        item.setChecked(checked);
    }

    @Override
    public List<String> getTabList() {
        return Collections.unmodifiableList(TAB_LIST);
    }

    private ListView initializeDrawerList() {
        final ListView drawerList = (ListView) findViewById(R.id.left_drawer);
        final DrawerItem[] drawerItems = {
                new DrawerItem(getString(R.string.libraryTabActivity), DrawerItem.Action.ACTION_LIBRARY),

                new DrawerItem(getString(R.string.outputs), DrawerItem.Action.ACTION_OUTPUTS),

                new DrawerItem(getString(R.string.settings), DrawerItem.Action.ACTION_SETTINGS),
                new DrawerItem("Euphony Settings...", DrawerItem.Action.ACTION_LOON_CLIENT),
                new DrawerItem("Euphony File Manager...", DrawerItem.Action.ACTION_LOON_FM),
                new DrawerItem("Euphony Reboot", DrawerItem.Action.ACTION_LOON_REBOOT),
                new DrawerItem("Euphony Shutdown", DrawerItem.Action.ACTION_LOON_SHUTDOWN) };

        // Set the adapter for the list view
        drawerList.setAdapter(new ArrayAdapter<>(this, R.layout.drawer_list_item, drawerItems));
        drawerList.setItemChecked(mOldDrawerPosition, true);

        // Set the list's click listener
        drawerList.setOnItemClickListener(new DrawerItemClickListener());

        return drawerList;
    }

    private ActionBarDrawerToggle initializeDrawerToggle() {
        final int drawerImageRes;

        // Set up the action bar.
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        //actionBar.setCustomView(mTextView);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayShowCustomEnabled(false);
        actionBar.setIcon(R.drawable.icon);
        actionBar.setTitle("");//ZV

        //actionBar.setBackgroundDrawable(new ColorDrawable(Color.rgb(197, 197, 197))); //ZV

        final ArrayAdapter<CharSequence> actionBarAdapter = new ArrayAdapter<>(actionBar.getThemedContext(),
                android.R.layout.simple_spinner_item);
        for (final String tab : TAB_LIST) {
            actionBarAdapter.add(getText(LibraryTabsUtil.getTabTitleResId(tab)));
        }

        actionBarAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        actionBar.setListNavigationCallbacks(actionBarAdapter, this);

        /**
         * @param Activity activity
         * @param DrawerLayout
         * @param drawerImageRes nav drawer icon to replace 'Up' caret
         * @param openDrawerContentDescRes "open drawer" description
         * @param closeDrawerContentDescRes "close drawer" description
         */
        return new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {

            /**
             * Called when a drawer has settled in a completely closed
             * state.
             */
            @Override
            public void onDrawerClosed(final View drawerView) {
                refreshActionBarTitle();
            }

            /**
             * Called when a drawer has settled in a completely open
             * state.
             */
            @Override
            public void onDrawerOpened(final View drawerView) {
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
                actionBar.setDisplayShowCustomEnabled(true);
                actionBar.setTitle(R.string.app_name);//ZV
                //mTextView.setText(R.string.app_name); ZV
            }
        };
    }

    private PopupMenu initializeHeaderOverflowPopup(final View headerOverflowMenu) {
        final PopupMenu resultPopupMenu;

        if (headerOverflowMenu == null) {
            resultPopupMenu = null;
        } else {
            final PopupMenu popupMenu = new PopupMenu(this, headerOverflowMenu);
            popupMenu.getMenuInflater().inflate(R.menu.mpd_mainmenu, popupMenu.getMenu());
            popupMenu.getMenuInflater().inflate(R.menu.mpd_playlistmenu, popupMenu.getMenu());
            popupMenu.getMenu().removeItem(R.id.PLM_EditPL);
            popupMenu.setOnMenuItemClickListener(this);

            headerOverflowMenu.setOnTouchListener(PopupMenuCompat.getDragToOpenListener(popupMenu));

            headerOverflowMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View v) {
                    if (mSlidingLayout != null && mSlidingLayout.isPanelExpanded()) {
                        prepareNowPlayingMenu(popupMenu.getMenu());
                        popupMenu.show();
                    }
                }
            });

            resultPopupMenu = popupMenu;
        }

        return resultPopupMenu;
    }

    private ImageButton initializeHeaderPlayQueue() {
        final ImageButton headerPlayQueue = (ImageButton) findViewById(R.id.header_show_queue);

        if (headerPlayQueue != null) {
            headerPlayQueue.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View v) {
                    if (mNowPlayingPager != null && mSlidingLayout != null && mSlidingLayout.isPanelExpanded()) {
                        if (mNowPlayingPager.getCurrentItem() == 0) {
                            showQueue();
                        } else {
                            mNowPlayingPager.setCurrentItem(0, true);
                            refreshQueueIndicator(false);
                        }
                    }
                }
            });
        }

        return headerPlayQueue;
    }

    private LibraryFragment initializeLibraryFragment() {
        LibraryFragment fragment = (LibraryFragment) mFragmentManager.findFragmentByTag(FRAGMENT_TAG_LIBRARY);

        if (fragment == null) {
            fragment = new LibraryFragment();
            final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.replace(R.id.library_root_frame, fragment, FRAGMENT_TAG_LIBRARY);
            ft.commit();
        }

        return fragment;
    }

    private ViewPager initializeNowPlayingPager() {
        final ViewPager nowPlayingPager = (ViewPager) findViewById(R.id.pager);
        if (nowPlayingPager != null) {
            nowPlayingPager.setAdapter(new MainMenuPagerAdapter());
            nowPlayingPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(final int position) {
                    refreshQueueIndicator(position != 0);
                }
            });
        }

        return nowPlayingPager;
    }

    private OutputsFragment initializeOutputsFragment() {
        OutputsFragment fragment = (OutputsFragment) mFragmentManager.findFragmentByTag(FRAGMENT_TAG_OUTPUTS);

        if (fragment == null) {
            fragment = new OutputsFragment();
            final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.replace(R.id.outputs_root_frame, fragment, FRAGMENT_TAG_OUTPUTS);
            ft.commit();
        }

        return fragment;
    }

    private SlidingUpPanelLayout initializeSlidingLayout(final Bundle savedInstanceState) {
        final SlidingUpPanelLayout slidingLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
        final SlidingUpPanelLayout.PanelSlideListener panelSlideListener = initializeSlidingPanelLayout();

        slidingLayout.setEnableDragViewTouchEvents(true);
        slidingLayout.setPanelHeight((int) getResources().getDimension(R.dimen.nowplaying_small_fragment_height));
        slidingLayout.setPanelSlideListener(panelSlideListener);

        // Ensure that the view state is consistent (otherwise we end up with a view mess)
        // The sliding layout should take care of it itself but does not
        if (savedInstanceState != null) {
            if ((Boolean) savedInstanceState.getSerializable(EXTRA_SLIDING_PANEL_EXPANDED)) {
                slidingLayout.expandPanel();
                panelSlideListener.onPanelSlide(slidingLayout, 1.0f);
                panelSlideListener.onPanelExpanded(slidingLayout);
            } else {
                slidingLayout.collapsePanel();
                panelSlideListener.onPanelSlide(slidingLayout, 0.0f);
                panelSlideListener.onPanelCollapsed(slidingLayout);
            }
        }

        return slidingLayout;
    }

    private SlidingUpPanelLayout.PanelSlideListener initializeSlidingPanelLayout() {

        return new SlidingUpPanelLayout.PanelSlideListener() {
            final View nowPlayingSmallFragment = findViewById(R.id.now_playing_small_fragment);

            @Override
            public void onPanelAnchored(final View panel) {
            }

            @Override
            public void onPanelCollapsed(final View panel) {
                nowPlayingSmallFragment.setVisibility(View.VISIBLE);
                nowPlayingSmallFragment.setAlpha(1.0f);
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            }

            @Override
            public void onPanelExpanded(final View panel) {
                nowPlayingSmallFragment.setVisibility(View.GONE);
                nowPlayingSmallFragment.setAlpha(1.0f);
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }

            @Override
            public void onPanelHidden(final View view) {
            }

            @Override
            public void onPanelSlide(final View panel, final float slideOffset) {
                final ActionBar actionBar = getSupportActionBar();

                if (slideOffset > 0.3f) {
                    if (actionBar.isShowing()) {
                        actionBar.hide();
                    }
                } else {
                    if (!actionBar.isShowing()) {
                        actionBar.show();
                    }
                }

                if (slideOffset < 1.0f) {
                    nowPlayingSmallFragment.setVisibility(View.VISIBLE);
                } else {
                    nowPlayingSmallFragment.setVisibility(View.GONE);
                }

                nowPlayingSmallFragment.setAlpha(1.0f - slideOffset);
            }
        };
    }

    private TextView initializeTextView() {
        final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final TextView textView = (TextView) inflater.inflate(R.layout.actionbar_title, null);

        textView.setFocusable(true);
        textView.setFocusableInTouchMode(true);
        textView.setSelected(true);
        textView.requestFocus();

        return textView;
    }

    @Override
    public void onBackPressed() {
        if (mSlidingLayout.isPanelExpanded()) {
            mSlidingLayout.collapsePanel();
        } else if (mCurrentDisplayMode != DisplayMode.MODE_LIBRARY) {
            switchMode(DisplayMode.MODE_LIBRARY);
        } else if (mFragmentManager.getBackStackEntryCount() > 0) {
            super.onBackPressed();
        } else {
            final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

            if (settings.getBoolean("enableExitConfirmation", false) && mBackPressExitCount < 1) {
                Tools.notifyUser(R.string.backpressToQuit);
                mBackPressExitCount += 1;
                mExitCounterReset.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mBackPressExitCount = 0;
                    }
                }, 5000L);
            } else {
                finish();
            }
        }
    }

    @Override
    public void onBackStackChanged() {
        refreshActionBarTitle();
    }

    @Override
    public void onConfigurationChanged(final Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (mApp.hasGooglePlayDeathWarningBeenDisplayed() && !mApp.hasGooglePlayThankYouBeenDisplayed()) {
            new AlertDialog.Builder(this).setTitle(getString(R.string.gpThanksTitle))
                    .setMessage(getString(R.string.gpThanksMessage))
                    .setNegativeButton(getString(R.string.gpThanksOkButton), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(final DialogInterface dialogInterface, final int i) {
                            mApp.markGooglePlayThankYouAsRead();
                        }
                    }).setCancelable(false).show();
        }

        mApp.setupServiceBinder();

        if (mApp.isTabletUiEnabled()) {
            setContentView(R.layout.main_activity_nagvigation_tablet);
        } else {
            setContentView(R.layout.main_activity_nagvigation);
        }

        mTextView = initializeTextView();

        mLibraryRootFrame = findViewById(R.id.library_root_frame);
        mOutputsRootFrame = findViewById(R.id.outputs_root_frame);

        mIsDualPaneMode = findViewById(R.id.nowplaying_dual_pane) != null;

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        mDrawerToggle = initializeDrawerToggle();

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerList = initializeDrawerList();

        mFragmentManager = getSupportFragmentManager();
        mFragmentManager.addOnBackStackChangedListener(this);

        mLibraryFragment = initializeLibraryFragment();
        mOutputsFragment = initializeOutputsFragment();
        mQueueFragment = (QueueFragment) mFragmentManager.findFragmentById(R.id.queue_fragment);

        // Setup the pager
        mNowPlayingPager = initializeNowPlayingPager();

        if (savedInstanceState == null) {
            switchMode(DisplayMode.MODE_LIBRARY);
        } else {
            switchMode((DisplayMode) savedInstanceState.getSerializable(EXTRA_DISPLAY_MODE));
        }

        mHeaderTitle = (TextView) findViewById(R.id.header_title);
        mHeaderDragView = findViewById(R.id.header_dragview);
        mHeaderPlayQueue = initializeHeaderPlayQueue();

        final ImageButton headerOverflowMenu = (ImageButton) findViewById(R.id.header_overflow_menu);
        if (headerOverflowMenu != null) {
            mHeaderOverflowPopupMenu = initializeHeaderOverflowPopup(headerOverflowMenu);
        }

        // Sliding panel
        mSlidingLayout = initializeSlidingLayout(savedInstanceState);
        refreshQueueIndicator(false);

        /** Reset the persistent override when the application is reset. */
        mApp.setPersistentOverride(false);
    }

    @Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.mpd_searchmenu, menu);
        return true;
    }

    @Override
    public boolean onKeyDown(final int keyCode, final KeyEvent event) {
        final boolean result;

        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            // For onKeyLongPress to work
            event.startTracking();
            result = !mApp.isLocalAudible();
        } else {
            result = super.onKeyDown(keyCode, event);
        }

        return result;
    }

    @Override
    public boolean onKeyLongPress(final int keyCode, final KeyEvent event) {
        boolean result = true;

        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            MPDControl.run(MPDControl.ACTION_NEXT);
            break;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            MPDControl.run(MPDControl.ACTION_PREVIOUS);
            break;
        default:
            result = super.onKeyLongPress(keyCode, event);
            break;
        }
        return result;
    }

    @Override
    public final boolean onKeyUp(final int keyCode, @NonNull final KeyEvent event) {
        boolean result = true;

        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (event.isTracking() && !event.isCanceled() && !mApp.isLocalAudible()) {
                if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                    MPDControl.run(MPDControl.ACTION_VOLUME_STEP_UP);
                } else {
                    MPDControl.run(MPDControl.ACTION_VOLUME_STEP_DOWN);
                }
            }
            break;
        default:
            result = super.onKeyUp(keyCode, event);
            break;
        }

        return result;
    }

    @Override
    public boolean onMenuItemClick(final MenuItem item) {
        return onOptionsItemSelected(item);
    }

    @Override
    public boolean onNavigationItemSelected(final int itemPosition, final long itemId) {
        mLibraryFragment.setCurrentItem(itemPosition, true);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        boolean result = true;
        final boolean itemHandled = mDrawerToggle.onOptionsItemSelected(item)
                || mQueueFragment != null && mQueueFragment.onOptionsItemSelected(item);

        // Handle item selection
        if (!itemHandled) {
            switch (item.getItemId()) {
            case R.id.menu_search:
                onSearchRequested();
                break;
            case CONNECT:
                mApp.connect();
                break;
            case R.id.GMM_Stream:
                if (mApp.isStreamActive()) {
                    mApp.stopStreaming();
                } else if (mApp.oMPDAsyncHelper.oMPD.isConnected()) {
                    mApp.startStreaming();
                }
                break;
            case R.id.GMM_Consume:
                MPDControl.run(MPDControl.ACTION_CONSUME);
                break;
            case R.id.GMM_Single:
                MPDControl.run(MPDControl.ACTION_SINGLE);
                break;
            case R.id.GMM_ShowNotification:
                if (mApp.isNotificationActive()) {
                    mApp.stopNotification();
                } else {
                    mApp.startNotification();
                    mApp.setPersistentOverride(false);
                }
                break;
            default:
                result = super.onOptionsItemSelected(item);
                break;
            }
        }
        return result;
    }

    @Override
    protected void onPause() {
        if (DEBUG) {
            unregisterReceiver(MPDConnectionHandler.getInstance());
        }
        super.onPause();
    }

    @Override
    protected void onPostCreate(final Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public boolean onPrepareOptionsMenu(final Menu menu) {
        // Reminder: Never disable buttons that are shown as actionbar actions here.
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        mBackPressExitCount = 0;
        if (DEBUG) {
            registerReceiver(MPDConnectionHandler.getInstance(),
                    new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
        }
    }

    @Override
    public void onSaveInstanceState(final Bundle outState) {
        outState.putSerializable(EXTRA_DISPLAY_MODE, mCurrentDisplayMode);
        outState.putSerializable(EXTRA_SLIDING_PANEL_EXPANDED, mSlidingLayout.isPanelExpanded());
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onStart() {
        super.onStart();
        mApp.setActivity(this);

        if (mApp.isNotificationPersistent()) {
            mApp.startNotification();
        }
    }

    @Override
    public void onStop() {
        super.onStop();

        mApp.unsetActivity(this);
    }

    @Override
    public void pageChanged(final int position) {
        final ActionBar actionBar = getSupportActionBar();
        if (mCurrentDisplayMode == DisplayMode.MODE_LIBRARY
                && actionBar.getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST) {
            actionBar.setSelectedNavigationItem(position);
        }
    }

    void prepareNowPlayingMenu(final Menu menu) {
        final boolean isStreaming = mApp.isStreamActive();
        final MPD mpd = mApp.oMPDAsyncHelper.oMPD;
        final MPDStatus mpdStatus = mpd.getStatus();

        // Reminder : never disable buttons that are shown as actionbar actions here
        if (mpd.isConnected()) {
            if (menu.findItem(CONNECT) != null) {
                menu.removeItem(CONNECT);
            }
        } else {
            if (menu.findItem(CONNECT) == null) {
                menu.add(0, CONNECT, 0, R.string.connect);
            }
        }

        final MenuItem saveItem = menu.findItem(R.id.PLM_Save);
        final MenuItem clearItem = menu.findItem(R.id.PLM_Clear);
        if (!mIsDualPaneMode && mNowPlayingPager != null && mNowPlayingPager.getCurrentItem() == 0) {
            saveItem.setVisible(false);
            clearItem.setVisible(false);
        } else {
            saveItem.setVisible(true);
            clearItem.setVisible(true);
        }

        /** If in streamingMode or persistentNotification don't allow a checkbox in the menu. */
        final MenuItem notificationItem = menu.findItem(R.id.GMM_ShowNotification);
        if (notificationItem != null) {
            if (isStreaming || mApp.isNotificationPersistent()) {
                notificationItem.setVisible(false);
            } else {
                notificationItem.setVisible(true);
            }

            setMenuChecked(notificationItem, mApp.isNotificationActive());
        }

        setMenuChecked(menu.findItem(R.id.GMM_Stream), isStreaming);
        setMenuChecked(menu.findItem(R.id.GMM_Single), mpdStatus.isSingle());
        setMenuChecked(menu.findItem(R.id.GMM_Consume), mpdStatus.isConsume());
    }

    @Override
    public void pushLibraryFragment(final Fragment fragment, final String label) {
        final String title;
        if (fragment instanceof BrowseFragment) {
            title = ((BrowseFragment) fragment).getTitle();
        } else {
            title = fragment.toString();
        }
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.replace(R.id.library_root_frame, fragment);
        ft.addToBackStack(label);
        ft.setBreadCrumbTitle(title);
        ft.commit();
    }

    /**
     * Navigation Drawer helpers
     */

    private void refreshActionBarTitle() {
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setTitle("");
        if (mCurrentDisplayMode == DisplayMode.MODE_OUTPUTS) {
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
            if (mCurrentDisplayMode == DisplayMode.MODE_OUTPUTS) {
                //ZV mTextView.setText(R.string.outputs);
                actionBar.setTitle(R.string.outputs);//ZV
            }
        } else if (mCurrentDisplayMode == DisplayMode.MODE_LIBRARY) {
            int fmStackCount = 0;

            if (mFragmentManager != null) {
                fmStackCount = mFragmentManager.getBackStackEntryCount();
            }

            if (fmStackCount > 0) {
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
                //ZV mTextView.setText(mFragmentManager.getBackStackEntryAt(fmStackCount - 1).getBreadCrumbTitle());
                actionBar.setTitle(mFragmentManager.getBackStackEntryAt(fmStackCount - 1).getBreadCrumbTitle()); //ZV
            } else {
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                actionBar.setDisplayShowCustomEnabled(false);
            }
        }
    }

    void refreshQueueIndicator(final boolean queueShown) {
        if (mHeaderPlayQueue != null) {
            if (queueShown) {
                mHeaderPlayQueue.setAlpha(1.0f);
            } else {
                mHeaderPlayQueue.setAlpha(0.5f);
            }
        }
        if (mHeaderTitle != null) {
            if (queueShown && !mIsDualPaneMode) {
                mHeaderTitle.setText(R.string.playQueue);
            } else {
                mHeaderTitle.setText(R.string.nowPlaying);
            }
        }

        // Restrain the sliding panel sliding zone
        if (mSlidingLayout != null) {
            if (queueShown) {
                mSlidingLayout.setDragView(mHeaderDragView);
            } else {
                mSlidingLayout.setDragView(null);
                // Sliding layout made mHeaderDragView clickable, revert it
                mHeaderDragView.setClickable(false);
            }
        }
    }

    public void showQueue() {
        if (mSlidingLayout != null) {
            mSlidingLayout.expandPanel();
        }
        if (mNowPlayingPager != null) {
            mNowPlayingPager.setCurrentItem(1, true);
        }
        refreshQueueIndicator(true);
    }

    /** Swaps fragments in the main content view */
    void switchMode(final DisplayMode newMode) {
        mCurrentDisplayMode = newMode;
        switch (mCurrentDisplayMode) {
        case MODE_LIBRARY:
            mLibraryRootFrame.setVisibility(View.VISIBLE);
            mOutputsRootFrame.setVisibility(View.GONE);
            break;
        case MODE_OUTPUTS:
            mLibraryRootFrame.setVisibility(View.GONE);
            mOutputsRootFrame.setVisibility(View.VISIBLE);
            mOutputsFragment.refreshOutputs();
            break;
        }
        refreshActionBarTitle();
    }

    public enum DisplayMode {
        MODE_LIBRARY, MODE_OUTPUTS
    }

    private static class DrawerItem {

        private final Action mAction;

        private final String mLabel;

        DrawerItem(final String label, final Action action) {
            super();
            mLabel = label;
            mAction = action;
        }

        @Override
        public String toString() {
            return mLabel;
        }

        private enum Action {
            ACTION_LIBRARY, ACTION_OUTPUTS, ACTION_SETTINGS, ACTION_LOON_CLIENT, ACTION_LOON_FM, ACTION_LOON_REBOOT, ACTION_LOON_SHUTDOWN
        }
    }

    private class DrawerItemClickListener implements AdapterView.OnItemClickListener {

        @Override
        public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
            mDrawerLayout.closeDrawer(mDrawerList);

            switch (((DrawerItem) parent.getItemAtPosition(position)).mAction) {
            case ACTION_LIBRARY:
                // If we are already on the library, pop the whole stack.
                // Acts like an "up" button
                if (mCurrentDisplayMode == DisplayMode.MODE_LIBRARY) {
                    final int fmStackCount = mFragmentManager.getBackStackEntryCount();
                    if (fmStackCount > 0) {
                        mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    }
                }
                switchMode(DisplayMode.MODE_LIBRARY);
                break;
            case ACTION_OUTPUTS:
                switchMode(DisplayMode.MODE_OUTPUTS);
                break;
            case ACTION_SETTINGS:
                mDrawerList.setItemChecked(mOldDrawerPosition, true);
                final Intent intent = new Intent(MainMenuActivity.this, SettingsActivity.class);
                startActivityForResult(intent, SETTINGS);
                break;
            case ACTION_LOON_CLIENT:
                final String serverName = mApp.oMPDAsyncHelper.getConnectionSettings().server;
                String url = "http://" + serverName + "/settings";
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);
                break;
            case ACTION_LOON_FM:
                final String serverName2 = mApp.oMPDAsyncHelper.getConnectionSettings().server;
                url = "http://" + serverName2 + ":8080/";
                i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);
                break;
            case ACTION_LOON_REBOOT:
                final String serverName3 = mApp.oMPDAsyncHelper.getConnectionSettings().server;
                PostTask pt = new PostTask();
                pt.execute(serverName3, "reboot");
                break;
            case ACTION_LOON_SHUTDOWN:
                final String serverName4 = mApp.oMPDAsyncHelper.getConnectionSettings().server;
                PostTask pt2 = new PostTask();
                pt2.execute(serverName4, "shutdown");
                break;

            }
            mOldDrawerPosition = position;
        }
    }

    private class PostTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... data) {
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://" + data[0] + "/" + data[1]);

            try {
                //execute http post
                HttpResponse response = httpclient.execute(httppost);

            } catch (ClientProtocolException e) {

            } catch (IOException e) {

            }
            return null;
        }
    }

    private class MainMenuPagerAdapter extends PagerAdapter {

        @Override
        public void destroyItem(final ViewGroup container, final int position, final Object object) {
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Object instantiateItem(final ViewGroup container, final int position) {
            int resId = 0;

            switch (position) {
            case 0:
                resId = R.id.nowplaying_fragment;
                break;
            case 1:
                resId = R.id.queue_fragment;
                break;
            default:
                break;
            }

            return findViewById(resId);
        }

        @Override
        public boolean isViewFromObject(final View arg0, final Object arg1) {
            return arg0.equals(arg1);
        }
    }
}