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;
}
public void addToRequestQueue(Request request) {
public void addToVolleyRequestQueue(Request request) {
request.setTag(TAG);
getRequestQueue().add(request);
getVolleyRequestQueue().add(request);
}
public RequestQueue getRequestQueue() {
public RequestQueue getVolleyRequestQueue() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(this);
}

View file

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

View file

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

View file

@ -36,7 +36,7 @@ public class LastFMArtistImageLoader {
}
} else {
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);
App app = (App) context.getApplicationContext();
String artistUrl = LastFMArtistInfoUtil.getArtistUrl(artist);
@ -89,7 +89,7 @@ public class LastFMArtistImageLoader {
callback.onArtistImageLoaded(null);
}
});
app.addToRequestQueue(artistInfoJSONRequest);
app.addToVolleyRequestQueue(artistInfoJSONRequest);
}
public static interface ArtistImageLoaderCallback {

View file

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

View file

@ -70,12 +70,6 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
cursor.close();
}
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) {
@ -84,6 +78,12 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
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 {
@ -94,6 +94,7 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + AlbumJSONColumns.NAME);

View file

@ -70,12 +70,6 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
cursor.close();
}
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) {
@ -84,6 +78,12 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
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 {
@ -94,6 +94,7 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + ArtistJSONColumns.NAME);

View file

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

View file

@ -1,11 +1,11 @@
package com.kabouzeid.materialmusic.ui.activities;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
@ -78,11 +78,10 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
private int toolbarColor;
private int tabHeight;
private Bitmap artistImage;
private Fragment currentFragment;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
setUpTranslucence(true, true);
@ -94,7 +93,47 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
setUpObservableListViewParams();
setUpToolBar();
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() {
@ -274,21 +313,17 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot
}
private void setUpArtistImageAndApplyPalette() {
if (artistImage == null) {
LastFMArtistImageLoader.loadArtistImage(this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
@Override
public void onArtistImageLoaded(Bitmap artistImage) {
if (artistImage != null) {
ArtistDetailActivity.this.artistImage = artistImage;
artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage);
}
LastFMArtistImageLoader.loadArtistImage(this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() {
@SuppressLint("NewApi")
@Override
public void onArtistImageLoaded(Bitmap artistImage) {
if (artistImage != null) {
artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage);
}
});
} else {
artistImageView.setImageBitmap(artistImage);
applyPalette(artistImage);
}
//if (Util.hasLollipopSDK()) startPostponedEnterTransition();
}
});
}
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
public boolean onCreateOptionsMenu(Menu 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.content.Context;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
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.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.transition.Explode;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
@ -73,16 +71,12 @@ public class MainActivity extends AbsFabActivity
R.id.navigation_drawer,
drawerLayout
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setExitTransition(new Explode());
}
}
private void setUpViewPager() {
viewPagerAdapter = new MainActivityViewPagerAdapter(this);
viewPager.setAdapter(viewPagerAdapter);
slidingTabLayout.setDistributeEvenly(true);
//slidingTabLayout.setDistributeEvenly(true);
slidingTabLayout.setSelectedIndicatorColors(Util.resolveColor(MainActivity.this, R.attr.colorAccent));
slidingTabLayout.setViewPager(viewPager);
}
@ -318,7 +312,7 @@ public class MainActivity extends AbsFabActivity
pages = new SparseArray<>();
context = activity;
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.artists),
context.getResources().getString(R.string.genres),

View file

@ -140,7 +140,7 @@ public class NavigationDrawerFragment extends Fragment {
private void setUpListView() {
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.artists), R.drawable.interpret));
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.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.TypedValue;
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="artists">Artists</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="unknown_artist">Unknown Artist</string>
<string name="unknown_album">Unknown Album</string>