/* * Copyright (C) 2012 Andrew Neal * Copyright (C) 2014 The CyanogenMod Project * Copyright (C) 2015 Naman Dwivedi * * 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.naman14.timber.activities; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.media.AudioManager; import android.media.session.MediaSessionManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.app.FragmentManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.afollestad.appthemeengine.ATE; import com.afollestad.appthemeengine.ATEActivity; import com.naman14.timber.ITimberService; import com.naman14.timber.MusicPlayer; import com.naman14.timber.MusicService; import com.naman14.timber.R; import com.naman14.timber.listeners.MusicStateListener; import com.naman14.timber.slidinguppanel.SlidingUpPanelLayout; import com.naman14.timber.subfragments.QuickControlsFragment; import com.naman14.timber.utils.Helpers; import com.naman14.timber.utils.NavigationUtils; import com.naman14.timber.utils.TimberUtils; import java.lang.ref.WeakReference; import java.util.ArrayList; import static com.naman14.timber.MusicPlayer.mService; public class BaseActivity extends ATEActivity implements ServiceConnection, MusicStateListener { private final ArrayList<MusicStateListener> mMusicStateListener = new ArrayList<>(); private MusicPlayer.ServiceToken mToken; private PlaybackStatus mPlaybackStatus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mToken = MusicPlayer.bindToService(this, this); mPlaybackStatus = new PlaybackStatus(this); //make volume keys change multimedia volume even if music is not playing now setVolumeControlStream(AudioManager.STREAM_MUSIC); } @Override protected void onStart() { super.onStart(); final IntentFilter filter = new IntentFilter(); // Play and pause changes filter.addAction(MusicService.PLAYSTATE_CHANGED); // Track changes filter.addAction(MusicService.META_CHANGED); // Update a list, probably the playlist fragment's filter.addAction(MusicService.REFRESH); // If a playlist has changed, notify us filter.addAction(MusicService.PLAYLIST_CHANGED); // If there is an error playing a track filter.addAction(MusicService.TRACK_ERROR); registerReceiver(mPlaybackStatus, filter); } @Override protected void onStop() { super.onStop(); } @Override public void onResume() { super.onResume(); onMetaChanged(); } @Override public void onServiceConnected(final ComponentName name, final IBinder service) { mService = ITimberService.Stub.asInterface(service); onMetaChanged(); } @Override public void onServiceDisconnected(final ComponentName name) { mService = null; } @Override protected void onDestroy() { super.onDestroy(); // Unbind from the service if (mToken != null) { MusicPlayer.unbindFromService(mToken); mToken = null; } try { unregisterReceiver(mPlaybackStatus); } catch (final Throwable e) { } mMusicStateListener.clear(); } @Override public void onMetaChanged() { // Let the listener know to the meta chnaged for (final MusicStateListener listener : mMusicStateListener) { if (listener != null) { listener.onMetaChanged(); } } } @Override public void restartLoader() { // Let the listener know to update a list for (final MusicStateListener listener : mMusicStateListener) { if (listener != null) { listener.restartLoader(); } } } @Override public void onPlaylistChanged() { // Let the listener know to update a list for (final MusicStateListener listener : mMusicStateListener) { if (listener != null) { listener.onPlaylistChanged(); } } } public void setMusicStateListenerListener(final MusicStateListener status) { if (status == this) { throw new UnsupportedOperationException("Override the method, don't add a listener"); } if (status != null) { mMusicStateListener.add(status); } } public void removeMusicStateListenerListener(final MusicStateListener status) { if (status != null) { mMusicStateListener.remove(status); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); if (!TimberUtils.hasEffectsPanel(BaseActivity.this)) { menu.removeItem(R.id.action_equalizer); } ATE.applyMenu(this, getATEKey(), menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); return true; case R.id.action_settings: NavigationUtils.navigateToSettings(this); return true; case R.id.action_shuffle: Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.shuffleAll(BaseActivity.this); } }, 80); return true; case R.id.action_search: NavigationUtils.navigateToSearch(this); return true; case R.id.action_equalizer: NavigationUtils.navigateToEqualizer(this); return true; } return super.onOptionsItemSelected(item); } @Nullable @Override public String getATEKey() { return Helpers.getATEKey(this); } public void setPanelSlideListeners(SlidingUpPanelLayout panelLayout) { panelLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { View nowPlayingCard = QuickControlsFragment.topContainer; nowPlayingCard.setAlpha(1 - slideOffset); } @Override public void onPanelCollapsed(View panel) { View nowPlayingCard = QuickControlsFragment.topContainer; nowPlayingCard.setAlpha(1); } @Override public void onPanelExpanded(View panel) { View nowPlayingCard = QuickControlsFragment.topContainer; nowPlayingCard.setAlpha(0); } @Override public void onPanelAnchored(View panel) { } @Override public void onPanelHidden(View panel) { } }); } private final static class PlaybackStatus extends BroadcastReceiver { private final WeakReference<BaseActivity> mReference; public PlaybackStatus(final BaseActivity activity) { mReference = new WeakReference<BaseActivity>(activity); } @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); BaseActivity baseActivity = mReference.get(); if (baseActivity != null) { if (action.equals(MusicService.META_CHANGED)) { baseActivity.onMetaChanged(); } else if (action.equals(MusicService.PLAYSTATE_CHANGED)) { // baseActivity.mPlayPauseProgressButton.getPlayPauseButton().updateState(); } else if (action.equals(MusicService.REFRESH)) { baseActivity.restartLoader(); } else if (action.equals(MusicService.PLAYLIST_CHANGED)) { baseActivity.onPlaylistChanged(); } else if (action.equals(MusicService.TRACK_ERROR)) { final String errorMsg = context.getString(R.string.error_playing_track, intent.getStringExtra(MusicService.TrackErrorExtra.TRACK_NAME)); Toast.makeText(baseActivity, errorMsg, Toast.LENGTH_SHORT).show(); } } } } public class initQuickControls extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { QuickControlsFragment fragment1 = new QuickControlsFragment(); FragmentManager fragmentManager1 = getSupportFragmentManager(); fragmentManager1.beginTransaction() .replace(R.id.quickcontrols_container, fragment1).commitAllowingStateLoss(); return "Executed"; } @Override protected void onPostExecute(String result) { // QuickControlsFragment.topContainer.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // NavigationUtils.navigateToNowplaying(BaseActivity.this, false); // } // }); } @Override protected void onPreExecute() { } } }