Transition lag fix

- in both Album and Artist View
This commit is contained in:
Karim Abou Zeid 2015-02-27 18:42:56 +01:00
commit 41502ee01e
13 changed files with 118 additions and 157 deletions

View file

@ -68,12 +68,12 @@ public class App extends Application {
return getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; return getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
} }
public void addToRequestQueue(Request request) { public void addToVolleyRequestQueue(Request request) {
request.setTag(TAG); request.setTag(TAG);
getRequestQueue().add(request); getVolleyRequestQueue().add(request);
} }
public RequestQueue getRequestQueue() { public RequestQueue getVolleyRequestQueue() {
if (requestQueue == null) { if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(this); requestQueue = Volley.newRequestQueue(this);
} }

View file

@ -101,7 +101,7 @@ public class LastFMAlbumImageLoader {
callback.onAlbumImageLoaded(null, null); callback.onAlbumImageLoaded(null, null);
} }
}); });
app.addToRequestQueue(albumInfoJSONRequest); app.addToVolleyRequestQueue(albumInfoJSONRequest);
} }
public static interface AlbumImageLoaderCallback { public static interface AlbumImageLoaderCallback {

View file

@ -56,7 +56,7 @@ public class LastFMArtistBiographyLoader {
callback.onArtistBioLoaded(""); callback.onArtistBioLoaded("");
} }
}); });
app.addToRequestQueue(artistInfoJSONRequest); app.addToVolleyRequestQueue(artistInfoJSONRequest);
} }
public static interface ArtistBioLoaderCallback { public static interface ArtistBioLoaderCallback {

View file

@ -36,7 +36,7 @@ public class LastFMArtistImageLoader {
} }
} else { } else {
Log.i(TAG, queryArtist + " is not in cache."); Log.i(TAG, queryArtist + " is not in cache.");
downloadArtistImage(context, queryArtist, callback); downloadArtistJSONAndStartImageDownload(context, queryArtist, callback);
} }
} }
} }
@ -71,7 +71,7 @@ public class LastFMArtistImageLoader {
} }
} }
private static void downloadArtistImage(final Context context, final String artist, final ArtistImageLoaderCallback callback) { private static void downloadArtistJSONAndStartImageDownload(final Context context, final String artist, final ArtistImageLoaderCallback callback) {
Log.i(TAG, "Downloading details for " + artist); Log.i(TAG, "Downloading details for " + artist);
App app = (App) context.getApplicationContext(); App app = (App) context.getApplicationContext();
String artistUrl = LastFMArtistInfoUtil.getArtistUrl(artist); String artistUrl = LastFMArtistInfoUtil.getArtistUrl(artist);
@ -89,7 +89,7 @@ public class LastFMArtistImageLoader {
callback.onArtistImageLoaded(null); callback.onArtistImageLoaded(null);
} }
}); });
app.addToRequestQueue(artistInfoJSONRequest); app.addToVolleyRequestQueue(artistInfoJSONRequest);
} }
public static interface ArtistImageLoaderCallback { public static interface ArtistImageLoaderCallback {

View file

@ -89,7 +89,7 @@ public class LastFMArtistThumbnailLoader {
callback.onArtistThumbnailLoaded(null); callback.onArtistThumbnailLoaded(null);
} }
}); });
app.addToRequestQueue(artistInfoJSONRequest); app.addToVolleyRequestQueue(artistInfoJSONRequest);
} }
public static interface ArtistThumbnailLoaderCallback { public static interface ArtistThumbnailLoaderCallback {

View file

@ -70,12 +70,6 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
cursor.close(); cursor.close();
} }
return null; return null;
} @Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + AlbumJSONColumns.NAME +
" (" + AlbumJSONColumns.ALBUMANDARTIST_NAME + " TEXT NOT NULL," +
AlbumJSONColumns.JSON + " TEXT NOT NULL);"
);
} }
public void removeItem(final String albumAndArtistName) { public void removeItem(final String albumAndArtistName) {
@ -84,6 +78,12 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
albumAndArtistName.trim().toLowerCase() albumAndArtistName.trim().toLowerCase()
}); });
} @Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + AlbumJSONColumns.NAME +
" (" + AlbumJSONColumns.ALBUMANDARTIST_NAME + " TEXT NOT NULL," +
AlbumJSONColumns.JSON + " TEXT NOT NULL);"
);
} }
public interface AlbumJSONColumns { public interface AlbumJSONColumns {
@ -94,6 +94,7 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
@Override @Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + AlbumJSONColumns.NAME); db.execSQL("DROP TABLE IF EXISTS " + AlbumJSONColumns.NAME);

View file

@ -70,12 +70,6 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
cursor.close(); cursor.close();
} }
return null; return null;
} @Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + ArtistJSONColumns.NAME +
" (" + ArtistJSONColumns.ARTIST_NAME + " TEXT NOT NULL," +
ArtistJSONColumns.JSON + " TEXT NOT NULL);"
);
} }
public void removeItem(final String artistName) { public void removeItem(final String artistName) {
@ -84,6 +78,12 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
artistName.trim().toLowerCase() artistName.trim().toLowerCase()
}); });
} @Override
public void onCreate(final SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + ArtistJSONColumns.NAME +
" (" + ArtistJSONColumns.ARTIST_NAME + " TEXT NOT NULL," +
ArtistJSONColumns.JSON + " TEXT NOT NULL);"
);
} }
public interface ArtistJSONColumns { public interface ArtistJSONColumns {
@ -94,6 +94,7 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
@Override @Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + ArtistJSONColumns.NAME); db.execSQL("DROP TABLE IF EXISTS " + ArtistJSONColumns.NAME);

View file

@ -1,5 +1,6 @@
package com.kabouzeid.materialmusic.ui.activities; package com.kabouzeid.materialmusic.ui.activities;
import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
@ -8,7 +9,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.support.v7.graphics.Palette; import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.transition.Transition;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -33,7 +33,6 @@ import com.kabouzeid.materialmusic.model.Album;
import com.kabouzeid.materialmusic.model.Song; import com.kabouzeid.materialmusic.model.Song;
import com.kabouzeid.materialmusic.ui.activities.base.AbsFabActivity; import com.kabouzeid.materialmusic.ui.activities.base.AbsFabActivity;
import com.kabouzeid.materialmusic.ui.activities.tageditor.AlbumTagEditorActivity; import com.kabouzeid.materialmusic.ui.activities.tageditor.AlbumTagEditorActivity;
import com.kabouzeid.materialmusic.util.ImageLoaderUtil;
import com.kabouzeid.materialmusic.util.MusicUtil; import com.kabouzeid.materialmusic.util.MusicUtil;
import com.kabouzeid.materialmusic.util.Util; import com.kabouzeid.materialmusic.util.Util;
import com.kabouzeid.materialmusic.util.ViewUtil; import com.kabouzeid.materialmusic.util.ViewUtil;
@ -129,10 +128,11 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
} }
} }
}; };
private Bitmap albumCover;
@SuppressLint("NewApi")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
if (Util.hasLollipopSDK()) postponeEnterTransition();
app = (App) getApplicationContext(); app = (App) getApplicationContext();
setTheme(app.getAppTheme()); setTheme(app.getAppTheme());
setUpTranslucence(); setUpTranslucence();
@ -154,8 +154,19 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
setUpObservableListViewParams(); setUpObservableListViewParams();
setUpToolBar(); setUpToolBar();
setUpViews(); setUpViews();
lollipopTransitionImageWrongSizeFix(); if (!Util.hasLollipopSDK()) animateEnterActivity();
animateEnterActivity(); }
@Override
public String getTag() {
return TAG;
}
@Override
public void goToAlbum(int albumId) {
if (album.id != albumId) {
goToAlbum(albumId);
}
} }
private void initViews() { private void initViews() {
@ -191,27 +202,38 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
albumTitleView.setScaleY(0); albumTitleView.setScaleY(0);
} }
@SuppressLint("NewApi")
private void setUpAlbumArtAndApplyPalette() { private void setUpAlbumArtAndApplyPalette() {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArtImageView, new ImageLoadingListener() { ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArtImageView, new ImageLoadingListener() {
@Override @Override
public void onLoadingStarted(String imageUri, View view) { public void onLoadingStarted(String imageUri, View view) {
albumArtImageView.setImageResource(R.drawable.default_album_art);
} }
@Override @Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) { public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
albumArtImageView.setImageResource(R.drawable.default_album_art); albumArtImageView.setImageResource(R.drawable.default_album_art);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
} }
@Override @Override
public void onLoadingComplete(String imageUri, final View view, Bitmap loadedImage) { public void onLoadingComplete(String imageUri, final View view, Bitmap loadedImage) {
albumCover = loadedImage;
applyPalette(loadedImage); applyPalette(loadedImage);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
} }
@Override @Override
public void onLoadingCancelled(String imageUri, View view) { public void onLoadingCancelled(String imageUri, View view) {
albumArtImageView.setImageResource(R.drawable.default_album_art); albumArtImageView.setImageResource(R.drawable.default_album_art);
if (Util.hasLollipopSDK()) {
startPostponedEnterTransition();
animateEnterActivity();
}
} }
}); });
} }
@ -351,53 +373,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements OnMusicRemote
.start(); .start();
} }
@Override
public String getTag() {
return TAG;
}
@Override
public void goToAlbum(int albumId) {
if (album.id != albumId) {
goToAlbum(albumId);
}
}
private void lollipopTransitionImageWrongSizeFix() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
if (albumCover == null) {
ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(album.id).toString(), albumArtImageView, new ImageLoaderUtil.defaultAlbumArtOnFailed());
} else {
albumArtImageView.setImageBitmap(albumCover);
}
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
}
}
@Override @Override
public void enableViews() { public void enableViews() {
super.enableViews(); super.enableViews();

View file

@ -1,11 +1,11 @@
package com.kabouzeid.materialmusic.ui.activities; package com.kabouzeid.materialmusic.ui.activities;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter; import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
@ -78,11 +78,10 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
private int toolbarColor; private int toolbarColor;
private int tabHeight; private int tabHeight;
private Bitmap artistImage;
private Fragment currentFragment; private Fragment currentFragment;
@SuppressLint("NewApi")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
setUpTranslucence(true, true); setUpTranslucence(true, true);
@ -94,7 +93,47 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
setUpObservableListViewParams(); setUpObservableListViewParams();
setUpToolBar(); setUpToolBar();
setUpViews(); setUpViews();
lollipopTransitionImageWrongSizeFix();
if (Util.hasLollipopSDK()) {
getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
setUpArtistImageAndApplyPalette();
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
}
}
@Override
public String getTag() {
return TAG;
}
@Override
public void goToArtist(int artistId) {
if (artist.id != artistId) {
super.goToArtist(artistId);
}
} }
private void initViews() { private void initViews() {
@ -274,21 +313,17 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
} }
private void setUpArtistImageAndApplyPalette() { private void setUpArtistImageAndApplyPalette() {
if (artistImage == null) {
LastFMArtistImageLoader.loadArtistImage(this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() { LastFMArtistImageLoader.loadArtistImage(this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
@SuppressLint("NewApi")
@Override @Override
public void onArtistImageLoaded(Bitmap artistImage) { public void onArtistImageLoaded(Bitmap artistImage) {
if (artistImage != null) { if (artistImage != null) {
ArtistDetailActivity.this.artistImage = artistImage;
artistImageView.setImageBitmap(artistImage); artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage); applyPalette(artistImage);
} }
//if (Util.hasLollipopSDK()) startPostponedEnterTransition();
} }
}); });
} else {
artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage);
}
} }
private void applyPalette(Bitmap bitmap) { private void applyPalette(Bitmap bitmap) {
@ -335,60 +370,6 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
} }
} }
@Override
public String getTag() {
return TAG;
}
@Override
public void goToArtist(int artistId) {
if (artist.id != artistId) {
super.goToArtist(artistId);
}
}
private void lollipopTransitionImageWrongSizeFix() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
if (artistImage == null) {
LastFMArtistImageLoader.loadArtistImage(ArtistDetailActivity.this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
@Override
public void onArtistImageLoaded(Bitmap artistImage) {
if (artistImage != null) {
artistImageView.setImageBitmap(artistImage);
}
}
});
} else {
artistImageView.setImageBitmap(artistImage);
}
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
}
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_artist_detail, menu); getMenuInflater().inflate(R.menu.menu_artist_detail, menu);

View file

@ -4,7 +4,6 @@ import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter; import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.MenuItemCompat; import android.support.v4.view.MenuItemCompat;
@ -14,7 +13,6 @@ import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.SearchView; import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.transition.Explode;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -73,16 +71,12 @@ public class MainActivity extends AbsFabActivity
R.id.navigation_drawer, R.id.navigation_drawer,
drawerLayout drawerLayout
); );
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setExitTransition(new Explode());
}
} }
private void setUpViewPager() { private void setUpViewPager() {
viewPagerAdapter = new MainActivityViewPagerAdapter(this); viewPagerAdapter = new MainActivityViewPagerAdapter(this);
viewPager.setAdapter(viewPagerAdapter); viewPager.setAdapter(viewPagerAdapter);
slidingTabLayout.setDistributeEvenly(true); //slidingTabLayout.setDistributeEvenly(true);
slidingTabLayout.setSelectedIndicatorColors(Util.resolveColor(MainActivity.this, R.attr.colorAccent)); slidingTabLayout.setSelectedIndicatorColors(Util.resolveColor(MainActivity.this, R.attr.colorAccent));
slidingTabLayout.setViewPager(viewPager); slidingTabLayout.setViewPager(viewPager);
} }
@ -318,7 +312,7 @@ public class MainActivity extends AbsFabActivity
pages = new SparseArray<>(); pages = new SparseArray<>();
context = activity; context = activity;
titles = new String[]{ titles = new String[]{
context.getResources().getString(R.string.all_songs), context.getResources().getString(R.string.songs),
context.getResources().getString(R.string.albums), context.getResources().getString(R.string.albums),
context.getResources().getString(R.string.artists), context.getResources().getString(R.string.artists),
context.getResources().getString(R.string.genres), context.getResources().getString(R.string.genres),

View file

@ -140,7 +140,7 @@ public class NavigationDrawerFragment extends Fragment {
private void setUpListView() { private void setUpListView() {
final ArrayList<NavigationDrawerItem> navigationDrawerItems = new ArrayList<>(); final ArrayList<NavigationDrawerItem> navigationDrawerItems = new ArrayList<>();
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.all_songs), R.drawable.songs)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.songs), R.drawable.songs));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.albums), R.drawable.album)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.albums), R.drawable.album));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.artists), R.drawable.interpret)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.artists), R.drawable.interpret));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.genres), R.drawable.songs)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.genres), R.drawable.songs));

View file

@ -9,6 +9,7 @@ import android.graphics.Bitmap;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View; import android.view.View;
@ -191,4 +192,12 @@ public class Util {
} }
} }
} }
public static boolean hasLollipopSDK() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}
public static boolean hasKitKatSDK() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
}
} }

View file

@ -20,7 +20,7 @@
<string name="albums">Albums</string> <string name="albums">Albums</string>
<string name="artists">Artists</string> <string name="artists">Artists</string>
<string name="genres">Genres</string> <string name="genres">Genres</string>
<string name="all_songs">All Songs</string> <string name="songs">Songs</string>
<string name="playlists">Playlists</string> <string name="playlists">Playlists</string>
<string name="unknown_artist">Unknown Artist</string> <string name="unknown_artist">Unknown Artist</string>
<string name="unknown_album">Unknown Album</string> <string name="unknown_album">Unknown Album</string>