Fixed a memory leak in AbsTagEditorActivity. Also fixed some NullPointer warnings.
This commit is contained in:
parent
7fd4226685
commit
84144fb4d0
1 changed files with 88 additions and 65 deletions
|
|
@ -47,6 +47,7 @@ import org.jaudiotagger.tag.images.Artwork;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
@ -91,6 +92,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
private List<String> songPaths;
|
private List<String> songPaths;
|
||||||
|
private MaterialDialog progressDialog;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
@ -113,6 +115,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
setUpViews();
|
setUpViews();
|
||||||
|
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
//noinspection ConstantConditions
|
||||||
getSupportActionBar().setTitle(getResources().getString(R.string.tag_editor));
|
getSupportActionBar().setTitle(getResources().getString(R.string.tag_editor));
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
@ -319,7 +322,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
protected void writeValuesToFiles(@NonNull final Map<FieldKey, String> fieldKeyValueMap, @Nullable final Artwork artwork, final boolean deleteArtwork) {
|
protected void writeValuesToFiles(@NonNull final Map<FieldKey, String> fieldKeyValueMap, @Nullable final Artwork artwork, final boolean deleteArtwork) {
|
||||||
Util.hideSoftKeyboard(this);
|
Util.hideSoftKeyboard(this);
|
||||||
final String writingFileStr = getResources().getString(R.string.writing_file_number);
|
final String writingFileStr = getResources().getString(R.string.writing_file_number);
|
||||||
final MaterialDialog progressDialog = new MaterialDialog.Builder(AbsTagEditorActivity.this)
|
progressDialog = new MaterialDialog.Builder(AbsTagEditorActivity.this)
|
||||||
.title(R.string.saving_changes)
|
.title(R.string.saving_changes)
|
||||||
.cancelable(false)
|
.cancelable(false)
|
||||||
.progress(true, 0)
|
.progress(true, 0)
|
||||||
|
|
@ -374,56 +377,78 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
rescanMediaAndQuitOnFinish(new OnScannedAllListener() {
|
rescanMediaAndQuitOnFinish();
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class FinishOnCompletedMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
|
||||||
|
|
||||||
|
private WeakReference<AbsTagEditorActivity> activityWeakReference;
|
||||||
|
private MediaScannerConnection connection;
|
||||||
|
private String[] toBeScanned;
|
||||||
|
private int position;
|
||||||
|
|
||||||
|
|
||||||
|
private FinishOnCompletedMediaScanner(AbsTagEditorActivity activity, String[] toBeScanned) {
|
||||||
|
activityWeakReference = new WeakReference<>(activity);
|
||||||
|
this.toBeScanned = toBeScanned;
|
||||||
|
connection = new MediaScannerConnection(activity.getApplicationContext(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scan() {
|
||||||
|
connection.connect();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onScannedAll() {
|
public void onMediaScannerConnected() {
|
||||||
|
scanNextPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScanCompleted(String path, Uri uri) {
|
||||||
|
scanNextPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scanNextPath() {
|
||||||
|
if (position < toBeScanned.length) {
|
||||||
|
connection.scanFile(toBeScanned[position], null);
|
||||||
|
}
|
||||||
|
checkIsDone();
|
||||||
|
position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkIsDone() {
|
||||||
|
if (position >= toBeScanned.length - 1) {
|
||||||
|
connection.disconnect();
|
||||||
|
AbsTagEditorActivity activity = activityWeakReference.get();
|
||||||
|
if (activity != null) {
|
||||||
|
activity.dismissDialogAndFinish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dismissDialogAndFinish() {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
progressDialog.dismiss();
|
progressDialog.dismiss();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void rescanMediaAndQuitOnFinish(@NonNull final OnScannedAllListener listener) {
|
private void rescanMediaAndQuitOnFinish() {
|
||||||
String[] toBeScanned = new String[songPaths.size()];
|
String[] toBeScanned = new String[songPaths.size()];
|
||||||
toBeScanned = songPaths.toArray(toBeScanned);
|
toBeScanned = songPaths.toArray(toBeScanned);
|
||||||
final int toBeScannedLength = toBeScanned.length;
|
new FinishOnCompletedMediaScanner(this, toBeScanned).scan();
|
||||||
MediaScannerConnection.scanFile(this, toBeScanned, null, new MediaScannerConnection.OnScanCompletedListener() {
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onScanCompleted(String s, Uri uri) {
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (i == 0 || i == toBeScannedLength - 1) {
|
|
||||||
if (i == toBeScannedLength - 1)
|
|
||||||
listener.onScannedAll();
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getId() {
|
protected int getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void writeValuesToFiles(@NonNull final Map<FieldKey, String> fieldKeyValueMap, @Nullable final Artwork artwork) {
|
|
||||||
if (artwork == null) {
|
|
||||||
writeValuesToFiles(fieldKeyValueMap, null, true);
|
|
||||||
} else {
|
|
||||||
writeValuesToFiles(fieldKeyValueMap, artwork, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void writeValuesToFiles(@NonNull final Map<FieldKey, String> fieldKeyValueMap, boolean deleteArtwork) {
|
|
||||||
writeValuesToFiles(fieldKeyValueMap, null, deleteArtwork);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, @NonNull Intent imageReturnedIntent) {
|
protected void onActivityResult(int requestCode, int resultCode, @NonNull Intent imageReturnedIntent) {
|
||||||
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
|
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
|
||||||
|
|
@ -438,77 +463,78 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
|
|
||||||
protected abstract void loadImageFromFile(Uri selectedFile);
|
protected abstract void loadImageFromFile(Uri selectedFile);
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private AudioFile getAudioFile(@NonNull String path) {
|
||||||
|
try {
|
||||||
|
return AudioFileIO.read(new File(path));
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Could not read audio file " + path, e);
|
||||||
|
return new AudioFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getSongTitle() {
|
protected String getSongTitle() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.TITLE);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.TITLE);
|
||||||
} catch (NullPointerException e) {
|
} catch (Exception ignored) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private AudioFile getAudioFile(@NonNull String path) {
|
|
||||||
try {
|
|
||||||
return AudioFileIO.read(new File(path));
|
|
||||||
} catch (@NonNull CannotReadException | ReadOnlyFileException | InvalidAudioFrameException | TagException | IOException e) {
|
|
||||||
Log.e(TAG, "Error while trying to create the AudioFile from java.io.File", e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getAlbumTitle() {
|
protected String getAlbumTitle() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ALBUM);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ALBUM);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getArtistName() {
|
protected String getArtistName() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ARTIST);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ARTIST);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getAlbumArtistName() {
|
protected String getAlbumArtistName() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ALBUM_ARTIST);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.ALBUM_ARTIST);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getGenreName() {
|
protected String getGenreName() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.GENRE);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.GENRE);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getSongYear() {
|
protected String getSongYear() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.YEAR);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.YEAR);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected String getTrackNumber() {
|
protected String getTrackNumber() {
|
||||||
try {
|
try {
|
||||||
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.TRACK);
|
return getAudioFile(songPaths.get(0)).getTagOrCreateAndSetDefault().getFirst(FieldKey.TRACK);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
protected Bitmap getAlbumArt() {
|
protected Bitmap getAlbumArt() {
|
||||||
|
|
@ -518,12 +544,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
byte[] artworkBinaryData = artworkTag.getBinaryData();
|
byte[] artworkBinaryData = artworkTag.getBinaryData();
|
||||||
return BitmapFactory.decodeByteArray(artworkBinaryData, 0, artworkBinaryData.length);
|
return BitmapFactory.decodeByteArray(artworkBinaryData, 0, artworkBinaryData.length);
|
||||||
}
|
}
|
||||||
} catch (NullPointerException ignored) {
|
return null;
|
||||||
}
|
} catch (Exception ignored) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface OnScannedAllListener {
|
|
||||||
void onScannedAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue