fixed image/video viewer. status preference fix

This commit is contained in:
nuclearfog 2023-07-08 15:29:35 +02:00
parent 82c2cbe67a
commit 71cc5d833c
No known key found for this signature in database
GPG Key ID: 03488A185C476379
8 changed files with 192 additions and 207 deletions

View File

@ -44,52 +44,16 @@ import java.io.Serializable;
*/ */
public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoaderResult>, DescriptionCallback { public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoaderResult>, DescriptionCallback {
/**
* mode used to show local image/gif file
* requires {@link #KEY_MEDIA_LOCAL} to be set
*/
public static final int MEDIA_LOCAL = 902;
/**
* mode used to show online image
* requires {@link #KEY_MEDIA_URL} to be set
*/
public static final int IMAGE_ONLINE = 903;
/**
* mode used to show online image
* requires {@link #KEY_MEDIA_ONLINE} to be set
*/
public static final int MEDIA_ONLINE = 904;
/** /**
* activity result code indicates that {@link MediaStatus} data has been updated * activity result code indicates that {@link MediaStatus} data has been updated
*/ */
public static final int RETURN_MEDIA_STATUS_UPDATE = 0x5895; public static final int RETURN_MEDIA_STATUS_UPDATE = 0x5895;
/** /**
* key to set image format (image or gif) * key to add media data (online or local)
* value type is Integer {@link #IMAGE_ONLINE,#GIF_LOCAL,#MEDIA_LOCAL} * value type can be {@link Media} for online media, {@link MediaStatus} for local media or {@link Uri} for media links
*/ */
public static final String TYPE = "image-type"; public static final String KEY_IMAGE_DATA = "image-data";
/**
* key to add URI of the image (online or local)
* value type is {@link Uri}
*/
public static final String KEY_MEDIA_URL = "image-url";
/**
* key to add offline media
* value type is {@link MediaStatus}
*/
public static final String KEY_MEDIA_LOCAL = "media-status";
/**
* key to add online media
* value type is {@link Media}
*/
public static final String KEY_MEDIA_ONLINE = "media-online";
/** /**
* name of the cache folder where online images will be stored * name of the cache folder where online images will be stored
@ -111,7 +75,6 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
private ImageDownloader imageAsync; private ImageDownloader imageAsync;
private GlobalSettings settings; private GlobalSettings settings;
private File cacheFolder; private File cacheFolder;
private int mode = 0;
@Override @Override
@ -141,58 +104,66 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
cacheFolder = new File(getExternalCacheDir(), ImageViewer.CACHE_FOLDER); cacheFolder = new File(getExternalCacheDir(), ImageViewer.CACHE_FOLDER);
cacheFolder.mkdirs(); cacheFolder.mkdirs();
mode = getIntent().getIntExtra(TYPE, 0); // get parameters
switch (mode) { String imageUrl = null;
case IMAGE_ONLINE: String blurHash = null;
zoomImage.setVisibility(View.VISIBLE); String description = null;
boolean animated = false;
boolean local = false;
Serializable serializedData;
if (savedInstanceState != null) {
serializedData = savedInstanceState.getSerializable(KEY_IMAGE_DATA);
} else {
serializedData = getIntent().getSerializableExtra(KEY_IMAGE_DATA);
}
if (serializedData instanceof MediaStatus) {
mediaStatus = (MediaStatus) serializedData;
imageUrl = mediaStatus.getPath();
animated = mediaStatus.getMediaType() == MediaStatus.GIF;
local = imageUrl != null && !imageUrl.startsWith("http");
description = mediaStatus.getDescription();
} else if (serializedData instanceof Media) {
Media media = (Media) serializedData;
blurHash = media.getBlurHash();
imageUrl = media.getUrl();
description = media.getDescription();
animated = media.getMediaType() == Media.GIF;
} else if (serializedData instanceof String) {
imageUrl = (String) serializedData;
} else {
finish();
}
// setup image view
if (imageUrl != null && !imageUrl.trim().isEmpty()) {
// select view to show image
if (animated) {
gifImage.setVisibility(View.VISIBLE);
zoomImage.setVisibility(View.INVISIBLE);
} else {
gifImage.setVisibility(View.INVISIBLE); gifImage.setVisibility(View.INVISIBLE);
zoomImage.setVisibility(View.VISIBLE);
}
// load image
if (local) {
if (animated) {
gifImage.setImageURI(Uri.parse(imageUrl));
} else {
zoomImage.setImageURI(Uri.parse(imageUrl));
}
} else {
loadingCircle.setVisibility(View.VISIBLE); loadingCircle.setVisibility(View.VISIBLE);
Uri data = getIntent().getParcelableExtra(KEY_MEDIA_URL); ImageLoaderParam request = new ImageLoaderParam(Uri.parse(imageUrl), cacheFolder);
ImageLoaderParam request = new ImageLoaderParam(data, cacheFolder);
imageAsync.execute(request, this); imageAsync.execute(request, this);
break; }
}
case MEDIA_LOCAL: // set image description
Serializable serializedData = getIntent().getSerializableExtra(KEY_MEDIA_LOCAL); if (description != null && !description.trim().isEmpty()) {
if (serializedData instanceof MediaStatus) { descriptionView.setDescription(description);
mediaStatus = (MediaStatus) serializedData; }
if (!mediaStatus.getDescription().trim().isEmpty()) { // set image blur placeholder
descriptionView.setVisibility(View.VISIBLE); if (blurHash != null && !blurHash.trim().isEmpty()) {
descriptionView.setDescription(mediaStatus.getDescription()); Bitmap blur = BlurHashDecoder.INSTANCE.decode(blurHash, 16, 16, 1f, true);
} zoomImage.setImageBitmap(blur);
if (mediaStatus.getMediaType() == MediaStatus.PHOTO) {
zoomImage.setVisibility(View.VISIBLE);
gifImage.setVisibility(View.INVISIBLE);
zoomImage.setImageURI(Uri.parse(mediaStatus.getPath()));
} else if (mediaStatus.getMediaType() == MediaStatus.GIF) {
zoomImage.setVisibility(View.INVISIBLE);
gifImage.setVisibility(View.VISIBLE);
gifImage.setImageURI(Uri.parse(mediaStatus.getPath()));
}
}
break;
case MEDIA_ONLINE:
serializedData = getIntent().getSerializableExtra(KEY_MEDIA_ONLINE);
if (serializedData instanceof Media) {
loadingCircle.setVisibility(View.VISIBLE);
Media media = (Media) serializedData;
if (!media.getBlurHash().isEmpty()) {
Bitmap blur = BlurHashDecoder.INSTANCE.decode(media.getBlurHash(), 16, 16, 1f, true);
zoomImage.setImageBitmap(blur);
}
if (!media.getDescription().isEmpty()) {
descriptionView.setVisibility(View.VISIBLE);
descriptionView.setDescription(media.getDescription());
}
if (media.getMediaType() == Media.PHOTO) {
zoomImage.setVisibility(View.VISIBLE);
gifImage.setVisibility(View.INVISIBLE);
request = new ImageLoaderParam(Uri.parse(media.getUrl()), cacheFolder);
imageAsync.execute(request, this);
}
}
break;
} }
} }
@ -201,7 +172,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
public void onBackPressed() { public void onBackPressed() {
if (mediaStatus != null) { if (mediaStatus != null) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(KEY_MEDIA_LOCAL, mediaStatus); intent.putExtra(KEY_IMAGE_DATA, mediaStatus);
setResult(RETURN_MEDIA_STATUS_UPDATE, intent); setResult(RETURN_MEDIA_STATUS_UPDATE, intent);
} }
super.onBackPressed(); super.onBackPressed();
@ -220,11 +191,17 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.image, menu); getMenuInflater().inflate(R.menu.image, menu);
MenuItem itemSave = menu.findItem(R.id.menu_image_save);
MenuItem itemDescription = menu.findItem(R.id.menu_image_add_description); MenuItem itemDescription = menu.findItem(R.id.menu_image_add_description);
AppStyles.setMenuIconColor(menu, settings.getIconColor());
itemSave.setVisible(mode == IMAGE_ONLINE || mode == MEDIA_ONLINE);
itemDescription.setVisible(mediaStatus != null); itemDescription.setVisible(mediaStatus != null);
AppStyles.setMenuIconColor(menu, settings.getIconColor());
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem itemSave = menu.findItem(R.id.menu_image_save);
itemSave.setVisible(cacheUri != null);
return true; return true;
} }
@ -239,6 +216,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
} }
else if (item.getItemId() == R.id.menu_image_add_description) { else if (item.getItemId() == R.id.menu_image_add_description) {
descriptionDialog.show(); descriptionDialog.show();
return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@ -261,6 +239,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
cacheUri = result.uri; cacheUri = result.uri;
zoomImage.reset(); zoomImage.reset();
zoomImage.setImageURI(cacheUri); zoomImage.setImageURI(cacheUri);
invalidateMenu();
} else { } else {
ErrorUtils.showErrorMessage(getApplicationContext(), result.exception); ErrorUtils.showErrorMessage(getApplicationContext(), result.exception);
finish(); finish();

View File

@ -184,8 +184,7 @@ public class MessageEditor extends MediaActivity implements OnClickListener, OnC
else if (v.getId() == R.id.popup_message_preview) { else if (v.getId() == R.id.popup_message_preview) {
if (messageUpdate.getMediaStatus() != null) { if (messageUpdate.getMediaStatus() != null) {
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_LOCAL, messageUpdate.getMediaStatus()); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, messageUpdate.getMediaStatus());
intent.putExtra(ImageViewer.TYPE, ImageViewer.MEDIA_LOCAL);
startActivity(intent); startActivity(intent);
} }
} }

View File

@ -583,8 +583,7 @@ public class ProfileActivity extends AppCompatActivity implements ActivityResult
else if (v.getId() == R.id.profile_img) { else if (v.getId() == R.id.profile_img) {
if (!user.getOriginalProfileImageUrl().isEmpty()) { if (!user.getOriginalProfileImageUrl().isEmpty()) {
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_URL, Uri.parse(user.getOriginalProfileImageUrl())); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, user.getOriginalProfileImageUrl());
intent.putExtra(ImageViewer.TYPE, ImageViewer.IMAGE_ONLINE);
startActivity(intent); startActivity(intent);
} }
} }
@ -592,8 +591,7 @@ public class ProfileActivity extends AppCompatActivity implements ActivityResult
else if (v.getId() == R.id.profile_banner) { else if (v.getId() == R.id.profile_banner) {
if (!user.getOriginalBannerImageUrl().isEmpty()) { if (!user.getOriginalBannerImageUrl().isEmpty()) {
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_URL, Uri.parse(user.getOriginalBannerImageUrl())); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, user.getOriginalBannerImageUrl());
intent.putExtra(ImageViewer.TYPE, ImageViewer.IMAGE_ONLINE);
startActivity(intent); startActivity(intent);
} }
} }

View File

@ -539,7 +539,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
// edit status // edit status
else if (item.getItemId() == R.id.menu_status_edit) { else if (item.getItemId() == R.id.menu_status_edit) {
Intent intent = new Intent(this, StatusEditor.class); Intent intent = new Intent(this, StatusEditor.class);
intent.putExtra(StatusEditor.KEY_DATA, status); intent.putExtra(StatusEditor.KEY_STATUS_DATA, status);
intent.putExtra(StatusEditor.KEY_EDIT, true); intent.putExtra(StatusEditor.KEY_EDIT, true);
activityResultLauncher.launch(intent); activityResultLauncher.launch(intent);
} }
@ -555,7 +555,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
public void onActivityResult(ActivityResult result) { public void onActivityResult(ActivityResult result) {
if (result.getData() != null) { if (result.getData() != null) {
if (result.getResultCode() == StatusEditor.RETURN_STATUS_UPDATE) { if (result.getResultCode() == StatusEditor.RETURN_STATUS_UPDATE) {
Serializable data = result.getData().getSerializableExtra(StatusEditor.KEY_DATA); Serializable data = result.getData().getSerializableExtra(StatusEditor.KEY_STATUS_DATA);
if (data instanceof Status) { if (data instanceof Status) {
setStatus((Status) data); setStatus((Status) data);
} }
@ -573,7 +573,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
// answer to the status // answer to the status
if (v.getId() == R.id.page_status_reply) { if (v.getId() == R.id.page_status_reply) {
Intent intent = new Intent(this, StatusEditor.class); Intent intent = new Intent(this, StatusEditor.class);
intent.putExtra(StatusEditor.KEY_DATA, status); intent.putExtra(StatusEditor.KEY_STATUS_DATA, status);
startActivity(intent); startActivity(intent);
} }
// show user reposting this status // show user reposting this status
@ -728,8 +728,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
String imageUrl = card.getImageUrl(); String imageUrl = card.getImageUrl();
if (!imageUrl.isEmpty()) { if (!imageUrl.isEmpty()) {
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_URL, Uri.parse(card.getImageUrl())); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, card.getImageUrl());
intent.putExtra(ImageViewer.TYPE, ImageViewer.IMAGE_ONLINE);
startActivity(intent); startActivity(intent);
} }
} }
@ -742,8 +741,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
switch (media.getMediaType()) { switch (media.getMediaType()) {
case Media.PHOTO: case Media.PHOTO:
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_ONLINE, media); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, media);
intent.putExtra(ImageViewer.TYPE, ImageViewer.MEDIA_ONLINE);
startActivity(intent); startActivity(intent);
break; break;
@ -754,7 +752,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener
case Media.GIF: case Media.GIF:
case Media.VIDEO: case Media.VIDEO:
intent = new Intent(this, VideoViewer.class); intent = new Intent(this, VideoViewer.class);
intent.putExtra(VideoViewer.KEY_VIDEO_ONLINE, media); intent.putExtra(VideoViewer.KEY_VIDEO_DATA, media);
startActivity(intent); startActivity(intent);
break; break;
} }

View File

@ -71,10 +71,10 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
* key to add the status to reply * key to add the status to reply
* value type is {@link Status} * value type is {@link Status}
*/ */
public static final String KEY_DATA = "status_data"; public static final String KEY_STATUS_DATA = "status_data";
/** /**
* key to edit status send with {@link #KEY_DATA} * key to edit status send with {@link #KEY_STATUS_DATA}
* value type is Boolean * value type is Boolean
*/ */
public static final String KEY_EDIT = "status_edit"; public static final String KEY_EDIT = "status_edit";
@ -85,12 +85,6 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
*/ */
public static final String KEY_TEXT = "status_text"; public static final String KEY_TEXT = "status_text";
/**
* key for status update to restore
* value type is {@link StatusUpdate}
*/
private static final String KEY_SAVE = "status_update";
private ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this); private ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this);
private AsyncCallback<StatusUpdateResult> statusUpdateResult = this::onStatusUpdated; private AsyncCallback<StatusUpdateResult> statusUpdateResult = this::onStatusUpdated;
private AsyncCallback<Instance> instanceResult = this::onInstanceResult; private AsyncCallback<Instance> instanceResult = this::onInstanceResult;
@ -148,10 +142,10 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
audioDialog = new AudioPlayerDialog(this); audioDialog = new AudioPlayerDialog(this);
emojiPicker = new EmojiPicker(this, this); emojiPicker = new EmojiPicker(this, this);
adapter = new IconAdapter(this, true); adapter = new IconAdapter(this, true);
iconList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)); iconList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
iconList.setAdapter(adapter); iconList.setAdapter(adapter);
AppStyles.setEditorTheme(root, background); AppStyles.setEditorTheme(root, background);
if (!settings.getLogin().getConfiguration().locationSupported()) { if (!settings.getLogin().getConfiguration().locationSupported()) {
locationBtn.setVisibility(View.GONE); locationBtn.setVisibility(View.GONE);
} }
@ -159,35 +153,43 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
emojiButton.setVisibility(View.GONE); emojiButton.setVisibility(View.GONE);
} }
// fetch parameters // fetch parameters
if (savedInstanceState == null) boolean editStatus;
savedInstanceState = getIntent().getExtras(); String prefix;
Serializable serializedData;
if (savedInstanceState != null) { if (savedInstanceState != null) {
Serializable serializedStatus = savedInstanceState.getSerializable(KEY_DATA); serializedData = savedInstanceState.getSerializable(KEY_STATUS_DATA);
Serializable serializedStatusUpdate = savedInstanceState.getSerializable(KEY_SAVE); editStatus = savedInstanceState.getBoolean(KEY_EDIT, false);
boolean editStatus = savedInstanceState.getBoolean(KEY_EDIT, false); prefix = savedInstanceState.getString(KEY_TEXT, "");
String prefix = savedInstanceState.getString(KEY_TEXT); } else {
if (serializedStatusUpdate instanceof StatusUpdate) { serializedData = getIntent().getSerializableExtra(KEY_STATUS_DATA);
statusUpdate = (StatusUpdate) serializedStatusUpdate; editStatus = getIntent().getBooleanExtra(KEY_EDIT, false);
} else if (serializedStatus instanceof Status) { if (getIntent().hasExtra(KEY_TEXT)) {
Status status = (Status) serializedStatus; prefix = getIntent().getStringExtra(KEY_TEXT);
if (editStatus) {
statusUpdate.setStatus(status);
statusText.append(status.getText());
for (Media media : status.getMedia()) {
addMedia(media.getMediaType());
}
mediaBtn.setVisibility(View.GONE);
} else {
statusUpdate.addReplyStatusId(status.getId());
statusUpdate.setVisibility(status.getVisibility());
statusUpdate.addText(status.getUserMentions());
statusText.append(status.getUserMentions());
}
} else { } else {
statusUpdate.addText(prefix); prefix = "";
statusText.append(prefix);
} }
} }
if (serializedData instanceof StatusUpdate) {
statusUpdate = (StatusUpdate) serializedData;
} else if (serializedData instanceof Status) {
Status status = (Status) serializedData;
if (editStatus) {
statusUpdate.setStatus(status);
statusText.append(status.getText());
for (Media media : status.getMedia()) {
addMedia(media.getMediaType());
}
mediaBtn.setVisibility(View.GONE);
} else {
statusUpdate.addReplyStatusId(status.getId());
statusUpdate.setVisibility(status.getVisibility());
statusUpdate.addText(status.getUserMentions());
statusText.append(status.getUserMentions());
}
} else {
statusUpdate.addText(prefix);
statusText.append(prefix);
}
statusText.addTextChangedListener(this); statusText.addTextChangedListener(this);
emojiButton.setOnClickListener(this); emojiButton.setOnClickListener(this);
@ -226,7 +228,7 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
@Override @Override
protected void onSaveInstanceState(@NonNull Bundle outState) { protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putSerializable(KEY_SAVE, statusUpdate); outState.putSerializable(KEY_STATUS_DATA, statusUpdate);
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }
@ -251,7 +253,7 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
public void onActivityResult(ActivityResult result) { public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == ImageViewer.RETURN_MEDIA_STATUS_UPDATE) { if (result.getResultCode() == ImageViewer.RETURN_MEDIA_STATUS_UPDATE) {
if (result.getData() != null) { if (result.getData() != null) {
Serializable data = result.getData().getSerializableExtra(ImageViewer.KEY_MEDIA_LOCAL); Serializable data = result.getData().getSerializableExtra(ImageViewer.KEY_IMAGE_DATA);
if (data instanceof MediaStatus) { if (data instanceof MediaStatus) {
MediaStatus mediaStatus = (MediaStatus) data; MediaStatus mediaStatus = (MediaStatus) data;
statusUpdate.updateMediaStatus(mediaStatus); statusUpdate.updateMediaStatus(mediaStatus);
@ -259,7 +261,7 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
} }
} else if (result.getResultCode() == VideoViewer.RESULT_VIDEO_UPDATE) { } else if (result.getResultCode() == VideoViewer.RESULT_VIDEO_UPDATE) {
if (result.getData() != null) { if (result.getData() != null) {
Serializable data = result.getData().getSerializableExtra(VideoViewer.KEY_VIDEO_LOCAL); Serializable data = result.getData().getSerializableExtra(VideoViewer.KEY_VIDEO_DATA);
if (data instanceof MediaStatus) { if (data instanceof MediaStatus) {
MediaStatus mediaStatus = (MediaStatus) data; MediaStatus mediaStatus = (MediaStatus) data;
statusUpdate.updateMediaStatus(mediaStatus); statusUpdate.updateMediaStatus(mediaStatus);
@ -405,14 +407,13 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
case MediaStatus.PHOTO: case MediaStatus.PHOTO:
case MediaStatus.GIF: case MediaStatus.GIF:
Intent intent = new Intent(this, ImageViewer.class); Intent intent = new Intent(this, ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_LOCAL, media); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, media);
intent.putExtra(ImageViewer.TYPE, ImageViewer.MEDIA_LOCAL);
activityResultLauncher.launch(intent); activityResultLauncher.launch(intent);
break; break;
case MediaStatus.VIDEO: case MediaStatus.VIDEO:
intent = new Intent(this, VideoViewer.class); intent = new Intent(this, VideoViewer.class);
intent.putExtra(VideoViewer.KEY_VIDEO_LOCAL, media); intent.putExtra(VideoViewer.KEY_VIDEO_DATA, media);
activityResultLauncher.launch(intent); activityResultLauncher.launch(intent);
break; break;
@ -490,7 +491,7 @@ public class StatusEditor extends MediaActivity implements ActivityResultCallbac
private void onStatusUpdated(@NonNull StatusUpdateResult result) { private void onStatusUpdated(@NonNull StatusUpdateResult result) {
if (result.status != null) { if (result.status != null) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(KEY_DATA, result.status); intent.putExtra(KEY_STATUS_DATA, result.status);
setResult(RETURN_STATUS_UPDATE, intent); setResult(RETURN_STATUS_UPDATE, intent);
Toast.makeText(getApplicationContext(), R.string.info_status_sent, Toast.LENGTH_LONG).show(); Toast.makeText(getApplicationContext(), R.string.info_status_sent, Toast.LENGTH_LONG).show();
finish(); finish();

View File

@ -61,15 +61,9 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
/** /**
* bundle key used for media information * bundle key used for media information
* value type is {@link Media} * value type can be {@link Media} or {@link MediaStatus}
*/ */
public static final String KEY_VIDEO_ONLINE = "media-video"; public static final String KEY_VIDEO_DATA = "media-video";
/**
* bundle key used for mediastatus information
* value type is {@link MediaStatus}
*/
public static final String KEY_VIDEO_LOCAL = "video-media-status";
/** /**
* Activity result code used to update {@link MediaStatus} information * Activity result code used to update {@link MediaStatus} information
@ -116,21 +110,18 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
playerView.setShowNextButton(false); playerView.setShowNextButton(false);
playerView.setShowPreviousButton(false); playerView.setShowPreviousButton(false);
MediaItem mediaItem; ProgressiveMediaSource mediaSource = null;
DataSource.Factory dataSourceFactory; Serializable serializedData;
Serializable serializedMedia, serializedMediaStatus;
if (savedInstance != null) { if (savedInstance != null) {
serializedMedia = savedInstance.getSerializable(KEY_VIDEO_ONLINE); serializedData = savedInstance.getSerializable(KEY_VIDEO_DATA);
serializedMediaStatus = savedInstance.getSerializable(KEY_VIDEO_LOCAL);
} else { } else {
serializedMedia = getIntent().getSerializableExtra(KEY_VIDEO_ONLINE); serializedData = getIntent().getSerializableExtra(KEY_VIDEO_DATA);
serializedMediaStatus = getIntent().getSerializableExtra(KEY_VIDEO_LOCAL);
} }
// check if video is online // check if video is online
if (serializedMedia instanceof Media) { if (serializedData instanceof Media) {
this.media = (Media) serializedMedia; this.media = (Media) serializedData;
mediaItem = MediaItem.fromUri(media.getUrl()); MediaItem mediaItem = MediaItem.fromUri(media.getUrl());
dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE)); DataSource.Factory dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE));
if (media.getMediaType() != Media.VIDEO) { if (media.getMediaType() != Media.VIDEO) {
playerView.setUseController(false); playerView.setUseController(false);
player.setRepeatMode(Player.REPEAT_MODE_ONE); player.setRepeatMode(Player.REPEAT_MODE_ONE);
@ -139,37 +130,46 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
descriptionView.setVisibility(View.VISIBLE); descriptionView.setVisibility(View.VISIBLE);
descriptionView.setDescription(media.getDescription()); descriptionView.setDescription(media.getDescription());
} }
mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem);
} }
// check if viceo is local // check if viceo is from an editable status
else if (serializedMediaStatus instanceof MediaStatus) { else if (serializedData instanceof MediaStatus) {
this.mediaStatus = (MediaStatus) serializedMediaStatus; this.mediaStatus = (MediaStatus) serializedData;
mediaItem = MediaItem.fromUri(mediaStatus.getPath()); if (mediaStatus.getPath() != null) {
dataSourceFactory = new DataSource.Factory() { DataSource.Factory dataSourceFactory;
@NonNull MediaItem mediaItem = MediaItem.fromUri(mediaStatus.getPath());
@Override if (mediaStatus.getPath().startsWith("http")) {
public DataSource createDataSource() { dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE));
return new ContentDataSource(getApplicationContext()); } else {
dataSourceFactory = new DataSource.Factory() {
@NonNull
@Override
public DataSource createDataSource() {
return new ContentDataSource(getApplicationContext());
}
};
} }
}; if (mediaStatus.getMediaType() != MediaStatus.VIDEO) {
if (mediaStatus.getMediaType() != MediaStatus.VIDEO) { playerView.setUseController(false);
playerView.setUseController(false); player.setRepeatMode(Player.REPEAT_MODE_ONE);
player.setRepeatMode(Player.REPEAT_MODE_ONE); }
} if (descriptionView != null && !mediaStatus.getDescription().isEmpty()) {
if (descriptionView != null && !mediaStatus.getDescription().isEmpty()) { descriptionView.setVisibility(View.VISIBLE);
descriptionView.setVisibility(View.VISIBLE); descriptionView.setDescription(mediaStatus.getDescription());
descriptionView.setDescription(mediaStatus.getDescription()); }
mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem);
} }
}
// prepare playback
if (mediaSource != null) {
player.setMediaSource(mediaSource);
playerView.setPlayer(player);
player.addListener(this);
player.prepare();
player.setPlayWhenReady(true);
} else { } else {
finish(); finish();
return;
} }
// initialize video extractor
player.setMediaSource(new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem));
playerView.setPlayer(player);
// prepare playback
player.addListener(this);
player.prepare();
player.setPlayWhenReady(true);
} }
@ -186,7 +186,7 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
public void onBackPressed() { public void onBackPressed() {
if (mediaStatus != null) { if (mediaStatus != null) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(KEY_VIDEO_LOCAL, mediaStatus); intent.putExtra(KEY_VIDEO_DATA, mediaStatus);
setResult(RESULT_VIDEO_UPDATE, intent); setResult(RESULT_VIDEO_UPDATE, intent);
} }
player.stop(); player.stop();
@ -196,8 +196,11 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
@Override @Override
protected void onSaveInstanceState(@NonNull Bundle outState) { protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putSerializable(KEY_VIDEO_LOCAL, mediaStatus); if (mediaStatus != null) {
outState.putSerializable(KEY_VIDEO_ONLINE, media); outState.putSerializable(KEY_VIDEO_DATA, mediaStatus);
} else if (media != null) {
outState.putSerializable(KEY_VIDEO_DATA, media);
}
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }
@ -226,10 +229,10 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.video, menu); getMenuInflater().inflate(R.menu.video, menu);
MenuItem menuOpenLink = menu.findItem(R.id.menu_video_link); MenuItem menuOpenUrl = menu.findItem(R.id.menu_video_link);
MenuItem menuDescription = menu.findItem(R.id.menu_video_add_description); MenuItem menuDescription = menu.findItem(R.id.menu_video_add_description);
AppStyles.setMenuIconColor(menu, Color.WHITE); AppStyles.setMenuIconColor(menu, Color.WHITE);
menuOpenLink.setVisible(media != null); menuOpenUrl.setVisible(media != null);
menuDescription.setVisible(mediaStatus != null); menuDescription.setVisible(mediaStatus != null);
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }

View File

@ -31,7 +31,8 @@ import java.util.TreeMap;
*/ */
public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeListener, OnItemSelectedListener { public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeListener, OnItemSelectedListener {
private Spinner visibilitySelector; private Spinner visibilitySelector, languageSelector;
private SwitchButton sensitiveCheck, spoilerCheck;
private DropdownAdapter visibility_adapter, language_adapter; private DropdownAdapter visibility_adapter, language_adapter;
private StatusUpdate statusUpdate; private StatusUpdate statusUpdate;
@ -63,16 +64,17 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_status); setContentView(R.layout.dialog_status);
ViewGroup rootView = findViewById(R.id.dialog_status_root); ViewGroup rootView = findViewById(R.id.dialog_status_root);
SwitchButton sensitiveCheck = findViewById(R.id.dialog_status_sensitive);
SwitchButton spoilerCheck = findViewById(R.id.dialog_status_spoiler);
View statusVisibility = findViewById(R.id.dialog_status_visibility_container); View statusVisibility = findViewById(R.id.dialog_status_visibility_container);
View statusSpoiler = findViewById(R.id.dialog_status_spoiler_container); View statusSpoiler = findViewById(R.id.dialog_status_spoiler_container);
Spinner languageSelector = findViewById(R.id.dialog_status_language); languageSelector = findViewById(R.id.dialog_status_language);
visibilitySelector = findViewById(R.id.dialog_status_visibility); visibilitySelector = findViewById(R.id.dialog_status_visibility);
sensitiveCheck = findViewById(R.id.dialog_status_sensitive);
spoilerCheck = findViewById(R.id.dialog_status_spoiler);
GlobalSettings settings = GlobalSettings.get(getContext()); GlobalSettings settings = GlobalSettings.get(getContext());
AppStyles.setTheme(rootView); AppStyles.setTheme(rootView);
languageSelector.setAdapter(language_adapter); languageSelector.setAdapter(language_adapter);
languageSelector.setSelection(0, false);
languageSelector.setSelected(false); languageSelector.setSelected(false);
visibilitySelector.setAdapter(visibility_adapter); visibilitySelector.setAdapter(visibility_adapter);
visibilitySelector.setSelection(0, false); visibilitySelector.setSelection(0, false);
@ -95,7 +97,6 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart();
if (statusUpdate.getVisibility() == Status.VISIBLE_PUBLIC) { if (statusUpdate.getVisibility() == Status.VISIBLE_PUBLIC) {
visibilitySelector.setSelection(0, false); visibilitySelector.setSelection(0, false);
} else if (statusUpdate.getVisibility() == Status.VISIBLE_PRIVATE) { } else if (statusUpdate.getVisibility() == Status.VISIBLE_PRIVATE) {
@ -105,6 +106,16 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
} else if (statusUpdate.getVisibility() == Status.VISIBLE_UNLISTED) { } else if (statusUpdate.getVisibility() == Status.VISIBLE_UNLISTED) {
visibilitySelector.setSelection(3, false); visibilitySelector.setSelection(3, false);
} }
sensitiveCheck.setCheckedImmediately(statusUpdate.isSensitive());
spoilerCheck.setCheckedImmediately(statusUpdate.isSpoiler());
if (!statusUpdate.getLanguageCode().isEmpty()) {
for (int i = 0; i < languageCodes.length; i++) {
if (languageCodes[i].equals(statusUpdate.getLanguageCode())) {
languageSelector.setSelection(i);
}
}
}
super.onStart();
} }
@ -136,8 +147,6 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (!isShowing())
return;
if (parent.getId() == R.id.dialog_status_visibility) { if (parent.getId() == R.id.dialog_status_visibility) {
switch (position) { switch (position) {
case 0: case 0:

View File

@ -1,7 +1,6 @@
package org.nuclearfog.twidda.ui.fragments; package org.nuclearfog.twidda.ui.fragments;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
@ -142,8 +141,7 @@ public class MessageFragment extends ListFragment implements OnMessageClickListe
int mediaIndex = extras[0]; int mediaIndex = extras[0];
if (mediaIndex >= 0 && mediaIndex < message.getMedia().length) { if (mediaIndex >= 0 && mediaIndex < message.getMedia().length) {
Intent intent = new Intent(requireContext(), ImageViewer.class); Intent intent = new Intent(requireContext(), ImageViewer.class);
intent.putExtra(ImageViewer.KEY_MEDIA_URL, Uri.parse(message.getMedia()[mediaIndex].getUrl())); intent.putExtra(ImageViewer.KEY_IMAGE_DATA, message.getMedia()[mediaIndex].getUrl());
intent.putExtra(ImageViewer.TYPE, ImageViewer.IMAGE_ONLINE);
startActivity(intent); startActivity(intent);
} }
} }