package com.kure.musicplayer.activities; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import com.kure.musicplayer.About; import com.kure.musicplayer.R; import com.kure.musicplayer.kMP; /** * Master Activity from which every other Activity inherits * (except for `ActivityMenuSettings`). * * If contains some things they all have in common: * * - They can change the color theme at runtime; * - They all have the same context menu (bottom menu). * (note that there's an extra item "Now Playing" that * only appears if user started playing something) * * What we do is make each Activity keep track of which * theme it currently has. * Whenever they have focus, we test to see if the global theme * was changed by the user. * If it was, it `recreate()`s itself. * * @note We must call `Activity.setTheme()` BEFORE * `Activity.setContentView()`! * * Sources that made me apply this idea, thank you so much: * - http://stackoverflow.com/a/4673209 * - http://stackoverflow.com/a/11875930 */ public class ActivityMaster extends Activity { /** * Keeping track of the current theme name. * * @note It's name and valid values are defined on * `res/values/strings.xml`, at the fields * we can change on the Settings menu. */ protected String currentTheme = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Mandatory - when creating we don't have // a theme applied yet. refreshTheme(); kMP.startMusicService(this); } /** * Called when the user returns to this activity after leaving. */ @Override protected void onResume() { super.onResume(); // Every time the user focuses this Activity, // we need to check it. // It the theme changed, recreate ourselves. if (refreshTheme()) recreate(); } /** * Tests if our current theme is the same as the one * specified on `Settings`, reapplying the theme if * not the case. * * @return Flag that tells if we've changed the theme. */ public boolean refreshTheme() { // Getting global theme name from the Settings. // Second argument is the default value, in case // something went wrong. String theme = kMP.settings.get("themes", "default"); if (currentTheme != theme) { // Testing each possible theme name. // I repeat - all valid theme names are specified // at `res/strings.xml`, right at the Settings sub menu. if (theme.equals("default")) setTheme(R.style.Theme_Default); else if (theme.equals("light")) setTheme(R.style.Theme_Light); else if (theme.equals("dark")) setTheme(R.style.Theme_Dark); else if (theme.equals("solarized_dark")) setTheme(R.style.Theme_Solarized_Dark); else if (theme.equals("wallpaper")) setTheme(R.style.Theme_Wallpaper); else if (theme.equals("dialog_light")) setTheme(R.style.Theme_DialogLight); else if (theme.equals("dialog_dark")) setTheme(R.style.Theme_DialogDark); else if (theme.equals("light_simple")) setTheme(R.style.Theme_LightSimple); else if (theme.equals("dark_simple")) setTheme(R.style.Theme_DarkSimple); currentTheme = theme; return true; } return false; } /** * Let's set a context menu (menu that appears when * the user presses the "menu" button). */ @Override public boolean onCreateOptionsMenu(Menu menu) { // Default options specified on the XML MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_context, menu); // Extra option to go to Now Playing screen // (only activated when there's an actual Now Playing screen) if (kMP.mainMenuHasNowPlayingItem) menu.findItem(R.id.context_menu_now_playing).setVisible(true); return super.onCreateOptionsMenu(menu); } /** * This method gets called whenever the user clicks an * item on the context menu. */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.context_menu_end: // This forces the system to kill the process, although // it's not a nice way to do it. // // Later implement FinActivity: // http://stackoverflow.com/a/4737595 System.exit(0); break; case R.id.context_menu_settings: startActivity(new Intent(this, ActivityMenuSettings.class)); break; case R.id.context_menu_now_playing: Intent nowPlayingIntent = new Intent(this, ActivityNowPlaying.class); nowPlayingIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(nowPlayingIntent); break; case R.id.About: Intent AboutIntent = new Intent(this,About.class); startActivity(AboutIntent); } return super.onOptionsItemSelected(item); } }