update to 9.1.4

This commit is contained in:
xaxtix 2022-11-21 01:12:39 +04:00
parent 4951061dde
commit 9bd017a72a
66 changed files with 1207 additions and 417 deletions

View File

@ -22,7 +22,7 @@ dependencies {
implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation "androidx.sharetarget:sharetarget:1.1.0"
implementation "androidx.sharetarget:sharetarget:1.2.0"
compileOnly 'org.checkerframework:checker-qual:2.5.2'
compileOnly 'org.checkerframework:checker-compat-qual:2.5.0'
@ -79,8 +79,8 @@ android {
defaultConfig.versionCode = Integer.parseInt(APP_VERSION_CODE)
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
minSdkVersion 19
targetSdkVersion 31
versionName "8.9.0"
vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi']

View File

@ -13,6 +13,7 @@
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<permission android:name="${applicationId}.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
@ -31,7 +32,7 @@
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<service
android:name="org.telegram.messenger.GcmPushListenerService">
android:name="org.telegram.messenger.GcmPushListenerService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
@ -45,7 +46,8 @@
<receiver
tools:replace="android:enabled"
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="false">
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.measurement.UPLOAD" />
</intent-filter>

View File

@ -34,7 +34,7 @@
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<service
android:name="org.telegram.messenger.GcmPushListenerService">
android:name="org.telegram.messenger.GcmPushListenerService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
@ -48,7 +48,8 @@
<receiver
tools:replace="android:enabled"
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="false">
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.measurement.UPLOAD" />
</intent-filter>

View File

@ -13,6 +13,7 @@
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<permission android:name="${applicationId}.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
@ -31,7 +32,7 @@
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<service
android:name="org.telegram.messenger.GcmPushListenerService">
android:name="org.telegram.messenger.GcmPushListenerService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
@ -45,7 +46,8 @@
<receiver
tools:replace="android:enabled"
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="false">
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.measurement.UPLOAD" />
</intent-filter>

View File

@ -34,7 +34,8 @@
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<service
android:name="org.telegram.messenger.GcmPushListenerService">
android:name="org.telegram.messenger.GcmPushListenerService"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
@ -48,7 +49,8 @@
<receiver
tools:replace="android:enabled"
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="false">
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.measurement.UPLOAD" />
</intent-filter>

View File

@ -114,7 +114,7 @@
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<service
android:name="org.telegram.messenger.GcmPushListenerService">
android:name="org.telegram.messenger.GcmPushListenerService" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
@ -128,7 +128,8 @@
<receiver
tools:replace="android:enabled"
android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
android:enabled="false">
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.measurement.UPLOAD" />
</intent-filter>

View File

@ -184,7 +184,8 @@
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
@ -251,7 +252,8 @@
<activity-alias
android:name="org.telegram.ui.CallsActivity"
android:targetActivity="org.telegram.ui.LaunchActivity"
android:permission="android.permission.CALL_PHONE">
android:permission="android.permission.CALL_PHONE"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
@ -274,7 +276,8 @@
android:windowSoftInputMode="adjustPan"
android:excludeFromRecents="true"
android:stateNotNeeded="true"
android:theme="@style/Theme.TMessages.Transparent">
android:theme="@style/Theme.TMessages.Transparent"
android:exported="true">
<intent-filter android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:priority="1">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
@ -286,7 +289,8 @@
android:name="org.telegram.ui.ExternalActionActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:windowSoftInputMode="adjustPan">
android:windowSoftInputMode="adjustPan"
android:exported="true">
<intent-filter android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round">
<action android:name="org.telegram.passport.AUTHORIZE"/>
<category android:name="android.intent.category.DEFAULT"/>
@ -296,7 +300,8 @@
android:name="org.telegram.ui.ChatsWidgetConfigActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:windowSoftInputMode="adjustPan">
android:windowSoftInputMode="adjustPan"
android:exported="true">
<intent-filter android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round">
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
@ -305,7 +310,8 @@
android:name="org.telegram.ui.ContactsWidgetConfigActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:windowSoftInputMode="adjustPan">
android:windowSoftInputMode="adjustPan"
android:exported="true">
<intent-filter android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round">
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
@ -377,7 +383,7 @@
</intent-filter>
</receiver>
<receiver android:name=".CallReceiver">
<receiver android:name=".CallReceiver" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
@ -404,14 +410,15 @@
<service android:name=".KeepAliveJob"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE"/>
<service android:name=".BringAppForegroundService" android:enabled="true"/>
<service android:name=".NotificationsService" android:enabled="true"/>
<service android:name=".BringAppForegroundService" android:enabled="true" android:exported="true"/>
<service android:name=".NotificationsService" android:enabled="true" android:exported="true"/>
<service android:name=".NotificationRepeat" android:exported="false"/>
<service android:name=".VideoEncodingService" android:enabled="true"/>
<service android:name=".ImportingService" android:enabled="true"/>
<service android:name=".VideoEncodingService" android:enabled="true" android:exported="true"/>
<service android:name=".ImportingService" android:enabled="true" android:exported="true"/>
<service android:name=".LocationSharingService"
android:foregroundServiceType="location"
android:enabled="true"/>
android:enabled="true"
android:exported="true"/>
<service android:name=".voip.VoIPService" android:enabled="true" android:foregroundServiceType="mediaProjection|camera|microphone|mediaPlayback"/>
<service android:name=".MusicPlayerService" android:exported="true" android:enabled="true" android:foregroundServiceType="mediaPlayback"/>
<service android:name=".MusicBrowserService" android:exported="true">
@ -419,13 +426,13 @@
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" android:exported="true">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
<receiver android:name=".MusicPlayerReceiver" >
<receiver android:name=".MusicPlayerReceiver" android:exported="false">
<intent-filter>
<action android:name="org.telegram.android.musicplayer.close" />
<action android:name="org.telegram.android.musicplayer.pause" />
@ -442,7 +449,7 @@
</intent-filter>
</receiver>
<receiver android:name=".AppStartReceiver" android:enabled="true">
<receiver android:name=".AppStartReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="org.telegram.start" />
<action android:name="android.intent.action.BOOT_COMPLETED" />

View File

@ -297,7 +297,7 @@ public class ApplicationLoader extends Application {
} else {
applicationContext.stopService(new Intent(applicationContext, NotificationsService.class));
PendingIntent pintent = PendingIntent.getService(applicationContext, 0, new Intent(applicationContext, NotificationsService.class), 0);
PendingIntent pintent = PendingIntent.getService(applicationContext, 0, new Intent(applicationContext, NotificationsService.class), PendingIntent.FLAG_MUTABLE);
AlarmManager alarm = (AlarmManager)applicationContext.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pintent);
}

View File

@ -24,8 +24,8 @@ public class BuildVars {
public static boolean USE_CLOUD_STRINGS = true;
public static boolean CHECK_UPDATES = true;
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
public static int BUILD_VERSION = 2917;
public static String BUILD_VERSION_STRING = "9.1.3";
public static int BUILD_VERSION = 2927;
public static String BUILD_VERSION_STRING = "9.1.4";
public static int APP_ID = 4;
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";

View File

@ -110,7 +110,7 @@ public class ChatsWidgetProvider extends AppWidgetProvider {
intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.list_view, contentIntent);
appWidgetManager.updateAppWidget(appWidgetId, rv);

View File

@ -23,6 +23,8 @@ import android.widget.RemoteViewsService;
import androidx.collection.LongSparseArray;
import com.google.android.exoplayer2.util.Log;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AvatarDrawable;
@ -350,6 +352,8 @@ class ChatsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.shortcut_widget_item, fillInIntent);
Log.d("kek", "kek " + name);
rv.setViewVisibility(R.id.shortcut_widget_item_divider, position == getCount() ? View.GONE : View.VISIBLE);
return rv;

View File

@ -111,7 +111,7 @@ public class ContactsWidgetProvider extends AppWidgetProvider {
intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.list_view, contentIntent);

View File

@ -20,6 +20,8 @@ import android.widget.RemoteViewsService;
import androidx.collection.LongSparseArray;
import com.google.android.exoplayer2.util.Log;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AvatarDrawable;
@ -201,6 +203,8 @@ class ContactsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactor
}
extras.putInt("currentAccount", accountInstance.getCurrentAccount());
Log.d("kek", "kek " + name);
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(a == 0 ? R.id.contacts_widget_item1 : R.id.contacts_widget_item2, fillInIntent);

View File

@ -42,14 +42,14 @@ public class FeedWidgetProvider extends AppWidgetProvider {
intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent2.setData(Uri.parse(intent2.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.feed_widget_layout);
rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent2);
rv.setRemoteAdapter(R.id.list_view, intent2);
rv.setEmptyView(R.id.list_view, R.id.empty_view);
Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class);
intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.list_view, contentIntent);

View File

@ -15,6 +15,7 @@ import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.telegram.SQLite.SQLiteException;
import org.telegram.messenger.time.FastDateFormat;
import org.telegram.messenger.video.MediaCodecVideoConvertor;
import org.telegram.tgnet.TLObject;
@ -308,6 +309,9 @@ public class FileLog {
}
if (BuildVars.DEBUG_VERSION && needSent(e) && logToAppCenter) {
AndroidUtilities.appCenterLog(e);
}
if (BuildVars.DEBUG_VERSION && e instanceof SQLiteException && e.getMessage() != null && e.getMessage().contains("disk image is malformed")) {
}
ensureInitied();
e.printStackTrace();

View File

@ -140,7 +140,6 @@ public class FilePathDatabase {
CountDownLatch syncLatch = new CountDownLatch(1);
String[] res = new String[1];
long time = System.currentTimeMillis();
dispatchQueue.postRunnable(() -> {
if (database != null) {

View File

@ -132,7 +132,7 @@ public class LocationSharingService extends Service implements NotificationCente
Intent intent2 = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class);
intent2.setAction("org.tmessages.openlocations");
intent2.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent2, 0);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent2, PendingIntent.FLAG_MUTABLE);
builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext);
builder.setWhen(System.currentTimeMillis());
@ -142,7 +142,7 @@ public class LocationSharingService extends Service implements NotificationCente
builder.setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL);
builder.setContentTitle(LocaleController.getString("AppName", R.string.AppName));
Intent stopIntent = new Intent(ApplicationLoader.applicationContext, StopLiveLocationReceiver.class);
builder.addAction(0, LocaleController.getString("StopLiveLocation", R.string.StopLiveLocation), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, stopIntent, PendingIntent.FLAG_UPDATE_CURRENT));
builder.addAction(0, LocaleController.getString("StopLiveLocation", R.string.StopLiveLocation), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, stopIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
}
updateNotification(false);

View File

@ -52,7 +52,6 @@ import android.provider.OpenableColumns;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import android.view.HapticFeedbackConstants;
import android.view.TextureView;
@ -5041,7 +5040,11 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
FileLog.e(e);
}
retriever.release();
try {
retriever.release();
} catch (Throwable throwable) {
FileLog.e(throwable);
}
return bitrate;
}

View File

@ -120,6 +120,7 @@ public class MessagesController extends BaseController implements NotificationCe
public LongSparseArray<SparseArray<Integer>> printingStringsTypes = new LongSparseArray<>();
public LongSparseArray<SparseArray<Boolean>>[] sendingTypings = new LongSparseArray[12];
public ConcurrentHashMap<Long, Integer> onlinePrivacy = new ConcurrentHashMap<>(20, 1.0f, 2);
private LongSparseIntArray pendingUnreadCounter = new LongSparseIntArray();
private int lastPrintingStringCount;
private boolean dialogsInTransaction;
@ -1331,6 +1332,7 @@ public class MessagesController extends BaseController implements NotificationCe
sendLoadPeersRequest(req3, requests, pinnedDialogs, pinnedRemoteDialogs, users, chats, filtersToSave, filtersToDelete, filtersOrder, filterDialogRemovals, filterUserRemovals, filtersUnreadCounterReset);
}
//no
TLRPC.TL_messages_getPeerDialogs req4 = null;
for (HashMap.Entry<Long, TLRPC.InputPeer> entry : dialogsToLoadMap.entrySet()) {
if (req4 == null) {
@ -4128,6 +4130,7 @@ public class MessagesController extends BaseController implements NotificationCe
if (did == 0 && (dialogs == null || dialogs.isEmpty())) {
return;
}
//probably
TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs();
if (dialogs != null) {
for (int a = 0; a < dialogs.size(); a++) {
@ -6755,6 +6758,7 @@ public class MessagesController extends BaseController implements NotificationCe
chatsDict.put(c.id, c);
}
//no
TLRPC.TL_messages_getPeerDialogs req1 = new TLRPC.TL_messages_getPeerDialogs();
TLRPC.TL_inputDialogPeer peer = new TLRPC.TL_inputDialogPeer();
if (res.peer.user_id != 0) {
@ -7352,6 +7356,7 @@ public class MessagesController extends BaseController implements NotificationCe
getConnectionsManager().bindRequestToGuid(reqId, classGuid);
} else {
if (loadDialog && (load_type == 3 || load_type == 2) && last_message_id == 0) {
//probably--
TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs();
TLRPC.InputPeer inputPeer = getInputPeer(dialogId);
TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer();
@ -8118,6 +8123,7 @@ public class MessagesController extends BaseController implements NotificationCe
FileLog.d("load unknown dialog " + dialogId);
}
//probably--
TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs();
TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer();
inputDialogPeer.peer = peer;
@ -9210,6 +9216,7 @@ public class MessagesController extends BaseController implements NotificationCe
if (BuildVars.DEBUG_PRIVATE_VERSION) {
FileLog.d("can't update dialog " + dialogId + " with new unread " + dialogsToUpdate.valueAt(a));
}
pendingUnreadCounter.put(dialogId, dialogsToUpdate.valueAt(a));
}
if (currentDialog != null) {
int prevCount = currentDialog.unread_count;
@ -11262,6 +11269,7 @@ public class MessagesController extends BaseController implements NotificationCe
gettingUnknownChannels.put(channel.id, true);
//no
TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs();
TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer();
inputDialogPeer.peer = inputPeer;
@ -13196,8 +13204,8 @@ public class MessagesController extends BaseController implements NotificationCe
for (int c = 0, size3 = updates.size(); c < size3; c++) {
TLRPC.Update baseUpdate = updates.get(c);
if (BuildVars.LOGS_ENABLED) {
FileLog.d("process update " + baseUpdate);
if (BuildVars.LOGS_ENABLED && baseUpdate != null) {
FileLog.d("process update " + baseUpdate.getClass().getSimpleName());
}
if (baseUpdate instanceof TLRPC.TL_updateNewMessage || baseUpdate instanceof TLRPC.TL_updateNewChannelMessage || baseUpdate instanceof TLRPC.TL_updateNewScheduledMessage) {
TLRPC.Message message;
@ -15553,6 +15561,7 @@ public class MessagesController extends BaseController implements NotificationCe
}
if (needReload) {
if (topicId == 0) {
//no
TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs();
TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer();
inputDialogPeer.peer = getInputPeer(dialogId);
@ -16009,11 +16018,27 @@ public class MessagesController extends BaseController implements NotificationCe
if (BuildVars.LOGS_ENABLED) {
FileLog.d("not found dialog with id " + dialogId + " dictCount = " + dialogs_dict.size() + " allCount = " + allDialogs.size());
}
boolean filterDialogsChanged = false;
dialog = new TLRPC.TL_dialog();
dialog.id = dialogId;
int mid = dialog.top_message = lastMessage.getId();
dialog.last_message_date = lastMessage.messageOwner.date;
dialog.flags = ChatObject.isChannel(chat) ? 1 : 0;
if (pendingUnreadCounter.get(dialogId, 0) > 0) {
dialog.unread_count = pendingUnreadCounter.get(dialogId);
pendingUnreadCounter.delete(dialogId);
if (!isDialogMuted(dialogId, 0)) {
unreadUnmutedDialogs++;
}
for (int b = 0; b < selectedDialogFilter.length; b++) {
if (selectedDialogFilter[b] != null && (selectedDialogFilter[b].flags & DIALOG_FILTER_FLAG_EXCLUDE_READ) != 0) {
filterDialogsChanged = true;
break;
}
}
}
dialogs_dict.put(dialogId, dialog);
allDialogs.add(dialog);
ArrayList<MessageObject> arrayList = new ArrayList<MessageObject>();
@ -16032,6 +16057,10 @@ public class MessagesController extends BaseController implements NotificationCe
dialogMessage.put(dialogId, arrayList);
changed = true;
if (filterDialogsChanged) {
sortDialogs(null);
getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload);
}
TLRPC.Dialog dialogFinal = dialog;
getMessagesStorage().getDialogFolderId(dialogId, param -> {
if (param != -1) {

View File

@ -2630,6 +2630,38 @@ public class MessagesStorage extends BaseController {
}
}
cursor2.dispose();
if (!topMessageIds.isEmpty()) {
cursor2 = database.queryFinalized("SELECT mid, data FROM messages_topics WHERE uid = " + dialogId + " AND mid IN (" + TextUtils.join(",", topMessageIds) + ")");
try {
while (cursor2.next()) {
int messageId = cursor2.intValue(0);
NativeByteBuffer data = cursor2.byteBufferValue(1);
if (data != null) {
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
if (message != null) {
message.readAttachPath(data, UserConfig.getInstance(currentAccount).clientUserId);
}
data.reuse();
topMessageIds.remove(messageId);
addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null);
ArrayList<TLRPC.TL_forumTopic> topicsList = topicsByTopMessageId.get(messageId);
if (topicsList != null) {
for (int i = 0; i < topicsList.size(); i++) {
topicsList.get(i).topMessage = message;
}
}
}
}
} catch (Exception e) {
FileLog.e(e);
}
}
loadReplyMessages(replyMessageOwners, dialogReplyMessagesIds, usersToLoad, chatsToLoad, false);
ArrayList<TLRPC.Chat> chats = new ArrayList<>();
ArrayList<TLRPC.User> users = new ArrayList<>();
if (!chatsToLoad.isEmpty()) {
@ -2648,35 +2680,6 @@ public class MessagesStorage extends BaseController {
}
});
cursor2.dispose();
if (!topMessageIds.isEmpty()) {
cursor2 = database.queryFinalized("SELECT mid, data FROM messages_topics WHERE uid = " + dialogId + " AND mid IN (" + TextUtils.join(",", topMessageIds) + ")");
try {
while (cursor2.next()) {
int messageId = cursor2.intValue(0);
NativeByteBuffer data = cursor2.byteBufferValue(1);
if (data != null) {
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
if (message != null) {
message.readAttachPath(data, UserConfig.getInstance(currentAccount).clientUserId);
}
data.reuse();
topMessageIds.remove(messageId);
ArrayList<TLRPC.TL_forumTopic> topicsList = topicsByTopMessageId.get(messageId);
if (topicsList != null) {
for (int i = 0; i < topicsList.size(); i++) {
topicsList.get(i).topMessage = message;
}
}
}
}
} catch (Exception e) {
FileLog.e(e);
}
}
loadReplyMessages(replyMessageOwners, dialogReplyMessagesIds, usersToLoad, chatsToLoad, false);
loadGroupedMessagesForTopics(dialogId, topics);
}
@ -10190,6 +10193,7 @@ public class MessagesStorage extends BaseController {
private int malformedCleanupCount = 0;
public void checkMalformed(Exception e) {
if (e != null && e.getMessage() != null && e.getMessage().contains("malformed") && malformedCleanupCount < 3) {
FileLog.e("detected database malformed error, cleaning up...");
malformedCleanupCount++;
cleanup(false);
}
@ -10238,6 +10242,7 @@ public class MessagesStorage extends BaseController {
}
} catch (Exception e) {
FileLog.e(e);
checkMalformed(e);
}
}
cursor.dispose();
@ -10812,23 +10817,44 @@ public class MessagesStorage extends BaseController {
cursor = null;
database.executeFast(String.format(Locale.US, "UPDATE messages_topics SET read_state = read_state | 1 WHERE uid = %d AND topic_id = %d AND mid <= %d AND read_state IN(0,2) AND out = 0", -chatId, mid, readMaxId)).stepThis().dispose();
//mark mentions as read
database.executeFast(String.format(Locale.US, "UPDATE messages_topics SET read_state = read_state | 2 WHERE uid = %d AND topic_id = %d AND mid <= %d AND read_state IN(0,1) AND out = 0", -chatId, mid, readMaxId)).stepThis().dispose();
int unreadMentionsCount = -1;
if (unreadCount < 0) {
unreadCount = 0;
cursor = database.queryFinalized(String.format(Locale.US, "SELECT count(mid) FROM messages_topics WHERE uid = %d AND topic_id = %d AND mid > %d AND read_state IN(0,2) AND out = 0", -chatId, mid, readMaxId));
cursor = database.queryFinalized(String.format(Locale.US, "SELECT count(mid) FROM messages_topics WHERE uid = %d AND topic_id = %d AND mid > %d AND read_state IN(0,2) AND out = 0", -chatId, mid, readMaxId));
if (cursor.next()) {
unreadCount = cursor.intValue(0);
}
cursor.dispose();
cursor = null;
if (unreadCount == 0) {
unreadMentionsCount = 0;
} else {
cursor = database.queryFinalized(String.format(Locale.US, "SELECT count(mid) FROM messages_topics WHERE uid = %d AND topic_id = %d AND mid > %d AND read_state < 2 AND out = 0", -chatId, mid, readMaxId));
if (cursor.next()) {
unreadMentionsCount = cursor.intValue(0);
}
cursor.dispose();
cursor = null;
}
} else if (unreadCount == 0) {
unreadMentionsCount = 0;
}
if (updateTopic) {
database.executeFast(String.format(Locale.ENGLISH, "UPDATE topics SET max_read_id = %d, unread_count = %d WHERE did = %d AND topic_id = %d", readMaxId, unreadCount, -chatId, mid)).stepThis().dispose();
if (unreadMentionsCount >= 0) {
database.executeFast(String.format(Locale.ENGLISH, "UPDATE topics SET max_read_id = %d, unread_count = %d, unread_mentions = %d WHERE did = %d AND topic_id = %d", readMaxId, unreadCount, unreadMentionsCount, -chatId, mid)).stepThis().dispose();
} else {
database.executeFast(String.format(Locale.ENGLISH, "UPDATE topics SET max_read_id = %d, unread_count = %d WHERE did = %d AND topic_id = %d", readMaxId, unreadCount, -chatId, mid)).stepThis().dispose();
}
int finalUnreadCount = unreadCount;
int finalUnreadMentionsCount = unreadMentionsCount;
AndroidUtilities.runOnUIThread(() -> {
getMessagesController().getTopicsController().updateMaxReadId(chatId, mid, readMaxId, finalUnreadCount);
getMessagesController().getTopicsController().updateMaxReadId(chatId, mid, readMaxId, finalUnreadCount, finalUnreadMentionsCount);
});
resetForumBadgeIfNeed(-chatId);
@ -15017,6 +15043,7 @@ public class MessagesStorage extends BaseController {
encryptedChats.clear();
FileLog.e(e);
getMessagesController().processLoadedDialogs(dialogs, encryptedChats, folderId, 0, 100, 1, true, false, true);
checkMalformed(e);
} finally {
if (cursor != null) {
cursor.dispose();

View File

@ -97,7 +97,7 @@ public class MusicBrowserService extends MediaBrowserService implements Notifica
Context context = getApplicationContext();
Intent intent = new Intent(context, LaunchActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 99, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntent.getActivity(context, 99, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
mediaSession.setSessionActivity(pi);
Bundle extras = new Bundle();

View File

@ -172,7 +172,7 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
audioManager.registerMediaButtonEventReceiver(remoteComponentName);
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(remoteComponentName);
PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0);
PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, PendingIntent.FLAG_MUTABLE);
remoteControlClient = new RemoteControlClient(mediaPendingIntent);
audioManager.registerRemoteControlClient(remoteControlClient);
}
@ -219,7 +219,7 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class);
intent.setAction("com.tmessages.openplayer");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, 0);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE);
Notification notification;
@ -246,12 +246,12 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
boolean isPlaying = !MediaController.getInstance().isMessagePaused();
PendingIntent pendingPrev = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PREVIOUS).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingPrev = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PREVIOUS).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
//PendingIntent pendingStop = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_CLOSE).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingStop = PendingIntent.getService(getApplicationContext(), 0, new Intent(this, getClass()).setAction(getPackageName() + ".STOP_PLAYER"), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingPlaypause = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(isPlaying ? NOTIFY_PAUSE : NOTIFY_PLAY).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingNext = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_NEXT).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingSeek = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_SEEK).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingStop = PendingIntent.getService(getApplicationContext(), 0, new Intent(this, getClass()).setAction(getPackageName() + ".STOP_PLAYER"), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingPlaypause = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(isPlaying ? NOTIFY_PAUSE : NOTIFY_PLAY).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingNext = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_NEXT).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingSeek = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_SEEK).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
Notification.Builder bldr = new Notification.Builder(this);
bldr.setSmallIcon(R.drawable.player)
@ -480,15 +480,15 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
}
public void setListeners(RemoteViews view) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PREVIOUS), PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PREVIOUS), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
view.setOnClickPendingIntent(R.id.player_previous, pendingIntent);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_CLOSE), PendingIntent.FLAG_UPDATE_CURRENT);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_CLOSE), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
view.setOnClickPendingIntent(R.id.player_close, pendingIntent);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PAUSE), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
view.setOnClickPendingIntent(R.id.player_pause, pendingIntent);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_NEXT), PendingIntent.FLAG_UPDATE_CURRENT);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_NEXT), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
view.setOnClickPendingIntent(R.id.player_next, pendingIntent);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PLAY), PendingIntent.FLAG_UPDATE_CURRENT);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PLAY), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
view.setOnClickPendingIntent(R.id.player_play, pendingIntent);
}

View File

@ -55,6 +55,8 @@ import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import com.google.android.exoplayer2.util.Log;
import org.telegram.messenger.support.LongSparseIntArray;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.TLRPC;
@ -65,6 +67,7 @@ import org.telegram.ui.PopupNotificationActivity;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@ -144,7 +147,7 @@ public class NotificationsController extends BaseController {
}
audioManager = (AudioManager) ApplicationLoader.applicationContext.getSystemService(Context.AUDIO_SERVICE);
}
private static volatile NotificationsController[] Instance = new NotificationsController[UserConfig.MAX_ACCOUNT_COUNT];
private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT];
static {
@ -470,8 +473,13 @@ public class NotificationsController extends BaseController {
smartNotificationsDialogs.remove(dialogId);
}
if (!newCount.equals(currentCount)) {
total_unread_count -= currentCount;
total_unread_count += newCount;
if (getMessagesController().isForum(dialogId)) {
total_unread_count -= currentCount > 0 ? 1 : 0;
total_unread_count += newCount > 0 ? 1 : 0;
} else {
total_unread_count -= currentCount;
total_unread_count += newCount;
}
pushDialogs.put(dialogId, newCount);
}
if (newCount == 0) {
@ -562,8 +570,13 @@ public class NotificationsController extends BaseController {
smartNotificationsDialogs.remove(dialogId);
}
if (!newCount.equals(currentCount)) {
total_unread_count -= currentCount;
total_unread_count += newCount;
if (getMessagesController().isForum(dialogId)) {
total_unread_count -= currentCount > 0 ? 1 : 0;
total_unread_count += newCount > 0 ? 1 : 0;
} else {
total_unread_count -= currentCount;
total_unread_count += newCount;
}
pushDialogs.put(dialogId, newCount);
}
if (newCount == 0) {
@ -967,10 +980,15 @@ public class NotificationsController extends BaseController {
}
if (canAddValue) {
if (currentCount != null) {
total_unread_count -= currentCount;
if (getMessagesController().isForum(dialog_id)) {
total_unread_count -= currentCount != null && currentCount > 0 ? 1 : 0;
total_unread_count += newCount > 0 ? 1 : 0;
} else {
if (currentCount != null) {
total_unread_count -= currentCount;
}
total_unread_count += newCount;
}
total_unread_count += newCount;
pushDialogs.put(dialog_id, newCount);
}
if (old_unread_count != total_unread_count) {
@ -1051,7 +1069,11 @@ public class NotificationsController extends BaseController {
}
if (canAddValue || newCount == 0) {
if (currentCount != null) {
total_unread_count -= currentCount;
if (getMessagesController().isForum(dialogId)) {
total_unread_count -= currentCount > 0 ? 1 : 0;
} else {
total_unread_count -= currentCount;
}
}
}
if (newCount == 0) {
@ -1083,7 +1105,11 @@ public class NotificationsController extends BaseController {
}
}
} else if (canAddValue) {
total_unread_count += newCount;
if (getMessagesController().isForum(dialogId)) {
total_unread_count += newCount > 0 ? 1 : 0;
} else {
total_unread_count += newCount;
}
pushDialogs.put(dialogId, newCount);
}
}
@ -1209,7 +1235,11 @@ public class NotificationsController extends BaseController {
}
int count = dialogs.valueAt(a);
pushDialogs.put(dialog_id, count);
total_unread_count += count;
if (getMessagesController().isForum(dialog_id)) {
total_unread_count += count > 0 ? 1 : 0;
} else {
total_unread_count += count;
}
}
if (push != null) {
@ -1270,10 +1300,17 @@ public class NotificationsController extends BaseController {
Integer currentCount = pushDialogs.get(dialogId);
int newCount = currentCount != null ? currentCount + 1 : 1;
if (currentCount != null) {
total_unread_count -= currentCount;
if (getMessagesController().isForum(dialogId)) {
if (currentCount != null) {
total_unread_count -= currentCount > 0 ? 1 : 0;
}
total_unread_count += newCount > 0 ? 1 : 0;
} else {
if (currentCount != null) {
total_unread_count -= currentCount;
}
total_unread_count += newCount;
}
total_unread_count += newCount;
pushDialogs.put(dialogId, newCount);
}
}
@ -1313,8 +1350,8 @@ public class NotificationsController extends BaseController {
continue;
}
}
if (dialog != null && dialog.unread_count != 0) {
count += dialog.unread_count;
if (dialog != null) {
count += MessagesController.getInstance(a).getDialogUnreadCount(dialog);
}
}
} catch (Exception e) {
@ -1334,7 +1371,7 @@ public class NotificationsController extends BaseController {
continue;
}
}
if (dialog.unread_count != 0) {
if (MessagesController.getInstance(a).getDialogUnreadCount(dialog) != 0) {
count++;
}
}
@ -2608,7 +2645,7 @@ public class NotificationsController extends BaseController {
try {
Intent intent = new Intent(ApplicationLoader.applicationContext, NotificationRepeat.class);
intent.putExtra("currentAccount", currentAccount);
PendingIntent pintent = PendingIntent.getService(ApplicationLoader.applicationContext, 0, intent, 0);
PendingIntent pintent = PendingIntent.getService(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE);
SharedPreferences preferences = getAccountInstance().getNotificationsSettings();
int minutes = preferences.getInt("repeat_messages", 60);
if (minutes > 0 && personalCount > 0) {
@ -2990,7 +3027,7 @@ public class NotificationsController extends BaseController {
}
NotificationCompat.BubbleMetadata.Builder bubbleBuilder =
new NotificationCompat.BubbleMetadata.Builder(
PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT),
PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT),
icon);
bubbleBuilder.setSuppressNotification(openedDialogId == did);
bubbleBuilder.setAutoExpandBubble(false);
@ -3737,7 +3774,7 @@ public class NotificationsController extends BaseController {
}
}
intent.putExtra("currentAccount", currentAccount);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_ONE_SHOT);
mBuilder.setContentTitle(name)
.setSmallIcon(R.drawable.notification)
@ -3761,7 +3798,7 @@ public class NotificationsController extends BaseController {
Intent dismissIntent = new Intent(ApplicationLoader.applicationContext, NotificationDismissReceiver.class);
dismissIntent.putExtra("messageDate", lastMessageObject.messageOwner.date);
dismissIntent.putExtra("currentAccount", currentAccount);
mBuilder.setDeleteIntent(PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 1, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
mBuilder.setDeleteIntent(PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 1, dismissIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
if (photoPath != null) {
BitmapDrawable img = ImageLoader.getInstance().getImageFromMemory(photoPath, null, "50_50");
@ -3885,7 +3922,7 @@ public class NotificationsController extends BaseController {
callbackIntent.putExtra("data", button.data);
}
callbackIntent.putExtra("mid", lastMessageObject.getId());
mBuilder.addAction(0, button.text, PendingIntent.getBroadcast(ApplicationLoader.applicationContext, lastButtonId++, callbackIntent, PendingIntent.FLAG_UPDATE_CURRENT));
mBuilder.addAction(0, button.text, PendingIntent.getBroadcast(ApplicationLoader.applicationContext, lastButtonId++, callbackIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
hasCallback = true;
}
}
@ -3897,9 +3934,9 @@ public class NotificationsController extends BaseController {
Intent replyIntent = new Intent(ApplicationLoader.applicationContext, PopupReplyReceiver.class);
replyIntent.putExtra("currentAccount", currentAccount);
if (Build.VERSION.SDK_INT <= 19) {
mBuilder.addAction(R.drawable.ic_ab_reply2, LocaleController.getString("Reply", R.string.Reply), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT));
mBuilder.addAction(R.drawable.ic_ab_reply2, LocaleController.getString("Reply", R.string.Reply), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, replyIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
} else {
mBuilder.addAction(R.drawable.ic_ab_reply, LocaleController.getString("Reply", R.string.Reply), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT));
mBuilder.addAction(R.drawable.ic_ab_reply, LocaleController.getString("Reply", R.string.Reply), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, replyIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
}
}
showExtraNotifications(mBuilder, detailText, dialog_id, topicId, chatName, vibrationPattern, ledColor, sound, configImportance, isDefault, isInApp, notifyDisabled, chatType);
@ -4202,7 +4239,7 @@ public class NotificationsController extends BaseController {
replyIntent.putExtra("max_id", maxId);
replyIntent.putExtra("topic_id", topicId);
replyIntent.putExtra("currentAccount", currentAccount);
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, replyIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
RemoteInput remoteInputWear = new RemoteInput.Builder(EXTRA_VOICE_REPLY).setLabel(LocaleController.getString("Reply", R.string.Reply)).build();
String replyToString;
if (DialogObject.isChatDialog(dialogId)) {
@ -4443,7 +4480,7 @@ public class NotificationsController extends BaseController {
intent.putExtra("topicId", topicId);
}
intent.putExtra("currentAccount", currentAccount);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender();
if (wearReplyAction != null) {
@ -4455,7 +4492,7 @@ public class NotificationsController extends BaseController {
msgHeardIntent.putExtra("dialog_id", dialogId);
msgHeardIntent.putExtra("max_id", maxId);
msgHeardIntent.putExtra("currentAccount", currentAccount);
PendingIntent readPendingIntent = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, msgHeardIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent readPendingIntent = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, msgHeardIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action readAction = new NotificationCompat.Action.Builder(R.drawable.msg_markread, LocaleController.getString("MarkAsRead", R.string.MarkAsRead), readPendingIntent)
.setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ)
.setShowsUserInterface(false)
@ -4504,7 +4541,7 @@ public class NotificationsController extends BaseController {
dismissIntent.putExtra("messageDate", maxDate);
dismissIntent.putExtra("dialogId", dialogId);
dismissIntent.putExtra("currentAccount", currentAccount);
builder.setDeleteIntent(PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
builder.setDeleteIntent(PendingIntent.getBroadcast(ApplicationLoader.applicationContext, internalId, dismissIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
if (useSummaryNotification) {
builder.setGroup(notificationGroup);
@ -4541,7 +4578,7 @@ public class NotificationsController extends BaseController {
callbackIntent.putExtra("data", button.data);
}
callbackIntent.putExtra("mid", rowsMid);
builder.addAction(0, button.text, PendingIntent.getBroadcast(ApplicationLoader.applicationContext, lastButtonId++, callbackIntent, PendingIntent.FLAG_UPDATE_CURRENT));
builder.addAction(0, button.text, PendingIntent.getBroadcast(ApplicationLoader.applicationContext, lastButtonId++, callbackIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
}
}
}

View File

@ -3612,7 +3612,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
newMsg.via_bot_name = "";
}
} else {
newMsg.via_bot_id = Utilities.parseInt(params.get("bot"));
newMsg.via_bot_id = Utilities.parseLong(params.get("bot"));
}
newMsg.flags |= TLRPC.MESSAGE_FLAG_HAS_BOT_ID;
}
@ -8037,7 +8037,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
} catch (Throwable ex) {
// Ignore failures while cleaning up.
}
}

View File

@ -70,6 +70,8 @@ public class TopicsController extends BaseController {
if (BuildVars.DEBUG_PRIVATE_VERSION) {
FileLog.d("load topics " + chatId + " fromCache=" + fromCache + " loadType=" + loadType);
}
topicsIsLoading.put(chatId, 1);
if (fromCache) {
getMessagesStorage().loadTopics(-chatId, topics -> {
AndroidUtilities.runOnUIThread(() -> {
@ -88,7 +90,6 @@ public class TopicsController extends BaseController {
return;
}
topicsIsLoading.put(chatId, 1);
TLRPC.TL_channels_getForumTopics getForumTopics = new TLRPC.TL_channels_getForumTopics();
getForumTopics.channel = getMessagesController().getInputChannel(chatId);
if (loadType == LOAD_TYPE_PRELOAD) {
@ -113,6 +114,7 @@ public class TopicsController extends BaseController {
messagesMap.put(topics.messages.get(i).id, topics.messages.get(i));
}
AndroidUtilities.runOnUIThread(() -> {
getMessagesStorage().putUsersAndChats(((TLRPC.TL_messages_forumTopics) response).users, ((TLRPC.TL_messages_forumTopics) response).chats, true, false);
getMessagesController().putUsers(((TLRPC.TL_messages_forumTopics) response).users, false);
getMessagesController().putChats(((TLRPC.TL_messages_forumTopics) response).chats, false);
@ -172,20 +174,19 @@ public class TopicsController extends BaseController {
topicsToReload = new ArrayList<>();
}
topicsToReload.add(newTopic);
} else {
if (newTopic.topicStartMessage == null) {
newTopic.topicStartMessage = new TLRPC.TL_message();
newTopic.topicStartMessage.message = "";
newTopic.topicStartMessage.id = newTopic.id;
newTopic.topicStartMessage.peer_id = getMessagesController().getPeer(-chatId);
newTopic.topicStartMessage.action = new TLRPC.TL_messageActionTopicCreate();
newTopic.topicStartMessage.action.title = newTopic.title;
}
topics.add(newTopic);
topicsMap.put(newTopic.id, newTopic);
topicsByTopMsgId.put(messageHash(newTopic.top_message, chatId), newTopic);
changed = true;
}
if (newTopic.topicStartMessage == null) {
newTopic.topicStartMessage = new TLRPC.TL_message();
newTopic.topicStartMessage.message = "";
newTopic.topicStartMessage.id = newTopic.id;
newTopic.topicStartMessage.peer_id = getMessagesController().getPeer(-chatId);
newTopic.topicStartMessage.action = new TLRPC.TL_messageActionTopicCreate();
newTopic.topicStartMessage.action.title = newTopic.title;
}
topics.add(newTopic);
topicsMap.put(newTopic.id, newTopic);
topicsByTopMsgId.put(messageHash(newTopic.top_message, chatId), newTopic);
changed = true;
}
}
}
@ -202,9 +203,7 @@ public class TopicsController extends BaseController {
}
}
if (changed) {
sortTopics(chatId);
}
if (topicsToReload != null && loadType != LOAD_TYPE_LOAD_UNKNOWN) {
reloadTopics(chatId, topicsToReload);
@ -213,6 +212,10 @@ public class TopicsController extends BaseController {
getUserConfig().getPreferences().edit().putBoolean("topics_end_reached_" + chatId, true).apply();
}
if (changed) {
sortTopics(chatId);
}
getNotificationCenter().postNotificationName(NotificationCenter.topicsDidLoaded, chatId, true);
if ((loadType == LOAD_TYPE_PRELOAD || (loadType == LOAD_TYPE_PRELOAD && !fromCache)) && fromCache && topicsByChatId.get(chatId).isEmpty()) {
@ -367,11 +370,14 @@ public class TopicsController extends BaseController {
}));
}
public void updateMaxReadId(long chatId, int topicId, int readMaxId, int unreadCount) {
public void updateMaxReadId(long chatId, int topicId, int readMaxId, int unreadCount, int mentionsUnread) {
TLRPC.TL_forumTopic topic = findTopic(chatId, topicId);
if (topic != null) {
topic.read_inbox_max_id = readMaxId;
topic.unread_count = unreadCount;
if (mentionsUnread >= 0) {
topic.unread_mentions_count = mentionsUnread;
}
sortTopics(chatId);
}
}
@ -669,14 +675,6 @@ public class TopicsController extends BaseController {
}
}
public TLRPC.Message getLastMessage(long id) {
ArrayList<TLRPC.TL_forumTopic> topics = topicsByChatId.get(id);
if (!topics.isEmpty()) {
return topics.get(0).topMessage;
}
return null;
}
LongSparseArray<TopicsLoadOffset> offsets = new LongSparseArray<>();
public TopicsLoadOffset getLoadOffset(long chatId) {
@ -867,7 +865,7 @@ public class TopicsController extends BaseController {
if (topic != null) {
topic.read_outbox_max_id = Math.max(topic.read_outbox_max_id, value);
updatedChats.add(-topicKey.dialogId);
if (topic.read_outbox_max_id >= topic.topMessage.id) {
if (topic.topMessage != null && topic.read_outbox_max_id >= topic.topMessage.id) {
topic.topMessage.unread = false;
}
}

View File

@ -178,7 +178,7 @@ public class Browser {
if (equals) {
return url.equals("telegra.ph") || url.equals("te.legra.ph") || url.equals("graph.org");
}
return url.matches("^(https" + (forceHttps ? "" : "?") + "://)?(te\\.?legra\\.ph|graph\\.org).*"); // telegra.ph, te.legra.ph, graph.org
return url.matches("^(https" + (forceHttps ? "" : "?") + "://)?(te\\.?legra\\.ph|graph\\.org)(/.*|$)"); // telegra.ph, te.legra.ph, graph.org
}
public static String extractUsername(String link) {
@ -207,9 +207,9 @@ public class Browser {
public static boolean urlMustNotHaveConfirmation(String url) {
return (
isTelegraphUrl(url, false, true) ||
url.matches("^(https://)?t\\.me/iv\\??.*") || // t.me/iv?
url.matches("^(https://)?telegram\\.org/(blog|tour)/?.*") || // telegram.org/blog, telegram.org/tour
url.matches("^(https://)?fragment\\.com/?.*") // fragment.com
url.matches("^(https://)?t\\.me/iv\\??(/.*|$)") || // t.me/iv?
url.matches("^(https://)?telegram\\.org/(blog|tour)(/.*|$)") || // telegram.org/blog, telegram.org/tour
url.matches("^(https://)?fragment\\.com(/.*|$)") // fragment.com
);
}
@ -346,14 +346,14 @@ public class Browser {
Intent share = new Intent(ApplicationLoader.applicationContext, ShareBroadcastReceiver.class);
share.setAction(Intent.ACTION_SEND);
PendingIntent copy = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 0, new Intent(ApplicationLoader.applicationContext, CustomTabsCopyReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent copy = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 0, new Intent(ApplicationLoader.applicationContext, CustomTabsCopyReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(getSession());
builder.addMenuItem(LocaleController.getString("CopyLink", R.string.CopyLink), copy);
builder.setToolbarColor(Theme.getColor(Theme.key_actionBarBrowser));
builder.setShowTitle(true);
builder.setActionButton(BitmapFactory.decodeResource(context.getResources(), R.drawable.msg_filled_shareout), LocaleController.getString("ShareFile", R.string.ShareFile), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 0, share, 0), true);
builder.setActionButton(BitmapFactory.decodeResource(context.getResources(), R.drawable.msg_filled_shareout), LocaleController.getString("ShareFile", R.string.ShareFile), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 0, share, PendingIntent.FLAG_MUTABLE ), true);
CustomTabsIntent intent = builder.build();
intent.setUseNewTask();
intent.launchUrl(context, uri);

View File

@ -9,6 +9,7 @@ import org.telegram.messenger.BuildVars;
import org.telegram.messenger.DispatchQueuePoolBackground;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Components.RLottieDrawable;
@ -47,12 +48,12 @@ public class BitmapsCache {
static volatile boolean cleanupScheduled;
byte[] bufferTmp;
private final static int N = Utilities.clamp(Runtime.getRuntime().availableProcessors(), 8, 1);
private final static int N = Utilities.clamp(Runtime.getRuntime().availableProcessors() - 2, 8, 1);
private static ThreadPoolExecutor bitmapCompressExecutor;
private final Object mutex = new Object();
private int frameIndex;
boolean error;
boolean fileExist;
volatile boolean fileExist;
int compressQuality;
final File file;
@ -89,36 +90,47 @@ public class BitmapsCache {
File fileTmo = new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache");
file = new File(fileTmo, fileName + "_" + w + "_" + h + (noLimit ? "_nolimit" : " ") + ".pcache2");
useSharedBuffers = w < AndroidUtilities.dp(60) && h < AndroidUtilities.dp(60);
fileExist = file.exists();
if (fileExist) {
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(file, "r");
cacheCreated = randomAccessFile.readBoolean();
if (cacheCreated && frameOffsets.isEmpty()) {
randomAccessFile.seek(randomAccessFile.readInt());
int count = randomAccessFile.readInt();
fillFrames(randomAccessFile, count);
if (count == 0) {
file.delete();
cacheCreated = false;
fileExist = false;
}
}
} catch (Throwable e) {
e.printStackTrace();
file.delete();
fileExist = false;
} finally {
// check cache created in file load queue only for high devices
if (SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH) {
fileExist = file.exists();
if (fileExist) {
RandomAccessFile randomAccessFile = null;
try {
if (randomAccessFile != null) {
randomAccessFile.close();
randomAccessFile = new RandomAccessFile(file, "r");
cacheCreated = randomAccessFile.readBoolean();
if (cacheCreated && frameOffsets.isEmpty()) {
randomAccessFile.seek(randomAccessFile.readInt());
int count = randomAccessFile.readInt();
if (count > 10_000) {
count = 0;
}
fillFrames(randomAccessFile, count);
if (frameOffsets.size() == 0) {
cacheCreated = false;
fileExist = false;
file.delete();
} else {
cachedFile = randomAccessFile;
}
}
} catch (IOException e) {
} catch (Throwable e) {
e.printStackTrace();
file.delete();
fileExist = false;
} finally {
try {
if (cachedFile != randomAccessFile && randomAccessFile != null) {
randomAccessFile.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
fileExist = false;
cacheCreated = false;
}
}
@ -152,25 +164,30 @@ public class BitmapsCache {
public void createCache() {
try {
long time = System.currentTimeMillis();
if (file.exists()) {
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(file, "r");
cacheCreated = randomAccessFile.readBoolean();
int framesCount = randomAccessFile.readInt();
if (framesCount == 0) {
cacheCreated = false;
}
if (cacheCreated) {
frameOffsets.clear();
randomAccessFile.seek(randomAccessFile.readInt());
int count = randomAccessFile.readInt();
fillFrames(randomAccessFile, count);
randomAccessFile.close();
fileExist = true;
return;
} else {
if (count > 10_000) {
count = 0;
}
if (count > 0) {
fillFrames(randomAccessFile, count);
randomAccessFile.seek(0);
cachedFile = randomAccessFile;
fileExist = true;
return;
} else {
fileExist = false;
cacheCreated = false;
}
}
if (!cacheCreated) {
file.delete();
}
} catch (Throwable e) {
@ -180,7 +197,7 @@ public class BitmapsCache {
}
} finally {
if (randomAccessFile != null) {
if (cachedFile != randomAccessFile && randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (Throwable e2) {
@ -207,9 +224,6 @@ public class BitmapsCache {
finalRandomAccessFile.writeInt(0);
int index = 0;
long bitmapFrameTime = 0;
long compressTime = 0;
long writeFileTime = 0;
int framePosition = 0;
AtomicBoolean closed = new AtomicBoolean(false);
@ -250,11 +264,9 @@ public class BitmapsCache {
return;
}
long time2 = System.currentTimeMillis();
if (source.getNextFrame(bitmap[index]) != 1) {
break;
}
bitmapFrameTime += System.currentTimeMillis() - time2;
countDownLatch[index] = new CountDownLatch(1);
@ -332,12 +344,10 @@ public class BitmapsCache {
randomAccessFile.close();
this.frameOffsets.clear();
// this.frameOffsets.addAll(frameOffsets);
this.frameOffsets.addAll(frameOffsets);
cachedFile = new RandomAccessFile(file, "r");
cacheCreated = true;
fileExist = true;
// if (BuildVars.DEBUG_VERSION) {
// FileLog.d("generate cache for time = " + (System.currentTimeMillis() - time) + " drawFrameTime = " + bitmapFrameTime + " comressQuality = " + compressQuality + " fileSize = " + AndroidUtilities.formatFileSize(file.length()) + " " + fileName);
// }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
@ -348,6 +358,9 @@ public class BitmapsCache {
}
private void fillFrames(RandomAccessFile randomAccessFile, int count) throws Throwable {
if (count == 0) {
return;
}
byte[] bytes = new byte[4 * 2 * count];
randomAccessFile.read(bytes);
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
@ -385,6 +398,7 @@ public class BitmapsCache {
synchronized (mutex) {
randomAccessFile = new RandomAccessFile(file, "r");
cacheCreated = randomAccessFile.readBoolean();
randomAccessFile.seek(randomAccessFile.readInt());
framesCount = randomAccessFile.readInt();
if (framesCount <= 0) {
cacheCreated = false;
@ -436,6 +450,9 @@ public class BitmapsCache {
} else {
randomAccessFile = cachedFile;
}
if (frameOffsets.size() == 0) {
return FRAME_RESULT_NO_FRAME;
}
index = Utilities.clamp(index, frameOffsets.size() - 1, 0);
selectedFrame = frameOffsets.get(index);
randomAccessFile.seek(selectedFrame.frameOffset);

View File

@ -79,7 +79,6 @@ import android.widget.RemoteViews;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import org.json.JSONObject;
import org.telegram.messenger.AccountInstance;
@ -1562,7 +1561,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
.putExtra("call_access_hash", privateCall.access_hash)
.putExtra("call_video", privateCall.video)
.putExtra("account", currentAccount)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP), 0).send();
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_MUTABLE).send();
} catch (Exception x) {
if (BuildVars.LOGS_ENABLED) {
FileLog.e("Error starting incall activity", x);
@ -2858,7 +2857,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
}
Notification.Builder builder = new Notification.Builder(this)
.setContentText(name)
.setContentIntent(PendingIntent.getActivity(this, 50, intent, 0));
.setContentIntent(PendingIntent.getActivity(this, 50, intent, PendingIntent.FLAG_MUTABLE));
if (groupCall != null) {
builder.setContentTitle(ChatObject.isChannelOrGiga(chat) ? LocaleController.getString("VoipLiveStream", R.string.VoipLiveStream) : LocaleController.getString("VoipVoiceChat", R.string.VoipVoiceChat));
builder.setSmallIcon(isMicMute() ? R.drawable.voicechat_muted : R.drawable.voicechat_active);
@ -2870,9 +2869,9 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
Intent endIntent = new Intent(this, VoIPActionsReceiver.class);
endIntent.setAction(getPackageName() + ".END_CALL");
if (groupCall != null) {
builder.addAction(R.drawable.ic_call_end_white_24dp, ChatObject.isChannelOrGiga(chat) ? LocaleController.getString("VoipChannelLeaveAlertTitle", R.string.VoipChannelLeaveAlertTitle) : LocaleController.getString("VoipGroupLeaveAlertTitle", R.string.VoipGroupLeaveAlertTitle), PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_UPDATE_CURRENT));
builder.addAction(R.drawable.ic_call_end_white_24dp, ChatObject.isChannelOrGiga(chat) ? LocaleController.getString("VoipChannelLeaveAlertTitle", R.string.VoipChannelLeaveAlertTitle) : LocaleController.getString("VoipGroupLeaveAlertTitle", R.string.VoipGroupLeaveAlertTitle), PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
} else {
builder.addAction(R.drawable.ic_call_end_white_24dp, LocaleController.getString("VoipEndCall", R.string.VoipEndCall), PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_UPDATE_CURRENT));
builder.addAction(R.drawable.ic_call_end_white_24dp, LocaleController.getString("VoipEndCall", R.string.VoipEndCall), PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
}
builder.setPriority(Notification.PRIORITY_MAX);
}
@ -3313,7 +3312,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
FileLog.d("Starting incall activity for incoming call");
}
try {
PendingIntent.getActivity(VoIPService.this, 12345, new Intent(VoIPService.this, LaunchActivity.class).setAction("voip"), 0).send();
PendingIntent.getActivity(VoIPService.this, 12345, new Intent(VoIPService.this, LaunchActivity.class).setAction("voip"), PendingIntent.FLAG_MUTABLE).send();
} catch (Exception x) {
if (BuildVars.LOGS_ENABLED) {
FileLog.e("Error starting incall activity", x);
@ -3914,7 +3913,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
.setContentText(name)
.setSmallIcon(R.drawable.notification)
.setSubText(subText)
.setContentIntent(PendingIntent.getActivity(this, 0, intent, 0));
.setContentIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_MUTABLE));
Uri soundProviderUri = Uri.parse("content://" + ApplicationLoader.getApplicationId() + ".call_sound_provider/start_ringing");
if (Build.VERSION.SDK_INT >= 26) {
SharedPreferences nprefs = MessagesController.getGlobalNotificationsSettings();
@ -3969,7 +3968,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
endTitle = new SpannableString(endTitle);
((SpannableString) endTitle).setSpan(new ForegroundColorSpan(0xFFF44336), 0, endTitle.length(), 0);
}
PendingIntent endPendingIntent = PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent endPendingIntent = PendingIntent.getBroadcast(this, 0, endIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
builder.addAction(R.drawable.ic_call_end_white_24dp, endTitle, endPendingIntent);
Intent answerIntent = new Intent(this, VoIPActionsReceiver.class);
answerIntent.setAction(getPackageName() + ".ANSWER_CALL");
@ -3979,7 +3978,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
answerTitle = new SpannableString(answerTitle);
((SpannableString) answerTitle).setSpan(new ForegroundColorSpan(0xFF00AA00), 0, answerTitle.length(), 0);
}
PendingIntent answerPendingIntent = PendingIntent.getBroadcast(this, 0, answerIntent, PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent answerPendingIntent = PendingIntent.getBroadcast(this, 0, answerIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
builder.addAction(R.drawable.ic_call, answerTitle, answerPendingIntent);
builder.setPriority(Notification.PRIORITY_MAX);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
@ -3989,7 +3988,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
builder.setColor(0xff2ca5e0);
builder.setVibrate(new long[0]);
builder.setCategory(Notification.CATEGORY_CALL);
builder.setFullScreenIntent(PendingIntent.getActivity(this, 0, intent, 0), true);
builder.setFullScreenIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_MUTABLE), true);
if (userOrChat instanceof TLRPC.User) {
TLRPC.User user = (TLRPC.User) userOrChat;
if (!TextUtils.isEmpty(user.phone)) {
@ -4269,7 +4268,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.R && (checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || privateCall.video && checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
try {
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
PendingIntent.getActivity(VoIPService.this, 0, new Intent(VoIPService.this, VoIPPermissionActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_ONE_SHOT).send();
PendingIntent.getActivity(VoIPService.this, 0, new Intent(VoIPService.this, VoIPPermissionActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_ONE_SHOT).send();
} catch (Exception x) {
if (BuildVars.LOGS_ENABLED) {
FileLog.e("Error starting permission activity", x);
@ -4279,7 +4278,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
}
acceptIncomingCall();
try {
PendingIntent.getActivity(VoIPService.this, 0, new Intent(VoIPService.this, getUIActivityClass()).setAction("voip"), 0).send();
PendingIntent.getActivity(VoIPService.this, 0, new Intent(VoIPService.this, getUIActivityClass()).setAction("voip"), PendingIntent.FLAG_MUTABLE).send();
} catch (Exception x) {
if (BuildVars.LOGS_ENABLED) {
FileLog.e("Error starting incall activity", x);

View File

@ -69,6 +69,7 @@ public class ActionBar extends FrameLayout {
}
}
private INavigationLayout.BackButtonState backButtonState;
private ImageView backButtonImageView;
private Drawable backButtonDrawable;
private SimpleTextView[] titleTextView = new SimpleTextView[2];
@ -157,6 +158,10 @@ public class ActionBar extends FrameLayout {
});
}
public INavigationLayout.BackButtonState getBackButtonState() {
return backButtonState;
}
private void createBackButtonImage() {
if (backButtonImageView != null) {
return;
@ -247,6 +252,10 @@ public class ActionBar extends FrameLayout {
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (parentFragment != null && parentFragment.getParentLayout().isActionBarInCrossfade()) {
return false;
}
boolean clip = shouldClipChild(child);
if (clip) {
canvas.save();
@ -309,6 +318,9 @@ public class ActionBar extends FrameLayout {
}
backButtonImageView.setVisibility(resource == 0 ? GONE : VISIBLE);
backButtonImageView.setImageResource(resource);
if (resource == R.drawable.ic_ab_back) {
backButtonState = INavigationLayout.BackButtonState.BACK;
}
}
private void createSubtitleTextView() {
@ -592,6 +604,45 @@ public class ActionBar extends FrameLayout {
return actionMode;
}
public void onDrawCrossfadeBackground(Canvas canvas) {
if (blurredBackground && actionBarColor != Color.TRANSPARENT) {
rectTmp.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
blurScrimPaint.setColor(actionBarColor);
contentView.drawBlurRect(canvas, getY(), rectTmp, blurScrimPaint, true);
} else {
Drawable drawable = getBackground();
if (drawable != null) {
drawable.setBounds(0, 0, getWidth(), getHeight());
drawable.draw(canvas);
}
}
}
public void onDrawCrossfadeContent(Canvas canvas, boolean front, boolean hideBackDrawable, float progress) {
for (int i = 0; i < getChildCount(); i++) {
View ch = getChildAt(i);
if ((!hideBackDrawable || ch != backButtonImageView) && ch.getVisibility() == View.VISIBLE && ch instanceof ActionBarMenu) {
canvas.save();
canvas.translate(ch.getX(), ch.getY());
ch.draw(canvas);
canvas.restore();
}
}
canvas.save();
canvas.translate(front ? getWidth() * progress * 0.5f : -getWidth() * 0.4f * (1f - progress), 0);
for (int i = 0; i < getChildCount(); i++) {
View ch = getChildAt(i);
if ((!hideBackDrawable || ch != backButtonImageView) && ch.getVisibility() == View.VISIBLE && !(ch instanceof ActionBarMenu)) {
canvas.save();
canvas.translate(ch.getX(), ch.getY());
ch.draw(canvas);
canvas.restore();
}
}
canvas.restore();
}
public void showActionMode() {
showActionMode(true, null, null, null, null, null, 0);
}

View File

@ -87,6 +87,8 @@ public class ActionBarMenuItem extends FrameLayout {
}
public static class ActionBarMenuItemSearchListener {
public void onPreToggleSearch() {}
public void onSearchExpand() {
}
@ -144,6 +146,8 @@ public class ActionBarMenuItem extends FrameLayout {
private LinearLayout searchFilterLayout;
private ArrayList<SearchFilterView> searchFilterViews = new ArrayList<>();
private TextView searchFieldCaption;
private CharSequence searchFieldHint;
private CharSequence searchFieldText;
private ImageView clearButton;
private AnimatorSet clearButtonAnimator;
private View searchAdditionalButton;
@ -151,6 +155,7 @@ public class ActionBarMenuItem extends FrameLayout {
protected TextView textView;
private FrameLayout searchContainer;
private boolean isSearchField;
private boolean wrapSearchInScrollView;
protected ActionBarMenuItemSearchListener listener;
private Rect rect;
private int[] location;
@ -756,6 +761,7 @@ public class ActionBarMenuItem extends FrameLayout {
}
public void openSearch(boolean openKeyboard) {
checkCreateSearchField();
if (searchContainer == null || searchContainer.getVisibility() == VISIBLE || parentMenu == null) {
return;
}
@ -773,6 +779,10 @@ public class ActionBarMenuItem extends FrameLayout {
AnimatorSet searchContainerAnimator;
public boolean toggleSearch(boolean openKeyboard) {
checkCreateSearchField();
if (listener != null) {
listener.onPreToggleSearch();
}
if (searchContainer == null || (listener != null && !listener.canToggleSearch())) {
return false;
}
@ -1090,6 +1100,7 @@ public class ActionBarMenuItem extends FrameLayout {
}
public void setSearchFieldHint(CharSequence hint) {
searchFieldHint = hint;
if (searchFieldCaption == null) {
return;
}
@ -1098,6 +1109,7 @@ public class ActionBarMenuItem extends FrameLayout {
}
public void setSearchFieldText(CharSequence text, boolean animated) {
searchFieldText = text;
if (searchFieldCaption == null) {
return;
}
@ -1115,6 +1127,7 @@ public class ActionBarMenuItem extends FrameLayout {
}
public EditTextBoldCursor getSearchField() {
checkCreateSearchField();
return searchField;
}
@ -1135,7 +1148,13 @@ public class ActionBarMenuItem extends FrameLayout {
if (parentMenu == null) {
return this;
}
if (value && searchContainer == null) {
isSearchField = value;
wrapSearchInScrollView = wrapInScrollView;
return this;
}
private void checkCreateSearchField() {
if (searchContainer == null && isSearchField) {
searchContainer = new FrameLayout(getContext()) {
private boolean ignoreRequestLayout;
@ -1166,7 +1185,7 @@ public class ActionBarMenuItem extends FrameLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!wrapInScrollView) {
if (!wrapSearchInScrollView) {
measureChildWithMargins(clearButton, widthMeasureSpec, 0, heightMeasureSpec, 0);
if (searchAdditionalButton != null) {
measureChildWithMargins(searchAdditionalButton, widthMeasureSpec, 0, heightMeasureSpec, 0);
@ -1233,7 +1252,7 @@ public class ActionBarMenuItem extends FrameLayout {
};
searchContainer.setClipChildren(searchItemPaddingStart != 0);
wrappedSearchFrameLayout = null;
if (wrapInScrollView) {
if (wrapSearchInScrollView) {
wrappedSearchFrameLayout = new FrameLayout(getContext());
HorizontalScrollView horizontalScrollView = new HorizontalScrollView(getContext()) {
@ -1402,16 +1421,24 @@ public class ActionBarMenuItem extends FrameLayout {
searchField.setHighlightColor(getThemedColor(Theme.key_chat_inTextSelectionHighlight));
searchField.setHandlesColor(getThemedColor(Theme.key_chat_TextSelectionCursor));
if (searchFieldHint != null) {
searchField.setHint(searchFieldHint);
setContentDescription(searchFieldHint);
}
if (searchFieldText != null) {
searchField.setText(searchFieldText);
}
searchFilterLayout = new LinearLayout(getContext());
searchFilterLayout.setOrientation(LinearLayout.HORIZONTAL);
searchFilterLayout.setVisibility(View.VISIBLE);
if (!LocaleController.isRTL) {
searchContainer.addView(searchFieldCaption, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 36, Gravity.CENTER_VERTICAL | Gravity.LEFT, 0, 5.5f, 0, 0));
searchContainer.addView(searchField, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.CENTER_VERTICAL, 6, 0, wrapInScrollView ? 0 : 48, 0));
searchContainer.addView(searchField, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.CENTER_VERTICAL, 6, 0, wrapSearchInScrollView ? 0 : 48, 0));
searchContainer.addView(searchFilterLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 32, Gravity.CENTER_VERTICAL, 0, 0, 48, 0));
} else {
searchContainer.addView(searchFilterLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 32, Gravity.CENTER_VERTICAL, 0, 0, 48, 0));
searchContainer.addView(searchField, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.CENTER_VERTICAL, 0, 0, wrapInScrollView ? 0 : 48, 0));
searchContainer.addView(searchField, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.CENTER_VERTICAL, 0, 0, wrapSearchInScrollView ? 0 : 48, 0));
searchContainer.addView(searchFieldCaption, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 36, Gravity.CENTER_VERTICAL | Gravity.RIGHT, 0, 5.5f, 48, 0));
}
searchFilterLayout.setClipChildren(false);
@ -1474,14 +1501,12 @@ public class ActionBarMenuItem extends FrameLayout {
AndroidUtilities.showKeyboard(searchField);
});
clearButton.setContentDescription(LocaleController.getString("ClearButton", R.string.ClearButton));
if (wrapInScrollView) {
if (wrapSearchInScrollView) {
wrappedSearchFrameLayout.addView(clearButton, LayoutHelper.createFrame(48, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT));
} else {
searchContainer.addView(clearButton, LayoutHelper.createFrame(48, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT));
}
}
isSearchField = value;
return this;
}
public OnClickListener getOnClickListener() {
@ -1632,6 +1657,7 @@ public class ActionBarMenuItem extends FrameLayout {
}
public void clearSearchText() {
searchFieldText = null;
if (searchField == null) {
return;
}

View File

@ -153,6 +153,14 @@ public abstract class BaseFragment {
return parentLayout != null && parentLayout.isInPassivePreviewMode();
}
public boolean isActionBarCrossfadeEnabled() {
return actionBar != null;
}
public INavigationLayout.BackButtonState getBackButtonState() {
return actionBar != null ? actionBar.getBackButtonState() : null;
}
public void setInPreviewMode(boolean value) {
inPreviewMode = value;
if (actionBar != null) {

View File

@ -78,6 +78,10 @@ public interface INavigationLayout {
return SharedConfig.useLNavigation ? new LNavigation(context) : new ActionBarLayout(context);
}
default boolean isActionBarInCrossfade() {
return false;
}
default boolean hasIntegratedBlurInPreview() {
return false;
}
@ -376,4 +380,9 @@ public interface INavigationLayout {
}
}
}
enum BackButtonState {
BACK,
MENU
}
}

View File

@ -181,7 +181,7 @@ public class MenuDrawable extends Drawable {
startXDiff += (paint.getStrokeWidth() / 2f) * (1f - currentRotation);
endYDiff += AndroidUtilities.dp(.5f) * currentRotation;
endXDiff -= AndroidUtilities.dp(.5f) * currentRotation + (paint.getStrokeWidth() / 2f) * (1f - currentRotation);
startYDiff -= AndroidUtilities.dp(.25f) * currentRotation;
startYDiff -= AndroidUtilities.dp(.75f) * currentRotation;
endYDiff += AndroidUtilities.dp(.25f) * currentRotation;
}
} else {

View File

@ -3117,6 +3117,8 @@ public class Theme {
public static Drawable chat_commentDrawable;
public static Drawable chat_commentStickerDrawable;
public static Drawable chat_commentArrowDrawable;
public static Drawable chat_gradientLeftDrawable;
public static Drawable chat_gradientRightDrawable;
public static Drawable[] chat_msgInCallDrawable = new Drawable[2];
public static Drawable[] chat_msgInCallSelectedDrawable = new Drawable[2];
public static Drawable[] chat_msgOutCallDrawable = new Drawable[2];
@ -5043,6 +5045,7 @@ public class Theme {
fallbackKeys.put(key_topics_unreadCounter, key_chats_unreadCounter);
fallbackKeys.put(key_topics_unreadCounterMuted, key_chats_message);
fallbackKeys.put(key_avatar_background2Saved, key_avatar_backgroundSaved);
fallbackKeys.put(key_avatar_background2Red, key_avatar_backgroundRed);
fallbackKeys.put(key_avatar_background2Orange, key_avatar_backgroundOrange);
fallbackKeys.put(key_avatar_background2Violet, key_avatar_backgroundViolet);
@ -9316,6 +9319,8 @@ public class Theme {
chat_commentDrawable = resources.getDrawable(R.drawable.msg_msgbubble);
chat_commentStickerDrawable = resources.getDrawable(R.drawable.msg_msgbubble2);
chat_commentArrowDrawable = resources.getDrawable(R.drawable.msg_arrowright);
chat_gradientLeftDrawable = resources.getDrawable(R.drawable.gradient_left);
chat_gradientRightDrawable = resources.getDrawable(R.drawable.gradient_right);
chat_contextResult_shadowUnderSwitchDrawable = resources.getDrawable(R.drawable.header_shadow).mutate();
@ -9641,6 +9646,8 @@ public class Theme {
setDrawableColorByKey(chat_commentDrawable, key_chat_inInstant);
setDrawableColorByKey(chat_commentStickerDrawable, key_chat_serviceIcon);
setDrawableColorByKey(chat_commentArrowDrawable, key_chat_inInstant);
setDrawableColorByKey(chat_gradientLeftDrawable, key_chat_stickersHintPanel);
setDrawableColorByKey(chat_gradientRightDrawable, key_chat_stickersHintPanel);
for (int a = 0; a < 2; a++) {
setDrawableColorByKey(chat_msgInCallDrawable[a], key_chat_inInstant);

View File

@ -8552,9 +8552,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
timeX -= getExtraTimeX();
// if (transitionParams != null && !transitionParams.shouldAnimateTimeX) {
// transitionParams.lastTimeX = timeX;
// }
if ((currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0) {
viewsLayout = new StaticLayout(currentViewsString, Theme.chat_timePaint, viewsTextWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
@ -9745,13 +9742,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
reactionsLayoutInBubble.y = getBackgroundDrawableBottom() - AndroidUtilities.dp(10) - reactionsLayoutInBubble.height;
reactionsLayoutInBubble.y -= (drawCommentButton ? AndroidUtilities.dp(43) : 0);
if (hasNewLineForTime) {
if (hasNewLineForTime && !(drawForwardedName && hasLinkPreview && documentAttachType == DOCUMENT_ATTACH_TYPE_AUDIO)) {
reactionsLayoutInBubble.y -= AndroidUtilities.dp(16);
}
if (captionLayout != null && ((currentMessageObject.type != MessageObject.TYPE_VOICE && !(currentMessageObject.isOut() && drawForwardedName && !drawPhotoImage) && !(currentMessageObject.type == MessageObject.TYPE_FILE && drawPhotoImage)) || (currentPosition != null && currentMessagesGroup != null))) {
reactionsLayoutInBubble.y -= AndroidUtilities.dp(14);
}
reactionsLayoutInBubble.y = reactionsLayoutInBubble.y + reactionsLayoutInBubble.positionOffsetY;
reactionsLayoutInBubble.y += reactionsLayoutInBubble.positionOffsetY;
}
if (reactionsLayoutInBubble.isSmall && !reactionsLayoutInBubble.isEmpty) {
int timeYOffset;
@ -13912,7 +13909,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
if (drawTopic && (animatingAlpha > 0 && replyForwardAlpha > 0) && (currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0)) {
if (drawTopic && topicButton != null && (animatingAlpha > 0 && replyForwardAlpha > 0) && (currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0)) {
float x, y;
if (currentMessageObject.shouldDrawWithoutBackground()) {
if (currentMessageObject.isOutOwner()) {
@ -14878,7 +14875,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
reactionsLayoutInBubble.draw(canvas, transitionParams.animateChangeProgress, null);
}
if (ChatObject.isChannel(currentChat) && !currentChat.megagroup || (currentMessageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_HAS_VIEWS) != 0 || (repliesLayout != null || transitionParams.animateReplies) || (isPinned || transitionParams.animatePinned)) {
additionalX += this.timeWidth - timeLayout.getLineWidth(0);
additionalX += timeWidth - timeLayout.getLineWidth(0);
if (reactionsLayoutInBubble.isSmall && !reactionsLayoutInBubble.isEmpty) {
additionalX -= reactionsLayoutInBubble.width;
}
@ -18171,7 +18168,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
animateTimeWidth = lastTimeWidth;
changed = true;
} else if (timeDrawablesIsChanged || Math.abs(timeX - lastTimeX) > 1) {
shouldAnimateTimeX = true ;
shouldAnimateTimeX = true;
animateTimeWidth = lastTimeWidth;
animateFromTimeX = lastTimeX;
animateFromTimeXViews = lastTimeXViews;

View File

@ -1047,9 +1047,9 @@ public class DialogCell extends BaseCell {
updateMessageThumbs();
messageNameString = getMessageNameString();
messageString = formatTopicsNames();
String restrictionReason = MessagesController.getRestrictionReason(message.messageOwner.restriction_reason);
buttonString = getMessageStringFormatted(messageFormat, restrictionReason, messageNameString, true);
if (applyName && buttonString.length() >= 0) {
String restrictionReason = message != null ? MessagesController.getRestrictionReason(message.messageOwner.restriction_reason) : null;
buttonString = message != null ? getMessageStringFormatted(messageFormat, restrictionReason, messageNameString, true) : "";
if (applyName && buttonString.length() >= 0 && messageNameString != null) {
SpannableStringBuilder spannableStringBuilder = SpannableStringBuilder.valueOf(buttonString);
spannableStringBuilder.setSpan(new ForegroundColorSpanThemable(Theme.key_chats_name, resourcesProvider), 0, Math.min(spannableStringBuilder.length(), messageNameString.length() + 1), 0);
buttonString = spannableStringBuilder;
@ -2066,10 +2066,10 @@ public class DialogCell extends BaseCell {
}
try {
CharSequence text = layout.getText();
if (text instanceof Spannable) {
FixedWidthSpan[] spans = ((Spannable) text).getSpans(0, text.length(), FixedWidthSpan.class);
if (text instanceof Spanned) {
FixedWidthSpan[] spans = ((Spanned) text).getSpans(0, text.length(), FixedWidthSpan.class);
if (spans != null && spans.length > 0) {
int spanOffset = ((Spannable) text).getSpanStart(spans[0]);
int spanOffset = ((Spanned) text).getSpanStart(spans[0]);
if (spanOffset < 0) {
spanOffset = 0;
}

View File

@ -312,6 +312,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private final static boolean DISABLE_PROGRESS_VIEW = true;
private final static int SKELETON_DISAPPEAR_MS = 200;
private static int SKELETON_LIGHT_OVERLAY_ALPHA = 22;
private static float SKELETON_SATURATION = 1.4f;
public final static int DEBUG_SHARE_ALERT_MODE_NORMAL = 0,
DEBUG_SHARE_ALERT_MODE_LESS = 1,
DEBUG_SHARE_ALERT_MODE_MORE = 2;
@ -682,6 +685,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private int lastSkeletonCount;
private int lastSkeletonMessageCount;
private Paint skeletonPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint skeletonServicePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private ColorMatrix skeletonColorMatrix = new ColorMatrix();
private Theme.MessageDrawable.PathDrawParams skeletonBackgroundCacheParams = new Theme.MessageDrawable.PathDrawParams();
private Theme.MessageDrawable skeletonBackgroundDrawable = new Theme.MessageDrawable(Theme.MessageDrawable.TYPE_TEXT, false, false, this::getThemedColor);
private long skeletonLastUpdateTime;
@ -692,6 +697,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private int skeletonColor0;
private int skeletonColor1;
private Paint skeletonOutlinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Matrix skeletonOutlineMatrix = new Matrix();
private LinearGradient skeletonOutlineGradient;
{
skeletonOutlinePaint.setStyle(Paint.Style.STROKE);
skeletonOutlinePaint.setStrokeWidth(AndroidUtilities.dp(1));
}
private boolean premiumInvoiceBot;
private boolean showScrollToMessageError;
private int startLoadFromMessageId;
@ -1037,7 +1051,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
@Override
public List<FloatingDebugController.DebugItem> onGetDebugItems() {
List<FloatingDebugController.DebugItem> items = new ArrayList<>();
if (currentChat != null && ChatObject.isChannel(currentChat)) {
if (ChatObject.isChannel(currentChat)) {
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugShareAlert)));
String mode;
switch (shareAlertDebugMode) {
default:
@ -1057,6 +1072,33 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugShareAlertTopicsSlowMotion), ()-> shareAlertDebugTopicsSlowMotion = !shareAlertDebugTopicsSlowMotion));
}
if (currentUser == null) {
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugMessageSkeletons)));
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugMessageSkeletonsLightOverlayAlpha), 0, 255, new AnimationProperties.FloatProperty("") {
@Override
public void setValue(Object object, float value) {
SKELETON_LIGHT_OVERLAY_ALPHA = (int) value;
}
@Override
public Object get(Object object) {
return (float) SKELETON_LIGHT_OVERLAY_ALPHA;
}
}));
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugMessageSkeletonsSaturation), 1f, 10f, new AnimationProperties.FloatProperty("") {
@Override
public void setValue(Object object, float value) {
SKELETON_SATURATION = value;
skeletonColorMatrix.setSaturation(value);
skeletonServicePaint.setColorFilter(new ColorMatrixColorFilter(skeletonColorMatrix));
}
@Override
public Object get(Object object) {
return SKELETON_SATURATION;
}
}));
}
return items;
}
@ -4833,7 +4875,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
private boolean isSkeletonVisible() {
if (justCreatedTopic) {
if (justCreatedTopic || currentUser != null || !SharedConfig.animationsEnabled()) {
return false;
}
int childHeight = 0;
@ -4849,10 +4891,26 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
checkDispatchHideSkeletons(fragmentBeginToShow);
}
boolean visible = (!endReached[0] || mergeDialogId != 0 && !endReached[1] || messages.isEmpty()) && loading && maxTop > 0 && (messages.isEmpty() ? animateProgressViewTo : childHeight != 0);
boolean visible = (!endReached[0] || mergeDialogId != 0 && !endReached[1] || messages.isEmpty()) && loading && maxTop > chatListViewPaddingTop && (messages.isEmpty() ? animateProgressViewTo : childHeight != 0);
if (!visible && startMessageAppearTransitionMs == 0) {
checkDispatchHideSkeletons(fragmentBeginToShow);
}
if (SharedConfig.getDevicePerformanceClass() != SharedConfig.PERFORMANCE_CLASS_LOW && !fromPullingDownTransition && !fragmentBeginToShow) {
Drawable wallpaper = themeDelegate.getWallpaperDrawable();
if (fragmentView != null) {
wallpaper = ((SizeNotifierFrameLayout) fragmentView).getBackgroundImage();
}
if (wallpaper instanceof MotionBackgroundDrawable) {
MotionBackgroundDrawable motion = (MotionBackgroundDrawable) wallpaper;
if (((MotionBackgroundDrawable) wallpaper).isIndeterminateAnimation() != visible) {
motion.setIndeterminateAnimation(visible);
motion.setIndeterminateSpeedScale(visible ? 1.5f : 1f);
motion.updateAnimation(true);
} else if (visible) {
motion.updateAnimation(false);
}
}
}
return visible || startMessageAppearTransitionMs != 0 && System.currentTimeMillis() - startMessageAppearTransitionMs <= SKELETON_DISAPPEAR_MS;
}
@ -4882,6 +4940,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
Paint servicePaint = getThemedPaint(Theme.key_paint_chatActionBackground);
if (skeletonServicePaint.getColor() != servicePaint.getColor()) {
skeletonServicePaint.setColor(servicePaint.getColor());
}
if (skeletonServicePaint.getShader() != servicePaint.getShader()) {
skeletonServicePaint.setShader(servicePaint.getShader());
skeletonColorMatrix.setSaturation(SKELETON_SATURATION);
skeletonServicePaint.setColorFilter(new ColorMatrixColorFilter(skeletonColorMatrix));
}
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
@ -4952,10 +5018,22 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
if (isSkeletonVisible()) {
boolean drawService = SharedConfig.getDevicePerformanceClass() != SharedConfig.PERFORMANCE_CLASS_LOW && Theme.hasGradientService();
boolean darkOverlay = ColorUtils.calculateLuminance(getThemedColor(Theme.key_windowBackgroundWhite)) <= 0.7f && Theme.hasGradientService();
boolean blackOverlay = ColorUtils.calculateLuminance(getThemedColor(Theme.key_windowBackgroundWhite)) <= 0.01f && Theme.hasGradientService();
if (drawService) {
Theme.applyServiceShaderMatrix(getMeasuredWidth(), AndroidUtilities.displaySize.y, 0, getY() - contentPanTranslation);
}
int wasDarkenAlpha = Theme.chat_actionBackgroundGradientDarkenPaint.getAlpha();
if (blackOverlay) {
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha((int) (wasDarkenAlpha * 4f));
}
float topSkeletonAlpha = startMessageAppearTransitionMs != 0 ? 1f - (System.currentTimeMillis() - startMessageAppearTransitionMs) / (float) SKELETON_DISAPPEAR_MS : 1f;
int alpha = skeletonPaint.getAlpha();
int wasServiceAlpha = servicePaint.getAlpha();
servicePaint.setAlpha((int) (wasServiceAlpha * 0.4f * topSkeletonAlpha));
int wasServiceAlpha = skeletonServicePaint.getAlpha();
int wasOutlineAlpha = skeletonOutlinePaint.getAlpha();
skeletonServicePaint.setAlpha((int) (0xFF * topSkeletonAlpha));
skeletonPaint.setAlpha((int) (topSkeletonAlpha * alpha));
while (lastTop > blurredViewTopOffset) {
lastTop -= AndroidUtilities.dp(3f);
@ -4982,21 +5060,33 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
int bottom = skeleton.lastBottom;
skeletonBackgroundDrawable.setBounds(noAvatar ? AndroidUtilities.dp(3f) : AndroidUtilities.dp(51), bottom - skeleton.height, skeleton.width, bottom);
Theme.applyServiceShaderMatrix(getMeasuredWidth(), AndroidUtilities.displaySize.y, 0, getY() + skeletonBackgroundDrawable.getBounds().top);
skeletonBackgroundDrawable.drawCached(canvas, skeletonBackgroundCacheParams, servicePaint);
if (drawService) {
skeletonBackgroundDrawable.drawCached(canvas, skeletonBackgroundCacheParams, skeletonServicePaint);
}
skeletonBackgroundDrawable.drawCached(canvas, skeletonBackgroundCacheParams, skeletonPaint);
if (darkOverlay) {
skeletonBackgroundDrawable.drawCached(canvas, skeletonBackgroundCacheParams, Theme.chat_actionBackgroundGradientDarkenPaint);
}
skeletonBackgroundDrawable.drawCached(canvas, skeletonBackgroundCacheParams, skeletonOutlinePaint);
if (!noAvatar) {
Theme.applyServiceShaderMatrix(getMeasuredWidth(), AndroidUtilities.displaySize.y, 0, getY() + bottom - AndroidUtilities.dp(42));
canvas.drawCircle(AndroidUtilities.dp(48 - 21), bottom - AndroidUtilities.dp(21), AndroidUtilities.dp(21), servicePaint);
if (drawService) {
canvas.drawCircle(AndroidUtilities.dp(48 - 21), bottom - AndroidUtilities.dp(21), AndroidUtilities.dp(21), skeletonServicePaint);
}
canvas.drawCircle(AndroidUtilities.dp(48 - 21), bottom - AndroidUtilities.dp(21), AndroidUtilities.dp(21), skeletonPaint);
if (darkOverlay) {
canvas.drawCircle(AndroidUtilities.dp(48 - 21), bottom - AndroidUtilities.dp(21), AndroidUtilities.dp(21), Theme.chat_actionBackgroundGradientDarkenPaint);
}
canvas.drawCircle(AndroidUtilities.dp(48 - 21), bottom - AndroidUtilities.dp(21), AndroidUtilities.dp(21), skeletonOutlinePaint);
}
lastTop -= skeleton.height;
}
servicePaint.setAlpha(wasServiceAlpha);
skeletonServicePaint.setAlpha(wasServiceAlpha);
skeletonPaint.setAlpha(alpha);
skeletonOutlinePaint.setAlpha(wasOutlineAlpha);
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha(wasDarkenAlpha);
invalidated = false;
invalidate();
} else if (System.currentTimeMillis() - startMessageAppearTransitionMs > SKELETON_DISAPPEAR_MS) {
@ -5012,13 +5102,18 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
private void updateSkeletonColors() {
int color0 = ColorUtils.setAlphaComponent(getThemedColor(Theme.key_listSelector), 30);
int color1 = ColorUtils.setAlphaComponent(getThemedColor(Theme.key_listSelector), 20);
boolean dark = ColorUtils.calculateLuminance(getThemedColor(Theme.key_windowBackgroundWhite)) <= 0.7f;
int color0 = ColorUtils.blendARGB(getThemedColor(Theme.key_listSelector), Color.argb(dark ? 0x21 : 0x03, 0xFF, 0xFF, 0xFF), dark ? 0.9f : 0.5f);
int color1 = ColorUtils.setAlphaComponent(getThemedColor(Theme.key_listSelector), dark ? 24 : SKELETON_LIGHT_OVERLAY_ALPHA);
if (skeletonColor1 != color1 || skeletonColor0 != color0) {
skeletonColor0 = color0;
skeletonColor1 = color1;
skeletonGradient = new LinearGradient(0, 0, skeletonGradientWidth = AndroidUtilities.dp(200), 0, new int[]{color1, color0, color0, color1}, new float[]{0.0f, 0.4f, 0.6f, 1f}, Shader.TileMode.CLAMP);
skeletonPaint.setShader(skeletonGradient);
int outlineColor = Color.argb(dark ? 0x2B : 0x60, 0xFF, 0xFF, 0xFF);
skeletonOutlineGradient = new LinearGradient(0, 0, skeletonGradientWidth, 0, new int[]{Color.TRANSPARENT, outlineColor, outlineColor, Color.TRANSPARENT}, new float[]{0.0f, 0.4f, 0.6f, 1f}, Shader.TileMode.CLAMP);
skeletonOutlinePaint.setShader(skeletonOutlineGradient);
}
}
@ -5041,6 +5136,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (skeletonGradient != null) {
skeletonGradient.setLocalMatrix(skeletonMatrix);
}
skeletonOutlineMatrix.setTranslate(skeletonTotalTranslation, 0);
if (skeletonOutlineGradient != null) {
skeletonOutlineGradient.setLocalMatrix(skeletonOutlineMatrix);
}
}
@Override
@ -8907,6 +9006,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return fragmentView;
}
@Override
public INavigationLayout.BackButtonState getBackButtonState() {
return INavigationLayout.BackButtonState.BACK;
}
public void onPageDownClicked() {
wasManualScroll = true;
textSelectionHelper.cancelTextSelectionRunnable();
@ -13018,6 +13122,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
private int getHeightForMessage(MessageObject object) {
if (getParentActivity() == null) {
return 0;
}
if (dummyMessageCell == null) {
dummyMessageCell = new ChatMessageCell(getParentActivity(), true, themeDelegate);
}
@ -22176,7 +22283,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
final ArrayList<Integer> options = new ArrayList<>();
View optionsView = null;
if (!getUserConfig().isPremium() && !getMessagesController().premiumLocked && message.getDocument() != null && message.getDocument().size >= 300 * 1024 * 1024 && FileLoader.getInstance(currentAccount).isLoadingFile(FileLoader.getAttachFileName(message.getDocument()))) {
if (!getUserConfig().isPremium() && !getMessagesController().premiumLocked && message.getDocument() != null && message.getDocument().size >= 150 * 1024 * 1024 && FileLoader.getInstance(currentAccount).isLoadingFile(FileLoader.getAttachFileName(message.getDocument()))) {
items.add(LocaleController.getString(R.string.PremiumSpeedPromo));
options.add(OPTION_SPEED_PROMO);
icons.add(R.drawable.msg_speed);

View File

@ -251,6 +251,9 @@ public class ChatReactionsEditActivity extends BaseFragment implements Notificat
} else {
chatReactions.remove(react.reaction);
if (chatReactions.isEmpty()) {
if (listAdapter != null) {
listAdapter.notifyItemRangeRemoved((isChannel ? 1 : 2), 1 + availableReactions.size());
}
setCheckedEnableReactionCell(SELECT_TYPE_NONE, true);
}
}

View File

@ -1272,10 +1272,10 @@ public class Bulletin {
avatarsImageView = new AvatarsImageView(context, false);
avatarsImageView.setStyle(AvatarsDrawable.STYLE_MESSAGE_SEEN);
avatarsImageView.setAvatarsTextSize(AndroidUtilities.dp(18));
addView(avatarsImageView, LayoutHelper.createFrameRelatively(24 + 12 + 12 + 8, 48, Gravity.START | Gravity.CENTER_VERTICAL, 12, 0, 0, 0));
textView = new LinkSpanDrawable.LinksTextView(context);
textView.setSingleLine();
textView.setTypeface(Typeface.SANS_SERIF);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setEllipsize(TextUtils.TruncateAt.END);

View File

@ -9,6 +9,7 @@ import android.text.style.ClickableSpan;
import android.util.TypedValue;
import android.view.HapticFeedbackConstants;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.CheckResult;
@ -203,10 +204,17 @@ public final class BulletinFactory {
}
}
layout.avatarsImageView.commitTransition(false);
layout.textView.setSingleLine(true);
layout.textView.setLines(1);
layout.textView.setSingleLine(false);
layout.textView.setMaxLines(2);
layout.textView.setText(text);
layout.textView.setTranslationX(-(3 - count) * AndroidUtilities.dp(12));
if (layout.textView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
int margin = AndroidUtilities.dp(12 + 56 + 2 - (3 - count) * 12);
if (LocaleController.isRTL) {
((ViewGroup.MarginLayoutParams) layout.textView.getLayoutParams()).rightMargin = margin;
} else {
((ViewGroup.MarginLayoutParams) layout.textView.getLayoutParams()).leftMargin = margin;
}
}
return create(layout, Bulletin.DURATION_LONG);
}
@ -216,9 +224,9 @@ public final class BulletinFactory {
text = null;
} else if (users.size() == 1) {
if (ChatObject.isChannelAndNotMegaGroup(chat)) {
text = AndroidUtilities.replaceTags(LocaleController.formatString("HasBeenAddedToChannel", R.string.HasBeenAddedToChannel, "**" + UserObject.getUserName(users.get(0)) + "**"));
text = AndroidUtilities.replaceTags(LocaleController.formatString("HasBeenAddedToChannel", R.string.HasBeenAddedToChannel, "**" + UserObject.getFirstName(users.get(0)) + "**"));
} else {
text = AndroidUtilities.replaceTags(LocaleController.formatString("HasBeenAddedToGroup", R.string.HasBeenAddedToGroup, "**" + UserObject.getUserName(users.get(0)) + "**"));
text = AndroidUtilities.replaceTags(LocaleController.formatString("HasBeenAddedToGroup", R.string.HasBeenAddedToGroup, "**" + UserObject.getFirstName(users.get(0)) + "**"));
}
} else {
if (ChatObject.isChannelAndNotMegaGroup(chat)) {

View File

@ -930,6 +930,9 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N
@Override
public void dismiss() {
super.dismiss();
if (customEmojiPacks != null) {
customEmojiPacks.recycle();
}
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 4);
}

View File

@ -5,6 +5,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import org.telegram.messenger.SharedConfig;
import org.telegram.ui.Components.AnimationProperties;
import org.telegram.ui.LaunchActivity;
public class FloatingDebugController {
@ -54,16 +55,34 @@ public class FloatingDebugController {
public static class DebugItem {
final CharSequence title;
final DebugItemType type;
final Runnable action;
Runnable action;
float from;
float to;
AnimationProperties.FloatProperty floatProperty;
public DebugItem(CharSequence title, Runnable action) {
this.type = DebugItemType.SIMPLE;
this.title = title;
this.action = action;
}
public DebugItem(CharSequence title) {
this.type = DebugItemType.HEADER;
this.title = title;
}
public DebugItem(CharSequence title, float from, float to, AnimationProperties.FloatProperty callback) {
this.type = DebugItemType.SEEKBAR;
this.title = title;
this.from = from;
this.to = to;
this.floatProperty = callback;
}
}
public enum DebugItemType {
SIMPLE
SIMPLE,
HEADER,
SEEKBAR
}
}

View File

@ -7,10 +7,13 @@ import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.TextPaint;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.GestureDetector;
@ -21,6 +24,7 @@ import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
@ -38,6 +42,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
@ -45,13 +50,17 @@ import org.telegram.messenger.SharedConfig;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.INavigationLayout;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Components.AnimationProperties;
import org.telegram.ui.Components.CombinedDrawable;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RecyclerListView;
import org.telegram.ui.Components.SeekBarView;
import org.telegram.ui.LaunchActivity;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class FloatingDebugView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate {
private FrameLayout floatingButtonContainer;
@ -225,10 +234,16 @@ public class FloatingDebugView extends FrameLayout implements NotificationCenter
switch (FloatingDebugController.DebugItemType.values()[viewType]) {
default:
case SIMPLE:
v = new AlertDialog.AlertDialogCell(context, null);
v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
break;
v = new AlertDialog.AlertDialogCell(context, null);
break;
case HEADER:
v = new HeaderCell(context);
break;
case SEEKBAR:
v = new SeekBarCell(context);
break;
}
v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return new RecyclerListView.Holder(v);
}
@ -236,11 +251,28 @@ public class FloatingDebugView extends FrameLayout implements NotificationCenter
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
FloatingDebugController.DebugItem item = debugItems.get(position);
switch (item.type) {
case SIMPLE:
case SIMPLE: {
AlertDialog.AlertDialogCell cell = (AlertDialog.AlertDialogCell) holder.itemView;
cell.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
cell.setTextAndIcon(item.title, 0);
break;
}
case HEADER: {
HeaderCell cell = (HeaderCell) holder.itemView;
cell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader));
cell.setText(item.title);
break;
}
case SEEKBAR: {
SeekBarCell cell = (SeekBarCell) holder.itemView;
cell.title = item.title.toString();
cell.value = (float) item.floatProperty.get(null);
cell.min = item.from;
cell.max = item.to;
cell.callback = item.floatProperty;
cell.invalidate();
break;
}
}
}
@ -450,6 +482,7 @@ public class FloatingDebugView extends FrameLayout implements NotificationCenter
private List<FloatingDebugController.DebugItem> getBuiltInDebugItems() {
List<FloatingDebugController.DebugItem> items = new ArrayList<>();
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugGeneral)));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(SharedConfig.debugWebView ? R.string.DebugMenuDisableWebViewDebug : R.string.DebugMenuEnableWebViewDebug), ()->{
SharedConfig.toggleDebugWebView();
@ -463,6 +496,37 @@ public class FloatingDebugView extends FrameLayout implements NotificationCenter
((Activity) getContext()).recreate();
}
}));
items.add(new FloatingDebugController.DebugItem(Theme.isCurrentThemeDark() ? "Switch to day theme" : "Switch to dark theme", () -> {
boolean toDark;
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE);
String dayThemeName = preferences.getString("lastDayTheme", "Blue");
if (Theme.getTheme(dayThemeName) == null || Theme.getTheme(dayThemeName).isDark()) {
dayThemeName = "Blue";
}
String nightThemeName = preferences.getString("lastDarkTheme", "Dark Blue");
if (Theme.getTheme(nightThemeName) == null || !Theme.getTheme(nightThemeName).isDark()) {
nightThemeName = "Dark Blue";
}
Theme.ThemeInfo themeInfo = Theme.getActiveTheme();
if (dayThemeName.equals(nightThemeName)) {
if (themeInfo.isDark() || dayThemeName.equals("Dark Blue") || dayThemeName.equals("Night")) {
dayThemeName = "Blue";
} else {
nightThemeName = "Dark Blue";
}
}
if (!Theme.isCurrentThemeDark()) {
themeInfo = Theme.getTheme(nightThemeName);
} else {
themeInfo = Theme.getTheme(dayThemeName);
}
Theme.ThemeInfo finalThemeInfo = themeInfo;
AndroidUtilities.runOnUIThread(() -> {
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, finalThemeInfo, true, null, -1);
}, 200);
}));
return items;
}
@ -511,4 +575,87 @@ public class FloatingDebugView extends FrameLayout implements NotificationCenter
public void dismiss(Runnable callback) {
callback.run();
}
@SuppressWarnings("unchecked")
private class SeekBarCell extends FrameLayout {
private SeekBarView seekBar;
private float min;
private float max;
private float value;
private AnimationProperties.FloatProperty callback;
private String title;
private TextPaint textPaint;
private int lastWidth;
public SeekBarCell(Context context) {
super(context);
setWillNotDraw(false);
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(AndroidUtilities.dp(16));
seekBar = new SeekBarView(context);
seekBar.setReportChanges(true);
seekBar.setDelegate(new SeekBarView.SeekBarViewDelegate() {
@Override
public void onSeekBarDrag(boolean stop, float progress) {
value = min + (max - min) * progress;
if (stop) {
callback.set(null, value);
}
invalidate();
}
@Override
public void onSeekBarPressed(boolean pressed) {}
@Override
public CharSequence getContentDescription() {
return String.valueOf(Math.round(min + (max - min) * seekBar.getProgress()));
}
});
seekBar.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
addView(seekBar, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.LEFT | Gravity.BOTTOM, 5, 5 + 24, 47, 0));
}
@Override
protected void onDraw(Canvas canvas) {
textPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
canvas.drawText(title, AndroidUtilities.dp(24), AndroidUtilities.dp(24), textPaint);
textPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteValueText));
String str = String.format(Locale.ROOT, "%.2f", value);
canvas.drawText(str, getMeasuredWidth() - AndroidUtilities.dp(8) - textPaint.measureText(str), AndroidUtilities.dp(28 - 5) + seekBar.getY(), textPaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
if (lastWidth != width) {
seekBar.setProgress(((float) callback.get(null) - min) / (float) (max - min));
lastWidth = width;
}
}
@Override
public void invalidate() {
super.invalidate();
seekBar.invalidate();
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
seekBar.getSeekBarAccessibilityDelegate().onInitializeAccessibilityNodeInfoInternal(this, info);
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
return super.performAccessibilityAction(action, arguments) || seekBar.getSeekBarAccessibilityDelegate().performAccessibilityActionInternal(this, action, arguments);
}
}
}

View File

@ -110,6 +110,7 @@ public class MotionBackgroundDrawable extends Drawable {
private ColorFilter legacyBitmapColorFilter;
private int legacyBitmapColor;
private float indeterminateSpeedScale = 1f;
private boolean isIndeterminateAnimation;
private Paint overrideBitmapPaint;
@ -861,7 +862,7 @@ public class MotionBackgroundDrawable extends Drawable {
float progress;
boolean isNeedGenerateGradient = postInvalidateParent || rotatingPreview;
if (isIndeterminateAnimation) {
posAnimationProgress += dt / 12000f;
posAnimationProgress += (dt / 12000f) * indeterminateSpeedScale;
if (posAnimationProgress >= 1.0f) {
posAnimationProgress = 0.0f;
}
@ -1007,6 +1008,18 @@ public class MotionBackgroundDrawable extends Drawable {
return colors[0] == colors[1] && colors[0] == colors[2] && colors[0] == colors[3];
}
public float getIndeterminateSpeedScale() {
return indeterminateSpeedScale;
}
public void setIndeterminateSpeedScale(float indeterminateSpeedScale) {
this.indeterminateSpeedScale = indeterminateSpeedScale;
}
public boolean isIndeterminateAnimation() {
return isIndeterminateAnimation;
}
public void setIndeterminateAnimation(boolean isIndeterminateAnimation) {
this.isIndeterminateAnimation = isIndeterminateAnimation;
}

View File

@ -69,8 +69,8 @@ public class VideoScreenPreview extends FrameLayout implements PagerHeaderView,
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(ApplicationLoader.applicationContext, Uri.fromFile(file));
int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
int width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
int height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
retriever.release();
aspectRatio = width / (float) height;
} else {

View File

@ -48,10 +48,15 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
public boolean skipFrameUpdate;
public static native long create(String src, String json, int w, int h, int[] params, boolean precache, int[] colorReplacement, boolean limitFps, int fitzModifier);
protected static native long createWithJson(String json, String name, int[] params, int[] colorReplacement);
public static native void destroy(long ptr);
private static native void setLayerColor(long ptr, String layer, int color);
private static native void replaceColors(long ptr, int[] colorReplacement);
public static native int getFrame(long ptr, int frame, Bitmap bitmap, int w, int h, int stride, boolean clear);
protected final int width;
@ -177,9 +182,13 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
}
BitmapsCache.incrementTaskCounter();
lottieCacheGenerateQueue.postRunnable(cacheGenerateTask = () -> {
BitmapsCache bitmapsCacheFinal = bitmapsCache;
if (bitmapsCacheFinal != null) {
bitmapsCacheFinal.createCache();
try {
BitmapsCache bitmapsCacheFinal = bitmapsCache;
if (bitmapsCacheFinal != null) {
bitmapsCacheFinal.createCache();
}
} catch (Throwable throwable) {
}
uiHandler.post(uiRunnableCacheFinished);
});
@ -267,6 +276,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
private boolean genCacheSend;
protected Runnable loadFrameRunnable = new Runnable() {
private long lastUpdate = 0;
@Override
public void run() {
if (isRecycled) {
@ -717,7 +727,6 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
return;
}
parentViews.add(parent);
checkCacheCancel();
}
public void removeParentView(ImageReceiver parent) {
@ -729,6 +738,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
}
private Runnable cancelCache;
public void checkCacheCancel() {
if (bitmapsCache == null || lottieCacheGenerateQueue == null || cacheGenerateTask == null) {
return;
@ -739,17 +749,14 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
} else {
mustCancel = mustCancel && masterParent == null;
}
if (mustCancel && cancelCache == null) {
AndroidUtilities.runOnUIThread(cancelCache = () -> {
if (mustCancel) {
if (cacheGenerateTask != null) {
lottieCacheGenerateQueue.cancelRunnable(cacheGenerateTask);
if (bitmapsCache != null) {
bitmapsCache.cancelCreate();
}
BitmapsCache.decrementTaskCounter();
}, 600);
} else if (!mustCancel && cancelCache != null) {
AndroidUtilities.cancelRunOnUIThread(cancelCache);
cancelCache = null;
cacheGenerateTask = null;
}
generatingCache = false;
genCacheSend = false;
}
}
@ -1315,33 +1322,30 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma
AndroidUtilities.runOnUIThread(onReady);
return;
}
loadFrameRunnableQueue.execute(() -> {
if (bitmapsCache.cacheExist()) {
AndroidUtilities.runOnUIThread(onReady);
} else {
AndroidUtilities.runOnUIThread(() -> {
generatingCache = true;
if (lottieCacheGenerateQueue == null) {
createCacheGenQueue();
generatingCache = true;
if (lottieCacheGenerateQueue == null) {
createCacheGenQueue();
}
if (cacheGenerateTask == null) {
BitmapsCache.incrementTaskCounter();
lottieCacheGenerateQueue.postRunnable(cacheGenerateTask = () -> {
try {
BitmapsCache bitmapsCacheFinal = bitmapsCache;
if (bitmapsCacheFinal != null) {
bitmapsCacheFinal.createCache();
}
if (cacheGenerateTask == null) {
BitmapsCache.incrementTaskCounter();
lottieCacheGenerateQueue.postRunnable(cacheGenerateTask = () -> {
BitmapsCache bitmapsCacheFinal = bitmapsCache;
if (bitmapsCacheFinal != null) {
bitmapsCacheFinal.createCache();
}
AndroidUtilities.runOnUIThread(() -> {
onReady.run();
if (cacheGenerateTask != null) {
cacheGenerateTask = null;
BitmapsCache.decrementTaskCounter();
}
});
});
} catch (Throwable e) {
FileLog.e(e);
}
AndroidUtilities.runOnUIThread(() -> {
onReady.run();
if (cacheGenerateTask != null) {
cacheGenerateTask = null;
BitmapsCache.decrementTaskCounter();
}
});
}
});
});
}
}
}

View File

@ -386,9 +386,10 @@ public class ReactedUsersListView extends FrameLayout {
titleView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem));
titleView.setEllipsizeByGradient(true);
titleView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
titleView.setWidthWrapContent(true);
titleView.setPadding(0, AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12));
addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 58, 0, 36 + 6, 0));
titleView.setRightPadding(AndroidUtilities.dp(30));
titleView.setTranslationX(LocaleController.isRTL ? AndroidUtilities.dp(30) : 0);
addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.FILL_HORIZONTAL | Gravity.CENTER_VERTICAL, 58, 0, 12, 0));
reactView = new BackupImageView(context);
addView(reactView, LayoutHelper.createFrameRelatively(24, 24, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0));
@ -411,6 +412,7 @@ public class ReactedUsersListView extends FrameLayout {
}
avatarView.setImage(ImageLocation.getForUser(u, ImageLocation.TYPE_SMALL), "50_50", thumb, u);
boolean hasReactImage = false;
if (reaction.reaction != null) {
ReactionsLayoutInBubble.VisibleReaction visibleReaction = ReactionsLayoutInBubble.VisibleReaction.fromTLReaction(reaction.reaction);
if (visibleReaction.emojicon != null) {
@ -418,17 +420,21 @@ public class ReactedUsersListView extends FrameLayout {
if (r != null) {
SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(r.static_icon.thumbs, Theme.key_windowBackgroundGray, 1.0f);
reactView.setImage(ImageLocation.getForDocument(r.center_icon), "40_40_lastframe", "webp", svgThumb, r);
hasReactImage = true;
} else {
reactView.setImageDrawable(null);
}
} else {
reactView.setAnimatedEmojiDrawable(new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, currentAccount, visibleReaction.documentId));
hasReactImage = true;
}
setContentDescription(LocaleController.formatString("AccDescrReactedWith", R.string.AccDescrReactedWith, UserObject.getUserName(u), reaction.reaction));
} else {
reactView.setImageDrawable(null);
setContentDescription(LocaleController.formatString("AccDescrPersonHasSeen", R.string.AccDescrPersonHasSeen, UserObject.getUserName(u)));
}
titleView.setRightPadding(AndroidUtilities.dp(hasReactImage ? 30 : 0));
titleView.setTranslationX(hasReactImage && LocaleController.isRTL ? AndroidUtilities.dp(30) : 0);
}
@Override

View File

@ -66,6 +66,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
@SuppressWarnings("JavaReflectionMemberAccess")
public class RecyclerListView extends RecyclerView {
public final static int SECTIONS_TYPE_SIMPLE = 0,
SECTIONS_TYPE_STICKY_HEADERS = 1,
@ -181,6 +182,18 @@ public class RecyclerListView extends RecyclerView {
private boolean accessibilityEnabled = true;
private final static Method initializeScrollbars;
static {
Method notSoFinalInitializeScrollbars;
try {
notSoFinalInitializeScrollbars = android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class);
} catch (Exception ignored) {
notSoFinalInitializeScrollbars = null;
}
initializeScrollbars = notSoFinalInitializeScrollbars;
}
private AccessibilityDelegate accessibilityDelegate = new AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
@ -1367,10 +1380,9 @@ public class RecyclerListView extends RecyclerView {
gotAttributes = true;
}
TypedArray a = context.getTheme().obtainStyledAttributes(attributes);
@SuppressLint("DiscouragedPrivateApi")
Method initializeScrollbars = android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class);
initializeScrollbars.invoke(this, a);
a.recycle();
if (initializeScrollbars != null) {
initializeScrollbars.invoke(this, a);
}
} catch (Throwable e) {
FileLog.e(e);
}

View File

@ -434,7 +434,7 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie
return false;
}
for (MessageObject obj : selectedFiles.values()) {
if (obj.getDocument() != null && obj.getDocument().size >= 300 * 1024 * 1024) {
if (obj.getDocument() != null && obj.getDocument().size >= 150 * 1024 * 1024) {
return true;
}
}

View File

@ -839,12 +839,23 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter
for (int i = 0 ; i < sharedMediaData.length; i++) {
allMessages.addAll(sharedMediaData[i].messages);
}
Utilities.globalQueue.postRunnable(new Runnable() {
@Override
public void run() {
FileLoader.getInstance(account).checkMediaExistance(allMessages);
}
});
String fileName = (String) args[0];
if (fileName != null) {
Utilities.globalQueue.postRunnable(new Runnable() {
@Override
public void run() {
for (int i = 0; i < allMessages.size(); i++) {
if (!fileName.equals(allMessages.get(i).getFileName())) {
allMessages.remove(i);
i--;
}
}
if (allMessages.size() > 0) {
FileLoader.getInstance(account).checkMediaExistance(allMessages);
}
}
});
}
}
}

View File

@ -32,7 +32,6 @@ import org.telegram.messenger.Emoji;
import org.telegram.messenger.MediaDataController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.SharedConfig;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
@ -133,12 +132,6 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter.
}
});
this.leftGradient = getResources().getDrawable(R.drawable.gradient_right).mutate();
this.leftGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
this.rightGradient = getResources().getDrawable(R.drawable.gradient_left).mutate();
this.rightGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS);
}
@ -154,8 +147,8 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter.
if (backgroundPaint != null) {
backgroundPaint.setColor(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider));
}
this.leftGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
this.rightGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
Theme.chat_gradientLeftDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
Theme.chat_gradientRightDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY));
}
public void forceClose() {
@ -423,7 +416,6 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter.
private AnimatedFloat showFloat2 = new AnimatedFloat(containerView, 150, 600, CubicBezierInterpolator.EASE_OUT_QUINT);
private OvershootInterpolator overshootInterpolator = new OvershootInterpolator(.4f);
private Drawable leftGradient, rightGradient;
private AnimatedFloat leftGradientAlpha = new AnimatedFloat(containerView, 300, CubicBezierInterpolator.EASE_OUT_QUINT);
private AnimatedFloat rightGradientAlpha = new AnimatedFloat(containerView, 300, CubicBezierInterpolator.EASE_OUT_QUINT);
@ -549,16 +541,16 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter.
float leftAlpha = leftGradientAlpha.set(listView.canScrollHorizontally(-1) ? 1f : 0f);
if (leftAlpha > 0) {
leftGradient.setBounds((int) left, (int) top, (int) left + AndroidUtilities.dp(32), (int) bottom);
leftGradient.setAlpha((int) (255 * leftAlpha));
leftGradient.draw(canvas);
Theme.chat_gradientLeftDrawable.setBounds((int) left, (int) top, (int) left + AndroidUtilities.dp(32), (int) bottom);
Theme.chat_gradientLeftDrawable.setAlpha((int) (255 * leftAlpha));
Theme.chat_gradientLeftDrawable.draw(canvas);
}
float rightAlpha = rightGradientAlpha.set(listView.canScrollHorizontally(1) ? 1f : 0f);
if (rightAlpha > 0) {
rightGradient.setBounds((int) right - AndroidUtilities.dp(32), (int) top, (int) right, (int) bottom);
rightGradient.setAlpha((int) (255 * rightAlpha));
rightGradient.draw(canvas);
Theme.chat_gradientRightDrawable.setBounds((int) right - AndroidUtilities.dp(32), (int) top, (int) right, (int) bottom);
Theme.chat_gradientRightDrawable.setAlpha((int) (255 * rightAlpha));
Theme.chat_gradientRightDrawable.draw(canvas);
}
canvas.restore();

View File

@ -46,6 +46,8 @@ public class UnreadCounterTextView extends View {
int counterColor;
CharSequence lastText;
String textColorKey = Theme.key_chat_fieldOverlayText;
public UnreadCounterTextView(Context context) {
super(context);
textPaint.setTextSize(AndroidUtilities.dp(13));
@ -202,7 +204,7 @@ public class UnreadCounterTextView extends View {
@Override
protected void onDraw(Canvas canvas) {
Layout layout = textLayout;
int color = Theme.getColor(isEnabled() ? Theme.key_chat_fieldOverlayText : Theme.key_windowBackgroundWhiteGrayText, getResourceProvider());
int color = Theme.getColor(isEnabled() ? textColorKey : Theme.key_windowBackgroundWhiteGrayText, getResourceProvider());
if (textColor != color) {
layoutPaint.setColor(textColor = color);
}
@ -218,8 +220,8 @@ public class UnreadCounterTextView extends View {
if (getParent() != null) {
int contentWidth = getMeasuredWidth();
int x = (getMeasuredWidth() - contentWidth) / 2;
if (rippleColor != Theme.getColor(Theme.key_chat_fieldOverlayText, getResourceProvider()) || selectableBackground == null) {
selectableBackground = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(60), 0, ColorUtils.setAlphaComponent(rippleColor = Theme.getColor(Theme.key_chat_fieldOverlayText, getResourceProvider()), 26));
if (rippleColor != Theme.getColor(textColorKey, getResourceProvider()) || selectableBackground == null) {
selectableBackground = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(60), 0, ColorUtils.setAlphaComponent(rippleColor = Theme.getColor(textColorKey, getResourceProvider()), 26));
selectableBackground.setCallback(this);
}
int start = (getLeft() + x) <= 0 ? x - AndroidUtilities.dp(20) : x;
@ -298,4 +300,9 @@ public class UnreadCounterTextView extends View {
}
}
}
public void setTextColorKey(String textColorKey) {
this.textColorKey = textColorKey;
invalidate();
}
}

View File

@ -2208,6 +2208,32 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
updateProxyButton(false, false);
}
searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true, true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
boolean isSpeedItemCreated = false;
@Override
public void onPreToggleSearch() {
if (!isSpeedItemCreated) {
isSpeedItemCreated = true;
FrameLayout searchContainer = (FrameLayout) searchItem.getSearchClearButton().getParent();
speedItem = new ActionBarMenuItem(context, menu, Theme.getColor(Theme.key_actionBarActionModeDefaultSelector), Theme.getColor(Theme.key_actionBarActionModeDefaultIcon));
speedItem.setIcon(R.drawable.avd_speed);
speedItem.getIconView().setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon), PorterDuff.Mode.SRC_IN));
speedItem.setTranslationX(AndroidUtilities.dp(32));
speedItem.setAlpha(0f);
speedItem.setOnClickListener(v -> showDialog(new PremiumFeatureBottomSheet(DialogsActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_DOWNLOAD_SPEED, true)));
speedItem.setClickable(false);
speedItem.setFixBackground(true);
FrameLayout.LayoutParams speedParams = new FrameLayout.LayoutParams(AndroidUtilities.dp(42), ViewGroup.LayoutParams.MATCH_PARENT);
speedParams.leftMargin = speedParams.rightMargin = AndroidUtilities.dp(14 + 24);
speedParams.gravity = Gravity.RIGHT;
searchContainer.addView(speedItem, speedParams);
searchItem.setSearchAdditionalButton(speedItem);
updateSpeedItem(searchViewPager.getCurrentPosition() == 2);
}
}
@Override
public void onSearchExpand() {
searching = true;
@ -2313,20 +2339,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
return !actionBar.isActionModeShowed() && databaseMigrationHint == null;
}
});
FrameLayout searchContainer = (FrameLayout) searchItem.getSearchClearButton().getParent();
speedItem = new ActionBarMenuItem(context, menu, Theme.getColor(Theme.key_actionBarActionModeDefaultSelector), Theme.getColor(Theme.key_actionBarActionModeDefaultIcon));
speedItem.setIcon(R.drawable.avd_speed);
speedItem.getIconView().setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon), PorterDuff.Mode.SRC_IN));
speedItem.setTranslationX(AndroidUtilities.dp(32));
speedItem.setAlpha(0f);
speedItem.setOnClickListener(v -> showDialog(new PremiumFeatureBottomSheet(this, PremiumPreviewFragment.PREMIUM_FEATURE_DOWNLOAD_SPEED, true)));
speedItem.setClickable(false);
speedItem.setFixBackground(true);
FrameLayout.LayoutParams speedParams = new FrameLayout.LayoutParams(AndroidUtilities.dp(42), ViewGroup.LayoutParams.MATCH_PARENT);
speedParams.leftMargin = speedParams.rightMargin = AndroidUtilities.dp(14 + 24);
speedParams.gravity = Gravity.RIGHT;
searchContainer.addView(speedItem, speedParams);
searchItem.setSearchAdditionalButton(speedItem);
if (initialDialogsType == 2 || initialDialogsType == DIALOGS_TYPE_START_ATTACH_BOT) {
searchItem.setVisibility(View.GONE);
@ -4308,15 +4320,19 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
}
public void updateSpeedItem(boolean visibleByPosition) {
if (speedItem == null) {
return;
}
boolean visibleByDownload = false;
for (MessageObject obj : getDownloadController().downloadingFiles) {
if (obj.getDocument() != null && obj.getDocument().size >= 300 * 1024 * 1024) {
if (obj.getDocument() != null && obj.getDocument().size >= 150 * 1024 * 1024) {
visibleByDownload = true;
break;
}
}
for (MessageObject obj : getDownloadController().recentDownloadingFiles) {
if (obj.getDocument() != null && obj.getDocument().size >= 300 * 1024 * 1024) {
if (obj.getDocument() != null && obj.getDocument().size >= 150 * 1024 * 1024) {
visibleByDownload = true;
break;
}
@ -8851,6 +8867,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundBlue));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundPink));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundSaved));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundRed));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Orange));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Violet));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Green));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Cyan));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Blue));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Pink));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_background2Saved));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundArchived));
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundArchivedHidden));
@ -9237,6 +9261,11 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
}
}
@Override
public INavigationLayout.BackButtonState getBackButtonState() {
return INavigationLayout.BackButtonState.MENU;
}
@Override
public void setProgressToDrawerOpened(float progress) {
if (SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW || isSlideBackTransition) {
@ -9290,6 +9319,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
@Override
public List<FloatingDebugController.DebugItem> onGetDebugItems() {
return Arrays.asList(
new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugDialogsActivity)),
new FloatingDebugController.DebugItem(LocaleController.getString(R.string.ClearLocalDatabase), () -> {
getMessagesStorage().clearLocalDatabase();
Toast.makeText(getContext(), LocaleController.getString(R.string.DebugClearLocalDatabaseSuccess), Toast.LENGTH_SHORT).show();

View File

@ -135,7 +135,7 @@ public class DownloadProgressIcon extends View implements NotificationCenter.Not
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
detachCurrentListeners();
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.onDownloadingFilesChanged);
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.onDownloadingFilesChanged);
downloadImageReceiver.onDetachedFromWindow();
downloadCompleteImageReceiver.onDetachedFromWindow();
}

View File

@ -55,6 +55,7 @@ import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.BottomSheet;
import org.telegram.ui.ActionBar.DrawerLayoutContainer;
import org.telegram.ui.ActionBar.INavigationLayout;
import org.telegram.ui.ActionBar.MenuDrawable;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Cells.CheckBoxCell;
@ -72,6 +73,7 @@ import java.util.Locale;
public class LNavigation extends FrameLayout implements INavigationLayout, FloatingDebugProvider {
private final static boolean ALLOW_OPEN_STIFFNESS_CONTROL = false;
private final static boolean USE_ACTIONBAR_CROSSFADE = false;
private static float SPRING_STIFFNESS = 1000f;
private static float SPRING_DAMPING_RATIO = 1f;
private final static float SPRING_STIFFNESS_PREVIEW = 650f;
@ -225,6 +227,11 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
*/
private Paint blurPaint = new Paint(Paint.DITHER_FLAG | Paint.ANTI_ALIAS_FLAG);
/**
* Back button drawable
*/
private MenuDrawable menuDrawable = new MenuDrawable(MenuDrawable.TYPE_DEFAULT);
/**
* View that captured current touch input
*/
@ -299,6 +306,8 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
dimmPaint.setColor(0x7a000000);
setWillNotDraw(false);
menuDrawable.setRoundCap();
int touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
gestureDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener() {
@Override
@ -360,6 +369,8 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
getChildAt(i).dispatchTouchEvent(e);
}
e.recycle();
invalidateActionBars();
} else {
isSwipeDisallowed = true;
}
@ -488,9 +499,6 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
}
fragment.onTransitionAnimationStart(true, true);
if (bgFragment != null) {
bgFragment.onTransitionAnimationStart(false, true);
}
FloatValueHolder valueHolder = new FloatValueHolder(swipeProgress * SPRING_MULTIPLIER);
currentSpringAnimation = new SpringAnimation(valueHolder)
@ -501,16 +509,10 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
swipeProgress = value / SPRING_MULTIPLIER;
invalidateTranslation();
fragment.onTransitionAnimationProgress(true, 1f - swipeProgress);
if (bgFragment != null) {
bgFragment.onTransitionAnimationProgress(false, 1f - swipeProgress);
}
});
Runnable onEnd = ()->{
fragment.onTransitionAnimationEnd(true, true);
fragment.prepareFragmentToSlide(true, false);
if (bgFragment != null) {
bgFragment.onTransitionAnimationEnd(false, true);
}
swipeProgress = 0f;
invalidateTranslation();
@ -526,6 +528,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
}
currentSpringAnimation = null;
invalidateActionBars();
};
currentSpringAnimation.addEndListener((animation, canceled, value, velocity) -> {
if (animation == currentSpringAnimation) {
@ -539,6 +542,15 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
}
}
private void invalidateActionBars() {
if (getLastFragment() != null && getLastFragment().getActionBar() != null) {
getLastFragment().getActionBar().invalidate();
}
if (getBackgroundFragment() != null && getBackgroundFragment().getActionBar() != null) {
getBackgroundFragment().getActionBar().invalidate();
}
}
private boolean processTouchEvent(MotionEvent ev) {
int act = ev.getActionMasked();
if (isTransitionAnimationInProgress()) {
@ -688,6 +700,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
if (params.removeLast && prevFragment != null) {
removeFragmentFromStack(prevFragment);
}
invalidateActionBars();
};
if (animate) {
if (!params.isFromDelay) {
@ -754,9 +767,6 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
}
fragment.onTransitionAnimationStart(true, false);
if (prevFragment != null) {
prevFragment.onTransitionAnimationStart(false, true);
}
customAnimation = fragment.onCustomTransitionAnimation(true, ()-> {
customAnimation = null;
@ -770,7 +780,6 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
fragment.onBecomeFullyVisible();
if (prevFragment != null) {
prevFragment.onTransitionAnimationEnd(false, true);
prevFragment.onBecomeFullyHidden();
}
onFragmentOpened.run();
@ -781,6 +790,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
return true;
}
invalidateActionBars();
FloatValueHolder valueHolder = new FloatValueHolder(SPRING_MULTIPLIER);
currentSpringAnimation = new SpringAnimation(valueHolder)
.setSpring(new SpringForce(0f)
@ -803,7 +813,6 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
fragment.onBecomeFullyVisible();
if (prevFragment != null) {
prevFragment.onTransitionAnimationEnd(false, true);
prevFragment.onBecomeFullyHidden();
prevFragment.setPaused(true);
}
@ -904,6 +913,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
observeDebugItemsFromView(items, fragment.getFragmentView());
}
if (ALLOW_OPEN_STIFFNESS_CONTROL) {
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugAltNavigation)));
items.add(new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugAltNavigationToggleControls), () -> getStiffnessControl().setVisibility(getStiffnessControl().getVisibility() == VISIBLE ? GONE : VISIBLE)));
}
return items;
@ -1201,6 +1211,12 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
this.delegate = delegate;
}
@Override
public boolean isActionBarInCrossfade() {
boolean crossfadeNoFragments = USE_ACTIONBAR_CROSSFADE && !isInPreviewMode() && (isSwipeInProgress() || isTransitionAnimationInProgress()) && customAnimation == null;
return crossfadeNoFragments && getLastFragment() != null && getLastFragment().isActionBarCrossfadeEnabled() && getBackgroundFragment() != null && getBackgroundFragment().isActionBarCrossfadeEnabled();
}
@Override
public void draw(Canvas canvas) {
if (useAlphaAnimations) {
@ -1238,6 +1254,64 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
canvas.drawBitmap(previewFragmentSnapshot, 0, 0, blurPaint);
canvas.restore();
}
if (isActionBarInCrossfade()) {
BaseFragment foregroundFragment = getLastFragment();
BaseFragment backgroundFragment = getBackgroundFragment();
ActionBar fgActionBar = foregroundFragment.getActionBar();
ActionBar bgActionBar = backgroundFragment.getActionBar();
boolean useBackDrawable = false;
boolean backDrawableReverse = false;
Float backDrawableForcedProgress = null;
if (backgroundFragment.getBackButtonState() == BackButtonState.MENU && foregroundFragment.getBackButtonState() == BackButtonState.BACK) {
useBackDrawable = true;
backDrawableReverse = false;
} else if (backgroundFragment.getBackButtonState() == BackButtonState.BACK && foregroundFragment.getBackButtonState() == BackButtonState.MENU) {
useBackDrawable = true;
backDrawableReverse = true;
} else if (backgroundFragment.getBackButtonState() == BackButtonState.BACK && foregroundFragment.getBackButtonState() == BackButtonState.BACK) {
useBackDrawable = true;
backDrawableForcedProgress = 0f;
} else if (backgroundFragment.getBackButtonState() == BackButtonState.MENU && foregroundFragment.getBackButtonState() == BackButtonState.MENU) {
useBackDrawable = true;
backDrawableForcedProgress = 1f;
}
AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getHeight());
canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (swipeProgress * 0xFF), Canvas.ALL_SAVE_FLAG);
bgActionBar.onDrawCrossfadeBackground(canvas);
canvas.restore();
canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) ((1 - swipeProgress) * 0xFF), Canvas.ALL_SAVE_FLAG);
fgActionBar.onDrawCrossfadeBackground(canvas);
canvas.restore();
if (useBackDrawable) {
AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getHeight());
float progress = backDrawableForcedProgress != null ? backDrawableForcedProgress : swipeProgress;
float bgAlpha = 1f - (bgActionBar.getY() / -(bgActionBar.getHeight() - AndroidUtilities.statusBarHeight));
float fgAlpha = 1f - (fgActionBar.getY() / -(fgActionBar.getHeight() - AndroidUtilities.statusBarHeight));
canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (AndroidUtilities.lerp(bgAlpha, fgAlpha, 1f - swipeProgress) * 0xFF), Canvas.ALL_SAVE_FLAG);
canvas.translate(AndroidUtilities.dp(16) - AndroidUtilities.dp(2) * (1f - progress), AndroidUtilities.dp(16) + (fgActionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0));
menuDrawable.setRotation(backDrawableReverse ? progress : 1f - progress, false);
menuDrawable.draw(canvas);
canvas.restore();
}
AndroidUtilities.rectTmp.set(0, AndroidUtilities.statusBarHeight, getWidth(), bgActionBar.getHeight());
canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (swipeProgress * 0xFF), Canvas.ALL_SAVE_FLAG);
canvas.translate(0, bgActionBar.getY());
bgActionBar.onDrawCrossfadeContent(canvas, false, useBackDrawable, swipeProgress);
canvas.restore();
canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) ((1 - swipeProgress) * 0xFF), Canvas.ALL_SAVE_FLAG);
canvas.translate(0, fgActionBar.getY());
fgActionBar.onDrawCrossfadeContent(canvas, true, useBackDrawable, swipeProgress);
canvas.restore();
}
}
@Override
@ -1283,12 +1357,10 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
lastFragment.onTransitionAnimationStart(false, true);
if (newLastFragment != null) {
newLastFragment.setPaused(false);
newLastFragment.onTransitionAnimationStart(true, false);
}
if (swipeProgress == 0) {
customAnimation = lastFragment.onCustomTransitionAnimation(false, () -> {
lastFragment.onTransitionAnimationEnd(false, true);
onCloseAnimationEnd(lastFragment, newLastFragment);
customAnimation = null;
@ -1351,7 +1423,6 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
if (newLastFragment != null) {
newLastFragment.prepareFragmentToSlide(false, false);
newLastFragment.onTransitionAnimationEnd(true, true);
newLastFragment.onBecomeFullyVisible();
}
@ -1372,6 +1443,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float
blurredBackFragmentForPreview = null;
}
previewOpenCallback = null;
invalidateActionBars();
}
@Override

View File

@ -1534,11 +1534,6 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati
@SuppressLint("Range")
private boolean handleIntent(Intent intent, boolean isNew, boolean restore, boolean fromPassword) {
if (AndroidUtilities.handleProxyIntent(this, intent)) {
actionBarLayout.rebuildFragments(INavigationLayout.REBUILD_FLAG_REBUILD_LAST);
if (AndroidUtilities.isTablet()) {
layersActionBarLayout.rebuildFragments(INavigationLayout.REBUILD_FLAG_REBUILD_LAST);
rightActionBarLayout.rebuildFragments(INavigationLayout.REBUILD_FLAG_REBUILD_LAST);
}
return true;
}
if (PhotoViewer.hasInstance() && PhotoViewer.getInstance().isVisible()) {

View File

@ -1591,6 +1591,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
}
}
@Override
public boolean isActionBarCrossfadeEnabled() {
return false;
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();

View File

@ -38,7 +38,6 @@ import androidx.collection.LongSparseArray;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -55,6 +54,7 @@ import org.telegram.messenger.NotificationsController;
import org.telegram.messenger.R;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.TopicsController;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.TLObject;
@ -68,10 +68,16 @@ import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BackDrawable;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Adapters.FiltersView;
import org.telegram.ui.Cells.DialogCell;
import org.telegram.ui.Cells.DrawerProfileCell;
import org.telegram.ui.Cells.GraySectionCell;
import org.telegram.ui.Cells.HeaderCell;
import org.telegram.ui.Cells.HintDialogCell;
import org.telegram.ui.Cells.ProfileSearchCell;
import org.telegram.ui.Cells.TopicSearchCell;
import org.telegram.ui.Cells.UserCell;
import org.telegram.ui.Components.AlertsCreator;
import org.telegram.ui.Components.AnimatedEmojiDrawable;
import org.telegram.ui.Components.Bulletin;
@ -106,6 +112,8 @@ import java.util.Iterator;
public class TopicsFragment extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ChatActivityInterface {
private final static int BOTTOM_BUTTON_TYPE_JOIN = 0;
private final static int BOTTOM_BUTTON_TYPE_REPORT = 1;
final long chatId;
ArrayList<Item> forumTopics = new ArrayList<>();
@ -145,6 +153,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
TLRPC.ChatFull chatFull;
boolean canShowCreateTopic;
private UnreadCounterTextView bottomOverlayChatText;
private int bottomButtonType;
private RecyclerListView recyclerListView;
private ItemTouchHelper itemTouchHelper;
private ActionBarMenuSubItem createTopicSubmenu;
@ -203,6 +212,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
ValueAnimator slideBackTransitionAnimator;
private FrameLayout topView;
private RLottieImageView floatingButton;
public TopicsFragment(Bundle bundle) {
super(bundle);
@ -468,7 +478,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
TLRPC.TL_forumTopic topic = topicsController.findTopic(chatId, list.get(i));
if (topic != null) {
getMessagesController().markMentionsAsRead(-chatId, topic.id);
getMessagesController().markDialogAsRead(-chatId, topic.top_message, 0, topic.topMessage.date, false, topic.id, 0, true, 0);
getMessagesController().markDialogAsRead(-chatId, topic.top_message, 0, topic.topMessage != null ? topic.topMessage.date : 0, false, topic.id, 0, true, 0);
getMessagesStorage().updateRepliesMaxReadId(chatId, topic.id, topic.top_message, 0, true);
}
}
@ -713,7 +723,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
});
}
floatingButtonContainer.setBackground(drawable);
RLottieImageView floatingButton = new RLottieImageView(context);
floatingButton = new RLottieImageView(context);
floatingButton.setImageResource(R.drawable.ic_chatlist_add_2);
floatingButtonContainer.setContentDescription(LocaleController.getString("CreateTopic", R.string.CreateTopic));
@ -745,7 +755,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
};
try {
topicsEmptyView.stickerView.getImageReceiver().setAutoRepeat(2);
} catch (Exception ignore) {}
} catch (Exception ignore) {
}
topicsEmptyView.showProgress(loadingTopics, fragmentBeginToShow);
topicsEmptyView.title.setText(LocaleController.getString("NoTopics", R.string.NoTopics));
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("d");
@ -778,33 +789,31 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
bottomOverlayChatText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
joinToGroup();
if (bottomButtonType == BOTTOM_BUTTON_TYPE_REPORT) {
AlertsCreator.showBlockReportSpamAlert(TopicsFragment.this, -chatId, null, getCurrentChat(), null, false, chatFull, param -> {
if (param == 0) {
updateChatInfo();
} else {
finishFragment();
}
}, getResourceProvider());
} else {
joinToGroup();
}
}
});
bottomOverlayProgress = new RadialProgressView(context, themeDelegate);
bottomOverlayProgress.setSize(AndroidUtilities.dp(22));
bottomOverlayProgress.setProgressColor(getThemedColor(Theme.key_chat_fieldOverlayText));
bottomOverlayProgress.setVisibility(View.INVISIBLE);
bottomOverlayContainer.addView(bottomOverlayProgress, LayoutHelper.createFrame(30, 30, Gravity.CENTER));
updateChatInfo();
bottomOverlayChatText.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_chat_fieldOverlayText), 26), Theme.RIPPLE_MASK_ALL));
floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY));
bottomOverlayContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
actionBar.setActionModeColor(Theme.getColor(Theme.key_windowBackgroundWhite));
actionBar.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefault));
searchContainer = new SearchContainer(context);
searchContainer.setVisibility(View.GONE);
contentView.addView(searchContainer);
EditTextBoldCursor editText = searchItem.getSearchField();
searchContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
// editText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
// editText.setHintTextColor(Theme.getColor(Theme.key_player_time));
// editText.setCursorColor(Theme.getColor(Theme.key_chat_messagePanelCursor));
actionBar.setDrawBlurBackground(contentView);
@ -859,10 +868,23 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
bottomPannelVisible = true;
updateChatInfo();
updateColors();
return fragmentView;
}
private void updateColors() {
if (bottomOverlayProgress == null) {
return;
}
bottomOverlayProgress.setProgressColor(getThemedColor(Theme.key_chat_fieldOverlayText));
floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY));
bottomOverlayContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
actionBar.setActionModeColor(Theme.getColor(Theme.key_windowBackgroundWhite));
actionBar.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefault));
searchContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
}
private void openProfile(boolean byAvatar) {
Bundle args = new Bundle();
args.putLong("chat_id", chatId);
@ -1266,6 +1288,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
unpinItem.setVisibility(canUnpinCount == 1 && canPinCount == 0 ? View.VISIBLE : View.GONE);
} else {
actionBar.hideActionMode();
return;
}
selectedDialogsCountTextView.setNumber(selectedTopics.size(), true);
@ -1414,6 +1437,11 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
TLRPC.Chat chatLocal = getMessagesController().getChat(chatId);
avatarContainer.setChatAvatar(chatLocal);
SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount);
boolean showReport = preferences.getBoolean("dialog_bar_report" + (-chatId), false);
boolean showBlock = preferences.getBoolean("dialog_bar_block" + (-chatId), false);
if (!opnendForSelect) {
if (chatLocal != null) {
avatarContainer.setTitle(chatLocal.title);
@ -1447,6 +1475,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
bottomOverlayChatText.setEnabled(false);
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayProgress, false, 0.5f, animated);
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayChatText, true, 0.5f, animated);
setButtonType(BOTTOM_BUTTON_TYPE_JOIN);
} else if (chatLocal != null && !opnendForSelect && (ChatObject.isNotInChat(chatLocal) || getMessagesController().isJoiningChannel(chatLocal.id))) {
bottomPannelVisibleLocal = true;
@ -1465,6 +1494,17 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayProgress, showProgress, 0.5f, animated);
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayChatText, !showProgress, 0.5f, animated);
setButtonType(BOTTOM_BUTTON_TYPE_JOIN);
} else if (showBlock || showReport) {
bottomOverlayChatText.setText(LocaleController.getString("ReportSpamAndLeave", R.string.ReportSpamAndLeave));
bottomOverlayChatText.setClickable(true);
bottomOverlayChatText.setEnabled(true);
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayProgress, false, 0.5f, false);
AndroidUtilities.updateViewVisibilityAnimated(bottomOverlayChatText, true, 0.5f, false);
setButtonType(BOTTOM_BUTTON_TYPE_REPORT);
bottomPannelVisibleLocal = true;
} else {
bottomPannelVisibleLocal = false;
}
@ -1496,6 +1536,13 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
groupCall = getMessagesController().getGroupCall(chatId, true);
}
private void setButtonType(int bottomButtonType) {
if (this.bottomButtonType != bottomButtonType) {
this.bottomButtonType = bottomButtonType;
bottomOverlayChatText.setTextColorKey(bottomButtonType == BOTTOM_BUTTON_TYPE_JOIN ? Theme.key_chat_fieldOverlayText : Theme.key_chat_reportSpam);
}
}
private void updateSubtitle() {
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(chatId);
if (this.chatFull != null && this.chatFull.participants != null) {
@ -2410,7 +2457,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
public void onTransitionAnimationStart(boolean isOpen, boolean backward) {
super.onTransitionAnimationStart(isOpen, backward);
transitionAnimationIndex = getNotificationCenter().setAnimationInProgress(transitionAnimationIndex, new int[] {NotificationCenter.topicsDidLoaded});
transitionAnimationIndex = getNotificationCenter().setAnimationInProgress(transitionAnimationIndex, new int[]{NotificationCenter.topicsDidLoaded});
transitionAnimationGlobalIndex = NotificationCenter.getGlobalInstance().setAnimationInProgress(transitionAnimationGlobalIndex, new int[0]);
}
@ -2427,7 +2474,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
getNotificationCenter().onAnimationFinish(transitionAnimationIndex);
NotificationCenter.getGlobalInstance().onAnimationFinish(transitionAnimationGlobalIndex);
if (!isOpen && (opnendForSelect || removeFragmentOnTransitionEnd)) {
if (!isOpen && (opnendForSelect && removeFragmentOnTransitionEnd)) {
removeSelfFromStack();
if (dialogsActivity != null) {
dialogsActivity.removeSelfFromStack();
@ -2528,4 +2575,57 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N
public SizeNotifierFrameLayout getContentView() {
return contentView;
}
@Override
public ArrayList<ThemeDescription> getThemeDescriptions() {
ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> {
for (int b = 0; b < 2; b++) {
RecyclerListView list = null;
if (b == 0) {
list = recyclerListView;
} else if (searchContainer != null) {
list = searchContainer.recyclerView;
}
if (list == null) {
continue;
}
int count = list.getChildCount();
for (int a = 0; a < count; a++) {
View child = list.getChildAt(a);
if (child instanceof ProfileSearchCell) {
((ProfileSearchCell) child).update(0);
} else if (child instanceof DialogCell) {
((DialogCell) child).update(0);
} else if (child instanceof UserCell) {
((UserCell) child).update(0);
}
}
}
if (actionBar != null) {
actionBar.setPopupBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground), true);
actionBar.setPopupItemsColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem), false, true);
actionBar.setPopupItemsColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItemIcon), true, true);
actionBar.setPopupItemsSelectorColor(Theme.getColor(Theme.key_dialogButtonSelector), true);
}
if (blurredView != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
blurredView.setForeground(new ColorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_windowBackgroundWhite), 100)));
}
}
updateColors();
};
ArrayList<ThemeDescription> arrayList = new ArrayList<>();
arrayList.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_windowBackgroundWhite));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle));
arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector));
if (searchContainer != null && searchContainer.recyclerView != null) {
GraySectionCell.createThemeDescriptions(arrayList, searchContainer.recyclerView);
}
return arrayList;
}
}

View File

@ -5735,7 +5735,7 @@
<string name="FloatingDebugEnable">Enable floating debug</string>
<string name="FloatingDebugDisable">Disable floating debug</string>
<string name="DebugClearLocalDatabaseSuccess">Cleared local database.</string>
<string name="DebugAltNavigationToggleControls">Toggle navigation stiffness controls</string>
<string name="DebugAltNavigationToggleControls">Toggle stiffness controls</string>
<string name="DebugClearSendMessageAsPeers">Clear Send Message As... peers</string>
<string name="DebugShareAlertSwitchDialogsMode">Switch sharing alert dialogs mode (%1$s)</string>
<string name="DebugShareAlertDialogsModeNormal">Normal</string>
@ -5781,4 +5781,11 @@
<string name="ChannelCaptionLimitPremiumPromo_many">Make the caption shorter or subscribe to *Telegram Premium* to double the limit to **%1$s** characters.</string>
<string name="ChannelCaptionLimitPremiumPromo_other">Make the caption shorter or subscribe to *Telegram Premium* to double the limit to **%1$s** characters.</string>
<string name="AllChats">All Chats</string>
<string name="DebugShareAlert">Share Alert</string>
<string name="DebugDialogsActivity">Dialogs Activity</string>
<string name="DebugMessageSkeletons">Message Skeletons</string>
<string name="DebugMessageSkeletonsLightOverlayAlpha">Light overlay alpha</string>
<string name="DebugMessageSkeletonsSaturation">Saturation</string>
<string name="DebugAltNavigation">Alternative navigation</string>
<string name="DebugGeneral">General</string>
</resources>

View File

@ -21,20 +21,9 @@ dependencies {
implementation files('../TMessagesProj/libs/libgsaverification-client.aar')
}
def getProps(String propName) {
def propsFile = rootProject.file('local.properties')
if (propsFile.exists()) {
def props = new Properties()
props.load(new FileInputStream(propsFile))
return props[propName]
} else {
return ""
}
}
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 33
buildToolsVersion '33.0.0'
defaultConfig.applicationId = APP_PACKAGE
@ -186,8 +175,8 @@ android {
}
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
minSdkVersion 19
targetSdkVersion 31
versionName APP_VERSION_NAME
ndkVersion "21.4.7075529"

View File

@ -5,7 +5,7 @@
android:installLocation="auto">
<application android:name="org.telegram.messenger.ApplicationLoaderImpl" tools:replace="name">
<service android:name="org.telegram.messenger.GoogleVoiceClientService"/>
<service android:name="org.telegram.messenger.GoogleVoiceClientService" android:exported="true"/>
<activity
android:name="org.telegram.messenger.GoogleVoiceClientActivity"
android:exported="true">

View File

@ -25,8 +25,8 @@ dependencies {
}
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 33
buildToolsVersion '33.0.0'
defaultConfig.applicationId = APP_PACKAGE
@ -142,8 +142,8 @@ android {
}
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
minSdkVersion 19
targetSdkVersion 31
versionName APP_VERSION_NAME
ndkVersion "21.4.7075529"

View File

@ -5,7 +5,7 @@
android:installLocation="auto">
<application android:name="org.telegram.messenger.ApplicationLoaderImpl" tools:replace="name">
<service android:name="org.telegram.messenger.GoogleVoiceClientService"/>
<service android:name="org.telegram.messenger.GoogleVoiceClientService" android:exported="true"/>
<activity
android:name="org.telegram.messenger.GoogleVoiceClientActivity"
android:exported="true">
@ -15,5 +15,31 @@
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name="com.microsoft.appcenter.distribute.DeepLinkActivity"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="updates"
android:path="/"
android:scheme="appcenter" />
</intent-filter>
</activity>
<receiver
android:name="com.microsoft.appcenter.distribute.DownloadManagerReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@ -29,8 +29,8 @@ dependencies {
}
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 33
buildToolsVersion '33.0.0'
defaultConfig.applicationId = APP_PACKAGE
@ -137,7 +137,7 @@ android {
defaultConfig {
minSdkVersion 19
targetSdkVersion 30
targetSdkVersion 31
versionName APP_VERSION_NAME
ndkVersion "21.4.7075529"

View File

@ -11,7 +11,7 @@
</queries>
<application android:name="org.telegram.messenger.HuaweiApplicationLoader" tools:replace="name">
<service android:name="org.telegram.messenger.GoogleVoiceClientService"/>
<service android:name="org.telegram.messenger.GoogleVoiceClientService" android:exported="true"/>
<activity
android:name="org.telegram.messenger.GoogleVoiceClientActivity"
android:exported="true">

View File

@ -13,8 +13,8 @@
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
#Sat Mar 12 05:53:50 MSK 2016
APP_VERSION_NAME=9.1.3
APP_VERSION_CODE=2917
APP_VERSION_NAME=9.1.4
APP_VERSION_CODE=2927
APP_PACKAGE=org.telegram.messenger
RELEASE_KEY_PASSWORD=TelegramAndroidPswd
RELEASE_KEY_ALIAS=tmessages