Added LeakCanary

This commit is contained in:
Karim Abou Zeid 2015-08-06 18:27:15 +02:00
commit 2564b99fa5
26 changed files with 301 additions and 137 deletions

View file

@ -21,13 +21,13 @@ import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.SearchAdapter;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicStateActivity;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.Util;
import butterknife.Bind;
import butterknife.ButterKnife;
public class SearchActivity extends AbsMusicStateActivity {
public class SearchActivity extends AbsMusicServiceActivity {
public static final String TAG = SearchActivity.class.getSimpleName();
@Bind(R.id.recycler_view)

View file

@ -104,7 +104,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(
getActivity(),
((SettingsActivity) getActivity()),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorPrimary());
return true;
@ -117,7 +117,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(
getActivity(),
((SettingsActivity) getActivity()),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorAccent());
return true;
@ -168,6 +168,103 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
.getString(preference.getKey(), ""));
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
addPreferencesFromResource(R.xml.pref_colors);
addPreferencesFromResource(R.xml.pref_now_playing_screen);
addPreferencesFromResource(R.xml.pref_images);
addPreferencesFromResource(R.xml.pref_lockscreen);
addPreferencesFromResource(R.xml.pref_audio);
final Preference defaultStartPage = findPreference("default_start_page");
setSummary(defaultStartPage);
defaultStartPage.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, @NonNull Object o) {
setSummary(defaultStartPage, o);
return true;
}
});
final Preference generalTheme = findPreference("general_theme");
setSummary(generalTheme);
generalTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, @NonNull Object o) {
setSummary(generalTheme, o);
PreferenceUtil.getInstance(getActivity()).setGeneralTheme(getActivity(), (String) o);
((SettingsActivity) getActivity()).recreateIfThemeChanged();
return true;
}
});
ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color");
primaryColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity()));
primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(
((SettingsActivity) getActivity()),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorPrimary());
return true;
}
});
ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color");
accentColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity()));
accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(
((SettingsActivity) getActivity()),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorAccent());
return true;
}
});
Preference colorNavBar = findPreference("should_color_navigation_bar");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
colorNavBar.setEnabled(false);
colorNavBar.setSummary(R.string.pref_only_lollipop);
} else {
colorNavBar.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
PreferenceUtil.getInstance(getActivity()).setColoredNavigationBar((boolean) newValue);
((SettingsActivity) getActivity()).recreateIfThemeChanged();
return true;
}
});
}
Preference ignoreMediaStoreArtwork = findPreference("ignore_media_store_artwork");
ignoreMediaStoreArtwork.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
ImageLoader.getInstance().clearMemoryCache();
return true;
}
});
Preference equalizer = findPreference("equalizer");
if (!hasEqualizer()) {
equalizer.setEnabled(false);
equalizer.setSummary(getResources().getString(R.string.no_equalizer));
}
equalizer.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
NavigationUtil.openEqualizer(getActivity());
return true;
}
});
}
private static void setSummary(Preference preference, @NonNull Object value) {
String stringValue = value.toString();

View file

@ -11,7 +11,7 @@ import android.os.IBinder;
import android.support.annotation.NonNull;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.service.MusicService;
import java.lang.ref.WeakReference;
@ -20,10 +20,10 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMusicStateActivity extends AbsBaseActivity implements ServiceConnection, MusicStateListener {
public static final String TAG = AbsMusicStateActivity.class.getSimpleName();
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements ServiceConnection, MusicServiceEventListener {
public static final String TAG = AbsMusicServiceActivity.class.getSimpleName();
private final ArrayList<MusicStateListener> mMusicStateListener = new ArrayList<>();
private final ArrayList<MusicServiceEventListener> mMusicServiceEventListener = new ArrayList<>();
private MusicPlayerRemote.ServiceToken serviceToken;
private MusicStateReceiver musicStateReceiver;
@ -71,21 +71,21 @@ public abstract class AbsMusicStateActivity extends AbsBaseActivity implements S
}
}
public void addMusicStateListenerListener(final MusicStateListener listener) {
public void addMusicStateListenerListener(final MusicServiceEventListener listener) {
if (listener != null) {
mMusicStateListener.add(listener);
mMusicServiceEventListener.add(listener);
}
}
public void removeMusicStateListenerListener(final MusicStateListener listener) {
public void removeMusicStateListenerListener(final MusicServiceEventListener listener) {
if (listener != null) {
mMusicStateListener.remove(listener);
mMusicServiceEventListener.remove(listener);
}
}
@Override
public void onPlayingMetaChanged() {
for (MusicStateListener listener : mMusicStateListener) {
for (MusicServiceEventListener listener : mMusicServiceEventListener) {
if (listener != null) {
listener.onPlayingMetaChanged();
}
@ -94,7 +94,7 @@ public abstract class AbsMusicStateActivity extends AbsBaseActivity implements S
@Override
public void onPlayStateChanged() {
for (MusicStateListener listener : mMusicStateListener) {
for (MusicServiceEventListener listener : mMusicServiceEventListener) {
if (listener != null) {
listener.onPlayStateChanged();
}
@ -103,33 +103,43 @@ public abstract class AbsMusicStateActivity extends AbsBaseActivity implements S
@Override
public void onMediaStoreChanged() {
for (MusicStateListener listener : mMusicStateListener) {
for (MusicServiceEventListener listener : mMusicServiceEventListener) {
if (listener != null) {
listener.onMediaStoreChanged();
}
}
}
@Override
public void onRepeatModeChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListener) {
if (listener != null) {
listener.onRepeatModeChanged();
}
}
}
@Override
public void onShuffleModeChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListener) {
if (listener != null) {
listener.onShuffleModeChanged();
}
}
}
private static final class MusicStateReceiver extends BroadcastReceiver {
private final WeakReference<AbsMusicStateActivity> reference;
private final WeakReference<AbsMusicServiceActivity> reference;
public MusicStateReceiver(final AbsMusicStateActivity activity) {
public MusicStateReceiver(final AbsMusicServiceActivity activity) {
reference = new WeakReference<>(activity);
}
@Override
public void onReceive(final Context context, @NonNull final Intent intent) {
final String action = intent.getAction();
AbsMusicStateActivity activity = reference.get();
AbsMusicServiceActivity activity = reference.get();
if (activity != null) {
switch (action) {
case MusicService.META_CHANGED:

View file

@ -62,17 +62,16 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
* <p>
* <p/>
* Do not use {@link #setContentView(int)} but wrap your layout with
* {@link #wrapSlidingMusicPanelAndFab(int)} first and then return it in {@link #createContentView()}
*/
public abstract class AbsSlidingMusicPanelActivity extends AbsMusicStateActivity implements SlidingUpPanelLayout.PanelSlideListener {
public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivity implements SlidingUpPanelLayout.PanelSlideListener {
public static final String TAG = AbsSlidingMusicPanelActivity.class.getSimpleName();
private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000;
private static final long DEFAULT_PROGRESS_VIEW_REFRESH_INTERVAL = 500;
private static final int CMD_REFRESH_PROGRESS_VIEWS = 1;
private static final String PANEL_EXPANDED_KEY = "panel_state";
@Bind(R.id.play_pause_fab)
FloatingActionButton playPauseFab;

View file

@ -26,6 +26,7 @@ import com.afollestad.materialdialogs.ThemeSingleton;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.misc.LagTracker;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
@ -57,18 +58,10 @@ import butterknife.ButterKnife;
*/
public abstract class AbsTagEditorActivity extends AbsBaseActivity {
private static final String TAG = AbsTagEditorActivity.class.getSimpleName();
private static final int REQUEST_CODE_SELECT_IMAGE = 1337;
public static final String EXTRA_ID = "extra_id";
public static final String EXTRA_PALETTE = "extra_palette";
private int id;
private int headerVariableSpace;
private int paletteColorPrimary;
private boolean isInNoImageMode;
private static final String TAG = AbsTagEditorActivity.class.getSimpleName();
private static final int REQUEST_CODE_SELECT_IMAGE = 1337;
@Bind(R.id.play_pause_fab)
FloatingActionButton fab;
@Bind(R.id.observableScrollView)
@ -79,13 +72,32 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
ImageView image;
@Bind(R.id.header)
LinearLayout header;
private int id;
private int headerVariableSpace;
private int paletteColorPrimary;
private boolean isInNoImageMode;
private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
float alpha;
if (!isInNoImageMode) {
alpha = 1 - (float) Math.max(0, headerVariableSpace - scrollY) / headerVariableSpace;
} else {
header.setTranslationY(scrollY);
alpha = 1;
}
ViewUtil.setBackgroundAlpha(toolbar, alpha, paletteColorPrimary);
image.setTranslationY(scrollY / 2);
}
};
private List<String> songPaths;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LagTracker.get().start("setContentView");
setContentView(getContentViewLayout());
LagTracker.get().end("setContentView");
ButterKnife.bind(this);
getIntentExtras();
@ -116,21 +128,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks);
}
private final SimpleObservableScrollViewCallbacks observableScrollViewCallbacks = new SimpleObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
float alpha;
if (!isInNoImageMode) {
alpha = 1 - (float) Math.max(0, headerVariableSpace - scrollY) / headerVariableSpace;
} else {
header.setTranslationY(scrollY);
alpha = 1;
}
ViewUtil.setBackgroundAlpha(toolbar, alpha, paletteColorPrimary);
image.setTranslationY(scrollY / 2);
}
};
private void setUpImageView() {
loadCurrentImage();
final CharSequence[] items = new CharSequence[]{

View file

@ -0,0 +1,20 @@
package com.kabouzeid.gramophone.ui.fragments;
import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.App;
import com.squareup.leakcanary.RefWatcher;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class LeakDetectFragment extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
if (getActivity() != null) {
RefWatcher refWatcher = App.getRefWatcher(getActivity());
refWatcher.watch(this);
}
}
}

View file

@ -2,15 +2,15 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.ui.fragments.LeakDetectFragment;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityFragment extends Fragment implements KabViewsDisableAble {
public abstract class AbsMainActivityFragment extends LeakDetectFragment implements KabViewsDisableAble {
private boolean areViewsEnabled;
@NonNull

View file

@ -14,7 +14,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.views.FastScroller;
import butterknife.Bind;
@ -23,7 +23,7 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicServiceEventListener {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
@ -119,6 +119,16 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
@Override
public void onShuffleModeChanged() {
}
@Override
public void onRepeatModeChanged() {
}
@Override
public void enableViews() {
super.enableViews();