Skip to content

Commit

Permalink
New features and fixes
Browse files Browse the repository at this point in the history
 - Video thumbnails
 - Grid view
 - Playback timer view
 - Auto start playback timer if user has not closed menu in 1 min
 - Fixes and enhancements
  • Loading branch information
AndreyPavlenko committed Jun 5, 2020
1 parent 5ed37bf commit d2a91b9
Show file tree
Hide file tree
Showing 34 changed files with 513 additions and 93 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
ext {
def abi = project.properties['ABI']
VERSION_CODE = 66
VERSION_CODE = 71
VERSION_NAME = "1.7.0"
SDK_MIN_VERSION = 23
SDK_TARGET_VERSION = 29
Expand Down
39 changes: 39 additions & 0 deletions fermata/src/auto/java/me/aap/fermata/auto/CarEditText.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
package me.aap.fermata.auto;

import android.content.Context;
import android.os.SystemClock;
import android.support.car.input.CarRestrictedEditText;
import android.util.AttributeSet;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;

import com.google.android.gms.car.input.CarEditable;
import com.google.android.gms.car.input.CarEditableListener;

import me.aap.fermata.ui.activity.FermataActivity;
import me.aap.fermata.ui.activity.MainActivityDelegate;

/**
* @author Andrey Pavlenko
*/
public class CarEditText extends CarRestrictedEditText implements CarEditable {
private OnKeyListener keyListener;

public CarEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
Expand All @@ -19,4 +28,34 @@ public CarEditText(Context context, AttributeSet attrs) {
public void setCarEditableListener(final CarEditableListener listener) {
super.setCarEditableListener(listener::onUpdateSelection);
}

@Override
public void setOnKeyListener(OnKeyListener l) {
super.setOnKeyListener(l);
keyListener = l;
}

@Override
public void onEditorAction(int actionCode) {
if (keyListener != null) {
switch (actionCode) {
case EditorInfo.IME_ACTION_GO:
case EditorInfo.IME_ACTION_SEARCH:
case EditorInfo.IME_ACTION_SEND:
case EditorInfo.IME_ACTION_NEXT:
case EditorInfo.IME_ACTION_DONE:
long eventTime = SystemClock.uptimeMillis();
KeyEvent e = new KeyEvent(eventTime, eventTime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | KeyEvent.FLAG_EDITOR_ACTION);
keyListener.onKey(this, KeyEvent.KEYCODE_ENTER, e);
FermataActivity a = MainActivityDelegate.get(getContext()).getAppActivity();
if (a instanceof MainCarActivity) ((MainCarActivity) a).stopInput(null);
return;
}
}

super.onEditorAction(actionCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,14 @@ public void onResume() {

@Override
public void onDestroy() {
super.onDestroy();

MainActivityDelegate a = getActivityDelegate();

if (a != null) {
FermataServiceUiBinder b = a.getMediaServiceBinder();
if (b != null) b.getMediaSessionCallback().onPause();
}

super.onDestroy();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public FutureSupplier<Bitmap> getBitmap(Context ctx, String uri, boolean cache,
Bitmap bm;

if (resize) {
size = getIconSize(ctx);
size = 3 * getIconSize(ctx);
iconUri = toIconUri(uri, size);
bm = getCachedBitmap(iconUri);
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package me.aap.fermata.media.engine;

import android.content.Context;
import android.support.v4.media.MediaMetadataCompat;
import android.graphics.Bitmap;

import me.aap.fermata.media.engine.MediaEngine.Listener;
import me.aap.fermata.media.lib.MediaLib.PlayableItem;
Expand All @@ -18,4 +18,20 @@ public interface MediaEngineProvider {
default boolean getMediaMetadata(MetadataBuilder meta, PlayableItem item) {
return false;
}

default boolean isValidBitmap(Bitmap bm) {
if (bm == null) return false;

int prev = 0;

for (int x = 0, w = bm.getWidth(), h = bm.getHeight(); x < w; x++) {
for (int y = 0; y < h; y++) {
int px = bm.getPixel(x, y);
if ((px != prev) && (x != 0) && (y != 0)) return true;
prev = px;
}
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,11 @@ public AudioEffects getAudioEffects() {

@Override
public void close() {
if (player.isPlaying()) player.stop();
try {
if (player.isPlaying()) player.stop();
} catch (IllegalStateException ignore) {
}

if (audioEffects != null) audioEffects.release();
player.release();
source = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import me.aap.fermata.media.lib.MediaLib.PlayableItem;
import me.aap.utils.log.Log;

import static java.util.concurrent.TimeUnit.MICROSECONDS;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

/**
* @author Andrey Pavlenko
*/
Expand Down Expand Up @@ -58,15 +61,26 @@ public boolean getMediaMetadata(MetadataBuilder meta, PlayableItem item) {
if (m != null) meta.putString(MediaMetadataCompat.METADATA_KEY_GENRE, m);

m = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
if (m != null)
meta.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, Long.parseLong(m));
long dur = 0;

if (m != null) {
dur = Long.parseLong(m);
meta.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, dur);
}

byte[] pic = mmr.getEmbeddedPicture();
Bitmap bm = null;

if (pic != null) {
Bitmap bm = BitmapFactory.decodeByteArray(pic, 0, pic.length);
if (bm != null) meta.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm);
bm = BitmapFactory.decodeByteArray(pic, 0, pic.length);
}

if ((bm == null) && item.isVideo()) {
dur = MICROSECONDS.convert(dur, MILLISECONDS);
bm = mmr.getFrameAtTime(dur / 2);
}

if (isValidBitmap(bm)) meta.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm);
} catch (Throwable ex) {
Log.d(ex, "Failed to retrieve media metadata of ", item.getLocation());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@
import java.util.HashMap;
import java.util.Map;

import me.aap.fermata.BuildConfig;
import me.aap.fermata.FermataApplication;
import me.aap.fermata.media.lib.MediaLib.PlayableItem;
import me.aap.utils.app.App;
import me.aap.utils.async.FutureSupplier;
import me.aap.utils.async.PromiseQueue;
import me.aap.utils.function.IntSupplier;
import me.aap.utils.log.Log;
import me.aap.utils.pref.PreferenceStore;
import me.aap.utils.pref.PreferenceStore.Pref;
import me.aap.utils.text.SharedTextBuilder;
import me.aap.utils.text.TextBuilder;
import me.aap.utils.vfs.VirtualResource;
Expand Down Expand Up @@ -245,6 +250,15 @@ private static boolean isBitmapUri(Context ctx, String u, Uri uri) {

private void createTable() {
if (db == null) return;

PreferenceStore ps = FermataApplication.get().getPreferenceStore();
Pref<IntSupplier> version = Pref.i("METADATA_VERSION", 0);

if (ps.getIntPref(version) < 70) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE);
ps.applyIntPref(version, BuildConfig.VERSION_CODE);
}

db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + "(" +
COL_ID + " VARCHAR NOT NULL UNIQUE, " +
COL_TITLE + " VARCHAR, " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@
import me.aap.fermata.media.lib.MediaLib.Item;
import me.aap.fermata.media.lib.MediaLib.PlayableItem;
import me.aap.fermata.media.lib.MediaLib.Playlist;
import me.aap.fermata.media.lib.MediaLib.Playlists;
import me.aap.fermata.media.pref.BrowsableItemPrefs;
import me.aap.fermata.media.pref.PlaylistPrefs;
import me.aap.utils.async.FutureSupplier;
import me.aap.utils.pref.PreferenceStore;
import me.aap.utils.pref.SharedPreferenceStore;
import me.aap.utils.text.SharedTextBuilder;

import static java.util.Objects.requireNonNull;
import static me.aap.utils.async.Completed.completed;
import static me.aap.utils.collection.CollectionUtils.mapToArray;

Expand Down Expand Up @@ -58,6 +60,12 @@ public int getPlaylistId() {
return playlistId;
}

@NonNull
@Override
public Playlists getParent() {
return (Playlists) requireNonNull(super.getParent());
}

@NonNull
@Override
public BrowsableItemPrefs getPrefs() {
Expand Down
6 changes: 6 additions & 0 deletions fermata/src/main/java/me/aap/fermata/media/lib/MediaLib.java
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,8 @@ interface Playlists extends BrowsableItem {

void removeItem(int idx);

void removeItems(List<Playlist> items);

void moveItem(int fromPosition, int toPosition);

@Override
Expand All @@ -553,6 +555,10 @@ default boolean hasPlaylists() {

interface Playlist extends BrowsableItem {

@NonNull
@Override
Playlists getParent();

String getName();

void addItems(List<PlayableItem> items);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package me.aap.fermata.ui.activity;

import android.content.Context;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;

import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;

import me.aap.utils.ui.activity.AppActivity;

Expand All @@ -27,8 +24,4 @@ default void stopInput(TextWatcher w) {
default boolean isInputActive() {
return false;
}

default EditText createEditText(Context ctx, AttributeSet attrs) {
return new AppCompatEditText(ctx, attrs);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -494,15 +494,17 @@ private void onMediaServiceBind(FermataServiceUiBinder b, Throwable err) {
}

fireBroadcastEvent(SERVICE_BOUND);
showFragment(R.id.folders_fragment);

FutureSupplier<?> f = goToCurrent().onCompletion((ok, fail1) -> {
FutureSupplier<Boolean> f = goToCurrent().onCompletion((ok, fail1) -> {
if ((fail1 != null) && !isCancellation(fail1)) {
Log.e(fail1, "Last played track not found");
}
});

setContentLoading(f);
if (!f.isDone() || !f.peek()) {
showFragment(R.id.folders_fragment);
setContentLoading(f);
}

FermataApplication.get().getHandler().post(() -> {
b.addBroadcastListener(this);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package me.aap.fermata.ui.activity;

import me.aap.utils.event.EventBroadcaster;
import me.aap.utils.function.BooleanSupplier;
import me.aap.utils.function.IntSupplier;

import me.aap.utils.pref.PreferenceStore;
import me.aap.utils.pref.SharedPreferenceStore;
import me.aap.utils.event.EventBroadcaster;

/**
* @author Andrey Pavlenko
Expand All @@ -18,6 +17,7 @@ public interface MainActivityPrefs extends SharedPreferenceStore, EventBroadcast
Pref<IntSupplier> THEME = Pref.i("THEME", THEME_DARK);
Pref<BooleanSupplier> HIDE_BARS = Pref.b("HIDE_BARS", false);
Pref<BooleanSupplier> FULLSCREEN = Pref.b("FULLSCREEN", false);
Pref<BooleanSupplier> GRID_VIEW = Pref.b("GRID_VIEW", false);

default int getThemePref() {
return getIntPref(THEME);
Expand All @@ -42,4 +42,12 @@ default boolean getFullscreenPref() {
default void setFullscreenPref(boolean value) {
applyBooleanPref(FULLSCREEN, value);
}

default boolean getGridViewPref() {
return getBooleanPref(GRID_VIEW);
}

default void setGridViewPref(boolean value) {
applyBooleanPref(GRID_VIEW, value);
}
}
Loading

0 comments on commit d2a91b9

Please sign in to comment.