NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/SharingLocationsAlert.java

326 lines
13 KiB
Java

/*
* This is the source code of Telegram for Android v. 5.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2018.
*/
package org.telegram.ui.Components;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.LocationController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.ui.ActionBar.BottomSheet;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.SharingLiveLocationCell;
import org.telegram.ui.ContentPreviewViewer;
import java.util.ArrayList;
import java.util.regex.Pattern;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class SharingLocationsAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate {
private Pattern urlPattern;
private RecyclerListView listView;
private ListAdapter adapter;
private Drawable shadowDrawable;
private TextView textView;
private int scrollOffsetY;
private int reqId;
private boolean ignoreLayout;
private SharingLocationsAlertDelegate delegate;
public interface SharingLocationsAlertDelegate {
void didSelectLocation(LocationController.SharingLocationInfo info);
}
public SharingLocationsAlert(Context context, SharingLocationsAlertDelegate sharingLocationsAlertDelegate, Theme.ResourcesProvider resourcesProvider) {
super(context, false, resourcesProvider);
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.liveLocationsChanged);
delegate = sharingLocationsAlertDelegate;
shadowDrawable = context.getResources().getDrawable(R.drawable.sheet_shadow_round).mutate();
shadowDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_dialogBackground), PorterDuff.Mode.MULTIPLY));
containerView = new FrameLayout(context) {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY != 0 && ev.getY() < scrollOffsetY) {
dismiss();
return true;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
return !isDismissed() && super.onTouchEvent(e);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
if (Build.VERSION.SDK_INT >= 21) {
height -= AndroidUtilities.statusBarHeight;
}
int measuredWidth = getMeasuredWidth();
int contentSize = AndroidUtilities.dp(48 + 8) + AndroidUtilities.dp(56) + 1 + LocationController.getLocationsCount() * AndroidUtilities.dp(54);
int padding;
if (contentSize < (height / 5 * 3)) {
padding = AndroidUtilities.dp(8);
} else {
padding = (height / 5 * 2);
if (contentSize < height) {
padding -= (height - contentSize);
}
}
if (listView.getPaddingTop() != padding) {
ignoreLayout = true;
listView.setPadding(0, padding, 0, AndroidUtilities.dp(8));
ignoreLayout = false;
}
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Math.min(contentSize, height), MeasureSpec.EXACTLY));
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
updateLayout();
}
@Override
public void requestLayout() {
if (ignoreLayout) {
return;
}
super.requestLayout();
}
@Override
protected void onDraw(Canvas canvas) {
shadowDrawable.setBounds(0, scrollOffsetY - backgroundPaddingTop, getMeasuredWidth(), getMeasuredHeight());
shadowDrawable.draw(canvas);
}
};
containerView.setWillNotDraw(false);
containerView.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0);
listView = new RecyclerListView(context) {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean result = ContentPreviewViewer.getInstance().onInterceptTouchEvent(event, listView, 0, null, resourcesProvider);
return super.onInterceptTouchEvent(event) || result;
}
@Override
public void requestLayout() {
if (ignoreLayout) {
return;
}
super.requestLayout();
}
};
listView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
listView.setAdapter(adapter = new ListAdapter(context));
listView.setVerticalScrollBarEnabled(false);
listView.setClipToPadding(false);
listView.setEnabled(true);
listView.setGlowColor(getThemedColor(Theme.key_dialogScrollGlow));
listView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
updateLayout();
}
});
listView.setOnItemClickListener((view, position) -> {
position -= 1;
if (position < 0 || position >= LocationController.getLocationsCount()) {
return;
}
delegate.didSelectLocation(getLocation(position));
dismiss();
});
containerView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 48));
View shadow = new View(context);
shadow.setBackgroundResource(R.drawable.header_shadow_reverse);
containerView.addView(shadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 3, Gravity.BOTTOM | Gravity.LEFT, 0, 0, 0, 48));
PickerBottomLayout pickerBottomLayout = new PickerBottomLayout(context, false);
pickerBottomLayout.setBackgroundColor(getThemedColor(Theme.key_dialogBackground));
containerView.addView(pickerBottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM));
pickerBottomLayout.cancelButton.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0);
pickerBottomLayout.cancelButton.setTextColor(getThemedColor(Theme.key_dialogTextRed));
pickerBottomLayout.cancelButton.setText(LocaleController.getString("StopAllLocationSharings", R.string.StopAllLocationSharings));
pickerBottomLayout.cancelButton.setOnClickListener(view -> {
for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) {
LocationController.getInstance(a).removeAllLocationSharings();
}
dismiss();
});
pickerBottomLayout.doneButtonTextView.setTextColor(getThemedColor(Theme.key_dialogTextBlue2));
pickerBottomLayout.doneButtonTextView.setText(LocaleController.getString("Close", R.string.Close).toUpperCase());
pickerBottomLayout.doneButton.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0);
pickerBottomLayout.doneButton.setOnClickListener(view -> dismiss());
pickerBottomLayout.doneButtonBadgeTextView.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
@Override
protected boolean canDismissWithSwipe() {
return false;
}
@SuppressLint("NewApi")
private void updateLayout() {
if (listView.getChildCount() <= 0) {
listView.setTopGlowOffset(scrollOffsetY = listView.getPaddingTop());
containerView.invalidate();
return;
}
View child = listView.getChildAt(0);
RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child);
int top = child.getTop() - AndroidUtilities.dp(8);
int newOffset = top > 0 && holder != null && holder.getAdapterPosition() == 0 ? top : 0;
if (scrollOffsetY != newOffset) {
listView.setTopGlowOffset(scrollOffsetY = newOffset);
containerView.invalidate();
}
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
if (id == NotificationCenter.liveLocationsChanged) {
if (LocationController.getLocationsCount() == 0) {
dismiss();
} else {
adapter.notifyDataSetChanged();
}
}
}
private LocationController.SharingLocationInfo getLocation(int position) {
for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) {
ArrayList<LocationController.SharingLocationInfo> infos = LocationController.getInstance(a).sharingLocationsUI;
if (position >= infos.size()) {
position -= infos.size();
} else {
return infos.get(position);
}
}
return null;
}
@Override
public void dismiss() {
super.dismiss();
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.liveLocationsChanged);
}
private class ListAdapter extends RecyclerListView.SelectionAdapter {
private Context context;
public ListAdapter(Context context) {
this.context = context;
}
@Override
public int getItemCount() {
return LocationController.getLocationsCount() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return 1;
}
return 0;
}
@Override
public boolean isEnabled(RecyclerView.ViewHolder holder) {
return holder.getItemViewType() == 0;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 0:
view = new SharingLiveLocationCell(context, false, 54, resourcesProvider);
//view.setBackgroundDrawable(Theme.getSelectorDrawable(false));
break;
case 1:
default:
FrameLayout frameLayout = new FrameLayout(context) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48) + 1, MeasureSpec.EXACTLY));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(0, AndroidUtilities.dp(40), getMeasuredWidth(), AndroidUtilities.dp(40), Theme.dividerPaint);
}
};
frameLayout.setWillNotDraw(false);
textView = new TextView(context);
textView.setTextColor(getThemedColor(Theme.key_dialogIcon));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setGravity(Gravity.CENTER);
textView.setPadding(0, 0, 0, AndroidUtilities.dp(8));
frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 40));
view = frameLayout;
break;
}
return new RecyclerListView.Holder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case 0: {
SharingLiveLocationCell cell = (SharingLiveLocationCell) holder.itemView;
cell.setDialog(getLocation(position - 1));
break;
}
case 1: {
if (textView != null) {
textView.setText(LocaleController.formatString("SharingLiveLocationTitle", R.string.SharingLiveLocationTitle, LocaleController.formatPluralString("Chats", LocationController.getLocationsCount())));
}
break;
}
}
}
}
}