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 {
/**
* 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
*/
public static final int RETURN_MEDIA_STATUS_UPDATE = 0x5895;
/**
* key to set image format (image or gif)
* value type is Integer {@link #IMAGE_ONLINE,#GIF_LOCAL,#MEDIA_LOCAL}
* key to add media data (online or 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";
/**
* 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";
public static final String KEY_IMAGE_DATA = "image-data";
/**
* 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 GlobalSettings settings;
private File cacheFolder;
private int mode = 0;
@Override
@ -141,58 +104,66 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
cacheFolder = new File(getExternalCacheDir(), ImageViewer.CACHE_FOLDER);
cacheFolder.mkdirs();
mode = getIntent().getIntExtra(TYPE, 0);
switch (mode) {
case IMAGE_ONLINE:
zoomImage.setVisibility(View.VISIBLE);
// get parameters
String imageUrl = null;
String blurHash = null;
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);
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);
Uri data = getIntent().getParcelableExtra(KEY_MEDIA_URL);
ImageLoaderParam request = new ImageLoaderParam(data, cacheFolder);
ImageLoaderParam request = new ImageLoaderParam(Uri.parse(imageUrl), cacheFolder);
imageAsync.execute(request, this);
break;
case MEDIA_LOCAL:
Serializable serializedData = getIntent().getSerializableExtra(KEY_MEDIA_LOCAL);
if (serializedData instanceof MediaStatus) {
mediaStatus = (MediaStatus) serializedData;
if (!mediaStatus.getDescription().trim().isEmpty()) {
descriptionView.setVisibility(View.VISIBLE);
descriptionView.setDescription(mediaStatus.getDescription());
}
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;
}
}
// set image description
if (description != null && !description.trim().isEmpty()) {
descriptionView.setDescription(description);
}
// set image blur placeholder
if (blurHash != null && !blurHash.trim().isEmpty()) {
Bitmap blur = BlurHashDecoder.INSTANCE.decode(blurHash, 16, 16, 1f, true);
zoomImage.setImageBitmap(blur);
}
}
@ -201,7 +172,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
public void onBackPressed() {
if (mediaStatus != null) {
Intent intent = new Intent();
intent.putExtra(KEY_MEDIA_LOCAL, mediaStatus);
intent.putExtra(KEY_IMAGE_DATA, mediaStatus);
setResult(RETURN_MEDIA_STATUS_UPDATE, intent);
}
super.onBackPressed();
@ -220,11 +191,17 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
@Override
public boolean onCreateOptionsMenu(Menu 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);
AppStyles.setMenuIconColor(menu, settings.getIconColor());
itemSave.setVisible(mode == IMAGE_ONLINE || mode == MEDIA_ONLINE);
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;
}
@ -239,6 +216,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
}
else if (item.getItemId() == R.id.menu_image_add_description) {
descriptionDialog.show();
return true;
}
return super.onOptionsItemSelected(item);
}
@ -261,6 +239,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback<ImageLoa
cacheUri = result.uri;
zoomImage.reset();
zoomImage.setImageURI(cacheUri);
invalidateMenu();
} else {
ErrorUtils.showErrorMessage(getApplicationContext(), result.exception);
finish();

View File

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

View File

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

View File

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

View File

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

View File

@ -61,15 +61,9 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
/**
* 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";
/**
* bundle key used for mediastatus information
* value type is {@link MediaStatus}
*/
public static final String KEY_VIDEO_LOCAL = "video-media-status";
public static final String KEY_VIDEO_DATA = "media-video";
/**
* 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.setShowPreviousButton(false);
MediaItem mediaItem;
DataSource.Factory dataSourceFactory;
Serializable serializedMedia, serializedMediaStatus;
ProgressiveMediaSource mediaSource = null;
Serializable serializedData;
if (savedInstance != null) {
serializedMedia = savedInstance.getSerializable(KEY_VIDEO_ONLINE);
serializedMediaStatus = savedInstance.getSerializable(KEY_VIDEO_LOCAL);
serializedData = savedInstance.getSerializable(KEY_VIDEO_DATA);
} else {
serializedMedia = getIntent().getSerializableExtra(KEY_VIDEO_ONLINE);
serializedMediaStatus = getIntent().getSerializableExtra(KEY_VIDEO_LOCAL);
serializedData = getIntent().getSerializableExtra(KEY_VIDEO_DATA);
}
// check if video is online
if (serializedMedia instanceof Media) {
this.media = (Media) serializedMedia;
mediaItem = MediaItem.fromUri(media.getUrl());
dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE));
if (serializedData instanceof Media) {
this.media = (Media) serializedData;
MediaItem mediaItem = MediaItem.fromUri(media.getUrl());
DataSource.Factory dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE));
if (media.getMediaType() != Media.VIDEO) {
playerView.setUseController(false);
player.setRepeatMode(Player.REPEAT_MODE_ONE);
@ -139,37 +130,46 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
descriptionView.setVisibility(View.VISIBLE);
descriptionView.setDescription(media.getDescription());
}
mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()).createMediaSource(mediaItem);
}
// check if viceo is local
else if (serializedMediaStatus instanceof MediaStatus) {
this.mediaStatus = (MediaStatus) serializedMediaStatus;
mediaItem = MediaItem.fromUri(mediaStatus.getPath());
dataSourceFactory = new DataSource.Factory() {
@NonNull
@Override
public DataSource createDataSource() {
return new ContentDataSource(getApplicationContext());
// check if viceo is from an editable status
else if (serializedData instanceof MediaStatus) {
this.mediaStatus = (MediaStatus) serializedData;
if (mediaStatus.getPath() != null) {
DataSource.Factory dataSourceFactory;
MediaItem mediaItem = MediaItem.fromUri(mediaStatus.getPath());
if (mediaStatus.getPath().startsWith("http")) {
dataSourceFactory = new OkHttpDataSource.Factory((Call.Factory) ConnectionBuilder.create(this, CACHE_SIZE));
} else {
dataSourceFactory = new DataSource.Factory() {
@NonNull
@Override
public DataSource createDataSource() {
return new ContentDataSource(getApplicationContext());
}
};
}
};
if (mediaStatus.getMediaType() != MediaStatus.VIDEO) {
playerView.setUseController(false);
player.setRepeatMode(Player.REPEAT_MODE_ONE);
}
if (descriptionView != null && !mediaStatus.getDescription().isEmpty()) {
descriptionView.setVisibility(View.VISIBLE);
descriptionView.setDescription(mediaStatus.getDescription());
if (mediaStatus.getMediaType() != MediaStatus.VIDEO) {
playerView.setUseController(false);
player.setRepeatMode(Player.REPEAT_MODE_ONE);
}
if (descriptionView != null && !mediaStatus.getDescription().isEmpty()) {
descriptionView.setVisibility(View.VISIBLE);
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 {
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() {
if (mediaStatus != null) {
Intent intent = new Intent();
intent.putExtra(KEY_VIDEO_LOCAL, mediaStatus);
intent.putExtra(KEY_VIDEO_DATA, mediaStatus);
setResult(RESULT_VIDEO_UPDATE, intent);
}
player.stop();
@ -196,8 +196,11 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putSerializable(KEY_VIDEO_LOCAL, mediaStatus);
outState.putSerializable(KEY_VIDEO_ONLINE, media);
if (mediaStatus != null) {
outState.putSerializable(KEY_VIDEO_DATA, mediaStatus);
} else if (media != null) {
outState.putSerializable(KEY_VIDEO_DATA, media);
}
super.onSaveInstanceState(outState);
}
@ -226,10 +229,10 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
@Override
public boolean onCreateOptionsMenu(Menu 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);
AppStyles.setMenuIconColor(menu, Color.WHITE);
menuOpenLink.setVisible(media != null);
menuOpenUrl.setVisible(media != null);
menuDescription.setVisible(mediaStatus != null);
return super.onCreateOptionsMenu(menu);
}

View File

@ -31,7 +31,8 @@ import java.util.TreeMap;
*/
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 StatusUpdate statusUpdate;
@ -63,16 +64,17 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_status);
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 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);
sensitiveCheck = findViewById(R.id.dialog_status_sensitive);
spoilerCheck = findViewById(R.id.dialog_status_spoiler);
GlobalSettings settings = GlobalSettings.get(getContext());
AppStyles.setTheme(rootView);
languageSelector.setAdapter(language_adapter);
languageSelector.setSelection(0, false);
languageSelector.setSelected(false);
visibilitySelector.setAdapter(visibility_adapter);
visibilitySelector.setSelection(0, false);
@ -95,7 +97,6 @@ public class StatusPreferenceDialog extends Dialog implements OnCheckedChangeLis
@Override
protected void onStart() {
super.onStart();
if (statusUpdate.getVisibility() == Status.VISIBLE_PUBLIC) {
visibilitySelector.setSelection(0, false);
} 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) {
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
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (!isShowing())
return;
if (parent.getId() == R.id.dialog_status_visibility) {
switch (position) {
case 0:

View File

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