/* * Copyright 2016 Substance Mobile * * 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.animbus.music.ui.custom.activity; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.annotation.AttrRes; import android.support.annotation.ColorInt; import android.support.annotation.MenuRes; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.v4.view.ViewCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.afollestad.appthemeengine.ATEActivity; import com.afollestad.appthemeengine.Config; import com.animbus.music.GEMApp; import com.animbus.music.R; import com.animbus.music.ui.activity.search.SearchActivity; import com.animbus.music.ui.activity.settings.Settings; import com.animbus.music.util.GEMUtil; import com.animbus.music.util.IconManager; import com.animbus.music.util.Options; import butterknife.Bind; import butterknife.ButterKnife; public abstract class ThemeActivity extends ATEActivity { @Nullable @Bind(R.id.toolbar) public Toolbar mToolbar; @Nullable @Bind(R.id.appbar) public AppBarLayout mAppBar; public View mRoot; public long lastSettingsUpdate = System.currentTimeMillis(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sequence(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); sequence(); } /** * call this when adding code to the sequence of default methods. The default sequence can be triggered by * <code>super.sequence()</code>. * Everything before triggering will happen before, everything after will happen after. The default sequence is: * {@link #setContentView(int)} or {@link #inflate()}, * {@link ButterKnife#bind(Activity)}, * {@link AppCompatActivity#setSupportActionBar(Toolbar)}, * Setting {@link #mRoot}, * {@link #setVariables()}, * {@link #setUp()}, * {@link #setUpTheme()} */ protected void sequence() { if (!useInflate()) setContentView(getLayout()); else inflate(); ButterKnife.bind(this); try { setSupportActionBar(mToolbar); } catch (Exception e) { Log.i(getClass().getSimpleName(), "This activity has no toolbar"); } mRoot = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); setVariables(); setUp(); setUpTheme(); } protected boolean useInflate() { return false; } protected void inflate() { //Do nothing. } protected abstract int getLayout(); protected void setVariables() { //Do nothing } protected abstract void setUp(); protected void setUpTheme() { //Removes shadow if the color matches background if (getPrimaryColor() == resolveColorAttr(android.R.attr.colorBackground) && !shouldKeepAppBarShadow()) ViewCompat.setElevation(mAppBar, 0.0f); //Changes background color of the root view mRoot.setBackgroundColor(resolveColorAttr(android.R.attr.windowBackground)); } protected boolean shouldKeepAppBarShadow() { return false; } /////////////////////////////////////////////////////////////////////////// // Color Getters /////////////////////////////////////////////////////////////////////////// @ColorInt public int getPrimaryColor() { return Config.primaryColor(this, getATEKey()); } @ColorInt public int getPrimaryDarkColor() { return Config.primaryColorDark(this, getATEKey()); } @ColorInt public int getAccentColor() { return Config.accentColor(this, getATEKey()); } @ColorInt public int getPrimaryTextColor() { return Config.textColorPrimary(this, getATEKey()); } @ColorInt public int getSecondaryTextColor() { return Config.textColorSecondary(this, getATEKey()); } @ColorInt public int resolveColorAttr(@AttrRes int resId) { final TypedValue value = new TypedValue(); getTheme().resolveAttribute(resId, value, true); return value.data; } /////////////////////////////////////////////////////////////////////////// // Lifecycle /////////////////////////////////////////////////////////////////////////// @Override protected void onStart() { super.onStart(); lastSettingsUpdate = System.currentTimeMillis(); } @Override protected void onResume() { super.onResume(); Options.invalidateActivity(this); } /////////////////////////////////////////////////////////////////////////// // Menu boilerplate /////////////////////////////////////////////////////////////////////////// @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (!overrideUpBehavior()) { supportFinishAfterTransition(); return true; } return processMenuItem(item.getItemId()) || super.onOptionsItemSelected(item); case R.id.action_settings: startActivity(new Intent(this, Settings.class)); return true; default: return processMenuItem(item.getItemId()) || super.onOptionsItemSelected(item); } } protected boolean overrideUpBehavior() { return false; } protected boolean processMenuItem(int id) { return false; } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean inflate = (getOptionsMenu() != 0); if (inflate) { getMenuInflater().inflate(getOptionsMenu(), menu); return super.onCreateOptionsMenu(menu); } return false; } @MenuRes protected int getOptionsMenu() { return 0; } /////////////////////////////////////////////////////////////////////////// // Makes sure "Search" button works on any screen /////////////////////////////////////////////////////////////////////////// @Override public boolean onSearchRequested() { startActivity(new Intent(this, SearchActivity.class)); return true; } /////////////////////////////////////////////////////////////////////////// // Convenience /////////////////////////////////////////////////////////////////////////// /** * A convenience method to call {@link GEMUtil#startUrl(Context, String)} * * @param url The url to launch */ protected void startUrl(String url) { GEMUtil.startUrl(this, url); } @Override public void setTitle(CharSequence title) { super.setTitle(title); if (mToolbar != null) mToolbar.setTitle(title); if (GEMUtil.isLollipop()) { IconManager iconM = IconManager.get().setContext(this); Bitmap bm = BitmapFactory.decodeResource(getResources(), iconM.getDrawable(iconM.getOverviewIcon(iconM.getIcon(), getPrimaryColor()).getId())); setTaskDescription(new ActivityManager.TaskDescription(title.toString(), bm, getPrimaryColor())); bm.recycle(); } } /////////////////////////////////////////////////////////////////////////// // Proper ATE key /////////////////////////////////////////////////////////////////////////// @Nullable @Override public String getATEKey() { return ((GEMApp) getApplication()).getATEKey(); } }