/* * 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.annotation.SuppressLint; import android.content.Context; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; 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.StickerSetCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.StickerEmptyView; import org.telegram.ui.Components.StickersAlert; import org.telegram.ui.Components.URLSpanNoUnderline; import org.telegram.ui.Components.VerticalPositionAutoAnimator; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; public class GroupStickersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private FrameLayout emptyFrameView; private StickerEmptyView emptyView; private FlickerLoadingView loadingView; private RecyclerListView listView; private ListAdapter listAdapter; private SearchAdapter searchAdapter; private LinearLayoutManager layoutManager; private int selectedStickerSetIndex = -1; private TLRPC.TL_messages_stickerSet selectedStickerSet; private boolean removeStickerSet; private TLRPC.ChatFull info; private long chatId; private int infoRow; private int headerRow; private int stickersStartRow; private int stickersEndRow; private int rowCount; private ActionBarMenuItem searchItem; private boolean searching; public GroupStickersActivity(long id) { super(); chatId = id; } @Override public boolean onFragmentCreate() { super.onFragmentCreate(); MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_IMAGE); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.chatInfoDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); updateRows(); return true; } @Override public void onFragmentDestroy() { super.onFragmentDestroy(); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.chatInfoDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.groupStickersDidLoad); if (selectedStickerSet != null || removeStickerSet) { saveStickerSet(); } } @Override public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("GroupStickers", R.string.GroupStickers)); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { finishFragment(); } } }); ActionBarMenu menu = actionBar.createMenu(); searchItem = menu.addItem(0, R.drawable.ic_ab_search); searchItem.setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { @Override public void onSearchExpand() {} @Override public void onSearchCollapse() { if (searching) { searchAdapter.onSearchStickers(null); searching = false; listView.setAdapter(listAdapter); } } @Override public void onTextChanged(EditText editText) { String text = editText.getText().toString(); searchAdapter.onSearchStickers(text); boolean newSearching = !TextUtils.isEmpty(text); if (newSearching != searching) { searching = newSearching; if (listView != null) { listView.setAdapter(searching ? searchAdapter : listAdapter); } } } }); searchItem.setSearchFieldHint(LocaleController.getString(R.string.Search)); listAdapter = new ListAdapter(context); searchAdapter = new SearchAdapter(context); fragmentView = new FrameLayout(context); FrameLayout frameLayout = (FrameLayout) fragmentView; frameLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); listView = new RecyclerListView(context); DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator(); defaultItemAnimator.setSupportsChangeAnimations(true); listView.setItemAnimator(defaultItemAnimator); layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); listView.setLayoutManager(layoutManager); emptyFrameView = new FrameLayout(context); emptyFrameView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); loadingView = new FlickerLoadingView(context, getResourceProvider()); loadingView.setViewType(FlickerLoadingView.STICKERS_TYPE); loadingView.setIsSingleCell(true); loadingView.setItemsCount((int) Math.ceil(AndroidUtilities.displaySize.y / AndroidUtilities.dpf2(58))); emptyFrameView.addView(loadingView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); emptyView = new StickerEmptyView(context, loadingView, StickerEmptyView.STICKER_TYPE_SEARCH); VerticalPositionAutoAnimator.attach(emptyView); emptyFrameView.addView(emptyView); frameLayout.addView(emptyFrameView); emptyFrameView.setVisibility(View.GONE); listView.setEmptyView(emptyFrameView); frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setAdapter(listAdapter); listView.setOnItemClickListener((view, position) -> { if (getParentActivity() == null) { return; } if (searching) { if (position > searchAdapter.searchEntries.size()) { onStickerSetClicked(view, searchAdapter.localSearchEntries.get(position - searchAdapter.searchEntries.size() - 1), false); } else if (position != searchAdapter.searchEntries.size()) { onStickerSetClicked(view, searchAdapter.searchEntries.get(position), true); } return; } if (position >= stickersStartRow && position < stickersEndRow) { TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE).get(position - stickersStartRow); onStickerSetClicked(view, stickerSet, false); } }); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); } } }); return fragmentView; } private void onStickerSetClicked(View view, TLRPC.TL_messages_stickerSet stickerSet, boolean remote) { TLRPC.InputStickerSet inputStickerSet = null; if (remote) { TLRPC.TL_inputStickerSetShortName inputStickerSetShortName = new TLRPC.TL_inputStickerSetShortName(); inputStickerSetShortName.short_name = stickerSet.set.short_name; inputStickerSet = inputStickerSetShortName; } StickersAlert stickersAlert = new StickersAlert(getParentActivity(), GroupStickersActivity.this, inputStickerSet, !remote ? stickerSet : null, null); boolean isSelected = ((StickerSetCell) view).isChecked(); stickersAlert.setCustomButtonDelegate(new StickersAlert.StickersAlertCustomButtonDelegate() { @Override public String getCustomButtonTextColorKey() { return isSelected ? Theme.key_dialogTextRed : Theme.key_featuredStickers_buttonText; } @Override public String getCustomButtonRippleColorKey() { return !isSelected ? Theme.key_featuredStickers_addButtonPressed : null; } @Override public String getCustomButtonColorKey() { return !isSelected ? Theme.key_featuredStickers_addButton : null; } @Override public String getCustomButtonText() { return LocaleController.getString(isSelected ? R.string.RemoveGroupStickerSet : R.string.SetAsGroupStickerSet); } @Override public boolean onCustomButtonPressed() { int row = layoutManager.findFirstVisibleItemPosition(); int top = Integer.MAX_VALUE; RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(row); if (holder != null) { top = holder.itemView.getTop(); } int prevIndex = selectedStickerSetIndex; if (isSelected) { selectedStickerSet = null; removeStickerSet = true; } else { selectedStickerSet = stickerSet; removeStickerSet = false; } updateSelectedStickerSetIndex(); if (prevIndex != -1) { boolean found = false; if (!searching) { for (int i = 0; i < listView.getChildCount(); i++) { View ch = listView.getChildAt(i); if (listView.getChildViewHolder(ch).getAdapterPosition() == stickersStartRow + prevIndex) { ((StickerSetCell) ch).setChecked(false, true); found = true; break; } } } if (!found) { listAdapter.notifyItemChanged(prevIndex); } } if (selectedStickerSetIndex != -1) { boolean found = false; if (!searching) { for (int i = 0; i < listView.getChildCount(); i++) { View ch = listView.getChildAt(i); if (listView.getChildViewHolder(ch).getAdapterPosition() == stickersStartRow + selectedStickerSetIndex) { ((StickerSetCell) ch).setChecked(true, true); found = true; break; } } } if (!found) { listAdapter.notifyItemChanged(selectedStickerSetIndex); } } if (top != Integer.MAX_VALUE) { layoutManager.scrollToPositionWithOffset(row + 1, top); } if (searching) { searchItem.setSearchFieldText("", false); actionBar.closeSearchField(true); } return true; } }); stickersAlert.show(); } @Override public void didReceivedNotification(int id, int account, Object... args) { if (id == NotificationCenter.stickersDidLoad) { if ((Integer) args[0] == MediaDataController.TYPE_IMAGE) { updateRows(); } } else if (id == NotificationCenter.chatInfoDidLoad) { TLRPC.ChatFull chatFull = (TLRPC.ChatFull) args[0]; if (chatFull.id == chatId) { if (info == null && chatFull.stickerset != null) { selectedStickerSet = MediaDataController.getInstance(currentAccount).getGroupStickerSetById(chatFull.stickerset); } info = chatFull; updateRows(); } } else if (id == NotificationCenter.groupStickersDidLoad) { long setId = (Long) args[0]; if (info != null && info.stickerset != null && info.stickerset.id == setId) { updateRows(); } } } public void setInfo(TLRPC.ChatFull chatFull) { info = chatFull; if (info != null && info.stickerset != null) { selectedStickerSet = MediaDataController.getInstance(currentAccount).getGroupStickerSetById(info.stickerset); } } private void saveStickerSet() { if (info == null || info.stickerset != null && selectedStickerSet != null && selectedStickerSet.set.id == info.stickerset.id || info.stickerset == null && selectedStickerSet == null) { return; } TLRPC.TL_channels_setStickers req = new TLRPC.TL_channels_setStickers(); req.channel = MessagesController.getInstance(currentAccount).getInputChannel(chatId); if (removeStickerSet) { req.stickerset = new TLRPC.TL_inputStickerSetEmpty(); } else { MessagesController.getEmojiSettings(currentAccount).edit().remove("group_hide_stickers_" + info.id).apply(); req.stickerset = new TLRPC.TL_inputStickerSetID(); req.stickerset.id = selectedStickerSet.set.id; req.stickerset.access_hash = selectedStickerSet.set.access_hash; } ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { if (selectedStickerSet == null) { info.stickerset = null; } else { info.stickerset = selectedStickerSet.set; MediaDataController.getInstance(currentAccount).putGroupStickerSet(selectedStickerSet); } updateSelectedStickerSetIndex(); if (info.stickerset == null) { info.flags |= 256; } else { info.flags = info.flags &~ 256; } MessagesStorage.getInstance(currentAccount).updateChatInfo(info, false); NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, info, 0, true, false); finishFragment(); } else { if (getParentActivity() != null) { Toast.makeText(getParentActivity(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text, Toast.LENGTH_SHORT).show(); } } })); } private void updateSelectedStickerSetIndex() { ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE); selectedStickerSetIndex = -1; long selectedSet; if (removeStickerSet) { selectedSet = 0; } else if (selectedStickerSet != null) { selectedSet = selectedStickerSet.set.id; } else if (info != null && info.stickerset != null) { selectedSet = info.stickerset.id; } else { selectedSet = 0; } if (selectedSet != 0) { for (int i = 0; i < stickerSets.size(); i++) { TLRPC.TL_messages_stickerSet set = stickerSets.get(i); if (set.set.id == selectedSet) { selectedStickerSetIndex = i; break; } } } } @SuppressLint("NotifyDataSetChanged") private void updateRows() { rowCount = 0; ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE); if (!stickerSets.isEmpty()) { headerRow = rowCount++; stickersStartRow = rowCount; stickersEndRow = rowCount + stickerSets.size(); rowCount += stickerSets.size(); } else { headerRow = -1; stickersStartRow = -1; stickersEndRow = -1; } infoRow = rowCount++; updateSelectedStickerSetIndex(); if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } } private class SearchAdapter extends RecyclerListView.SelectionAdapter { private final static int TYPE_STICKER_SET = 0, TYPE_MY_STICKERS_HEADER = 1; private Context mContext; private List searchEntries = new ArrayList<>(); private List localSearchEntries = new ArrayList<>(); private Runnable lastCallback; private String lastQuery; private int reqId; public SearchAdapter(Context context) { mContext = context; setHasStableIds(true); } @Override public long getItemId(int position) { if (getItemViewType(position) == TYPE_STICKER_SET) { List arrayList = position > searchEntries.size() ? localSearchEntries : searchEntries; int row = position > searchEntries.size() ? position - searchEntries.size() - 1 : position; return arrayList.get(row).set.id; } return -1; } @SuppressLint("NotifyDataSetChanged") private void onSearchStickers(String query) { if (reqId != 0) { getConnectionsManager().cancelRequest(reqId, true); reqId = 0; } if (lastCallback != null) { AndroidUtilities.cancelRunOnUIThread(lastCallback); lastCallback = null; } lastQuery = null; int count = getItemCount(); if (count > 0) { searchEntries.clear(); localSearchEntries.clear(); notifyItemRangeRemoved(0, count); } if (TextUtils.isEmpty(query)) { emptyView.setVisibility(View.GONE); emptyView.showProgress(false, true); return; } if (emptyView.getVisibility() != View.VISIBLE) { emptyView.setVisibility(View.VISIBLE); emptyView.showProgress(true, false); } else { emptyView.showProgress(true, true); } AndroidUtilities.runOnUIThread(lastCallback = ()-> { lastQuery = query; TLRPC.TL_messages_searchStickerSets searchStickerSets = new TLRPC.TL_messages_searchStickerSets(); searchStickerSets.q = query; reqId = getConnectionsManager().sendRequest(searchStickerSets, (response, error) -> { if (!Objects.equals(lastQuery, searchStickerSets.q)) { return; } if (response instanceof TLRPC.TL_messages_foundStickerSets) { List newSearchEntries = new ArrayList<>(); TLRPC.TL_messages_foundStickerSets foundStickerSets = (TLRPC.TL_messages_foundStickerSets) response; for (TLRPC.StickerSetCovered stickerSetCovered : foundStickerSets.sets) { TLRPC.TL_messages_stickerSet set = new TLRPC.TL_messages_stickerSet(); set.set = stickerSetCovered.set; set.documents = stickerSetCovered.covers; newSearchEntries.add(set); } String lowQuery = query.toLowerCase(Locale.ROOT).trim(); List newLocalEntries = new ArrayList<>(); for (TLRPC.TL_messages_stickerSet localSet : MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE)) { if (localSet.set.short_name.toLowerCase(Locale.ROOT).contains(lowQuery) || localSet.set.title.toLowerCase(Locale.ROOT).contains(lowQuery)) { newLocalEntries.add(localSet); } } AndroidUtilities.runOnUIThread(()->{ searchEntries = newSearchEntries; localSearchEntries = newLocalEntries; notifyDataSetChanged(); emptyView.title.setVisibility(View.GONE); emptyView.subtitle.setText(LocaleController.formatString(R.string.ChooseStickerNoResultsFound, query)); emptyView.showProgress(false, true); }); } }, ConnectionsManager.RequestFlagInvokeAfter | ConnectionsManager.RequestFlagFailOnServerErrors); }, 300); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view; switch (viewType) { case TYPE_STICKER_SET: view = new StickerSetCell(mContext, 3); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; default: case TYPE_MY_STICKERS_HEADER: view = new HeaderCell(mContext, Theme.key_windowBackgroundWhiteGrayText4, 21, 0, 0, false, getResourceProvider()); view.setBackground(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); ((HeaderCell) view).setText(LocaleController.getString(R.string.ChooseStickerMyStickerSets)); break; } view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)); return new RecyclerListView.Holder(view); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case TYPE_STICKER_SET: { boolean local = position > searchEntries.size(); List arrayList = local ? localSearchEntries : searchEntries; int row = local ? position - searchEntries.size() - 1 : position; StickerSetCell cell = (StickerSetCell) holder.itemView; TLRPC.TL_messages_stickerSet set = arrayList.get(row); cell.setStickersSet(set, row != arrayList.size() - 1, !local); cell.setSearchQuery(set, lastQuery != null ? lastQuery.toLowerCase(Locale.ROOT) : "", getResourceProvider()); long id; if (selectedStickerSet != null) { id = selectedStickerSet.set.id; } else if (info != null && info.stickerset != null) { id = info.stickerset.id; } else { id = 0; } cell.setChecked(set.set.id == id, false); break; } } } @Override public int getItemViewType(int position) { return searchEntries.size() == position ? TYPE_MY_STICKERS_HEADER : TYPE_STICKER_SET; } @Override public int getItemCount() { return searchEntries.size() + localSearchEntries.size() + (localSearchEntries.isEmpty() ? 0 : 1); } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int viewType = getItemViewType(holder.getAdapterPosition()); return viewType == TYPE_STICKER_SET; } } private class ListAdapter extends RecyclerListView.SelectionAdapter { private final static int TYPE_STICKER_SET = 0, TYPE_INFO = 1, TYPE_CHOOSE_HEADER = 4; 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 TYPE_STICKER_SET: { ArrayList arrayList = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE); int row = position - stickersStartRow; StickerSetCell cell = (StickerSetCell) holder.itemView; TLRPC.TL_messages_stickerSet set = arrayList.get(row); cell.setStickersSet(arrayList.get(row), row != arrayList.size() - 1); long id; if (selectedStickerSet != null) { id = selectedStickerSet.set.id; } else if (info != null && info.stickerset != null) { id = info.stickerset.id; } else { id = 0; } cell.setChecked(set.set.id == id, false); break; } case TYPE_INFO: { if (position == infoRow) { String text = LocaleController.getString("ChooseStickerSetMy", R.string.ChooseStickerSetMy); String botName = "@stickers"; int index = text.indexOf(botName); if (index != -1) { try { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text); URLSpanNoUnderline spanNoUnderline = new URLSpanNoUnderline("@stickers") { @Override public void onClick(View widget) { MessagesController.getInstance(currentAccount).openByUserName("stickers", GroupStickersActivity.this, 1); } }; stringBuilder.setSpan(spanNoUnderline, index, index + botName.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); ((TextInfoPrivacyCell) holder.itemView).setText(stringBuilder); } catch (Exception e) { FileLog.e(e); ((TextInfoPrivacyCell) holder.itemView).setText(text); } } else { ((TextInfoPrivacyCell) holder.itemView).setText(text); } } break; } case TYPE_CHOOSE_HEADER: { ((HeaderCell) holder.itemView).setText(LocaleController.getString(R.string.ChooseStickerSetHeader)); break; } } } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int type = holder.getItemViewType(); return type == TYPE_STICKER_SET; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view; switch (viewType) { case TYPE_STICKER_SET: view = new StickerSetCell(mContext, 3); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case TYPE_INFO: view = new TextInfoPrivacyCell(mContext); view.setBackground(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); break; case TYPE_CHOOSE_HEADER: default: view = new HeaderCell(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 i) { if (i >= stickersStartRow && i < stickersEndRow) { return TYPE_STICKER_SET; } else if (i == headerRow) { return TYPE_CHOOSE_HEADER; } else if (i == infoRow) { return TYPE_INFO; } return TYPE_STICKER_SET; } } @Override public ArrayList getThemeDescriptions() { ArrayList themeDescriptions = new ArrayList<>(); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{StickerSetCell.class, TextSettingsCell.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[]{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)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_LINKCOLOR, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteLinkText)); 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, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{StickerSetCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{StickerSetCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, new Class[]{StickerSetCell.class}, new String[]{"optionsButton"}, null, null, null, Theme.key_stickers_menuSelector)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{StickerSetCell.class}, new String[]{"optionsButton"}, null, null, null, Theme.key_stickers_menu)); return themeDescriptions; } }