Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

November 2023 Features #504

Merged
merged 79 commits into from
Dec 23, 2023
Merged
Show file tree
Hide file tree
Changes from 56 commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
0ad511e
Restricted and Unsupported messages
Arseny271 Nov 7, 2023
1cb2d12
Edit rights
Arseny271 Nov 9, 2023
0b012f9
Media-only chats
Arseny271 Nov 9, 2023
8538dea
Slow mode
Arseny271 Nov 12, 2023
f24f7b2
Ability to set public profile photo (without picker and editor)
Arseny271 Nov 12, 2023
2cc0e6e
Avatar Editor
Arseny271 Nov 12, 2023
343485e
Merge branch 'main' into 2023-october-features
Arseny271 Nov 13, 2023
01d7959
Merge Fixes
Arseny271 Nov 13, 2023
1fcf4bc
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Nov 14, 2023
2d696c3
Avatar Picker
Arseny271 Nov 14, 2023
d1f0711
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Nov 14, 2023
8bf0090
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Nov 15, 2023
cc8ad01
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Nov 15, 2023
e38dd34
Messages Filter - basic logic
Arseny271 Nov 16, 2023
a23f57e
Merge branch 'main' into 2023-october-features
Arseny271 Nov 17, 2023
c82c16a
Message Filter Update
Arseny271 Nov 17, 2023
924f197
Icon fixes + edit rights fixes
Arseny271 Nov 17, 2023
684301b
Some slowmode fixes
Arseny271 Nov 19, 2023
f937f41
Mirror Horizontal
Arseny271 Nov 19, 2023
a04b7fb
Icon fixes in avatar picker + some right fixes
Arseny271 Nov 20, 2023
295863f
Some picker and editor improvements
Arseny271 Nov 20, 2023
1a88567
Flip improvements
Arseny271 Nov 20, 2023
1d8862c
Channel Filter
Arseny271 Nov 21, 2023
492fb88
Update TdlibUi.java
Arseny271 Nov 21, 2023
7457873
Update Rights editor
Arseny271 Nov 21, 2023
c5a4f87
Rights icon fix
Arseny271 Nov 21, 2023
d56c05f
Disable videos in avatar picker
Arseny271 Nov 21, 2023
d350ba7
Update TdlibUi.java
Arseny271 Nov 21, 2023
3f3e56a
Update
Arseny271 Nov 22, 2023
f522ea3
Add Slow mode timer for round messages
Arseny271 Nov 22, 2023
65e0a0f
Hide messages filter
Arseny271 Nov 22, 2023
9ca8dae
Fix for short round videos?
Arseny271 Nov 22, 2023
37363e1
Revert messages filter
Arseny271 Nov 24, 2023
5b56d3e
Revert messages filter
Arseny271 Nov 24, 2023
9e4ba2e
Hide "send as" photo when slow mode active
Arseny271 Nov 25, 2023
77db688
Hide "send as" photo when slow mode active
Arseny271 Nov 25, 2023
066d850
Update EGLEditorView.java
Arseny271 Nov 25, 2023
2cc4816
Remove hasWritePermission from almost all places
Arseny271 Nov 25, 2023
473f459
Update MessagesController.java
Arseny271 Nov 25, 2023
d82f0fd
Improved animations
Arseny271 Nov 25, 2023
ce2f62f
Update Animations
Arseny271 Nov 25, 2023
93e7295
Update EditHeaderView.java
Arseny271 Nov 25, 2023
e849fed
Update MediaViewController.java
Arseny271 Nov 25, 2023
d9dc086
Merge branch 'main' into 2023-october-features
vkryl Nov 28, 2023
c137b2f
Merge fix
vkryl Nov 28, 2023
f6e16ef
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Nov 29, 2023
10e3e4d
Fix chatlist in SharedController
Arseny271 Nov 29, 2023
f43d54e
ShareControllerFix
Arseny271 Nov 29, 2023
534485d
Merge branch 'main' into 2023-october-features
vkryl Nov 30, 2023
f6581d4
Merge branch 'main' into 2023-october-features
vkryl Nov 30, 2023
550bc8f
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Dec 2, 2023
05f037f
Update Tdlib.java
Arseny271 Dec 2, 2023
730820a
Update Tdlib.java
Arseny271 Dec 2, 2023
e5f35cd
Merge branch 'main' into 2023-october-features
vkryl Dec 3, 2023
f424161
Merge branch 'main' into 2023-october-features
vkryl Dec 4, 2023
ceb2d25
Merge branch 'main' into 2023-october-features
vkryl Dec 6, 2023
ed9a931
Merge branch 'TGX-Android:main' into 2023-october-features
Arseny271 Dec 8, 2023
73343fa
Fixed crash when filtering reaction senders
Arseny271 Dec 8, 2023
5070950
Dismiss andim bugfix
Arseny271 Dec 9, 2023
2880fd6
Emoji status fix
Arseny271 Dec 12, 2023
924caab
Temporary fix for sticker pack window twitching
Arseny271 Dec 12, 2023
f42db3e
Fix reactions position in ChatList
Arseny271 Dec 12, 2023
e30f10a
Edit date fix for combined messages
Arseny271 Dec 18, 2023
c7bd43c
Merge branch 'main' into 2023-october-features
vkryl Dec 20, 2023
441bc28
Hide reactions preview in chat view when draft is visible
Arseny271 Dec 21, 2023
b826cde
Update TGMessageSticker.java
Arseny271 Dec 21, 2023
87b2edd
Merge branch 'main' into 2023-october-features
vkryl Dec 22, 2023
86b03a5
Update app/src/main/java/org/thunderdog/challegram/data/TGMessageStic…
vkryl Dec 22, 2023
f7b6296
Merge branch 'main' into 2023-october-features
vkryl Dec 22, 2023
371403d
Merge branch 'main' into 2023-october-features
vkryl Dec 22, 2023
edcfcf6
Merge branch 'main' into 2023-october-features
vkryl Dec 22, 2023
51cb255
Update app/src/main/java/org/thunderdog/challegram/ui/SettingsPrivacy…
Arseny271 Dec 22, 2023
c867041
Update app/src/main/java/org/thunderdog/challegram/ui/SettingsPrivacy…
Arseny271 Dec 22, 2023
422c282
Update app/src/main/java/org/thunderdog/challegram/telegram/TdlibCach…
Arseny271 Dec 22, 2023
1b81db5
Update app/src/main/java/org/thunderdog/challegram/ui/SettingsPrivacy…
Arseny271 Dec 22, 2023
714c5b1
Update SettingsPrivacyKeyController.java
Arseny271 Dec 22, 2023
9139d9e
Fix double opening for avatar picker
Arseny271 Dec 22, 2023
575ea9c
Use pluralBold instead plural in getSlowModeRestrictionText
Arseny271 Dec 22, 2023
2709ebc
Updating timer value in slow mode restriction hint
Arseny271 Dec 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 9 additions & 7 deletions app/src/main/java/org/thunderdog/challegram/BaseActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -1809,7 +1809,7 @@ public void hideContextualPopups (boolean byNavigation) {
PopupLayout window = windows.get(i);
View boundView = window.getBoundView();
ViewController<?> boundController = window.getBoundController();
if (isContextual(boundView) || (byNavigation && boundView instanceof StickerSetWrap) || (boundView instanceof MediaLayout && !(navigation.getCurrentStackItem() instanceof MessagesController)) || (byNavigation && isContextual(boundController)) ) {
if (isContextual(boundView) || (byNavigation && boundView instanceof StickerSetWrap) || (boundView instanceof MediaLayout && !((navigation.getCurrentStackItem() instanceof MessagesController) || (((MediaLayout) boundView).getMode() == MediaLayout.MODE_AVATAR_PICKER))) || (byNavigation && isContextual(boundController)) ) {
window.hideWindow(true);
}
}
Expand Down Expand Up @@ -3040,15 +3040,17 @@ public void checkCameraApi () {
}

private void initializeCamera (ViewController.CameraOpenOptions options) {
if (camera == null) {
final boolean needCreateCamera = camera == null;
if (needCreateCamera) {
camera = new CameraController(this);
camera.setMode(options.mode, options.readyListener);
camera.setQrListener(options.qrCodeListener, options.qrModeSubtitle, options.qrModeDebug);
}
camera.setMode(options.mode, options.readyListener);
camera.setAvatarPickerMode(options.avatarPickerMode);
camera.setQrListener(options.qrCodeListener, options.qrModeSubtitle, options.qrModeDebug);
camera.setMediaEditorDelegates(options.delegate, options.selectDelegate, options.sendDelegate);
if (needCreateCamera) {
camera.getValue(); // Ensure view creation
addActivityListener(camera);
} else {
camera.setMode(options.mode, options.readyListener);
camera.setQrListener(options.qrCodeListener, options.qrModeSubtitle, options.qrModeDebug);
}
hideContextualPopups(false);
closeAllMedia(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.thunderdog.challegram.data.TD;
import org.thunderdog.challegram.loader.ImageFile;
import org.thunderdog.challegram.loader.ImageGalleryFile;
import org.thunderdog.challegram.mediaview.AvatarPickerMode;
import org.thunderdog.challegram.mediaview.MediaSelectDelegate;
import org.thunderdog.challegram.mediaview.MediaSendDelegate;
import org.thunderdog.challegram.mediaview.MediaViewController;
Expand All @@ -56,6 +57,7 @@
import org.thunderdog.challegram.navigation.Menu;
import org.thunderdog.challegram.navigation.MenuMoreWrap;
import org.thunderdog.challegram.navigation.ToggleHeaderView;
import org.thunderdog.challegram.navigation.ViewController;
import org.thunderdog.challegram.telegram.Tdlib;
import org.thunderdog.challegram.theme.ColorId;
import org.thunderdog.challegram.tool.Intents;
Expand Down Expand Up @@ -101,7 +103,9 @@ protected int getMenuId () {
@Override
public void fillMenuItems (int id, HeaderView header, LinearLayout menu) {
if (id == R.id.menu_more) {
header.addSearchButton(menu, this);
if (mediaLayout.getMode() != MediaLayout.MODE_AVATAR_PICKER) {
header.addSearchButton(menu, this);
}
header.addMoreButton(menu, this);
} else if (id == R.id.menu_clear) {
header.addClearButton(menu, this);
Expand Down Expand Up @@ -207,7 +211,8 @@ protected View onCreateView (Context context) {
decoration = new GridSpacingItemDecoration(spanCount, Screen.dp(4f), true, true, true);
GridLayoutManager manager = new RtlGridLayoutManager(context(), spanCount);

int options = MediaGalleryAdapter.OPTION_SELECTABLE | MediaGalleryAdapter.OPTION_ALWAYS_SELECTABLE;
int options = inAvatarPickerMode() ? MediaGalleryAdapter.OPTION_NEVER_SELECTABLE :
MediaGalleryAdapter.OPTION_SELECTABLE | MediaGalleryAdapter.OPTION_ALWAYS_SELECTABLE;
/*if (U.deviceHasAnyCamera(context)) {
options |= MediaGalleryAdapter.OPTION_CAMERA_AVAILABLE;
}*/
Expand All @@ -229,7 +234,7 @@ protected View onCreateView (Context context) {
if (mediaLayout.needCameraButton()) {
cameraBadgeView = new CircleCounterBadgeView(this, R.id.btn_camera, this::onCameraButtonClick, null);
cameraBadgeView.init(R.drawable.deproko_baseline_camera_26, 48f, 4f, ColorId.circleButtonChat, ColorId.circleButtonChatIcon);
cameraBadgeView.setLayoutParams(FrameLayoutFix.newParams(Screen.dp(CircleCounterBadgeView.BUTTON_WRAPPER_WIDTH), Screen.dp(74f), Gravity.BOTTOM | Gravity.RIGHT, 0, 0, Screen.dp(12), Screen.dp(12 + 60)));
cameraBadgeView.setLayoutParams(FrameLayoutFix.newParams(Screen.dp(CircleCounterBadgeView.BUTTON_WRAPPER_WIDTH), Screen.dp(74f), Gravity.BOTTOM | Gravity.RIGHT, 0, 0, Screen.dp(12), Screen.dp(12) + mediaLayout.getCameraButtonOffset()));
contentView.addView(cameraBadgeView);
}

Expand All @@ -251,6 +256,12 @@ protected void onUpdateBottomBarFactor (float bottomBarFactor, float counterFact
}

private void onCameraButtonClick (View v) {
if (mediaLayout.getMode() == MediaLayout.MODE_AVATAR_PICKER) {
mediaLayout.hidePopupAndOpenCamera(new ViewController.CameraOpenOptions().anchor(v)
.setAvatarPickerMode(mediaLayout.getAvatarPickerMode()).setMediaEditorDelegates(this, this, this));
return;
}

MessagesController c = mediaLayout.parentMessageController();
if (c == null) return;

Expand Down Expand Up @@ -565,7 +576,7 @@ public boolean onPhotoOrVideoOpenRequested (ImageFile fromFile) {
MediaViewController controller = new MediaViewController(context, tdlib);
controller.setArguments(
MediaViewController.Args.fromGallery(this, this, this, this, stack, mediaLayout.areScheduledOnly())
.setReceiverChatId(mediaLayout.getTargetChatId())
.setReceiverChatId(mediaLayout.getTargetChatId()).setAvatarPickerMode(mediaLayout.getAvatarPickerMode())
);
controller.open();

Expand All @@ -575,13 +586,20 @@ public boolean onPhotoOrVideoOpenRequested (ImageFile fromFile) {
return false;
}

private boolean inAvatarPickerMode () {
return mediaLayout.getAvatarPickerMode() != AvatarPickerMode.NONE;
}

@Override
public boolean isMediaItemSelected (int index, MediaItem item) {
return adapter.getSelectionIndex(item.getSourceGalleryFile()) >= 0;
}

@Override
public void setMediaItemSelected (int index, MediaItem item, boolean isSelected) {
if (mediaLayout.getMode() == MediaLayout.MODE_AVATAR_PICKER) {
return;
}
adapter.setSelected(item.getSourceGalleryFile(), isSelected);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,20 @@ public interface Callback {
boolean onPhotoOrVideoOpenRequested (ImageFile fromFile);
}

public static final int OPTION_SELECTABLE = 0x01;
public static final int OPTION_ALWAYS_SELECTABLE = 0x02;
public static final int OPTION_NEED_COUNTER = 0x04;
public static final int OPTION_CAMERA_AVAILABLE = 0x08;
public static final int OPTION_NEED_CAMERA = 0x10;
public static final int OPTION_SELECTABLE = 1;
public static final int OPTION_ALWAYS_SELECTABLE = 1 << 1;
public static final int OPTION_NEED_COUNTER = 1 << 2;
public static final int OPTION_CAMERA_AVAILABLE = 1 << 3;
public static final int OPTION_NEED_CAMERA = 1 << 4;
public static final int OPTION_NEVER_SELECTABLE = 1 << 5;

private final Context context;
private final RecyclerView parent;
private final GridLayoutManager manager;
private final Callback callback;
private final boolean isSelectable;
private final boolean isAlwaysSelectable; // when we click on a first photo, it will be selected
private final boolean isNeverSelectable; // hide all checkboxes
private final boolean needCounter;
private final boolean cameraAvailable;
private boolean animationsEnabled;
Expand All @@ -64,6 +66,7 @@ public MediaGalleryAdapter (Context context, RecyclerView parent, GridLayoutMana
this.needCounter = (options & OPTION_NEED_COUNTER) != 0;
this.cameraAvailable = false; // (options & OPTION_CAMERA_AVAILABLE) != 0 && (!Config.CUSTOM_CAMERA_ENABLED || (options & OPTION_NEED_CAMERA) != 0);
this.showCamera = cameraAvailable && (options & OPTION_NEED_CAMERA) != 0;
this.isNeverSelectable = (options & OPTION_NEVER_SELECTABLE) != 0;
this.selected = new ArrayList<>();
}

Expand Down Expand Up @@ -244,6 +247,7 @@ public void onBindViewHolder (MediaHolder holder, int position) {
ImageFile imageFile = images.get(showCamera ? position - 1 : position);
holder.setImage(imageFile, getSelectionIndex(imageFile), isSelectable, isVisible(imageFile));
holder.setAnimationsDisabled(!animationsEnabled);
((MediaGalleryImageView) holder.itemView).setAlwaysInvisible(isNeverSelectable);
break;
}
case MediaHolder.VIEW_TYPE_COUNTER: {
Expand Down Expand Up @@ -293,7 +297,7 @@ public int measureScrollTop (int position) {
public void onClick (View view, boolean isSelect) {
ImageFile image = ((MediaGalleryImageView) view).getImage();

if (!isSelect && callback.onPhotoOrVideoOpenRequested(image)) {
if ((!isSelect || isNeverSelectable) && callback.onPhotoOrVideoOpenRequested(image)) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ public void setClickListener (ClickListener listener) {
}

private boolean isInvisible;
private boolean isAlwaysInvisible;

public void setAlwaysInvisible (boolean alwaysInvisible) {
isAlwaysInvisible = alwaysInvisible;
invalidate();
}

public void setInvisible (boolean isInvisible, boolean needInvalidate) {
if (this.isInvisible != isInvisible) {
Expand Down Expand Up @@ -322,7 +328,7 @@ protected void onDraw (Canvas c) {
c.restore();
}

if (!isInvisible) {
if (!isInvisible && !isAlwaysInvisible) {
final int centerX = receiver.centerX() + (int) ((float) receiver.getWidth() * (1f - SCALE)) / 2;
final int centerY = receiver.centerY() - (int) ((float) receiver.getHeight() * (1f - SCALE)) / 2;
final int radius = Screen.dp(9f + 2f * factor);
Expand Down