/* * 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 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; } } } } }