2017-03-31 01:58:05 +02:00
|
|
|
|
/*
|
2019-01-23 18:03:33 +01:00
|
|
|
|
* This is the source code of Telegram for Android v. 5.x.x.
|
2017-03-31 01:58:05 +02:00
|
|
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
|
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
|
|
|
*
|
2019-01-23 18:03:33 +01:00
|
|
|
|
* Copyright Nikolai Kudashov, 2013-2018.
|
2017-03-31 01:58:05 +02:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package org.telegram.ui;
|
|
|
|
|
|
|
|
|
|
import android.animation.ObjectAnimator;
|
|
|
|
|
import android.animation.StateListAnimator;
|
|
|
|
|
import android.annotation.SuppressLint;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.database.DataSetObserver;
|
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
|
import android.graphics.Outline;
|
|
|
|
|
import android.graphics.Paint;
|
|
|
|
|
import android.graphics.PorterDuff;
|
|
|
|
|
import android.graphics.PorterDuffColorFilter;
|
|
|
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.support.v4.view.PagerAdapter;
|
|
|
|
|
import android.support.v4.view.ViewPager;
|
|
|
|
|
import android.text.style.CharacterStyle;
|
|
|
|
|
import android.util.TypedValue;
|
|
|
|
|
import android.view.Gravity;
|
|
|
|
|
import android.view.View;
|
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
|
import android.view.ViewOutlineProvider;
|
|
|
|
|
import android.widget.EditText;
|
|
|
|
|
import android.widget.FrameLayout;
|
|
|
|
|
import android.widget.ImageView;
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
|
|
|
import org.telegram.messenger.LocaleController;
|
|
|
|
|
import org.telegram.messenger.MessageObject;
|
|
|
|
|
import org.telegram.messenger.NotificationCenter;
|
|
|
|
|
import org.telegram.messenger.R;
|
|
|
|
|
import org.telegram.messenger.UserConfig;
|
|
|
|
|
import org.telegram.messenger.support.widget.LinearLayoutManager;
|
|
|
|
|
import org.telegram.messenger.support.widget.RecyclerView;
|
|
|
|
|
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.BackDrawable;
|
|
|
|
|
import org.telegram.ui.ActionBar.BaseFragment;
|
|
|
|
|
import org.telegram.ui.ActionBar.MenuDrawable;
|
|
|
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
|
import org.telegram.ui.Cells.ChatActionCell;
|
|
|
|
|
import org.telegram.ui.Cells.ChatMessageCell;
|
|
|
|
|
import org.telegram.ui.Cells.DialogCell;
|
|
|
|
|
import org.telegram.ui.Cells.LoadingCell;
|
|
|
|
|
import org.telegram.ui.Components.CombinedDrawable;
|
|
|
|
|
import org.telegram.ui.Components.LayoutHelper;
|
|
|
|
|
import org.telegram.ui.Components.RecyclerListView;
|
|
|
|
|
import org.telegram.ui.Components.SizeNotifierFrameLayout;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
|
|
public class ThemePreviewActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
|
|
|
|
|
|
|
|
|
|
private FrameLayout page1;
|
|
|
|
|
private RecyclerListView listView;
|
|
|
|
|
private DialogsAdapter dialogsAdapter;
|
|
|
|
|
private ImageView floatingButton;
|
|
|
|
|
private View dotsContainer;
|
|
|
|
|
private ActionBar actionBar2;
|
|
|
|
|
|
|
|
|
|
private SizeNotifierFrameLayout page2;
|
|
|
|
|
private RecyclerListView listView2;
|
|
|
|
|
private MessagesAdapter messagesAdapter;
|
|
|
|
|
|
|
|
|
|
private Theme.ThemeInfo applyingTheme;
|
|
|
|
|
private File themeFile;
|
|
|
|
|
private boolean applied;
|
|
|
|
|
|
|
|
|
|
public ThemePreviewActivity(File file, Theme.ThemeInfo themeInfo) {
|
|
|
|
|
super();
|
|
|
|
|
swipeBackEnabled = false;
|
|
|
|
|
applyingTheme = themeInfo;
|
|
|
|
|
themeFile = file;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public View createView(Context context) {
|
|
|
|
|
page1 = new FrameLayout(context);
|
|
|
|
|
ActionBarMenu menu = actionBar.createMenu();
|
|
|
|
|
final ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onSearchExpand() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canCollapseSearch() {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onSearchCollapse() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onTextChanged(EditText editText) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
2019-01-23 18:03:33 +01:00
|
|
|
|
item.setSearchFieldHint(LocaleController.getString("Search", R.string.Search));
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
actionBar.setBackButtonDrawable(new MenuDrawable());
|
|
|
|
|
actionBar.setAddToContainer(false);
|
|
|
|
|
actionBar.setTitle(LocaleController.getString("ThemePreview", R.string.ThemePreview));
|
|
|
|
|
|
|
|
|
|
page1 = new FrameLayout(context) {
|
|
|
|
|
@Override
|
|
|
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
|
|
|
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
|
|
|
|
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
|
|
|
|
|
|
setMeasuredDimension(widthSize, heightSize);
|
|
|
|
|
|
|
|
|
|
measureChildWithMargins(actionBar, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
|
|
|
int actionBarHeight = actionBar.getMeasuredHeight();
|
|
|
|
|
if (actionBar.getVisibility() == VISIBLE) {
|
|
|
|
|
heightSize -= actionBarHeight;
|
|
|
|
|
}
|
|
|
|
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams();
|
|
|
|
|
layoutParams.topMargin = actionBarHeight;
|
|
|
|
|
listView.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY));
|
|
|
|
|
|
|
|
|
|
measureChildWithMargins(floatingButton, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
|
|
|
|
boolean result = super.drawChild(canvas, child, drawingTime);
|
|
|
|
|
if (child == actionBar && parentLayout != null) {
|
|
|
|
|
parentLayout.drawHeaderShadow(canvas, actionBar.getVisibility() == VISIBLE ? actionBar.getMeasuredHeight() : 0);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
page1.addView(actionBar, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
|
|
|
|
|
|
|
|
|
|
listView = new RecyclerListView(context);
|
|
|
|
|
listView.setVerticalScrollBarEnabled(true);
|
|
|
|
|
listView.setItemAnimator(null);
|
|
|
|
|
listView.setLayoutAnimation(null);
|
|
|
|
|
listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
|
|
|
|
|
listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT);
|
|
|
|
|
page1.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP));
|
|
|
|
|
|
|
|
|
|
floatingButton = new ImageView(context);
|
|
|
|
|
floatingButton.setScaleType(ImageView.ScaleType.CENTER);
|
|
|
|
|
|
|
|
|
|
Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground));
|
|
|
|
|
if (Build.VERSION.SDK_INT < 21) {
|
|
|
|
|
Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow).mutate();
|
|
|
|
|
shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY));
|
|
|
|
|
CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0);
|
|
|
|
|
combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56));
|
|
|
|
|
drawable = combinedDrawable;
|
|
|
|
|
}
|
|
|
|
|
floatingButton.setBackgroundDrawable(drawable);
|
|
|
|
|
floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY));
|
|
|
|
|
floatingButton.setImageResource(R.drawable.floating_pencil);
|
|
|
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
|
|
|
StateListAnimator animator = new StateListAnimator();
|
|
|
|
|
animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200));
|
|
|
|
|
animator.addState(new int[]{}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200));
|
|
|
|
|
floatingButton.setStateListAnimator(animator);
|
|
|
|
|
floatingButton.setOutlineProvider(new ViewOutlineProvider() {
|
|
|
|
|
@SuppressLint("NewApi")
|
|
|
|
|
@Override
|
|
|
|
|
public void getOutline(View view, Outline outline) {
|
|
|
|
|
outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
page1.addView(floatingButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 56 : 60, Build.VERSION.SDK_INT >= 21 ? 56 : 60, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM, LocaleController.isRTL ? 14 : 0, 0, LocaleController.isRTL ? 0 : 14, 14));
|
|
|
|
|
|
|
|
|
|
dialogsAdapter = new DialogsAdapter(context);
|
|
|
|
|
listView.setAdapter(dialogsAdapter);
|
|
|
|
|
|
|
|
|
|
page2 = new SizeNotifierFrameLayout(context) {
|
|
|
|
|
@Override
|
|
|
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
|
|
|
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
|
|
|
|
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
|
|
|
|
|
|
setMeasuredDimension(widthSize, heightSize);
|
|
|
|
|
|
|
|
|
|
measureChildWithMargins(actionBar2, widthMeasureSpec, 0, heightMeasureSpec, 0);
|
|
|
|
|
int actionBarHeight = actionBar2.getMeasuredHeight();
|
|
|
|
|
if (actionBar2.getVisibility() == VISIBLE) {
|
|
|
|
|
heightSize -= actionBarHeight;
|
|
|
|
|
}
|
|
|
|
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView2.getLayoutParams();
|
|
|
|
|
layoutParams.topMargin = actionBarHeight;
|
|
|
|
|
listView2.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
|
|
|
|
boolean result = super.drawChild(canvas, child, drawingTime);
|
|
|
|
|
if (child == actionBar2 && parentLayout != null) {
|
|
|
|
|
parentLayout.drawHeaderShadow(canvas, actionBar2.getVisibility() == VISIBLE ? actionBar2.getMeasuredHeight() : 0);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
};
|
2019-01-23 18:03:33 +01:00
|
|
|
|
page2.setBackgroundImage(Theme.getCachedWallpaper(), Theme.isWallpaperMotion());
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
actionBar2 = createActionBar(context);
|
|
|
|
|
actionBar2.setBackButtonDrawable(new BackDrawable(false));
|
|
|
|
|
actionBar2.setTitle("Reinhardt");
|
|
|
|
|
actionBar2.setSubtitle(LocaleController.formatDateOnline(System.currentTimeMillis() / 1000 - 60 * 60));
|
|
|
|
|
page2.addView(actionBar2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
|
|
|
|
|
|
|
|
|
|
listView2 = new RecyclerListView(context);
|
|
|
|
|
listView2.setVerticalScrollBarEnabled(true);
|
|
|
|
|
listView2.setItemAnimator(null);
|
|
|
|
|
listView2.setLayoutAnimation(null);
|
|
|
|
|
listView2.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4));
|
|
|
|
|
listView2.setClipToPadding(false);
|
|
|
|
|
listView2.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true));
|
|
|
|
|
listView2.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT);
|
|
|
|
|
page2.addView(listView2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP));
|
|
|
|
|
|
|
|
|
|
messagesAdapter = new MessagesAdapter(context);
|
|
|
|
|
listView2.setAdapter(messagesAdapter);
|
|
|
|
|
|
|
|
|
|
fragmentView = new FrameLayout(context);
|
|
|
|
|
FrameLayout frameLayout = (FrameLayout) fragmentView;
|
|
|
|
|
|
|
|
|
|
final ViewPager viewPager = new ViewPager(context);
|
|
|
|
|
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPageSelected(int position) {
|
|
|
|
|
dotsContainer.invalidate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPageScrollStateChanged(int state) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
viewPager.setAdapter(new PagerAdapter() {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getCount() {
|
|
|
|
|
return 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isViewFromObject(View view, Object object) {
|
|
|
|
|
return object == view;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getItemPosition(Object object) {
|
|
|
|
|
return POSITION_UNCHANGED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object instantiateItem(ViewGroup container, int position) {
|
|
|
|
|
View view = position == 0 ? page1 : page2;
|
|
|
|
|
container.addView(view);
|
|
|
|
|
return view;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void destroyItem(ViewGroup container, int position, Object object) {
|
|
|
|
|
container.removeView((View) object);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void unregisterDataSetObserver(DataSetObserver observer) {
|
|
|
|
|
if (observer != null) {
|
|
|
|
|
super.unregisterDataSetObserver(observer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
AndroidUtilities.setViewPagerEdgeEffectColor(viewPager, Theme.getColor(Theme.key_actionBarDefault));
|
|
|
|
|
frameLayout.addView(viewPager, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 48));
|
|
|
|
|
|
|
|
|
|
View shadow = new View(context);
|
|
|
|
|
shadow.setBackgroundResource(R.drawable.header_shadow_reverse);
|
|
|
|
|
frameLayout.addView(shadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 3, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 48));
|
|
|
|
|
|
|
|
|
|
FrameLayout bottomLayout = new FrameLayout(context);
|
|
|
|
|
bottomLayout.setBackgroundColor(0xffffffff);
|
|
|
|
|
frameLayout.addView(bottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM));
|
|
|
|
|
|
|
|
|
|
dotsContainer = new View(context) {
|
|
|
|
|
|
|
|
|
|
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onDraw(Canvas canvas) {
|
|
|
|
|
int selected = viewPager.getCurrentItem();
|
|
|
|
|
for (int a = 0; a < 2; a++) {
|
|
|
|
|
paint.setColor(a == selected ? 0xff999999 : 0xffcccccc);
|
|
|
|
|
canvas.drawCircle(AndroidUtilities.dp(3 + 15 * a), AndroidUtilities.dp(4), AndroidUtilities.dp(3), paint);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
bottomLayout.addView(dotsContainer, LayoutHelper.createFrame(22, 8, Gravity.CENTER));
|
|
|
|
|
|
|
|
|
|
TextView cancelButton = new TextView(context);
|
|
|
|
|
cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
|
|
|
cancelButton.setTextColor(0xff19a7e8);
|
|
|
|
|
cancelButton.setGravity(Gravity.CENTER);
|
|
|
|
|
cancelButton.setBackgroundDrawable(Theme.createSelectorDrawable(0x2f000000, 0));
|
|
|
|
|
cancelButton.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0);
|
|
|
|
|
cancelButton.setText(LocaleController.getString("Cancel", R.string.Cancel).toUpperCase());
|
|
|
|
|
cancelButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
|
|
|
bottomLayout.addView(cancelButton, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT));
|
2019-01-23 18:03:33 +01:00
|
|
|
|
cancelButton.setOnClickListener(v -> {
|
|
|
|
|
Theme.applyPreviousTheme();
|
|
|
|
|
parentLayout.rebuildAllFragmentViews(false, false);
|
|
|
|
|
finishFragment();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
TextView doneButton = new TextView(context);
|
|
|
|
|
doneButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
|
|
|
|
doneButton.setTextColor(0xff19a7e8);
|
|
|
|
|
doneButton.setGravity(Gravity.CENTER);
|
|
|
|
|
doneButton.setBackgroundDrawable(Theme.createSelectorDrawable(0x2f000000, 0));
|
|
|
|
|
doneButton.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0);
|
|
|
|
|
doneButton.setText(LocaleController.getString("ApplyTheme", R.string.ApplyTheme).toUpperCase());
|
|
|
|
|
doneButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
|
|
|
|
bottomLayout.addView(doneButton, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.RIGHT));
|
2019-01-23 18:03:33 +01:00
|
|
|
|
doneButton.setOnClickListener(v -> {
|
|
|
|
|
applied = true;
|
|
|
|
|
parentLayout.rebuildAllFragmentViews(false, false);
|
|
|
|
|
Theme.applyThemeFile(themeFile, applyingTheme.name, false);
|
|
|
|
|
finishFragment();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return fragmentView;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onFragmentCreate() {
|
2019-01-23 18:03:33 +01:00
|
|
|
|
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiDidLoad);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
return super.onFragmentCreate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onFragmentDestroy() {
|
2019-01-23 18:03:33 +01:00
|
|
|
|
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiDidLoad);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
super.onFragmentDestroy();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onResume() {
|
|
|
|
|
super.onResume();
|
|
|
|
|
if (dialogsAdapter != null) {
|
|
|
|
|
dialogsAdapter.notifyDataSetChanged();
|
|
|
|
|
}
|
|
|
|
|
if (messagesAdapter != null) {
|
|
|
|
|
messagesAdapter.notifyDataSetChanged();
|
|
|
|
|
}
|
2019-01-23 18:03:33 +01:00
|
|
|
|
if (page2 != null) {
|
|
|
|
|
page2.onResume();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPause() {
|
|
|
|
|
super.onPause();
|
|
|
|
|
if (page2 != null) {
|
|
|
|
|
page2.onResume();
|
|
|
|
|
}
|
2017-03-31 01:58:05 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onBackPressed() {
|
|
|
|
|
Theme.applyPreviousTheme();
|
2017-07-08 18:32:04 +02:00
|
|
|
|
parentLayout.rebuildAllFragmentViews(false, false);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
return super.onBackPressed();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@SuppressWarnings("unchecked")
|
2018-07-30 04:07:02 +02:00
|
|
|
|
public void didReceivedNotification(int id, int account, Object... args) {
|
2019-01-23 18:03:33 +01:00
|
|
|
|
if (id == NotificationCenter.emojiDidLoad) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
if (listView == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int count = listView.getChildCount();
|
|
|
|
|
for (int a = 0; a < count; a++) {
|
|
|
|
|
View child = listView.getChildAt(a);
|
|
|
|
|
if (child instanceof DialogCell) {
|
|
|
|
|
DialogCell cell = (DialogCell) child;
|
|
|
|
|
cell.update(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class DialogsAdapter extends RecyclerListView.SelectionAdapter {
|
|
|
|
|
|
|
|
|
|
private Context mContext;
|
|
|
|
|
|
|
|
|
|
private ArrayList<DialogCell.CustomDialog> dialogs;
|
|
|
|
|
|
|
|
|
|
public DialogsAdapter(Context context) {
|
|
|
|
|
mContext = context;
|
|
|
|
|
dialogs = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
int date = (int) (System.currentTimeMillis() / 1000);
|
|
|
|
|
DialogCell.CustomDialog customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Eva Summer";
|
|
|
|
|
customDialog.message = "Reminds me of a Chinese prove...";
|
|
|
|
|
customDialog.id = 0;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = true;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = true;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
2018-07-30 04:07:02 +02:00
|
|
|
|
customDialog.name = "Your inner Competition";
|
|
|
|
|
customDialog.message = "hey, I've updated the source code.";
|
2017-03-31 01:58:05 +02:00
|
|
|
|
customDialog.id = 1;
|
|
|
|
|
customDialog.unread_count = 2;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date - 60 * 60;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
2018-07-30 04:07:02 +02:00
|
|
|
|
customDialog.name = "Mike Apple";
|
2017-03-31 01:58:05 +02:00
|
|
|
|
customDialog.message = "\uD83E\uDD37\u200D♂️ Sticker";
|
|
|
|
|
customDialog.id = 2;
|
|
|
|
|
customDialog.unread_count = 3;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = true;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 2;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = true;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Paul Newman";
|
|
|
|
|
customDialog.message = "Any ideas?";
|
|
|
|
|
customDialog.id = 3;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 2;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 3;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Old Pirates";
|
|
|
|
|
customDialog.message = "Yo-ho-ho!";
|
|
|
|
|
customDialog.id = 4;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 1;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 4;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = true;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Kate Bright";
|
|
|
|
|
customDialog.message = "Hola!";
|
|
|
|
|
customDialog.id = 5;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 5;
|
|
|
|
|
customDialog.verified = false;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Nick K";
|
|
|
|
|
customDialog.message = "These are not the droids you are looking for";
|
|
|
|
|
customDialog.id = 6;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 6;
|
|
|
|
|
customDialog.verified = true;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
|
|
|
|
|
customDialog = new DialogCell.CustomDialog();
|
|
|
|
|
customDialog.name = "Adler Toberg";
|
|
|
|
|
customDialog.message = "Did someone say peanut butter?";
|
|
|
|
|
customDialog.id = 0;
|
|
|
|
|
customDialog.unread_count = 0;
|
|
|
|
|
customDialog.pinned = false;
|
|
|
|
|
customDialog.muted = false;
|
|
|
|
|
customDialog.type = 0;
|
|
|
|
|
customDialog.date = date - 60 * 60 * 7;
|
|
|
|
|
customDialog.verified = true;
|
|
|
|
|
customDialog.isMedia = false;
|
|
|
|
|
customDialog.sent = false;
|
|
|
|
|
dialogs.add(customDialog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getItemCount() {
|
|
|
|
|
return dialogs.size() + 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isEnabled(RecyclerView.ViewHolder holder) {
|
|
|
|
|
return holder.getItemViewType() != 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
|
|
|
|
View view = null;
|
|
|
|
|
if (viewType == 0) {
|
2017-12-08 18:35:59 +01:00
|
|
|
|
view = new DialogCell(mContext, false);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
} else if (viewType == 1) {
|
|
|
|
|
view = new LoadingCell(mContext);
|
|
|
|
|
}
|
|
|
|
|
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
|
|
|
|
|
return new RecyclerListView.Holder(view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
|
|
|
|
|
if (viewHolder.getItemViewType() == 0) {
|
|
|
|
|
DialogCell cell = (DialogCell) viewHolder.itemView;
|
|
|
|
|
cell.useSeparator = (i != getItemCount() - 1);
|
|
|
|
|
cell.setDialog(dialogs.get(i));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getItemViewType(int i) {
|
|
|
|
|
if (i == dialogs.size()) {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class MessagesAdapter extends RecyclerListView.SelectionAdapter {
|
|
|
|
|
|
|
|
|
|
private Context mContext;
|
|
|
|
|
|
|
|
|
|
private ArrayList<MessageObject> messages;
|
|
|
|
|
|
|
|
|
|
public MessagesAdapter(Context context) {
|
|
|
|
|
mContext = context;
|
|
|
|
|
messages = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
int date = (int) (System.currentTimeMillis() / 1000) - 60 * 60;
|
|
|
|
|
|
|
|
|
|
TLRPC.Message message;
|
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.message = "Reinhardt, we need to find you some new tunes \uD83C\uDFB6.";
|
|
|
|
|
message.date = date + 60;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 259;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.from_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.id = 1;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaEmpty();
|
|
|
|
|
message.out = true;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
|
|
|
|
message.to_id.user_id = 0;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
MessageObject replyMessageObject = new MessageObject(currentAccount, message, true);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.message = "I can't even take you seriously right now.";
|
|
|
|
|
message.date = date + 960;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 259;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.from_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.id = 1;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaEmpty();
|
|
|
|
|
message.out = true;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
|
|
|
|
message.to_id.user_id = 0;
|
|
|
|
|
MessageObject messageObject;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
messages.add(new MessageObject(currentAccount, message, true));
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.date = date + 130;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 259;
|
|
|
|
|
message.from_id = 0;
|
|
|
|
|
message.id = 5;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaDocument();
|
2017-07-23 14:56:38 +02:00
|
|
|
|
message.media.flags |= 3;
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.media.document = new TLRPC.TL_document();
|
|
|
|
|
message.media.document.mime_type = "audio/mp4";
|
2019-01-23 18:03:33 +01:00
|
|
|
|
message.media.document.file_reference = new byte[0];
|
2017-03-31 01:58:05 +02:00
|
|
|
|
TLRPC.TL_documentAttributeAudio audio = new TLRPC.TL_documentAttributeAudio();
|
|
|
|
|
audio.duration = 243;
|
|
|
|
|
audio.performer = "David Hasselhoff";
|
|
|
|
|
audio.title = "True Survivor";
|
|
|
|
|
message.media.document.attributes.add(audio);
|
|
|
|
|
message.out = false;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.to_id.user_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
|
|
|
|
messages.add(new MessageObject(currentAccount, message, true));
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.message = "Ah, you kids today with techno music! You should enjoy the classics, like Hasselhoff!";
|
|
|
|
|
message.date = date + 60;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 257 + 8;
|
|
|
|
|
message.from_id = 0;
|
|
|
|
|
message.id = 1;
|
|
|
|
|
message.reply_to_msg_id = 5;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaEmpty();
|
|
|
|
|
message.out = false;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.to_id.user_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
|
|
|
|
messageObject = new MessageObject(currentAccount, message, true);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
messageObject.customReplyName = "Lucio";
|
|
|
|
|
messageObject.replyMessageObject = replyMessageObject;
|
|
|
|
|
messages.add(messageObject);
|
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.date = date + 120;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 259;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.from_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.id = 1;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaDocument();
|
2017-07-23 14:56:38 +02:00
|
|
|
|
message.media.flags |= 3;
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.media.document = new TLRPC.TL_document();
|
|
|
|
|
message.media.document.mime_type = "audio/ogg";
|
2019-01-23 18:03:33 +01:00
|
|
|
|
message.media.document.file_reference = new byte[0];
|
2017-03-31 01:58:05 +02:00
|
|
|
|
audio = new TLRPC.TL_documentAttributeAudio();
|
|
|
|
|
audio.flags = 1028;
|
|
|
|
|
audio.duration = 3;
|
|
|
|
|
audio.voice = true;
|
|
|
|
|
audio.waveform = new byte[]{0, 4, 17, -50, -93, 86, -103, -45, -12, -26, 63, -25, -3, 109, -114, -54, -4, -1,
|
|
|
|
|
-1, -1, -1, -29, -1, -1, -25, -1, -1, -97, -43, 57, -57, -108, 1, -91, -4, -47, 21, 99, 10, 97, 43,
|
|
|
|
|
45, 115, -112, -77, 51, -63, 66, 40, 34, -122, -116, 48, -124, 16, 66, -120, 16, 68, 16, 33, 4, 1};
|
|
|
|
|
message.media.document.attributes.add(audio);
|
|
|
|
|
message.out = true;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
|
|
|
|
message.to_id.user_id = 0;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
messageObject = new MessageObject(currentAccount, message, true);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
messageObject.audioProgressSec = 1;
|
|
|
|
|
messageObject.audioProgress = 0.3f;
|
|
|
|
|
messageObject.useCustomPhoto = true;
|
|
|
|
|
messages.add(messageObject);
|
|
|
|
|
|
|
|
|
|
messages.add(replyMessageObject);
|
|
|
|
|
|
|
|
|
|
message = new TLRPC.TL_message();
|
|
|
|
|
message.date = date + 10;
|
|
|
|
|
message.dialog_id = 1;
|
|
|
|
|
message.flags = 257;
|
|
|
|
|
message.from_id = 0;
|
|
|
|
|
message.id = 1;
|
|
|
|
|
message.media = new TLRPC.TL_messageMediaPhoto();
|
2017-07-23 14:56:38 +02:00
|
|
|
|
message.media.flags |= 3;
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.media.photo = new TLRPC.TL_photo();
|
2019-01-23 18:03:33 +01:00
|
|
|
|
message.media.photo.file_reference = new byte[0];
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.media.photo.has_stickers = false;
|
|
|
|
|
message.media.photo.id = 1;
|
|
|
|
|
message.media.photo.access_hash = 0;
|
|
|
|
|
message.media.photo.date = date;
|
|
|
|
|
TLRPC.TL_photoSize photoSize = new TLRPC.TL_photoSize();
|
|
|
|
|
photoSize.size = 0;
|
|
|
|
|
photoSize.w = 500;
|
|
|
|
|
photoSize.h = 302;
|
|
|
|
|
photoSize.type = "s";
|
|
|
|
|
photoSize.location = new TLRPC.TL_fileLocationUnavailable();
|
|
|
|
|
message.media.photo.sizes.add(photoSize);
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.message = "Bring it on! I LIVE for this!";
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.out = false;
|
|
|
|
|
message.to_id = new TLRPC.TL_peerUser();
|
2018-07-30 04:07:02 +02:00
|
|
|
|
message.to_id.user_id = UserConfig.getInstance(currentAccount).getClientUserId();
|
|
|
|
|
messageObject = new MessageObject(currentAccount, message, true);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
messageObject.useCustomPhoto = true;
|
|
|
|
|
messages.add(messageObject);
|
|
|
|
|
|
2017-12-08 18:35:59 +01:00
|
|
|
|
message = new TLRPC.TL_message();
|
2017-03-31 01:58:05 +02:00
|
|
|
|
message.message = LocaleController.formatDateChat(date);
|
|
|
|
|
message.id = 0;
|
|
|
|
|
message.date = date;
|
2018-07-30 04:07:02 +02:00
|
|
|
|
messageObject = new MessageObject(currentAccount, message, false);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
messageObject.type = 10;
|
|
|
|
|
messageObject.contentType = 1;
|
|
|
|
|
messageObject.isDateObject = true;
|
|
|
|
|
messages.add(messageObject);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getItemCount() {
|
|
|
|
|
return messages.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isEnabled(RecyclerView.ViewHolder holder) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
|
|
|
|
View view = null;
|
|
|
|
|
if (viewType == 0) {
|
|
|
|
|
view = new ChatMessageCell(mContext);
|
|
|
|
|
ChatMessageCell chatMessageCell = (ChatMessageCell) view;
|
|
|
|
|
chatMessageCell.setDelegate(new ChatMessageCell.ChatMessageCellDelegate() {
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressShare(ChatMessageCell cell) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2017-07-08 18:32:04 +02:00
|
|
|
|
public boolean needPlayMessage(MessageObject messageObject) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressChannelAvatar(ChatMessageCell cell, TLRPC.Chat chat, int postId) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void didPressOther(ChatMessageCell cell) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressUserAvatar(ChatMessageCell cell, TLRPC.User user) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressBotButton(ChatMessageCell cell, TLRPC.KeyboardButton button) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressVoteButton(ChatMessageCell cell, TLRPC.TL_pollAnswer button) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressCancelSendButton(ChatMessageCell cell) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didLongPress(ChatMessageCell cell) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canPerformActions() {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressUrl(MessageObject messageObject, final CharacterStyle url, boolean longPress) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void needOpenWebView(String url, String title, String description, String originalUrl, int w, int h) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressReplyMessage(ChatMessageCell cell, int id) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressViaBot(ChatMessageCell cell, String username) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressImage(ChatMessageCell cell) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2019-01-23 18:03:33 +01:00
|
|
|
|
public void didPressInstantButton(ChatMessageCell cell, int type) {
|
2017-03-31 01:58:05 +02:00
|
|
|
|
|
|
|
|
|
}
|
2017-12-08 18:35:59 +01:00
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isChatAdminCell(int uid) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2017-03-31 01:58:05 +02:00
|
|
|
|
});
|
|
|
|
|
} else if (viewType == 1) {
|
|
|
|
|
view = new ChatActionCell(mContext);
|
|
|
|
|
((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() {
|
|
|
|
|
@Override
|
|
|
|
|
public void didClickedImage(ChatActionCell cell) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void didLongPressed(ChatActionCell cell) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void needOpenUserProfile(int uid) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void didPressedReplyMessage(ChatActionCell cell, int id) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void didPressedBotButton(MessageObject messageObject, TLRPC.KeyboardButton button) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
|
|
|
|
|
return new RecyclerListView.Holder(view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
|
|
|
|
|
MessageObject message = messages.get(position);
|
|
|
|
|
View view = holder.itemView;
|
|
|
|
|
|
|
|
|
|
if (view instanceof ChatMessageCell) {
|
|
|
|
|
ChatMessageCell messageCell = (ChatMessageCell) view;
|
|
|
|
|
messageCell.isChat = false;
|
|
|
|
|
int nextType = getItemViewType(position - 1);
|
|
|
|
|
int prevType = getItemViewType(position + 1);
|
|
|
|
|
boolean pinnedBotton;
|
|
|
|
|
boolean pinnedTop;
|
|
|
|
|
if (!(message.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && nextType == holder.getItemViewType()) {
|
|
|
|
|
MessageObject nextMessage = messages.get(position - 1);
|
|
|
|
|
pinnedBotton = nextMessage.isOutOwner() == message.isOutOwner() && Math.abs(nextMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60;
|
|
|
|
|
} else {
|
|
|
|
|
pinnedBotton = false;
|
|
|
|
|
}
|
|
|
|
|
if (prevType == holder.getItemViewType()) {
|
|
|
|
|
MessageObject prevMessage = messages.get(position + 1);
|
|
|
|
|
pinnedTop = !(prevMessage.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && prevMessage.isOutOwner() == message.isOutOwner() && Math.abs(prevMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60;
|
|
|
|
|
} else {
|
|
|
|
|
pinnedTop = false;
|
|
|
|
|
}
|
|
|
|
|
messageCell.setFullyDraw(true);
|
2017-12-08 18:35:59 +01:00
|
|
|
|
messageCell.setMessageObject(message, null, pinnedBotton, pinnedTop);
|
2017-03-31 01:58:05 +02:00
|
|
|
|
} else if (view instanceof ChatActionCell) {
|
|
|
|
|
ChatActionCell actionCell = (ChatActionCell) view;
|
|
|
|
|
actionCell.setMessageObject(message);
|
|
|
|
|
actionCell.setAlpha(1.0f);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getItemViewType(int i) {
|
|
|
|
|
if (i >= 0 && i < messages.size()) {
|
|
|
|
|
return messages.get(i).contentType;
|
|
|
|
|
}
|
|
|
|
|
return 4;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|