/* * 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 getThemeDescriptions() { ArrayList 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; } }