org.runbuddy.tomahawk.activities.TomahawkMainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.runbuddy.tomahawk.activities.TomahawkMainActivity.java

Source

/* == This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
 *
 *   Copyright 2012, Christopher Reichert <creichert07@gmail.com>
 *   Copyright 2012, Enno Gottschalk <mrmaffen@googlemail.com>
 *
 *   Tomahawk is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   Tomahawk is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
 */
package org.runbuddy.tomahawk.activities;

import android.accounts.AccountManager;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.media.AudioManager;
import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager;
import android.support.v4.media.MediaBrowserCompat;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import com.uservoice.uservoicesdk.Config;
import com.uservoice.uservoicesdk.UserVoice;

import org.jdeferred.DoneCallback;
import org.runbuddy.libtomahawk.authentication.AuthenticatorManager;
import org.runbuddy.libtomahawk.authentication.AuthenticatorUtils;
import org.runbuddy.libtomahawk.authentication.HatchetAuthenticatorUtils;
import org.runbuddy.libtomahawk.collection.Album;
import org.runbuddy.libtomahawk.collection.Artist;
import org.runbuddy.libtomahawk.collection.CollectionManager;
import org.runbuddy.libtomahawk.collection.DbCollection;
import org.runbuddy.libtomahawk.collection.Playlist;
import org.runbuddy.libtomahawk.collection.StationPlaylist;
import org.runbuddy.libtomahawk.database.DatabaseHelper;
import org.runbuddy.libtomahawk.database.TomahawkSQLiteHelper;
import org.runbuddy.libtomahawk.infosystem.InfoRequestData;
import org.runbuddy.libtomahawk.infosystem.InfoSystem;
import org.runbuddy.libtomahawk.infosystem.User;
import org.runbuddy.libtomahawk.resolver.PipeLine;
import org.runbuddy.libtomahawk.resolver.Query;
import org.runbuddy.libtomahawk.resolver.Result;
import org.runbuddy.libtomahawk.resolver.UserCollectionStubResolver;
import org.runbuddy.libtomahawk.resolver.models.ScriptResolverUrlResult;
import org.runbuddy.libtomahawk.utils.ViewUtils;
import org.runbuddy.libtomahawk.utils.parser.XspfParser;
import org.runbuddy.tomahawk.R;
import org.runbuddy.tomahawk.adapters.SuggestionSimpleCursorAdapter;
import org.runbuddy.tomahawk.app.TomahawkApp;
import org.runbuddy.tomahawk.dialogs.GMusicConfigDialog;
import org.runbuddy.tomahawk.dialogs.InstallPluginConfigDialog;
import org.runbuddy.tomahawk.dialogs.WarnOldPluginDialog;
import org.runbuddy.tomahawk.listeners.TomahawkPanelSlideListener;
import org.runbuddy.tomahawk.services.PlaybackService;

import org.runbuddy.tomahawk.ui.fragments.ArtistPagerFragment;
import org.runbuddy.tomahawk.ui.fragments.ContentHeaderFragment;
import org.runbuddy.tomahawk.ui.fragments.ContextMenuFragment;
import org.runbuddy.tomahawk.ui.fragments.PlaylistEntriesFragment;
import org.runbuddy.tomahawk.ui.fragments.PreferencePagerFragment;
import org.runbuddy.tomahawk.ui.fragments.SearchPagerFragment;
import org.runbuddy.tomahawk.ui.fragments.TomahawkFragment;
import org.runbuddy.tomahawk.ui.fragments.WelcomeFragment;
import org.runbuddy.tomahawk.utils.AnimationUtils;
import org.runbuddy.tomahawk.utils.FragmentUtils;
import org.runbuddy.tomahawk.utils.IdGenerator;
import org.runbuddy.tomahawk.utils.MediaPlayIntentHandler;
import org.runbuddy.tomahawk.utils.MenuDrawer;
import org.runbuddy.tomahawk.utils.PlaybackManager;
import org.runbuddy.tomahawk.utils.PluginUtils;
import org.runbuddy.tomahawk.utils.PreferenceUtils;
import org.runbuddy.tomahawk.utils.SearchViewStyle;
import org.runbuddy.tomahawk.utils.ThreadManager;
import org.runbuddy.tomahawk.utils.TomahawkRunnable;
import org.runbuddy.tomahawk.views.PlaybackPanel;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import de.greenrobot.event.EventBus;
import fr.castorflex.android.smoothprogressbar.SmoothProgressBar;

/**
 * The main Tomahawk activity
 * appcompaActivity
 */
public class TomahawkMainActivity extends AppCompatActivity {

    private final static String TAG = TomahawkMainActivity.class.getSimpleName();
    public static final String SAVED_PLAYBACK_STATE = "saved_playback_state";
    public static final String SHOW_PLAYBACKFRAGMENT_ON_STARTUP = "show_playbackfragment_on_startup";
    protected final HashSet<String> mCorrespondingRequestIds = new HashSet<>();
    private MediaBrowserCompat mMediaBrowser;
    private int mPlaybackState = PlaybackStateCompat.STATE_NONE;
    //NavigationView navigationView;2016.08.10??

    private final MediaBrowserCompat.ConnectionCallback mConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {
        @Override
        public void onConnected() {
            Log.d(TAG, "MediaBrowser connected");
            try {
                MediaControllerCompat mediaController = new MediaControllerCompat(TomahawkMainActivity.this,
                        mMediaBrowser.getSessionToken());
                setSupportMediaController(mediaController);
                mediaController.registerCallback(mMediaCallback);
                mPlaybackPanel.setMediaController(mediaController);
                mMediaCallback.onPlaybackStateChanged(mediaController.getPlaybackState());
                ContentHeaderFragment.MediaControllerConnectedEvent event = new ContentHeaderFragment.MediaControllerConnectedEvent();
                EventBus.getDefault().post(event);
            } catch (RemoteException e) {
                Log.e(TAG, "Could not connect media controller: ", e);
            }
        }
    };

    private final MediaControllerCompat.Callback mMediaCallback = new MediaControllerCompat.Callback() {
        @Override
        public void onPlaybackStateChanged(@NonNull PlaybackStateCompat state) {
            Log.d(TAG, "onPlaybackstate changed" + state);
            mPlaybackState = state.getState();
            mPlaybackPanel.updatePlaybackState(state);
            if (getSupportMediaController() != null) {
                String playbackManagerId = getSupportMediaController().getExtras()
                        .getString(PlaybackService.EXTRAS_KEY_PLAYBACKMANAGER);
                PlaybackManager playbackManager = PlaybackManager.getByKey(playbackManagerId);
                if (playbackManager != null && (playbackManager.getCurrentEntry() != null
                        || playbackManager.getPlaylist() instanceof StationPlaylist)) {
                    showPanel();
                } else {
                    hidePanel();
                }
            } else {
                hidePanel();
            }
        }

        @Override
        public void onMetadataChanged(MediaMetadataCompat metadata) {
            if (metadata != null) {
                Log.d(TAG, "onMetadataChanged changed" + metadata);
                mPlaybackPanel.updateMetadata(metadata);
            }
        }

        @Override
        public void onQueueChanged(List<MediaSessionCompat.QueueItem> queue) {
        }
    };

    private MenuItem mSearchItem;
    private MenuDrawer mMenuDrawer;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mTitle;
    private CharSequence mDrawerTitle;
    private TomahawkMainReceiver mTomahawkMainReceiver;
    private SmoothProgressBar mSmoothProgressBar;
    private SlidingUpPanelLayout mSlidingUpPanelLayout;
    private TomahawkPanelSlideListener mPanelSlideListener;
    private PlaybackPanel mPlaybackPanel;
    private View mActionBarBg;
    private boolean mDestroyed;
    private Handler mShouldShowAnimationHandler;

    private final Runnable mShouldShowAnimationRunnable = new Runnable() {
        @Override
        public void run() {
            if (ThreadManager.get().isActive() || mPlaybackState == PlaybackStateCompat.STATE_BUFFERING
                    || CollectionManager.get().getUserCollection().isWorking()) {
                mSmoothProgressBar.setVisibility(View.VISIBLE);
            } else {
                mSmoothProgressBar.setVisibility(View.GONE);
            }
            mShouldShowAnimationHandler.postDelayed(mShouldShowAnimationRunnable, 500);
        }
    };

    public static class ShowWebViewEvent {

        public int mRequestid;

        public String mUrl;
    }

    /**
     * Handles incoming broadcasts.
     */
    private class TomahawkMainReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
                boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                if (!noConnectivity) {
                    AuthenticatorUtils hatchetAuthUtils = AuthenticatorManager.get()
                            .getAuthenticatorUtils(TomahawkApp.PLUGINNAME_HATCHET);
                    InfoSystem.get().sendLoggedOps(hatchetAuthUtils);
                }
            }
        }
    }

    /**
     * If the {@link PipeLine} was able to parse a given url (like a link to a spotify track for
     * example), then this method receives the result object.
     *
     * @param event the result object which contains the parsed data
     */
    @SuppressWarnings("unused")
    public void onEventAsync(PipeLine.UrlResultsEvent event) {
        final Bundle bundle = new Bundle();
        List<Query> queries;
        Query query;
        Playlist playlist;
        switch (event.mResult.type) {
        case PipeLine.URL_TYPE_ARTIST:
            bundle.putString(TomahawkFragment.ARTIST, Artist.get(event.mResult.artist).getCacheKey());
            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC_PAGER);
            bundle.putLong(TomahawkFragment.CONTAINER_FRAGMENT_ID, IdGenerator.getSessionUniqueId());
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    FragmentUtils.replace(TomahawkMainActivity.this, ArtistPagerFragment.class, bundle);
                }
            });
            break;
        case PipeLine.URL_TYPE_ALBUM:
            Artist artist = Artist.get(event.mResult.artist);
            bundle.putString(TomahawkFragment.ALBUM, Album.get(event.mResult.album, artist).getCacheKey());
            bundle.putString(TomahawkFragment.COLLECTION_ID, TomahawkApp.PLUGINNAME_HATCHET);
            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC);
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class, bundle);
                }
            });
            break;
        case PipeLine.URL_TYPE_TRACK:
            queries = new ArrayList<>();
            query = Query.get(event.mResult.track, "", event.mResult.artist, false);
            queries.add(query);
            playlist = Playlist.fromQueryList(IdGenerator.getSessionUniqueStringId(),
                    event.mResult.track + " - " + event.mResult.artist, "", queries);
            playlist.setFilled(true);
            bundle.putString(TomahawkFragment.PLAYLIST, playlist.getCacheKey());
            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC);
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class, bundle);
                }
            });
            break;
        case PipeLine.URL_TYPE_PLAYLIST:
            queries = new ArrayList<>();
            for (ScriptResolverUrlResult track : event.mResult.tracks) {
                query = Query.get(track.track, "", track.artist, false);
                if (event.mResolver != null && event.mResolver.isEnabled() && track.hint != null) {
                    Result result = Result.get(track.hint, query.getBasicTrack(), event.mResolver);
                    float trackScore = query.howSimilar(result);
                    query.addTrackResult(result, trackScore);
                }
                queries.add(query);
            }
            playlist = Playlist.fromQueryList(IdGenerator.getLifetimeUniqueStringId(), event.mResult.title, null,
                    queries);
            playlist.setFilled(true);
            bundle.putString(TomahawkFragment.PLAYLIST, playlist.getCacheKey());
            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC);
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class, bundle);
                }
            });
            break;
        case PipeLine.URL_TYPE_XSPFURL:
            Playlist pl = XspfParser.parse(event.mResult.url);
            if (pl != null) {
                bundle.putString(TomahawkFragment.PLAYLIST, pl.getCacheKey());
                bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC);
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class, bundle);
                    }
                });
            }
            break;
        }
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(DbCollection.InitializedEvent event) {
        MenuDrawer.updateDrawer(mMenuDrawer, this);
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(InfoSystem.ResultsEvent event) {
        if (mCorrespondingRequestIds.contains(event.mInfoRequestData.getRequestId())) {
            if (event.mInfoRequestData != null
                    && event.mInfoRequestData.getType() == InfoRequestData.INFOREQUESTDATA_TYPE_USERS) {
                MenuDrawer.updateDrawer(mMenuDrawer, this);
            }
        }
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(CollectionManager.AddedOrRemovedEvent event) {
        MenuDrawer.updateDrawer(mMenuDrawer, this);
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(HatchetAuthenticatorUtils.UserLoginEvent event) {
        MenuDrawer.updateDrawer(mMenuDrawer, this);
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(AuthenticatorManager.ConfigTestResultEvent event) {
        if (event.mComponent instanceof HatchetAuthenticatorUtils
                && (event.mType == AuthenticatorManager.CONFIG_TEST_RESULT_TYPE_SUCCESS
                        || event.mType == AuthenticatorManager.CONFIG_TEST_RESULT_TYPE_LOGOUT)) {
            onHatchetLoggedInOut(event.mType == AuthenticatorManager.CONFIG_TEST_RESULT_TYPE_SUCCESS);
        }
    }

    @SuppressWarnings("unused")
    public void onEventMainThread(ShowWebViewEvent event) {
        Intent intent = new Intent(this, WebViewActivity.class);
        intent.putExtra(WebViewActivity.URL_EXTRA, event.mUrl);
        intent.putExtra(WebViewActivity.REQUESTID_EXTRA, event.mRequestid);
        startActivity(intent);
    }

    @SuppressWarnings("unused")
    public void onEventAsync(PipeLine.ResolversChangedEvent event) {
        String resolverId = event.mScriptResolver.getId();
        if ((resolverId.equals(TomahawkApp.PLUGINNAME_DEEZER) || resolverId.equals(TomahawkApp.PLUGINNAME_SPOTIFY))
                && event.mScriptResolver.isEnabled() && !PluginUtils.isPluginUpToDate(resolverId)) {
            PipeLine.get().getResolver(resolverId).setEnabled(false);
            WarnOldPluginDialog dialog = new WarnOldPluginDialog();
            Bundle args = new Bundle();
            args.putString(TomahawkFragment.PREFERENCEID, resolverId);
            if (PluginUtils.isPluginInstalled(resolverId)) {
                args.putString(TomahawkFragment.MESSAGE, getString(R.string.warn_old_plugin));
            } else {
                args.putString(TomahawkFragment.MESSAGE, getString(R.string.warn_no_plugin));
            }
            dialog.setArguments(args);
            dialog.show(getSupportFragmentManager(), null);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        GMusicConfigDialog.ActivityResultEvent event = new GMusicConfigDialog.ActivityResultEvent();
        event.resultCode = resultCode;
        event.requestCode = requestCode;
        EventBus.getDefault().post(event);
    }

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

        PipeLine.get();
        CollectionManager.get().getUserCollection().loadMediaItems(false);
        setContentView(R.layout.tomahawk_main_activity);
        mMediaBrowser = new MediaBrowserCompat(this, new ComponentName(this, PlaybackService.class),
                mConnectionCallback, null);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        mSmoothProgressBar = (SmoothProgressBar) findViewById(R.id.smoothprogressbar);
        mTitle = mDrawerTitle = getTitle().toString().toUpperCase();
        getSupportActionBar().setTitle("");
        mPlaybackPanel = (PlaybackPanel) findViewById(R.id.playback_panel);
        mSlidingUpPanelLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
        FragmentUtils.addPlaybackFragment(this);
        mPanelSlideListener = new TomahawkPanelSlideListener(this, mSlidingUpPanelLayout, mPlaybackPanel);
        mSlidingUpPanelLayout.setPanelSlideListener(mPanelSlideListener);
        if (mPlaybackState != PlaybackStateCompat.STATE_NONE) {
            showPanel();
        } else {
            hidePanel();
        }

        mActionBarBg = findViewById(R.id.action_bar_background);

        mMenuDrawer = (MenuDrawer) findViewById(R.id.drawer_layout);
        if (mMenuDrawer != null) {
            mDrawerToggle = new ActionBarDrawerToggle(this, mMenuDrawer, R.string.drawer_open,
                    R.string.drawer_close) {
                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
                    getSupportActionBar().setTitle(mTitle);
                }

                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
                    getSupportActionBar().setTitle(mDrawerTitle);
                    if (mSearchItem != null) {
                        MenuItemCompat.collapseActionView(mSearchItem);
                    }
                }
            };
            // Set the drawer toggle as the DrawerListener
            mMenuDrawer.addDrawerListener(mDrawerToggle);
        }

        // set customization variables on the ActionBar
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setDisplayShowCustomEnabled(true);

        //Setup UserVoice
        Config config = new Config("tomahawk.uservoice.com");
        config.setForumId(224204);
        config.setTopicId(62613);
        UserVoice.init(config, TomahawkMainActivity.this);

        //Resolve currently logged-in user
        User.getSelf().done(new DoneCallback<User>() {
            @Override
            public void onDone(User user) {
                String requestId = InfoSystem.get().resolve(user);
                if (requestId != null) {
                    mCorrespondingRequestIds.add(requestId);
                }
            }
        });

        //Ask for notification service access if hatchet user logged in
        PreferenceUtils.attemptAskAccess(this);

        User.getSelf().done(new DoneCallback<User>() {
            @Override
            public void onDone(final User user) {
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        if (!mDestroyed) {
                            FragmentUtils.addRootFragment(TomahawkMainActivity.this, user);

                            if (!PreferenceUtils.getBoolean(PreferenceUtils.COACHMARK_WELCOMEFRAGMENT_DISABLED)) {
                                FragmentUtils.replace(TomahawkMainActivity.this, WelcomeFragment.class, null);
                            }
                        }
                    }
                });
            }
        });
        handleIntent(getIntent());

        /********************2016.08.10**********************/

        /*
        public void loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments) {
        mFragmentation.loadMultipleRootTransaction(getSupportFragmentManager(), containerId, showPosition, toFragments);//?public,?
        }*/

        //initView();

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        // Sync the toggle state after onRestoreInstanceState has occurred.
        if (mDrawerToggle != null) {
            mDrawerToggle.syncState();
        }
    }

    @Override
    protected void onNewIntent(final Intent intent) {
        super.onNewIntent(intent);

        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {
        if (MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH.equals(intent.getAction())) {
            intent.setAction(null);
            String playbackManagerId = getSupportMediaController().getExtras()
                    .getString(PlaybackService.EXTRAS_KEY_PLAYBACKMANAGER);
            PlaybackManager playbackManager = PlaybackManager.getByKey(playbackManagerId);
            MediaPlayIntentHandler intentHandler = new MediaPlayIntentHandler(
                    getSupportMediaController().getTransportControls(), playbackManager);
            intentHandler.mediaPlayFromSearch(intent.getExtras());
        }
        if ("com.google.android.gms.actions.SEARCH_ACTION".equals(intent.getAction())) {
            intent.setAction(null);
            String query = intent.getStringExtra(SearchManager.QUERY);
            if (query != null && !query.isEmpty()) {
                DatabaseHelper.get().addEntryToSearchHistory(query);
                Bundle bundle = new Bundle();
                bundle.putString(TomahawkFragment.QUERY_STRING, query);
                bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_STATIC);
                FragmentUtils.replace(TomahawkMainActivity.this, SearchPagerFragment.class, bundle);
            }
        }
        if (SHOW_PLAYBACKFRAGMENT_ON_STARTUP.equals(intent.getAction())) {
            intent.setAction(null);
            // if this Activity is being shown after the user clicked the notification
            if (mSlidingUpPanelLayout != null) {
                mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
            }
        }
        if (intent.hasExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE)) {
            intent.removeExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
            Bundle bundle = new Bundle();
            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_STATIC_SMALL);
            FragmentUtils.replace(this, PreferencePagerFragment.class, bundle);
        }

        if (intent.getData() != null) {
            final Uri data = intent.getData();
            intent.setData(null);
            List<String> pathSegments = data.getPathSegments();
            String host = data.getHost();
            String scheme = data.getScheme();
            if ((scheme != null && (scheme.equals("spotify") || scheme.equals("tomahawk"))) || (host != null
                    && (host.contains("spotify.com") || host.contains("hatchet.is") || host.contains("toma.hk")
                            || host.contains("beatsmusic.com") || host.contains("deezer.com")
                            || host.contains("rdio.com") || host.contains("soundcloud.com")))) {
                PipeLine.get().lookupUrl(data.toString());
            } else if ((pathSegments != null && pathSegments.get(pathSegments.size() - 1).endsWith(".xspf"))
                    || (intent.getType() != null && intent.getType().equals("application/xspf+xml"))) {
                TomahawkRunnable r = new TomahawkRunnable(TomahawkRunnable.PRIORITY_IS_INFOSYSTEM_HIGH) {
                    @Override
                    public void run() {
                        Playlist pl = XspfParser.parse(data);
                        if (pl != null) {
                            final Bundle bundle = new Bundle();
                            bundle.putString(TomahawkFragment.PLAYLIST, pl.getCacheKey());
                            bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE,
                                    ContentHeaderFragment.MODE_HEADER_DYNAMIC);
                            new Handler(Looper.getMainLooper()).post(new Runnable() {
                                @Override
                                public void run() {
                                    FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class,
                                            bundle);
                                }
                            });
                        }
                    }
                };
                ThreadManager.get().execute(r);
            } else if (pathSegments != null && (pathSegments.get(pathSegments.size() - 1).endsWith(".axe")
                    || pathSegments.get(pathSegments.size() - 1).endsWith(".AXE"))) {
                InstallPluginConfigDialog dialog = new InstallPluginConfigDialog();
                Bundle args = new Bundle();
                args.putString(InstallPluginConfigDialog.PATH_TO_AXE_URI_STRING, data.toString());
                dialog.setArguments(args);
                dialog.show(getSupportFragmentManager(), null);
            } else {
                String albumName;
                String trackName;
                String artistName;
                try {
                    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
                    retriever.setDataSource(this, data);
                    albumName = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
                    artistName = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
                    trackName = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
                    retriever.release();
                } catch (Exception e) {
                    Log.e(TAG, "handleIntent: " + e.getClass() + ": " + e.getLocalizedMessage());
                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                            String msg = TomahawkApp.getContext().getString(R.string.invalid_file);
                            Toast.makeText(TomahawkApp.getContext(), msg, Toast.LENGTH_LONG).show();
                        }
                    });
                    return;
                }
                if (TextUtils.isEmpty(trackName) && pathSegments != null) {
                    trackName = pathSegments.get(pathSegments.size() - 1);
                }
                Query query = Query.get(trackName, albumName, artistName, false);
                Result result = Result.get(data.toString(), query.getBasicTrack(),
                        UserCollectionStubResolver.get());
                float trackScore = query.howSimilar(result);
                query.addTrackResult(result, trackScore);
                Bundle bundle = new Bundle();
                List<Query> queries = new ArrayList<>();
                queries.add(query);
                Playlist playlist = Playlist.fromQueryList(IdGenerator.getSessionUniqueStringId(), "", "", queries);
                playlist.setFilled(true);
                playlist.setName(artistName + " - " + trackName);
                bundle.putString(TomahawkFragment.PLAYLIST, playlist.getCacheKey());
                bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_DYNAMIC);
                FragmentUtils.replace(TomahawkMainActivity.this, PlaylistEntriesFragment.class, bundle);
            }
        }
    }

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

        EventBus.getDefault().register(this);

        if (mMediaBrowser != null) {
            mMediaBrowser.connect();
        }
    }

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

        MenuDrawer.updateDrawer(mMenuDrawer, this);

        if (mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.HIDDEN) {
            mPlaybackPanel.setVisibility(View.GONE);
        } else {
            mPlaybackPanel.setup(mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED);
            mPlaybackPanel.setVisibility(View.VISIBLE);
            if (mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
                mPanelSlideListener.onPanelSlide(mSlidingUpPanelLayout, 1f);
            } else {
                mPanelSlideListener.onPanelSlide(mSlidingUpPanelLayout, 0f);
            }
        }

        if (mShouldShowAnimationHandler == null) {
            mShouldShowAnimationHandler = new Handler();
            mShouldShowAnimationHandler.post(mShouldShowAnimationRunnable);
        }

        if (mTomahawkMainReceiver == null) {
            mTomahawkMainReceiver = new TomahawkMainReceiver();
        }

        // Register intents that the BroadcastReceiver should listen to
        registerReceiver(mTomahawkMainReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

        // Install listener that disables the navigation drawer and hides the actionbar whenever
        // a WelcomeFragment or ContextMenuFragment is the currently shown Fragment.
        getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                updateActionBarState(true);
            }
        });
        updateActionBarState(true);

    }

    @Override
    public void onStop() {
        EventBus.getDefault().unregister(this);

        if (mMediaBrowser != null) {
            mMediaBrowser.disconnect();
        }
        if (getSupportMediaController() != null) {
            getSupportMediaController().unregisterCallback(mMediaCallback);
        }

        super.onStop();
    }

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

        if (mShouldShowAnimationHandler != null) {
            mShouldShowAnimationHandler.removeCallbacks(mShouldShowAnimationRunnable);
            mShouldShowAnimationHandler = null;
        }

        if (mTomahawkMainReceiver != null) {
            unregisterReceiver(mTomahawkMainReceiver);
            mTomahawkMainReceiver = null;
        }
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putInt(SAVED_PLAYBACK_STATE, mPlaybackState);

        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        mDestroyed = true;
        super.onDestroy();
    }

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

        if (mDrawerToggle != null) {
            mDrawerToggle.onConfigurationChanged(newConfig);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.clear();
        getMenuInflater().inflate(R.menu.tomahawk_main_menu, menu);

        // customize the searchView
        mSearchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(mSearchItem);
        SearchViewStyle.on(searchView).setSearchPlateDrawableId(R.drawable.edittext_background)
                .setCursorColor(getResources().getColor(R.color.tomahawk_red));
        searchView.setQueryHint(getString(R.string.search));
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if (query != null && !TextUtils.isEmpty(query)) {
                    DatabaseHelper.get().addEntryToSearchHistory(query);
                    Bundle bundle = new Bundle();
                    bundle.putString(TomahawkFragment.QUERY_STRING, query);
                    bundle.putInt(TomahawkFragment.CONTENT_HEADER_MODE, ContentHeaderFragment.MODE_HEADER_STATIC);
                    FragmentUtils.replace(TomahawkMainActivity.this, SearchPagerFragment.class, bundle);
                    if (mSearchItem != null) {
                        MenuItemCompat.collapseActionView(mSearchItem);
                    }
                    searchView.clearFocus();
                    return true;
                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                Cursor cursor = DatabaseHelper.get().getSearchHistoryCursor(newText);
                if (cursor.getCount() != 0) {
                    String[] columns = new String[] { TomahawkSQLiteHelper.SEARCHHISTORY_COLUMN_ENTRY };
                    int[] columnTextId = new int[] { android.R.id.text1 };

                    SuggestionSimpleCursorAdapter simple = new SuggestionSimpleCursorAdapter(getBaseContext(),
                            R.layout.searchview_dropdown_item, cursor, columns, columnTextId, 0);

                    if (searchView.getSuggestionsAdapter() != null
                            && searchView.getSuggestionsAdapter().getCursor() != null) {
                        searchView.getSuggestionsAdapter().getCursor().close();
                    }
                    searchView.setSuggestionsAdapter(simple);
                    return true;
                } else {
                    cursor.close();
                    return false;
                }
            }
        });
        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionSelect(int position) {
                SQLiteCursor cursor = (SQLiteCursor) searchView.getSuggestionsAdapter().getItem(position);
                int indexColumnSuggestion = cursor.getColumnIndex(TomahawkSQLiteHelper.SEARCHHISTORY_COLUMN_ENTRY);

                searchView.setQuery(cursor.getString(indexColumnSuggestion), false);

                return true;
            }

            @Override
            public boolean onSuggestionClick(int position) {
                SQLiteCursor cursor = (SQLiteCursor) searchView.getSuggestionsAdapter().getItem(position);
                int indexColumnSuggestion = cursor.getColumnIndex(TomahawkSQLiteHelper.SEARCHHISTORY_COLUMN_ENTRY);

                searchView.setQuery(cursor.getString(indexColumnSuggestion), false);

                return true;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        return mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)
                || super.onOptionsItemSelected(item);
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
    }

    public void closeDrawer() {
        if (mMenuDrawer != null) {
            mMenuDrawer.closeDrawer();
        }
    }

    public void onHatchetLoggedInOut(boolean loggedIn) {
        if (loggedIn) {
            PreferenceUtils.attemptAskAccess(this);
            User.getSelf().done(new DoneCallback<User>() {
                @Override
                public void onDone(User user) {
                    String requestId = InfoSystem.get().resolve(user);
                    if (requestId != null) {
                        mCorrespondingRequestIds.add(requestId);
                    }
                }
            });
        }
        MenuDrawer.updateDrawer(mMenuDrawer, this);
    }

    @Override
    public void onBackPressed() {
        if (findViewById(R.id.context_menu_fragment) == null && mSlidingUpPanelLayout.isEnabled()
                && (mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED
                        || mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.ANCHORED)) {
            mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
        } else {
            if (mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.HIDDEN) {
                AnimationUtils.fade(mPlaybackPanel, AnimationUtils.DURATION_CONTEXTMENU, true);
            }
            super.onBackPressed();
        }
    }

    public float getSlidingOffset() {
        return mPanelSlideListener.getSlidingOffset();
    }

    public void collapsePanel() {
        if (mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.HIDDEN) {
            mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
        }
    }

    public void showPanel() {
        if (mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.HIDDEN) {
            mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            mPlaybackPanel.setup(mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED);
            showPlaybackPanel(true);
        }
    }

    public void hidePanel() {
        if (mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.HIDDEN) {
            mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.HIDDEN);
            hidePlaybackPanel();
        }
    }

    /**
     * Disables the navigation drawer and hides the actionbar whenever WelcomeFragment or
     * ContextMenuFragment is the currently shown Fragment or if the playback {@link
     * SlidingUpPanelLayout} is more than half way expanded.
     *
     * @param checkCurrentFragment whether or not to check the current Fragment. This can be set to
     *                             false to improve performance when this function is repeatedly
     *                             being called in {@link org.runbuddy.tomahawk.listeners.TomahawkPanelSlideListener}
     */
    public void updateActionBarState(boolean checkCurrentFragment) {
        boolean hideActionBar = mPanelSlideListener.getSlidingOffset() > 0.5f;
        boolean forced = true;
        if (checkCurrentFragment && !hideActionBar) {
            forced = false;
            int size = getSupportFragmentManager().getBackStackEntryCount();
            if (size > 0) {
                String clssName = getSupportFragmentManager().getBackStackEntryAt(size - 1).getName();
                hideActionBar = WelcomeFragment.class.getName().equals(clssName)
                        || ContextMenuFragment.class.getName().equals(clssName);
            }
        }
        if (hideActionBar) {
            if (mMenuDrawer != null) {
                mMenuDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }
            hideActionbar();
        } else {
            if (mMenuDrawer != null) {
                mMenuDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            }
            showActionBar(forced);
        }
    }

    private void showActionBar(boolean forced) {
        if (forced || mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED
                || mSlidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.HIDDEN) {
            if (!getSupportActionBar().isShowing()) {
                getSupportActionBar().show();
            }
            int actionBarHeight = getResources()
                    .getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
            AnimationUtils.moveY(mActionBarBg, 0, -actionBarHeight, 250, true);
        }
    }

    private void hideActionbar() {
        if (getSupportActionBar().isShowing()) {
            getSupportActionBar().hide();
        }
        int actionBarHeight = getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
        AnimationUtils.moveY(mActionBarBg, 0, -actionBarHeight, 250, false);
    }

    public void showPlaybackPanel(boolean forced) {
        if (forced || mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.HIDDEN) {
            AnimationUtils.fade(mPlaybackPanel, AnimationUtils.DURATION_CONTEXTMENU, true);
            if (!PreferenceUtils.getBoolean(PreferenceUtils.COACHMARK_SEEK_DISABLED)
                    && PreferenceUtils.getLong(PreferenceUtils.COACHMARK_SEEK_TIMESTAMP) + 259200000 < System
                            .currentTimeMillis()) {
                final View coachMark = ViewUtils.ensureInflation(mPlaybackPanel,
                        R.id.playbackpanel_seek_coachmark_stub, R.id.playbackpanel_seek_coachmark);
                coachMark.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        coachMark.setVisibility(View.GONE);
                    }
                });
                coachMark.setVisibility(View.VISIBLE);
                PreferenceUtils.edit().putLong(PreferenceUtils.COACHMARK_SEEK_TIMESTAMP, System.currentTimeMillis())
                        .apply();
            }
        }
    }

    public void hidePlaybackPanel() {
        AnimationUtils.fade(mPlaybackPanel, AnimationUtils.DURATION_CONTEXTMENU, false);
    }

    public PlaybackPanel getPlaybackPanel() {
        return mPlaybackPanel;
    }

    public SlidingUpPanelLayout getSlidingUpPanelLayout() {
        return mSlidingUpPanelLayout;
    }

    public void showFilledActionBar() {
        findViewById(R.id.action_bar_background).setBackgroundResource(R.color.primary_background_inverted);
    }

    public void showGradientActionBar() {
        findViewById(R.id.action_bar_background).setBackgroundResource(R.drawable.below_shadow);
    }

}