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

699 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;
}
}
}
@SuppressWarnings("unchecked")
@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;
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:
default:
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;
}
}