mirror of https://github.com/NekoX-Dev/NekoX.git
697 lines
36 KiB
Java
697 lines
36 KiB
Java
/*
|
|
* This is the source code of Telegram for Android v. 5.x.x.
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Nikolai Kudashov, 2013-2018.
|
|
*/
|
|
|
|
package org.telegram.ui;
|
|
|
|
import android.app.Dialog;
|
|
import android.content.Context;
|
|
import android.content.SharedPreferences;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffColorFilter;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.SystemClock;
|
|
import android.text.TextUtils;
|
|
import android.util.TypedValue;
|
|
import android.view.Gravity;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.messenger.DownloadController;
|
|
import org.telegram.messenger.LocaleController;
|
|
import org.telegram.messenger.MessagesController;
|
|
import org.telegram.messenger.NotificationCenter;
|
|
import org.telegram.messenger.R;
|
|
import org.telegram.messenger.SharedConfig;
|
|
import org.telegram.tgnet.ConnectionsManager;
|
|
import org.telegram.ui.ActionBar.ActionBar;
|
|
import org.telegram.ui.ActionBar.AlertDialog;
|
|
import org.telegram.ui.ActionBar.BaseFragment;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
import org.telegram.ui.ActionBar.ThemeDescription;
|
|
import org.telegram.ui.Cells.HeaderCell;
|
|
import org.telegram.ui.Cells.ShadowSectionCell;
|
|
import org.telegram.ui.Cells.TextCheckCell;
|
|
import org.telegram.ui.Cells.TextInfoPrivacyCell;
|
|
import org.telegram.ui.Cells.TextSettingsCell;
|
|
import org.telegram.ui.Components.LayoutHelper;
|
|
import org.telegram.ui.Components.RecyclerListView;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.recyclerview.widget.DefaultItemAnimator;
|
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class ProxyListActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
|
|
|
|
private ListAdapter listAdapter;
|
|
private RecyclerListView listView;
|
|
@SuppressWarnings("FieldCanBeLocal")
|
|
private LinearLayoutManager layoutManager;
|
|
|
|
private int currentConnectionState;
|
|
|
|
private boolean useProxySettings;
|
|
private boolean useProxyForCalls;
|
|
|
|
private int rowCount;
|
|
private int useProxyRow;
|
|
private int useProxyDetailRow;
|
|
private int connectionsHeaderRow;
|
|
private int proxyStartRow;
|
|
private int proxyEndRow;
|
|
private int proxyAddRow;
|
|
private int proxyDetailRow;
|
|
private int callsRow;
|
|
private int callsDetailRow;
|
|
|
|
public class TextDetailProxyCell extends FrameLayout {
|
|
|
|
private TextView textView;
|
|
private TextView valueTextView;
|
|
private ImageView checkImageView;
|
|
private SharedConfig.ProxyInfo currentInfo;
|
|
private Drawable checkDrawable;
|
|
|
|
private int color;
|
|
|
|
public TextDetailProxyCell(Context context) {
|
|
super(context);
|
|
|
|
textView = new TextView(context);
|
|
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
|
|
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
|
textView.setLines(1);
|
|
textView.setMaxLines(1);
|
|
textView.setSingleLine(true);
|
|
textView.setEllipsize(TextUtils.TruncateAt.END);
|
|
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
|
|
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 56 : 21), 10, (LocaleController.isRTL ? 21 : 56), 0));
|
|
|
|
valueTextView = new TextView(context);
|
|
valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
|
|
valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
|
|
valueTextView.setLines(1);
|
|
valueTextView.setMaxLines(1);
|
|
valueTextView.setSingleLine(true);
|
|
valueTextView.setCompoundDrawablePadding(AndroidUtilities.dp(6));
|
|
valueTextView.setEllipsize(TextUtils.TruncateAt.END);
|
|
valueTextView.setPadding(0, 0, 0, 0);
|
|
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 56 : 21), 35, (LocaleController.isRTL ? 21 : 56), 0));
|
|
|
|
checkImageView = new ImageView(context);
|
|
checkImageView.setImageResource(R.drawable.profile_info);
|
|
checkImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText3), PorterDuff.Mode.MULTIPLY));
|
|
checkImageView.setScaleType(ImageView.ScaleType.CENTER);
|
|
checkImageView.setContentDescription(LocaleController.getString("Edit", R.string.Edit));
|
|
addView(checkImageView, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP, 8, 8, 8, 0));
|
|
checkImageView.setOnClickListener(v -> presentFragment(new ProxySettingsActivity(currentInfo)));
|
|
|
|
setWillNotDraw(false);
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64) + 1, MeasureSpec.EXACTLY));
|
|
}
|
|
|
|
public void setProxy(SharedConfig.ProxyInfo proxyInfo) {
|
|
textView.setText(proxyInfo.address + ":" + proxyInfo.port);
|
|
currentInfo = proxyInfo;
|
|
}
|
|
|
|
public void updateStatus() {
|
|
String colorKey;
|
|
if (SharedConfig.currentProxy == currentInfo && useProxySettings) {
|
|
if (currentConnectionState == ConnectionsManager.ConnectionStateConnected || currentConnectionState == ConnectionsManager.ConnectionStateUpdating) {
|
|
colorKey = Theme.key_windowBackgroundWhiteBlueText6;
|
|
if (currentInfo.ping != 0) {
|
|
valueTextView.setText(LocaleController.getString("Connected", R.string.Connected) + ", " + LocaleController.formatString("Ping", R.string.Ping, currentInfo.ping));
|
|
} else {
|
|
valueTextView.setText(LocaleController.getString("Connected", R.string.Connected));
|
|
}
|
|
if (!currentInfo.checking && !currentInfo.available) {
|
|
currentInfo.availableCheckTime = 0;
|
|
}
|
|
} else {
|
|
colorKey = Theme.key_windowBackgroundWhiteGrayText2;
|
|
valueTextView.setText(LocaleController.getString("Connecting", R.string.Connecting));
|
|
}
|
|
} else {
|
|
if (currentInfo.checking) {
|
|
valueTextView.setText(LocaleController.getString("Checking", R.string.Checking));
|
|
colorKey = Theme.key_windowBackgroundWhiteGrayText2;
|
|
} else if (currentInfo.available) {
|
|
if (currentInfo.ping != 0) {
|
|
valueTextView.setText(LocaleController.getString("Available", R.string.Available) + ", " + LocaleController.formatString("Ping", R.string.Ping, currentInfo.ping));
|
|
} else {
|
|
valueTextView.setText(LocaleController.getString("Available", R.string.Available));
|
|
}
|
|
colorKey = Theme.key_windowBackgroundWhiteGreenText;
|
|
} else {
|
|
valueTextView.setText(LocaleController.getString("Unavailable", R.string.Unavailable));
|
|
colorKey = Theme.key_windowBackgroundWhiteRedText4;
|
|
}
|
|
}
|
|
color = Theme.getColor(colorKey);
|
|
valueTextView.setTag(colorKey);
|
|
valueTextView.setTextColor(color);
|
|
if (checkDrawable != null) {
|
|
checkDrawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
|
|
}
|
|
}
|
|
|
|
public void setChecked(boolean checked) {
|
|
if (checked) {
|
|
if (checkDrawable == null) {
|
|
checkDrawable = getResources().getDrawable(R.drawable.proxy_check).mutate();
|
|
}
|
|
if (checkDrawable != null) {
|
|
checkDrawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
|
|
}
|
|
if (LocaleController.isRTL) {
|
|
valueTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, checkDrawable, null);
|
|
} else {
|
|
valueTextView.setCompoundDrawablesWithIntrinsicBounds(checkDrawable, null, null, null);
|
|
}
|
|
} else {
|
|
valueTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
|
|
}
|
|
}
|
|
|
|
public void setValue(CharSequence value) {
|
|
valueTextView.setText(value);
|
|
}
|
|
|
|
@Override
|
|
protected void onAttachedToWindow() {
|
|
super.onAttachedToWindow();
|
|
updateStatus();
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean onFragmentCreate() {
|
|
super.onFragmentCreate();
|
|
|
|
SharedConfig.loadProxyList();
|
|
currentConnectionState = ConnectionsManager.getInstance(currentAccount).getConnectionState();
|
|
|
|
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.proxyCheckDone);
|
|
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.didUpdateConnectionState);
|
|
|
|
final SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
|
useProxySettings = preferences.getBoolean("proxy_enabled", false) && !SharedConfig.proxyList.isEmpty();
|
|
useProxyForCalls = preferences.getBoolean("proxy_enabled_calls", false);
|
|
|
|
updateRows(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onFragmentDestroy() {
|
|
super.onFragmentDestroy();
|
|
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.proxyCheckDone);
|
|
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didUpdateConnectionState);
|
|
}
|
|
|
|
@Override
|
|
public View createView(Context context) {
|
|
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
|
actionBar.setTitle(LocaleController.getString("ProxySettings", R.string.ProxySettings));
|
|
if (AndroidUtilities.isTablet()) {
|
|
actionBar.setOccupyStatusBar(false);
|
|
}
|
|
actionBar.setAllowOverlayTitle(false);
|
|
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
|
|
@Override
|
|
public void onItemClick(int id) {
|
|
if (id == -1) {
|
|
finishFragment();
|
|
}
|
|
}
|
|
});
|
|
|
|
listAdapter = new ListAdapter(context);
|
|
|
|
fragmentView = new FrameLayout(context);
|
|
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
|
|
FrameLayout frameLayout = (FrameLayout) fragmentView;
|
|
|
|
listView = new RecyclerListView(context);
|
|
((DefaultItemAnimator) listView.getItemAnimator()).setDelayAnimations(false);
|
|
listView.setVerticalScrollBarEnabled(false);
|
|
listView.setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
|
|
frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT));
|
|
listView.setAdapter(listAdapter);
|
|
listView.setOnItemClickListener((view, position) -> {
|
|
if (position == useProxyRow) {
|
|
if (SharedConfig.currentProxy == null) {
|
|
if (!SharedConfig.proxyList.isEmpty()) {
|
|
SharedConfig.currentProxy = SharedConfig.proxyList.get(0);
|
|
|
|
if (!useProxySettings) {
|
|
SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
|
SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit();
|
|
editor.putString("proxy_ip", SharedConfig.currentProxy.address);
|
|
editor.putString("proxy_pass", SharedConfig.currentProxy.password);
|
|
editor.putString("proxy_user", SharedConfig.currentProxy.username);
|
|
editor.putInt("proxy_port", SharedConfig.currentProxy.port);
|
|
editor.putString("proxy_secret", SharedConfig.currentProxy.secret);
|
|
editor.commit();
|
|
}
|
|
} else {
|
|
presentFragment(new ProxySettingsActivity());
|
|
return;
|
|
}
|
|
}
|
|
useProxySettings = !useProxySettings;
|
|
|
|
SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
|
|
|
TextCheckCell textCheckCell = (TextCheckCell) view;
|
|
textCheckCell.setChecked(useProxySettings);
|
|
if (!useProxySettings) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(callsRow);
|
|
if (holder != null) {
|
|
textCheckCell = (TextCheckCell) holder.itemView;
|
|
textCheckCell.setChecked(false);
|
|
}
|
|
useProxyForCalls = false;
|
|
}
|
|
|
|
SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit();
|
|
editor.putBoolean("proxy_enabled", useProxySettings);
|
|
editor.commit();
|
|
|
|
ConnectionsManager.setProxySettings(useProxySettings, SharedConfig.currentProxy.address, SharedConfig.currentProxy.port, SharedConfig.currentProxy.username, SharedConfig.currentProxy.password, SharedConfig.currentProxy.secret);
|
|
NotificationCenter.getGlobalInstance().removeObserver(ProxyListActivity.this, NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().addObserver(ProxyListActivity.this, NotificationCenter.proxySettingsChanged);
|
|
|
|
for (int a = proxyStartRow; a < proxyEndRow; a++) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(a);
|
|
if (holder != null) {
|
|
TextDetailProxyCell cell = (TextDetailProxyCell) holder.itemView;
|
|
cell.updateStatus();
|
|
}
|
|
}
|
|
|
|
} else if (position == callsRow) {
|
|
useProxyForCalls = !useProxyForCalls;
|
|
TextCheckCell textCheckCell = (TextCheckCell) view;
|
|
textCheckCell.setChecked(useProxyForCalls);
|
|
SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit();
|
|
editor.putBoolean("proxy_enabled_calls", useProxyForCalls);
|
|
editor.commit();
|
|
} else if (position >= proxyStartRow && position < proxyEndRow) {
|
|
SharedConfig.ProxyInfo info = SharedConfig.proxyList.get(position - proxyStartRow);
|
|
useProxySettings = true;
|
|
SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit();
|
|
editor.putString("proxy_ip", info.address);
|
|
editor.putString("proxy_pass", info.password);
|
|
editor.putString("proxy_user", info.username);
|
|
editor.putInt("proxy_port", info.port);
|
|
editor.putString("proxy_secret", info.secret);
|
|
editor.putBoolean("proxy_enabled", useProxySettings);
|
|
if (!info.secret.isEmpty()) {
|
|
useProxyForCalls = false;
|
|
editor.putBoolean("proxy_enabled_calls", false);
|
|
}
|
|
editor.commit();
|
|
SharedConfig.currentProxy = info;
|
|
for (int a = proxyStartRow; a < proxyEndRow; a++) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(a);
|
|
if (holder != null) {
|
|
TextDetailProxyCell cell = (TextDetailProxyCell) holder.itemView;
|
|
cell.setChecked(cell.currentInfo == info);
|
|
cell.updateStatus();
|
|
}
|
|
}
|
|
updateRows(false);
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(useProxyRow);
|
|
if (holder != null) {
|
|
TextCheckCell textCheckCell = (TextCheckCell) holder.itemView;
|
|
textCheckCell.setChecked(true);
|
|
}
|
|
ConnectionsManager.setProxySettings(useProxySettings, SharedConfig.currentProxy.address, SharedConfig.currentProxy.port, SharedConfig.currentProxy.username, SharedConfig.currentProxy.password, SharedConfig.currentProxy.secret);
|
|
} else if (position == proxyAddRow) {
|
|
presentFragment(new ProxySettingsActivity());
|
|
}
|
|
});
|
|
listView.setOnItemLongClickListener((view, position) -> {
|
|
if (position >= proxyStartRow && position < proxyEndRow) {
|
|
final SharedConfig.ProxyInfo info = SharedConfig.proxyList.get(position - proxyStartRow);
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
|
builder.setMessage(LocaleController.getString("DeleteProxy", R.string.DeleteProxy));
|
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> {
|
|
SharedConfig.deleteProxy(info);
|
|
if (SharedConfig.currentProxy == null) {
|
|
useProxyForCalls = false;
|
|
useProxySettings = false;
|
|
}
|
|
NotificationCenter.getGlobalInstance().removeObserver(ProxyListActivity.this, NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxySettingsChanged);
|
|
NotificationCenter.getGlobalInstance().addObserver(ProxyListActivity.this, NotificationCenter.proxySettingsChanged);
|
|
updateRows(false);
|
|
if (listAdapter != null) {
|
|
listAdapter.notifyItemRemoved(position);
|
|
if (SharedConfig.currentProxy == null) {
|
|
listAdapter.notifyItemChanged(useProxyRow, ListAdapter.PAYLOAD_CHECKED_CHANGED);
|
|
listAdapter.notifyItemChanged(callsRow, ListAdapter.PAYLOAD_CHECKED_CHANGED);
|
|
}
|
|
}
|
|
});
|
|
showDialog(builder.create());
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
return fragmentView;
|
|
}
|
|
|
|
private void updateRows(boolean notify) {
|
|
rowCount = 0;
|
|
useProxyRow = rowCount++;
|
|
useProxyDetailRow = rowCount++;
|
|
connectionsHeaderRow = rowCount++;
|
|
if (!SharedConfig.proxyList.isEmpty()) {
|
|
proxyStartRow = rowCount;
|
|
rowCount += SharedConfig.proxyList.size();
|
|
proxyEndRow = rowCount;
|
|
} else {
|
|
proxyStartRow = -1;
|
|
proxyEndRow = -1;
|
|
}
|
|
proxyAddRow = rowCount++;
|
|
proxyDetailRow = rowCount++;
|
|
if (SharedConfig.currentProxy == null || SharedConfig.currentProxy.secret.isEmpty()) {
|
|
boolean change = callsRow == -1;
|
|
callsRow = rowCount++;
|
|
callsDetailRow = rowCount++;
|
|
if (!notify && change) {
|
|
listAdapter.notifyItemChanged(proxyDetailRow);
|
|
listAdapter.notifyItemRangeInserted(proxyDetailRow + 1, 2);
|
|
}
|
|
} else {
|
|
boolean change = callsRow != -1;
|
|
callsRow = -1;
|
|
callsDetailRow = -1;
|
|
if (!notify && change) {
|
|
listAdapter.notifyItemChanged(proxyDetailRow);
|
|
listAdapter.notifyItemRangeRemoved(proxyDetailRow + 1, 2);
|
|
}
|
|
}
|
|
checkProxyList();
|
|
if (notify && listAdapter != null) {
|
|
listAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
|
|
private void checkProxyList() {
|
|
for (int a = 0, count = SharedConfig.proxyList.size(); a < count; a++) {
|
|
final SharedConfig.ProxyInfo proxyInfo = SharedConfig.proxyList.get(a);
|
|
if (proxyInfo.checking || SystemClock.elapsedRealtime() - proxyInfo.availableCheckTime < 2 * 60 * 1000) {
|
|
continue;
|
|
}
|
|
proxyInfo.checking = true;
|
|
proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(currentAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret, time -> AndroidUtilities.runOnUIThread(() -> {
|
|
proxyInfo.availableCheckTime = SystemClock.elapsedRealtime();
|
|
proxyInfo.checking = false;
|
|
if (time == -1) {
|
|
proxyInfo.available = false;
|
|
proxyInfo.ping = 0;
|
|
} else {
|
|
proxyInfo.ping = time;
|
|
proxyInfo.available = true;
|
|
}
|
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, proxyInfo);
|
|
}));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onDialogDismiss(Dialog dialog) {
|
|
DownloadController.getInstance(currentAccount).checkAutodownloadSettings();
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
if (listAdapter != null) {
|
|
listAdapter.notifyDataSetChanged();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void didReceivedNotification(int id, int account, Object... args) {
|
|
if (id == NotificationCenter.proxySettingsChanged) {
|
|
updateRows(true);
|
|
} else if (id == NotificationCenter.didUpdateConnectionState) {
|
|
int state = ConnectionsManager.getInstance(account).getConnectionState();
|
|
if (currentConnectionState != state) {
|
|
currentConnectionState = state;
|
|
if (listView != null && SharedConfig.currentProxy != null) {
|
|
int idx = SharedConfig.proxyList.indexOf(SharedConfig.currentProxy);
|
|
if (idx >= 0) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(idx + proxyStartRow);
|
|
if (holder != null) {
|
|
TextDetailProxyCell cell = (TextDetailProxyCell) holder.itemView;
|
|
cell.updateStatus();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (id == NotificationCenter.proxyCheckDone) {
|
|
if (listView != null) {
|
|
SharedConfig.ProxyInfo proxyInfo = (SharedConfig.ProxyInfo) args[0];
|
|
int idx = SharedConfig.proxyList.indexOf(proxyInfo);
|
|
if (idx >= 0) {
|
|
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(idx + proxyStartRow);
|
|
if (holder != null) {
|
|
TextDetailProxyCell cell = (TextDetailProxyCell) holder.itemView;
|
|
cell.updateStatus();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private class ListAdapter extends RecyclerListView.SelectionAdapter {
|
|
|
|
public static final int PAYLOAD_CHECKED_CHANGED = 0;
|
|
|
|
private Context mContext;
|
|
|
|
public ListAdapter(Context context) {
|
|
mContext = context;
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return rowCount;
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
|
|
switch (holder.getItemViewType()) {
|
|
case 0: {
|
|
if (position == proxyDetailRow && callsRow == -1) {
|
|
holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
|
|
} else {
|
|
holder.itemView.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
TextSettingsCell textCell = (TextSettingsCell) holder.itemView;
|
|
textCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
|
|
if (position == proxyAddRow) {
|
|
textCell.setText(LocaleController.getString("AddProxy", R.string.AddProxy), false);
|
|
}
|
|
break;
|
|
}
|
|
case 2: {
|
|
HeaderCell headerCell = (HeaderCell) holder.itemView;
|
|
if (position == connectionsHeaderRow) {
|
|
headerCell.setText(LocaleController.getString("ProxyConnections", R.string.ProxyConnections));
|
|
}
|
|
break;
|
|
}
|
|
case 3: {
|
|
TextCheckCell checkCell = (TextCheckCell) holder.itemView;
|
|
if (position == useProxyRow) {
|
|
checkCell.setTextAndCheck(LocaleController.getString("UseProxySettings", R.string.UseProxySettings), useProxySettings, false);
|
|
} else if (position == callsRow) {
|
|
checkCell.setTextAndCheck(LocaleController.getString("UseProxyForCalls", R.string.UseProxyForCalls), useProxyForCalls, false);
|
|
}
|
|
break;
|
|
}
|
|
case 4: {
|
|
TextInfoPrivacyCell cell = (TextInfoPrivacyCell) holder.itemView;
|
|
if (position == callsDetailRow) {
|
|
cell.setText(LocaleController.getString("UseProxyForCallsInfo", R.string.UseProxyForCallsInfo));
|
|
cell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow));
|
|
}
|
|
break;
|
|
}
|
|
case 5: {
|
|
TextDetailProxyCell cell = (TextDetailProxyCell) holder.itemView;
|
|
SharedConfig.ProxyInfo info = SharedConfig.proxyList.get(position - proxyStartRow);
|
|
cell.setProxy(info);
|
|
cell.setChecked(SharedConfig.currentProxy == info);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) {
|
|
if (holder.getItemViewType() == 3 && payloads.contains(PAYLOAD_CHECKED_CHANGED)) {
|
|
TextCheckCell checkCell = (TextCheckCell) holder.itemView;
|
|
if (position == useProxyRow) {
|
|
checkCell.setChecked(useProxySettings);
|
|
} else if (position == callsRow) {
|
|
checkCell.setChecked(useProxyForCalls);
|
|
}
|
|
} else {
|
|
super.onBindViewHolder(holder, position, payloads);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
|
|
int viewType = holder.getItemViewType();
|
|
if (viewType == 3) {
|
|
TextCheckCell checkCell = (TextCheckCell) holder.itemView;
|
|
int position = holder.getAdapterPosition();
|
|
if (position == useProxyRow) {
|
|
checkCell.setChecked(useProxySettings);
|
|
} else if (position == callsRow) {
|
|
checkCell.setChecked(useProxyForCalls);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isEnabled(RecyclerView.ViewHolder holder) {
|
|
int position = holder.getAdapterPosition();
|
|
return position == useProxyRow || position == callsRow || position == proxyAddRow || position >= proxyStartRow && position < proxyEndRow;
|
|
}
|
|
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
View view = null;
|
|
switch (viewType) {
|
|
case 0:
|
|
view = new ShadowSectionCell(mContext);
|
|
break;
|
|
case 1:
|
|
view = new TextSettingsCell(mContext);
|
|
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
|
|
break;
|
|
case 2:
|
|
view = new HeaderCell(mContext);
|
|
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
|
|
break;
|
|
case 3:
|
|
view = new TextCheckCell(mContext);
|
|
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
|
|
break;
|
|
case 4:
|
|
view = new TextInfoPrivacyCell(mContext);
|
|
view.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow));
|
|
break;
|
|
case 5:
|
|
view = new TextDetailProxyCell(mContext);
|
|
view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
|
|
break;
|
|
}
|
|
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
|
|
return new RecyclerListView.Holder(view);
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
if (position == useProxyDetailRow || position == proxyDetailRow) {
|
|
return 0;
|
|
} else if (position == proxyAddRow) {
|
|
return 1;
|
|
} else if (position == useProxyRow || position == callsRow) {
|
|
return 3;
|
|
} else if (position == connectionsHeaderRow) {
|
|
return 2;
|
|
} else if (position >= proxyStartRow && position < proxyEndRow) {
|
|
return 5;
|
|
} else {
|
|
return 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public ArrayList<ThemeDescription> getThemeDescriptions() {
|
|
ArrayList<ThemeDescription> themeDescriptions = new ArrayList<>();
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextSettingsCell.class, TextCheckCell.class, HeaderCell.class, TextDetailProxyCell.class}, null, null, null, Theme.key_windowBackgroundWhite));
|
|
themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray));
|
|
|
|
themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault));
|
|
themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon));
|
|
themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle));
|
|
themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteValueText));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextDetailProxyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG | ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailProxyCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText6));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG | ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailProxyCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG | ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailProxyCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGreenText));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG | ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailProxyCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteRedText4));
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{TextDetailProxyCell.class}, new String[]{"checkImageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText3));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText));
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2));
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrack));
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrackChecked));
|
|
|
|
themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow));
|
|
themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4));
|
|
|
|
return themeDescriptions;
|
|
}
|
|
}
|