NekoX/TMessagesProj/src/main/java/org/telegram/ui/SessionBottomSheet.java

422 lines
20 KiB
Java

package org.telegram.ui;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.BottomSheet;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.TextCheckCell2;
import org.telegram.ui.Components.BulletinFactory;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RLottieImageView;
import org.telegram.ui.Components.Switch;
public class SessionBottomSheet extends BottomSheet {
TLRPC.TL_authorization session;
BaseFragment parentFragment;
RLottieImageView imageView;
public SessionBottomSheet(BaseFragment fragment, TLRPC.TL_authorization session, boolean isCurrentSession, Callback callback) {
super(fragment.getParentActivity(), false);
setOpenNoDelay(true);
Context context = fragment.getParentActivity();
this.session = session;
this.parentFragment = fragment;
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
imageView = new RLottieImageView(context);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!imageView.isPlaying() && imageView.getAnimatedDrawable() != null) {
imageView.getAnimatedDrawable().setCurrentFrame(40);
imageView.playAnimation();
}
}
});
imageView.setScaleType(ImageView.ScaleType.CENTER);
linearLayout.addView(imageView, LayoutHelper.createLinear(70, 70, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 0));
TextView nameView = new TextView(context);
nameView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
nameView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
nameView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
nameView.setGravity(Gravity.CENTER);
linearLayout.addView(nameView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 21, 12, 21, 0));
TextView timeView = new TextView(context);
timeView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText));
timeView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
timeView.setGravity(Gravity.CENTER);
linearLayout.addView(timeView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 21, 4, 21, 21));
String timeText;
if ((session.flags & 1) != 0) {
timeText = LocaleController.getString("Online", R.string.Online);
} else {
timeText = LocaleController.stringForMessageListDate(session.date_active);
}
timeView.setText(timeText);
StringBuilder stringBuilder = new StringBuilder();
if (session.device_model.length() != 0) {
stringBuilder.append(session.device_model);
}
if (stringBuilder.length() == 0) {
if (session.platform.length() != 0) {
stringBuilder.append(session.platform);
}
if (session.system_version.length() != 0) {
if (session.platform.length() != 0) {
stringBuilder.append(" ");
}
stringBuilder.append(session.system_version);
}
}
nameView.setText(stringBuilder);
setAnimation(session, imageView);
ItemView applicationItemView = new ItemView(context, false);
stringBuilder = new StringBuilder();
stringBuilder.append(session.app_name);
stringBuilder.append(" ").append(session.app_version);
applicationItemView.valueText.setText(stringBuilder);
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.menu_devices).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
applicationItemView.iconView.setImageDrawable(drawable);
applicationItemView.descriptionText.setText(LocaleController.getString("Application", R.string.Application));
linearLayout.addView(applicationItemView);
ItemView prevItem = applicationItemView;
if (session.country.length() != 0) {
ItemView locationItemView = new ItemView(context, false);
locationItemView.valueText.setText(session.country);
drawable = ContextCompat.getDrawable(context, R.drawable.menu_location).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
locationItemView.iconView.setImageDrawable(drawable);
locationItemView.descriptionText.setText(LocaleController.getString("Location", R.string.Location));
locationItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
copyText(session.country);
}
});
locationItemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
copyText(session.country);
return true;
}
});
locationItemView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 2));
linearLayout.addView(locationItemView);
if (prevItem != null) {
prevItem.needDivider = true;
}
prevItem = locationItemView;
}
if (session.ip.length() != 0) {
ItemView locationItemView = new ItemView(context, false);
locationItemView.valueText.setText(session.ip);
drawable = ContextCompat.getDrawable(context, R.drawable.menu_language).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
locationItemView.iconView.setImageDrawable(drawable);
locationItemView.descriptionText.setText(LocaleController.getString("IpAddress", R.string.IpAddress));
locationItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
copyText(session.ip);
}
});
locationItemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
copyText(session.country);
return true;
}
});
locationItemView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 2));
linearLayout.addView(locationItemView);
if (prevItem != null) {
prevItem.needDivider = true;
}
prevItem = locationItemView;
}
if (secretChatsEnabled(session)) {
ItemView acceptSecretChats = new ItemView(context, true);
acceptSecretChats.valueText.setText(LocaleController.getString("AcceptSecretChats", R.string.AcceptSecretChats));
drawable = ContextCompat.getDrawable(context, R.drawable.menu_secret).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
acceptSecretChats.iconView.setImageDrawable(drawable);
acceptSecretChats.switchView.setChecked(!session.encrypted_requests_disabled, false);
acceptSecretChats.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 7));
acceptSecretChats.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
acceptSecretChats.switchView.setChecked(!acceptSecretChats.switchView.isChecked(), true);
session.encrypted_requests_disabled = !acceptSecretChats.switchView.isChecked();
uploadSessionSettings();
}
});
if (prevItem != null) {
prevItem.needDivider = true;
}
acceptSecretChats.descriptionText.setText(LocaleController.getString("AcceptSecretChatsDescription", R.string.AcceptSecretChatsDescription));
linearLayout.addView(acceptSecretChats);
prevItem = acceptSecretChats;
}
ItemView acceptCalls = new ItemView(context, true);
acceptCalls.valueText.setText(LocaleController.getString("AcceptCalls", R.string.AcceptCalls));
drawable = ContextCompat.getDrawable(context, R.drawable.menu_calls).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
acceptCalls.iconView.setImageDrawable(drawable);
acceptCalls.switchView.setChecked(!session.call_requests_disabled, false);
acceptCalls.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 7));
acceptCalls.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
acceptCalls.switchView.setChecked(!acceptCalls.switchView.isChecked(), true);
session.call_requests_disabled = !acceptCalls.switchView.isChecked();
uploadSessionSettings();
}
});
if (prevItem != null) {
prevItem.needDivider = true;
}
acceptCalls.descriptionText.setText(LocaleController.getString("AcceptCallsChatsDescription", R.string.AcceptCallsChatsDescription));
linearLayout.addView(acceptCalls);
if (!isCurrentSession) {
TextView buttonTextView = new TextView(context);
buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0);
buttonTextView.setGravity(Gravity.CENTER);
buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
buttonTextView.setText(LocaleController.getString("TerminateSession", R.string.TerminateSession));
buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText));
buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_chat_attachAudioBackground), ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhite), 120)));
linearLayout.addView(buttonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, 0, 16, 15, 16, 16));
buttonTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(parentFragment.getParentActivity());
final boolean[] param = new boolean[1];
String buttonText;
builder.setMessage(LocaleController.getString("TerminateSessionText", R.string.TerminateSessionText));
builder.setTitle(LocaleController.getString("AreYouSureSessionTitle", R.string.AreYouSureSessionTitle));
buttonText = LocaleController.getString("Terminate", R.string.Terminate);
builder.setPositiveButton(buttonText, (dialogInterface, option) -> {
callback.onSessionTerminated(session);
dismiss();
});
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
AlertDialog alertDialog = builder.create();
fragment.showDialog(alertDialog);
TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
if (button != null) {
button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2));
}
}
});
}
ScrollView scrollView = new ScrollView(context);
scrollView.addView(linearLayout);
setCustomView(scrollView);
}
private boolean secretChatsEnabled(TLRPC.TL_authorization session) {
if (session.api_id == 2040 || session.api_id == 2496) {
return false;
}
return true;
}
private void uploadSessionSettings() {
TLRPC.TL_account_changeAuthorizationSettings req = new TLRPC.TL_account_changeAuthorizationSettings();
req.encrypted_requests_disabled = session.encrypted_requests_disabled;
req.call_requests_disabled = session.call_requests_disabled;
req.flags = 1 | 2;
req.hash = session.hash;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
});
}
private void copyText(String text) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setItems(new CharSequence[]{LocaleController.getString("Copy", R.string.Copy)}, (dialogInterface, i) -> {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("label", text);
clipboard.setPrimaryClip(clip);
BulletinFactory.of(getContainer(), null).createCopyBulletin(LocaleController.getString("TextCopied", R.string.TextCopied)).show();
});
builder.show();
}
private void setAnimation(TLRPC.TL_authorization session, RLottieImageView imageView) {
String platform = session.platform.toLowerCase();
if (platform.isEmpty()) {
platform = session.system_version.toLowerCase();
}
String deviceModel = session.device_model.toLowerCase();
int iconId;
String colorKey;
boolean animation = true;
if (deviceModel.contains("safari")) {
iconId = R.raw.safari_30;
colorKey = Theme.key_avatar_backgroundPink;
} else if (deviceModel.contains("edge")) {
iconId = R.raw.edge_30;
colorKey = Theme.key_avatar_backgroundPink;
} else if (deviceModel.contains("chrome")) {
iconId = R.raw.chrome_30;
colorKey = Theme.key_avatar_backgroundPink;
} else if (deviceModel.contains("opera") || deviceModel.contains("firefox") || deviceModel.contains("vivaldi")) {
animation = false;
if (deviceModel.contains("opera")) {
iconId = R.drawable.device_web_opera;
} else if (deviceModel.contains("firefox")) {
iconId = R.drawable.device_web_firefox;
} else {
iconId = R.drawable.device_web_other;
}
colorKey = Theme.key_avatar_backgroundPink;
} else if (platform.contains("ubuntu")) {
iconId = R.raw.ubuntu_30;
colorKey = Theme.key_avatar_backgroundBlue;
} else if (platform.contains("ios")) {
iconId = deviceModel.contains("ipad") ? R.raw.ipad_30 : R.raw.iphone_30;
colorKey = Theme.key_avatar_backgroundBlue;
} else if (platform.contains("windows")) {
iconId = R.raw.windows_30;
colorKey = Theme.key_avatar_backgroundCyan;
} else if (platform.contains("macos")) {
iconId = R.raw.mac_30;
colorKey = Theme.key_avatar_backgroundCyan;
} else if (platform.contains("android")) {
iconId = R.raw.android_30;
colorKey = Theme.key_avatar_backgroundGreen;
} else {
if (session.app_name.toLowerCase().contains("desktop")) {
iconId = R.raw.windows_30;
colorKey = Theme.key_avatar_backgroundCyan;
} else {
iconId = R.raw.chrome_30;
colorKey = Theme.key_avatar_backgroundPink;
}
}
imageView.setBackground(Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(colorKey)));
if (animation) {
int[] colors = new int[]{0x000000, Theme.getColor(colorKey)};
imageView.setAnimation(iconId, 50, 50, colors);
} else {
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), iconId));
}
}
private static class ItemView extends FrameLayout {
ImageView iconView;
TextView valueText;
TextView descriptionText;
Switch switchView;
boolean needDivider = false;
public ItemView(Context context, boolean needSwitch) {
super(context);
iconView = new ImageView(context);
addView(iconView, LayoutHelper.createFrame(28, 28, 0, 16, 8, 0, 0));
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 64, 4, 0, 4));
valueText = new TextView(context);
valueText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
valueText.setGravity(Gravity.LEFT);
valueText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
linearLayout.addView(valueText, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, needSwitch ? 46 : 0, 0));
descriptionText = new TextView(context);
descriptionText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
descriptionText.setGravity(Gravity.LEFT);
descriptionText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText));
linearLayout.addView(descriptionText, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 4, needSwitch ? 46 : 0, 0));
setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4));
if (needSwitch) {
switchView = new Switch(context);
switchView.setDrawIconType(1);
addView(switchView, LayoutHelper.createFrame(37, 40, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 21, 0, 21, 0));
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (needDivider) {
canvas.drawRect(AndroidUtilities.dp(64), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight(), Theme.dividerPaint);
}
}
}
public interface Callback {
void onSessionTerminated(TLRPC.TL_authorization session);
}
@Override
public void show() {
super.show();
imageView.playAnimation();
}
}