diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 03cb85443..c77842c5a 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -457,6 +457,7 @@ public class AndroidUtilities { Method mGetRawH = Display.class.getMethod("getRawHeight"); size.set((Integer) mGetRawW.invoke(windowManager.getDefaultDisplay()), (Integer) mGetRawH.invoke(windowManager.getDefaultDisplay())); } catch (Exception e) { + size.set(windowManager.getDefaultDisplay().getWidth(), windowManager.getDefaultDisplay().getHeight()); FileLog.e("tmessages", e); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java new file mode 100644 index 000000000..f4da419a6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java @@ -0,0 +1,125 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Adapters; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import org.telegram.android.LocaleController; +import org.telegram.android.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.ui.Cells.DrawerActionCell; +import org.telegram.ui.Cells.DrawerDividerCell; +import org.telegram.ui.Cells.DrawerEmptyCell; +import org.telegram.ui.Cells.DrawerProfileCell; + +public class DrawerLayoutAdapter extends BaseAdapter { + + private Context mContext; + + public DrawerLayoutAdapter(Context context) { + mContext = context; + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int i) { + return !(i == 0 || i == 1 || i == 5 || i == 6 || i == 7); + } + + @Override + public int getCount() { + return UserConfig.isClientActivated() ? 12 : 0; + } + + @Override + public Object getItem(int i) { + return null; + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + int type = getItemViewType(i); + if (type == 0) { + if (view == null) { + view = new DrawerProfileCell(mContext); + } + ((DrawerProfileCell) view).setUser(MessagesController.getInstance().getUser(UserConfig.getClientUserId())); + } else if (type == 1) { + if (view == null) { + view = new DrawerEmptyCell(mContext); + } + } else if (type == 2) { + if (view == null) { + view = new DrawerDividerCell(mContext); + } + } else if (type == 3) { + if (view == null) { + view = new DrawerActionCell(mContext); + } + DrawerActionCell actionCell = (DrawerActionCell) view; + if (i == 2) { + actionCell.setTextAndIcon(LocaleController.getString("NewGroup", R.string.NewGroup), R.drawable.menu_newgroup); + } else if (i == 3) { + actionCell.setTextAndIcon(LocaleController.getString("NewSecretChat", R.string.NewSecretChat), R.drawable.menu_secret); + } else if (i == 4) { + actionCell.setTextAndIcon(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList), R.drawable.menu_broadcast); + } else if (i == 8) { + actionCell.setTextAndIcon(LocaleController.getString("Contacts", R.string.Contacts), R.drawable.menu_contacts); + } else if (i == 9) { + actionCell.setTextAndIcon(LocaleController.getString("InviteFriends", R.string.InviteFriends), R.drawable.menu_invite); + } else if (i == 10) { + actionCell.setTextAndIcon(LocaleController.getString("Settings", R.string.Settings), R.drawable.menu_settings); + } else if (i == 11) { + actionCell.setTextAndIcon(LocaleController.getString("TelegramFaq", R.string.TelegramFaq), R.drawable.menu_help); + } + } + + return view; + } + + @Override + public int getItemViewType(int i) { + if (i == 0) { + return 0; + } else if (i == 1 || i == 5 || i == 7) { + return 1; + } else if (i == 6) { + return 2; + } + return 3; + } + + @Override + public int getViewTypeCount() { + return 4; + } + + @Override + public boolean isEmpty() { + return !UserConfig.isClientActivated(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AnimationCompat/AnimatorSetProxy.java b/TMessagesProj/src/main/java/org/telegram/ui/AnimationCompat/AnimatorSetProxy.java index 49c4c8612..e039dfb5d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/AnimationCompat/AnimatorSetProxy.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/AnimationCompat/AnimatorSetProxy.java @@ -11,11 +11,11 @@ package org.telegram.ui.AnimationCompat; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; +import android.view.animation.Interpolator; import org.telegram.ui.Animation.Animator10; import org.telegram.ui.Animation.AnimatorListenerAdapter10; import org.telegram.ui.Animation.AnimatorSet10; -import org.telegram.ui.Animation.ObjectAnimator10; import org.telegram.ui.Animation.View10; import java.util.Arrays; @@ -58,11 +58,27 @@ public class AnimatorSetProxy { } } + public void cancel() { + if (View10.NEED_PROXY) { + ((AnimatorSet10) animatorSet).cancel(); + } else { + ((AnimatorSet) animatorSet).cancel(); + } + } + public void addListener(AnimatorListenerAdapterProxy listener) { if (View10.NEED_PROXY) { - ((AnimatorSet10) animatorSet).addListener((AnimatorListenerAdapter10)listener.animatorListenerAdapter); + ((AnimatorSet10) animatorSet).addListener((AnimatorListenerAdapter10) listener.animatorListenerAdapter); } else { ((AnimatorSet) animatorSet).addListener((AnimatorListenerAdapter) listener.animatorListenerAdapter); } } + + public void setInterpolator(Interpolator interpolator) { + if (View10.NEED_PROXY) { + ((AnimatorSet10) animatorSet).setInterpolator(interpolator); + } else { + ((AnimatorSet) animatorSet).setInterpolator(interpolator); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java new file mode 100644 index 000000000..a61e4cceb --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java @@ -0,0 +1,54 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; + +public class DrawerActionCell extends FrameLayout { + + private TextView textView; + + public DrawerActionCell(Context context) { + super(context); + + textView = new TextView(context); + textView.setTextColor(0xff444444); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setLines(1); + textView.setMaxLines(1); + textView.setSingleLine(true); + textView.setGravity(Gravity.LEFT | Gravity.CENTER); + textView.setCompoundDrawablePadding(AndroidUtilities.dp(34)); + addView(textView); + LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + layoutParams.leftMargin = AndroidUtilities.dp(14); + layoutParams.rightMargin = AndroidUtilities.dp(16); + textView.setLayoutParams(layoutParams); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY)); + } + + public void setTextAndIcon(String text, int resId) { + textView.setText(text); + textView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerDividerCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerDividerCell.java new file mode 100644 index 000000000..05aca7ec4 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerDividerCell.java @@ -0,0 +1,25 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.widget.FrameLayout; + +public class DrawerDividerCell extends FrameLayout { + + public DrawerDividerCell(Context context) { + super(context); + setBackgroundColor(0xffd9d9d9); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(1, MeasureSpec.EXACTLY)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerEmptyCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerEmptyCell.java new file mode 100644 index 000000000..4df169104 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerEmptyCell.java @@ -0,0 +1,26 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.widget.FrameLayout; + +import org.telegram.android.AndroidUtilities; + +public class DrawerEmptyCell extends FrameLayout { + + public DrawerEmptyCell(Context context) { + super(context); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(8), MeasureSpec.EXACTLY)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java new file mode 100644 index 000000000..d9f5199fb --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -0,0 +1,105 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.os.Build; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.telegram.PhoneFormat.PhoneFormat; +import org.telegram.android.AndroidUtilities; +import org.telegram.android.ContactsController; +import org.telegram.messenger.TLRPC; +import org.telegram.ui.Views.AvatarDrawable; +import org.telegram.ui.Views.BackupImageView; + +public class DrawerProfileCell extends FrameLayout { + + private BackupImageView avatarImageView; + private TextView nameTextView; + private TextView phoneTextView; + + public DrawerProfileCell(Context context) { + super(context); + setBackgroundColor(0xff4c84b5); + + avatarImageView = new BackupImageView(context); + avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(32)); + addView(avatarImageView); + LayoutParams layoutParams = (LayoutParams) avatarImageView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(64); + layoutParams.height = AndroidUtilities.dp(64); + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.bottomMargin = AndroidUtilities.dp(67); + avatarImageView.setLayoutParams(layoutParams); + + nameTextView = new TextView(context); + nameTextView.setTextColor(0xffffffff); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + nameTextView.setLines(1); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setGravity(Gravity.LEFT); + addView(nameTextView); + layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.bottomMargin = AndroidUtilities.dp(28); + layoutParams.rightMargin = AndroidUtilities.dp(16); + nameTextView.setLayoutParams(layoutParams); + + phoneTextView = new TextView(context); + phoneTextView.setTextColor(0xffc2e5ff); + phoneTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + phoneTextView.setLines(1); + phoneTextView.setMaxLines(1); + phoneTextView.setSingleLine(true); + phoneTextView.setGravity(Gravity.LEFT); + addView(phoneTextView); + layoutParams = (FrameLayout.LayoutParams) phoneTextView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.bottomMargin = AndroidUtilities.dp(9); + layoutParams.rightMargin = AndroidUtilities.dp(16); + phoneTextView.setLayoutParams(layoutParams); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (Build.VERSION.SDK_INT >= 21) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(148) + AndroidUtilities.statusBarHeight, MeasureSpec.EXACTLY)); + } else { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(148), MeasureSpec.EXACTLY)); + } + } + + public void setUser(TLRPC.User user) { + if (user == null) { + return; + } + TLRPC.FileLocation photo = null; + if (user.photo != null) { + photo = user.photo.photo_small; + } + nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); + phoneTextView.setText(PhoneFormat.getInstance().format("+" + user.phone)); + AvatarDrawable avatarDrawable = new AvatarDrawable(user); + avatarDrawable.setColor(0xff5c98cd); + avatarImageView.setImage(photo, "50_50", avatarDrawable); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index e30088ce4..e933bb6f4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -2852,8 +2852,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (lower_part < 0) { args.putInt("chat_id", -lower_part); } - presentFragment(new ChatActivity(args), true); forwardSelectedMessages(did, param); + presentFragment(new ChatActivity(args), true); if (!AndroidUtilities.isTablet()) { removeSelfFromStack(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 113179c33..a086266ed 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -27,9 +27,12 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; +import android.widget.AbsListView; +import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -45,6 +48,7 @@ import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; +import org.telegram.ui.Adapters.DrawerLayoutAdapter; import org.telegram.ui.Views.ActionBar.ActionBarLayout; import org.telegram.ui.Views.ActionBar.BaseFragment; import org.telegram.ui.Views.ActionBar.DrawerLayoutContainer; @@ -75,6 +79,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa private LinearLayout buttonLayoutTablet = null; private FrameLayout shadowTabletSide = null; private ImageView backgroundTablet = null; + private DrawerLayoutContainer drawerLayoutContainer = null; + private boolean tabletFullSize = false; @Override @@ -233,21 +239,62 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } }); } else { - DrawerLayoutContainer drawerLayoutContainer = new DrawerLayoutContainer(this); + drawerLayoutContainer = new DrawerLayoutContainer(this); drawerLayoutContainer.setStatusBarColor(0xff54759e); drawerLayoutContainer.addView(actionBarLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - FrameLayout frameLayout = new FrameLayout(this); - drawerLayoutContainer.setDrawerLayout(frameLayout); - frameLayout.setBackgroundColor(0xffff0000); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)frameLayout.getLayoutParams(); + ListView listView = new ListView(this); + listView.setAdapter(new DrawerLayoutAdapter(this)); + drawerLayoutContainer.setDrawerLayout(listView); + listView.setBackgroundColor(0xffffffff); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)listView.getLayoutParams(); Point screenSize = AndroidUtilities.getRealScreenSize(); layoutParams.width = Math.min(screenSize.x, screenSize.y) - AndroidUtilities.dp(56); layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - frameLayout.setLayoutParams(layoutParams); + listView.setPadding(0, 0, 0, 0); + listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setLayoutParams(layoutParams); + listView.setVerticalScrollBarEnabled(false); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (position == 2) { + presentFragment(new GroupCreateActivity()); + drawerLayoutContainer.closeDrawer(false); + } else if (position == 3) { + Bundle args = new Bundle(); + args.putBoolean("onlyUsers", true); + args.putBoolean("destroyAfterSelect", true); + args.putBoolean("usersAsSections", true); + args.putBoolean("createSecretChat", true); + presentFragment(new ContactsActivity(args)); + drawerLayoutContainer.closeDrawer(false); + } else if (position == 4) { + Bundle args = new Bundle(); + args.putBoolean("broadcast", true); + presentFragment(new GroupCreateActivity(args)); + drawerLayoutContainer.closeDrawer(false); + } else if (position == 8) { + presentFragment(new ContactsActivity(null)); + drawerLayoutContainer.closeDrawer(false); + } else if (position == 9) { + drawerLayoutContainer.closeDrawer(false); + } else if (position == 10) { + presentFragment(new SettingsActivity()); + drawerLayoutContainer.closeDrawer(false); + } else if (position == 11) { + drawerLayoutContainer.closeDrawer(false); + } + } + }); + setContentView(drawerLayoutContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - actionBarLayout.setDrawerLayout(drawerLayoutContainer); - actionBarLayout.setAllowOpenDrawer(true); + drawerLayoutContainer.setParentActionBarLayout(actionBarLayout); + drawerLayoutContainer.setAllowOpenDrawer(true); + actionBarLayout.setDrawerLayoutContainer(drawerLayoutContainer); } actionBarLayout.init(mainFragmentsStack); actionBarLayout.setDelegate(this); @@ -965,23 +1012,23 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa public void onBackPressed() { if (PhotoViewer.getInstance().isVisible()) { PhotoViewer.getInstance().closePhoto(true); - } else { - if (AndroidUtilities.isTablet()) { - if (layersActionBarLayout.getVisibility() == View.VISIBLE) { - layersActionBarLayout.onBackPressed(); - } else { - boolean cancel = false; - if (rightActionBarLayout.getVisibility() == View.VISIBLE && !rightActionBarLayout.fragmentsStack.isEmpty()) { - BaseFragment lastFragment = rightActionBarLayout.fragmentsStack.get(rightActionBarLayout.fragmentsStack.size() - 1); - cancel = !lastFragment.onBackPressed(); - } - if (!cancel) { - actionBarLayout.onBackPressed(); - } - } + } else if (drawerLayoutContainer.isDrawerOpened()) { + drawerLayoutContainer.closeDrawer(false); + } else if (AndroidUtilities.isTablet()) { + if (layersActionBarLayout.getVisibility() == View.VISIBLE) { + layersActionBarLayout.onBackPressed(); } else { - actionBarLayout.onBackPressed(); + boolean cancel = false; + if (rightActionBarLayout.getVisibility() == View.VISIBLE && !rightActionBarLayout.fragmentsStack.isEmpty()) { + BaseFragment lastFragment = rightActionBarLayout.fragmentsStack.get(rightActionBarLayout.fragmentsStack.size() - 1); + cancel = !lastFragment.onBackPressed(); + } + if (!cancel) { + actionBarLayout.onBackPressed(); + } } + } else { + actionBarLayout.onBackPressed(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index bbec10b25..72b762e10 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -82,13 +82,6 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter private long openedDialogId = 0; - private final static int messages_list_menu_other = 1; - private final static int messages_list_menu_new_chat = 2; - private final static int messages_list_menu_new_secret_chat = 3; - private final static int messages_list_menu_contacts = 4; - private final static int messages_list_menu_settings = 5; - private final static int messages_list_menu_new_broadcast = 6; - public static interface MessagesActivityDelegate { public abstract void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param); } @@ -201,39 +194,18 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } else { actionBarLayer.setBackButtonDrawable(new MenuDrawable()); actionBarLayer.setTitle(LocaleController.getString("AppName", R.string.AppName)); - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); - item.addSubItem(messages_list_menu_new_chat, LocaleController.getString("NewGroup", R.string.NewGroup), 0); - item.addSubItem(messages_list_menu_new_secret_chat, LocaleController.getString("NewSecretChat", R.string.NewSecretChat), 0); - item.addSubItem(messages_list_menu_new_broadcast, LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList), 0); - item.addSubItem(messages_list_menu_contacts, LocaleController.getString("Contacts", R.string.Contacts), 0); - item.addSubItem(messages_list_menu_settings, LocaleController.getString("Settings", R.string.Settings), 0); } actionBarLayer.setBackOverlay(R.layout.updating_state_layout); actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { - if (id == messages_list_menu_settings) { - presentFragment(new SettingsActivity()); - } else if (id == messages_list_menu_contacts) { - presentFragment(new ContactsActivity(null)); - } else if (id == messages_list_menu_new_secret_chat) { - Bundle args = new Bundle(); - args.putBoolean("onlyUsers", true); - args.putBoolean("destroyAfterSelect", true); - args.putBoolean("usersAsSections", true); - args.putBoolean("createSecretChat", true); - presentFragment(new ContactsActivity(args)); - } else if (id == messages_list_menu_new_chat) { - presentFragment(new GroupCreateActivity()); - } else if (id == -1) { + if (id == -1) { if (onlySelect) { finishFragment(); + } else if (parentLayout != null) { + parentLayout.getDrawerLayoutContainer().openDrawer(false); } - } else if (id == messages_list_menu_new_broadcast) { - Bundle args = new Bundle(); - args.putBoolean("broadcast", true); - presentFragment(new GroupCreateActivity(args)); } } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarLayout.java index 98337bc43..efbf3ee99 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarLayout.java @@ -66,8 +66,6 @@ public class ActionBarLayout extends FrameLayout { private View shadowView; private DrawerLayoutContainer drawerLayoutContainer; - private boolean allowOpenDrawer; - private Animation openAnimation; private Animation closeAnimation; private Animation alphaOpenAnimation; @@ -243,14 +241,6 @@ public class ActionBarLayout extends FrameLayout { ViewProxy.setTranslationX(shadowView, -AndroidUtilities.dp(2)); } - private void prepareForDrawerOpen(MotionEvent ev) { - maybeStartTracking = false; - startedTracking = true; - startedTrackingX = (int) ev.getX(); - beginTrackingSent = false; - AndroidUtilities.lockOrientation(parentActivity); - } - private void prepareForMoving(MotionEvent ev) { maybeStartTracking = false; startedTracking = true; @@ -327,6 +317,12 @@ public class ActionBarLayout extends FrameLayout { float velY = velocityTracker.getYVelocity(); if (velX >= 3500 && velX > velY) { prepareForMoving(ev); + if (!beginTrackingSent) { + if (((Activity)getContext()).getCurrentFocus() != null) { + AndroidUtilities.hideKeyboard(((Activity)getContext()).getCurrentFocus()); + } + beginTrackingSent = true; + } } } if (startedTracking) { @@ -386,77 +382,6 @@ public class ActionBarLayout extends FrameLayout { velocityTracker = null; } } - } else if (drawerLayoutContainer != null && allowOpenDrawer && fragmentsStack.size() == 1) { - if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN && !startedTracking && !maybeStartTracking) { - startedTrackingPointerId = ev.getPointerId(0); - maybeStartTracking = true; - startedTrackingX = (int) ev.getX(); - startedTrackingY = (int) ev.getY(); - if (velocityTracker != null) { - velocityTracker.clear(); - } - } else if (ev != null && ev.getAction() == MotionEvent.ACTION_MOVE && ev.getPointerId(0) == startedTrackingPointerId) { - if (velocityTracker == null) { - velocityTracker = VelocityTracker.obtain(); - } - int dx = (int) (ev.getX() - startedTrackingX); - int dy = Math.abs((int) ev.getY() - startedTrackingY); - velocityTracker.addMovement(ev); - if (maybeStartTracking && !startedTracking && Math.abs(dx) >= AndroidUtilities.dp(10) && Math.abs(dx) / 3 > dy) { - prepareForDrawerOpen(ev); - } else if (startedTracking) { - if (!beginTrackingSent) { - if (parentActivity.getCurrentFocus() != null) { - AndroidUtilities.hideKeyboard(parentActivity.getCurrentFocus()); - } - BaseFragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1); - currentFragment.onBeginSlide(); - beginTrackingSent = true; - } - drawerLayoutContainer.moveDrawerByX(dx); - } - } else if (ev != null && ev.getPointerId(0) == startedTrackingPointerId && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_POINTER_UP)) { - if (velocityTracker == null) { - velocityTracker = VelocityTracker.obtain(); - } - velocityTracker.computeCurrentVelocity(1000); - if (!startedTracking) { - float velX = velocityTracker.getXVelocity(); - float velY = velocityTracker.getYVelocity(); - if (Math.abs(velX) >= 3500 && velX > velY) { - prepareForDrawerOpen(ev); - } - } - if (startedTracking) { - float x = ViewProxy.getX(containerView); - float velX = velocityTracker.getXVelocity(); - float velY = velocityTracker.getYVelocity(); - final boolean backAnimation = x < containerView.getMeasuredWidth() / 3.0f && (velX < 3500 || velX < velY); - float distToMove = 0; - if (!backAnimation) { - drawerLayoutContainer.openDrawer(); - } else { - drawerLayoutContainer.closeDrawer(); - } - AndroidUtilities.unlockOrientation(parentActivity); - startedTracking = false; - animationInProgress = false; //TODO animation check - } else { - maybeStartTracking = false; - startedTracking = false; - } - if (velocityTracker != null) { - velocityTracker.recycle(); - velocityTracker = null; - } - } else if (ev == null) { - maybeStartTracking = false; - startedTracking = false; - if (velocityTracker != null) { - velocityTracker.recycle(); - velocityTracker = null; - } - } } return startedTracking; } @@ -909,11 +834,11 @@ public class ActionBarLayout extends FrameLayout { backgroundView = view; } - public void setDrawerLayout(DrawerLayoutContainer layout) { + public void setDrawerLayoutContainer(DrawerLayoutContainer layout) { drawerLayoutContainer = layout; } - public void setAllowOpenDrawer(boolean value) { - allowOpenDrawer = value; + public DrawerLayoutContainer getDrawerLayoutContainer() { + return drawerLayoutContainer; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarMenuItem.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarMenuItem.java index 26f66390b..766a9a154 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarMenuItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/ActionBarMenuItem.java @@ -382,7 +382,7 @@ public class ActionBarMenuItem extends ImageView { layoutParams.width = 0; layoutParams.gravity = Gravity.CENTER_VERTICAL; layoutParams.height = AndroidUtilities.dp(36); - layoutParams.rightMargin = AndroidUtilities.dp(4); + layoutParams.rightMargin = AndroidUtilities.dp(16); searchField.setLayoutParams(layoutParams); searchField.setVisibility(GONE); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/DrawerLayoutContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/DrawerLayoutContainer.java index ac630b946..c1004411f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ActionBar/DrawerLayoutContainer.java @@ -8,30 +8,56 @@ package org.telegram.ui.Views.ActionBar; +import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.drawable.Drawable; import android.os.Build; import android.view.Gravity; +import android.view.MotionEvent; +import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.WindowInsets; +import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; +import android.widget.ListView; import org.telegram.android.AndroidUtilities; -import org.telegram.ui.AnimationCompat.ViewProxy; +import org.telegram.messenger.R; +import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.ui.AnimationCompat.AnimatorSetProxy; +import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; public class DrawerLayoutContainer extends FrameLayout { private static final int MIN_DRAWER_MARGIN = 64; private View drawerLayout; + private ActionBarLayout parentActionBarLayout; + + private boolean maybeStartTracking = false; + private boolean startedTracking = false; + private int startedTrackingX; + private int startedTrackingY; + private int startedTrackingPointerId; + private VelocityTracker velocityTracker = null; + private boolean beginTrackingSent; + private AnimatorSetProxy currentAnimation = null; private Paint statusBarPaint = new Paint(); + private Paint scrimPaint = new Paint(); + private Object lastInsets; private boolean inLayout; private int minDrawerMargin; - private float drawerOffset; + private float scrimOpacity; + private Drawable shadowLeft; + private boolean allowOpenDrawer; + + private int drawerPosition = 0; + private boolean drawerOpened = false; public DrawerLayoutContainer(Context context) { super(context); @@ -44,6 +70,8 @@ public class DrawerLayoutContainer extends FrameLayout { setFitsSystemWindows(true); configureApplyInsets(this); } + + shadowLeft = getResources().getDrawable(R.drawable.menu_shadow); } private class InsetsListener implements View.OnApplyWindowInsetsListener { @@ -111,29 +139,228 @@ public class DrawerLayoutContainer extends FrameLayout { } public void moveDrawerByX(int dx) { - if (dx > drawerLayout.getMeasuredWidth()) { - dx = drawerLayout.getMeasuredWidth(); - } - ViewProxy.setTranslationX(drawerLayout, dx); + setDrawerPosition(drawerPosition + dx); + } - final int newVisibility = dx > 0 ? VISIBLE : INVISIBLE; + public void setDrawerPosition(int value) { + drawerPosition = value; + if (drawerPosition > drawerLayout.getMeasuredWidth()) { + drawerPosition = drawerLayout.getMeasuredWidth(); + } else if (drawerPosition < 0) { + drawerPosition = 0; + } + requestLayout(); + + final int newVisibility = drawerPosition > 0 ? VISIBLE : INVISIBLE; if (drawerLayout.getVisibility() != newVisibility) { drawerLayout.setVisibility(newVisibility); } + setScrimOpacity((float)drawerPosition / (float)drawerLayout.getMeasuredWidth()); } - public void openDrawer() { - + public int getDrawerPosition() { + return drawerPosition; } - public void closeDrawer() { + public void cancelCurrentAnimation() { + if (currentAnimation != null) { + currentAnimation.cancel(); + currentAnimation = null; + } + } + public void openDrawer(boolean fast) { + cancelCurrentAnimation(); + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + animatorSet.playTogether( + ObjectAnimatorProxy.ofInt(this, "drawerPosition", drawerLayout.getMeasuredWidth()) + ); + animatorSet.setInterpolator(new DecelerateInterpolator()); + if (fast) { + animatorSet.setDuration(Math.max((int) (200.0f / drawerLayout.getMeasuredWidth() * (drawerLayout.getMeasuredWidth() - drawerPosition)), 50)); + } else { + animatorSet.setDuration(300); + } + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animator) { + onDrawerAnimationEnd(true); + } + + @Override + public void onAnimationCancel(Object animator) { + onDrawerAnimationEnd(true); + } + }); + animatorSet.start(); + currentAnimation = animatorSet; + } + + public void closeDrawer(boolean fast) { + cancelCurrentAnimation(); + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + animatorSet.playTogether( + ObjectAnimatorProxy.ofInt(this, "drawerPosition", 0) + ); + animatorSet.setInterpolator(new DecelerateInterpolator()); + if (fast) { + animatorSet.setDuration(Math.max((int) (200.0f / drawerLayout.getMeasuredWidth() * drawerPosition), 50)); + } else { + animatorSet.setDuration(300); + } + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animator) { + onDrawerAnimationEnd(false); + } + + @Override + public void onAnimationCancel(Object animator) { + onDrawerAnimationEnd(false); + } + }); + animatorSet.start(); + } + + private void onDrawerAnimationEnd(boolean opened) { + AndroidUtilities.unlockOrientation((Activity) getContext()); + startedTracking = false; + currentAnimation = null; + drawerOpened = opened; + if (!opened) { + if (drawerLayout instanceof ListView) { + ((ListView)drawerLayout).setSelectionFromTop(0, 0); + } + } + } + + private void setScrimOpacity(float value) { + scrimOpacity = value; + invalidate(); + } + + private float getScrimOpacity() { + return scrimOpacity; } public View getDrawerLayout() { return drawerLayout; } + public void setParentActionBarLayout(ActionBarLayout layout) { + parentActionBarLayout = layout; + } + + public void setAllowOpenDrawer(boolean value) { + allowOpenDrawer = value; + } + + private void prepareForDrawerOpen(MotionEvent ev) { + maybeStartTracking = false; + startedTracking = true; + if (ev != null) { + startedTrackingX = (int) ev.getX(); + } + beginTrackingSent = false; + AndroidUtilities.lockOrientation((Activity)getContext()); + } + + public boolean isDrawerOpened() { + return drawerOpened; + } + + public boolean onTouchEvent(MotionEvent ev) { + if (!parentActionBarLayout.checkTransitionAnimation()) { + if (drawerOpened && ev != null && ev.getX() > drawerPosition && !startedTracking) { + if (ev.getAction() == MotionEvent.ACTION_UP) { + closeDrawer(false); + } + return true; + } + if (allowOpenDrawer && parentActionBarLayout.fragmentsStack.size() == 1) { + if (ev != null && (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_MOVE) && !startedTracking && !maybeStartTracking) { + startedTrackingPointerId = ev.getPointerId(0); + maybeStartTracking = true; + startedTrackingX = (int) ev.getX(); + startedTrackingY = (int) ev.getY(); + cancelCurrentAnimation(); + if (velocityTracker != null) { + velocityTracker.clear(); + } + } else if (ev != null && ev.getAction() == MotionEvent.ACTION_MOVE && ev.getPointerId(0) == startedTrackingPointerId) { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain(); + } + int dx = (int) (ev.getX() - startedTrackingX); + int dy = Math.abs((int) ev.getY() - startedTrackingY); + velocityTracker.addMovement(ev); + if (maybeStartTracking && !startedTracking && Math.abs(dx) / 3 > Math.abs(dy)) { + prepareForDrawerOpen(ev); + startedTrackingX = (int) ev.getX(); + } else if (startedTracking) { + if (!beginTrackingSent) { + if (((Activity)getContext()).getCurrentFocus() != null) { + AndroidUtilities.hideKeyboard(((Activity)getContext()).getCurrentFocus()); + } + beginTrackingSent = true; + } + moveDrawerByX(dx); + startedTrackingX = (int) ev.getX(); + } + } else if (ev == null || ev != null && ev.getPointerId(0) == startedTrackingPointerId && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_POINTER_UP)) { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain(); + } + velocityTracker.computeCurrentVelocity(1000); + if (!startedTracking) { + float velX = velocityTracker.getXVelocity(); + float velY = velocityTracker.getYVelocity(); + if (Math.abs(velX) >= 1500 && Math.abs(velX) > Math.abs(velY)) { + prepareForDrawerOpen(ev); + if (!beginTrackingSent) { + if (((Activity)getContext()).getCurrentFocus() != null) { + AndroidUtilities.hideKeyboard(((Activity)getContext()).getCurrentFocus()); + } + beginTrackingSent = true; + } + } + } + if (startedTracking) { + float velX = velocityTracker.getXVelocity(); + float velY = velocityTracker.getYVelocity(); + boolean backAnimation = drawerPosition < drawerLayout.getMeasuredWidth() / 2.0f && (velX < 1500 || Math.abs(velX) < Math.abs(velY)) || velX < 0 && Math.abs(velX) >= 1500; + if (!backAnimation) { + openDrawer(!drawerOpened && Math.abs(velX) >= 1500); + } else { + closeDrawer(drawerOpened && Math.abs(velX) >= 1500); + } + startedTracking = false; + } else { + maybeStartTracking = false; + startedTracking = false; + } + if (velocityTracker != null) { + velocityTracker.recycle(); + velocityTracker = null; + } + } + } + return startedTracking; + } + return false; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return parentActionBarLayout.checkTransitionAnimation() || onTouchEvent(ev); + } + + @Override + public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { + onTouchEvent(null); + super.requestDisallowInterceptTouchEvent(disallowIntercept); + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); @@ -159,7 +386,7 @@ public class DrawerLayoutContainer extends FrameLayout { if (drawerLayout != child) { child.layout(lp.leftMargin, lp.topMargin, lp.leftMargin + child.getMeasuredWidth(), lp.topMargin + child.getMeasuredHeight()); } else { - child.layout(-child.getMeasuredWidth(), lp.topMargin, 0, lp.topMargin + child.getMeasuredHeight()); + child.layout(-child.getMeasuredWidth() + drawerPosition, lp.topMargin, drawerPosition, lp.topMargin + child.getMeasuredHeight()); } } inLayout = false; @@ -207,6 +434,7 @@ public class DrawerLayoutContainer extends FrameLayout { final int contentHeightSpec = MeasureSpec.makeMeasureSpec(heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY); child.measure(contentWidthSpec, contentHeightSpec); } else { + child.setPadding(0, 0, 0, 0); final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec, minDrawerMargin + lp.leftMargin + lp.rightMargin, lp.width); final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec, lp.topMargin + lp.bottomMargin, lp.height); child.measure(drawerWidthSpec, drawerHeightSpec); @@ -214,403 +442,10 @@ public class DrawerLayoutContainer extends FrameLayout { } } - - /*private static final int MIN_DRAWER_MARGIN = 64; // dp - - private static final int DEFAULT_SCRIM_COLOR = 0x99000000; - - private static final int PEEK_DELAY = 160; // ms - - private static final int MIN_FLING_VELOCITY = 400; // dips per second - - private static final boolean ALLOW_EDGE_LOCK = false; - - private static final boolean CHILDREN_DISALLOW_INTERCEPT = true; - - private static final float TOUCH_SLOP_SENSITIVITY = 1.f; - - private static final int[] LAYOUT_ATTRS = new int[] { - android.R.attr.layout_gravity - }; - - private final ChildAccessibilityDelegate mChildAccessibilityDelegate = - new ChildAccessibilityDelegate(); - - private int mMinDrawerMargin; - - private int mScrimColor = DEFAULT_SCRIM_COLOR; - private float mScrimOpacity; - private Paint mScrimPaint = new Paint(); - - private final ViewDragHelper mLeftDragger; - private final ViewDragHelper mRightDragger; - private final ViewDragCallback mLeftCallback; - private final ViewDragCallback mRightCallback; - private int mDrawerState; - private boolean mInLayout; - private boolean mFirstLayout = true; - private int mLockModeLeft; - private int mLockModeRight; - private boolean mDisallowInterceptRequested; - private boolean mChildrenCanceledTouch; - - private DrawerListener mListener; - - private float mInitialMotionX; - private float mInitialMotionY; - - private Drawable mShadowLeft; - private Drawable mShadowRight; - - - private CharSequence mTitleLeft; - private CharSequence mTitleRight; - - private Object mLastInsets; - private boolean mDrawStatusBarBackground; - - public interface DrawerListener { - public void onDrawerSlide(View drawerView, float slideOffset); - public void onDrawerOpened(View drawerView); - public void onDrawerClosed(View drawerView); - public void onDrawerStateChanged(@State int newState); - } - - public static abstract class SimpleDrawerListener implements DrawerListener { - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - } - - @Override - public void onDrawerOpened(View drawerView) { - } - - @Override - public void onDrawerClosed(View drawerView) { - } - - @Override - public void onDrawerStateChanged(int newState) { - } - } - - public void setDrawerShadow(Drawable shadowDrawable, @EdgeGravity int gravity) { - - final int absGravity = GravityCompat.getAbsoluteGravity(gravity, - ViewCompat.getLayoutDirection(this)); - if ((absGravity & Gravity.LEFT) == Gravity.LEFT) { - mShadowLeft = shadowDrawable; - invalidate(); - } - if ((absGravity & Gravity.RIGHT) == Gravity.RIGHT) { - mShadowRight = shadowDrawable; - invalidate(); - } - } - - public void setDrawerShadow(@DrawableRes int resId, @EdgeGravity int gravity) { - setDrawerShadow(getResources().getDrawable(resId), gravity); - } - - public void setScrimColor(int color) { - mScrimColor = color; - invalidate(); - } - - public void setDrawerListener(DrawerListener listener) { - mListener = listener; - } - - public void setDrawerLockMode(@LockMode int lockMode) { - setDrawerLockMode(lockMode, Gravity.LEFT); - setDrawerLockMode(lockMode, Gravity.RIGHT); - } - - public void setDrawerLockMode(@LockMode int lockMode, @EdgeGravity int edgeGravity) { - final int absGravity = GravityCompat.getAbsoluteGravity(edgeGravity, - ViewCompat.getLayoutDirection(this)); - if (absGravity == Gravity.LEFT) { - mLockModeLeft = lockMode; - } else if (absGravity == Gravity.RIGHT) { - mLockModeRight = lockMode; - } - if (lockMode != LOCK_MODE_UNLOCKED) { - // Cancel interaction in progress - final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger; - helper.cancel(); - } - switch (lockMode) { - case LOCK_MODE_LOCKED_OPEN: - final View toOpen = findDrawerWithGravity(absGravity); - if (toOpen != null) { - openDrawer(toOpen); - } - break; - case LOCK_MODE_LOCKED_CLOSED: - final View toClose = findDrawerWithGravity(absGravity); - if (toClose != null) { - closeDrawer(toClose); - } - break; - // default: do nothing - } - } - - public void setDrawerLockMode(@LockMode int lockMode, View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a " + - "drawer with appropriate layout_gravity"); - } - final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; - setDrawerLockMode(lockMode, gravity); - } - - @LockMode - public int getDrawerLockMode(@EdgeGravity int edgeGravity) { - final int absGravity = GravityCompat.getAbsoluteGravity( - edgeGravity, ViewCompat.getLayoutDirection(this)); - if (absGravity == Gravity.LEFT) { - return mLockModeLeft; - } else if (absGravity == Gravity.RIGHT) { - return mLockModeRight; - } - return LOCK_MODE_UNLOCKED; - } - - @LockMode - public int getDrawerLockMode(View drawerView) { - final int absGravity = getDrawerViewAbsoluteGravity(drawerView); - if (absGravity == Gravity.LEFT) { - return mLockModeLeft; - } else if (absGravity == Gravity.RIGHT) { - return mLockModeRight; - } - return LOCK_MODE_UNLOCKED; - } - - public void setDrawerTitle(@EdgeGravity int edgeGravity, CharSequence title) { - final int absGravity = GravityCompat.getAbsoluteGravity( - edgeGravity, ViewCompat.getLayoutDirection(this)); - if (absGravity == Gravity.LEFT) { - mTitleLeft = title; - } else if (absGravity == Gravity.RIGHT) { - mTitleRight = title; - } - } - - @Nullable - public CharSequence getDrawerTitle(@EdgeGravity int edgeGravity) { - final int absGravity = GravityCompat.getAbsoluteGravity( - edgeGravity, ViewCompat.getLayoutDirection(this)); - if (absGravity == Gravity.LEFT) { - return mTitleLeft; - } else if (absGravity == Gravity.RIGHT) { - return mTitleRight; - } - return null; - } - - void updateDrawerState(int forGravity, @State int activeState, View activeDrawer) { - final int leftState = mLeftDragger.getViewDragState(); - final int rightState = mRightDragger.getViewDragState(); - - final int state; - if (leftState == STATE_DRAGGING || rightState == STATE_DRAGGING) { - state = STATE_DRAGGING; - } else if (leftState == STATE_SETTLING || rightState == STATE_SETTLING) { - state = STATE_SETTLING; - } else { - state = STATE_IDLE; - } - - if (activeDrawer != null && activeState == STATE_IDLE) { - final LayoutParams lp = (LayoutParams) activeDrawer.getLayoutParams(); - if (lp.onScreen == 0) { - dispatchOnDrawerClosed(activeDrawer); - } else if (lp.onScreen == 1) { - dispatchOnDrawerOpened(activeDrawer); - } - } - - if (state != mDrawerState) { - mDrawerState = state; - - if (mListener != null) { - mListener.onDrawerStateChanged(state); - } - } - } - - void dispatchOnDrawerClosed(View drawerView) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (lp.knownOpen) { - lp.knownOpen = false; - if (mListener != null) { - mListener.onDrawerClosed(drawerView); - } - - // If no drawer is opened, all drawers are not shown - // for accessibility and the content is shown. - View content = getChildAt(0); - if (content != null) { - ViewCompat.setImportantForAccessibility(content, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES); - } - ViewCompat.setImportantForAccessibility(drawerView, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - - // Only send WINDOW_STATE_CHANGE if the host has window focus. This - // may change if support for multiple foreground windows (e.g. IME) - // improves. - if (hasWindowFocus()) { - final View rootView = getRootView(); - if (rootView != null) { - rootView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - } - } - } - } - - void dispatchOnDrawerOpened(View drawerView) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (!lp.knownOpen) { - lp.knownOpen = true; - if (mListener != null) { - mListener.onDrawerOpened(drawerView); - } - - // If a drawer is opened, only it is shown for - // accessibility and the content is not shown. - View content = getChildAt(0); - if (content != null) { - ViewCompat.setImportantForAccessibility(content, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - } - ViewCompat.setImportantForAccessibility(drawerView, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES); - - sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - drawerView.requestFocus(); - } - } - - void dispatchOnDrawerSlide(View drawerView, float slideOffset) { - if (mListener != null) { - mListener.onDrawerSlide(drawerView, slideOffset); - } - } - - void setDrawerViewOffset(View drawerView, float slideOffset) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - if (slideOffset == lp.onScreen) { - return; - } - - lp.onScreen = slideOffset; - dispatchOnDrawerSlide(drawerView, slideOffset); - } - - float getDrawerViewOffset(View drawerView) { - return ((LayoutParams) drawerView.getLayoutParams()).onScreen; - } - - int getDrawerViewAbsoluteGravity(View drawerView) { - final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity; - return GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this)); - } - - boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) { - final int absGravity = getDrawerViewAbsoluteGravity(drawerView); - return (absGravity & checkFor) == checkFor; - } - - View findOpenDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (((LayoutParams) child.getLayoutParams()).knownOpen) { - return child; - } - } - return null; - } - - void moveDrawerToOffset(View drawerView, float slideOffset) { - final float oldOffset = getDrawerViewOffset(drawerView); - final int width = drawerView.getWidth(); - final int oldPos = (int) (width * oldOffset); - final int newPos = (int) (width * slideOffset); - final int dx = newPos - oldPos; - - drawerView.offsetLeftAndRight( - checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT) ? dx : -dx); - setDrawerViewOffset(drawerView, slideOffset); - } - - View findDrawerWithGravity(int gravity) { - final int absHorizGravity = GravityCompat.getAbsoluteGravity( - gravity, ViewCompat.getLayoutDirection(this)) & Gravity.HORIZONTAL_GRAVITY_MASK; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final int childAbsGravity = getDrawerViewAbsoluteGravity(child); - if ((childAbsGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == absHorizGravity) { - return child; - } - } - return null; - } - - static String gravityToString(@EdgeGravity int gravity) { - if ((gravity & Gravity.LEFT) == Gravity.LEFT) { - return "LEFT"; - } - if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { - return "RIGHT"; - } - return Integer.toHexString(gravity); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mFirstLayout = true; - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - mFirstLayout = true; - } - - @Override - public void computeScroll() { - final int childCount = getChildCount(); - float scrimOpacity = 0; - for (int i = 0; i < childCount; i++) { - final float onscreen = ((LayoutParams) getChildAt(i).getLayoutParams()).onScreen; - scrimOpacity = Math.max(scrimOpacity, onscreen); - } - mScrimOpacity = scrimOpacity; - - // "|" used on purpose; both need to run. - if (mLeftDragger.continueSettling(true) | mRightDragger.continueSettling(true)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - - private static boolean hasOpaqueBackground(View v) { - final Drawable bg = v.getBackground(); - if (bg != null) { - return bg.getOpacity() == PixelFormat.OPAQUE; - } - return false; - } - @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { final int height = getHeight(); - final boolean drawingContent = isContentView(child); + final boolean drawingContent = child != drawerLayout; int clipLeft = 0, clipRight = getWidth(); final int restoreCount = canvas.save(); @@ -618,18 +453,13 @@ public class DrawerLayoutContainer extends FrameLayout { final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View v = getChildAt(i); - if (v == child || v.getVisibility() != VISIBLE || - !hasOpaqueBackground(v) || !isDrawerView(v) || - v.getHeight() < height) { + if (v == child || v.getVisibility() != VISIBLE || v != drawerLayout || v.getHeight() < height) { continue; } - if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) { - final int vright = v.getRight(); - if (vright > clipLeft) clipLeft = vright; - } else { - final int vleft = v.getLeft(); - if (vleft < clipRight) clipRight = vleft; + final int vright = v.getRight(); + if (vright > clipLeft) { + clipLeft = vright; } } canvas.clipRect(clipLeft, 0, clipRight, getHeight()); @@ -637,541 +467,15 @@ public class DrawerLayoutContainer extends FrameLayout { final boolean result = super.drawChild(canvas, child, drawingTime); canvas.restoreToCount(restoreCount); - if (mScrimOpacity > 0 && drawingContent) { - final int baseAlpha = (mScrimColor & 0xff000000) >>> 24; - final int imag = (int) (baseAlpha * mScrimOpacity); - final int color = imag << 24 | (mScrimColor & 0xffffff); - mScrimPaint.setColor(color); - - canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint); - } else if (mShadowLeft != null && checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - final int shadowWidth = mShadowLeft.getIntrinsicWidth(); - final int childRight = child.getRight(); - final int drawerPeekDistance = mLeftDragger.getEdgeSize(); - final float alpha = - Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f)); - mShadowLeft.setBounds(childRight, child.getTop(), - childRight + shadowWidth, child.getBottom()); - mShadowLeft.setAlpha((int) (0xff * alpha)); - mShadowLeft.draw(canvas); - } else if (mShadowRight != null && checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) { - final int shadowWidth = mShadowRight.getIntrinsicWidth(); - final int childLeft = child.getLeft(); - final int showing = getWidth() - childLeft; - final int drawerPeekDistance = mRightDragger.getEdgeSize(); - final float alpha = - Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f)); - mShadowRight.setBounds(childLeft - shadowWidth, child.getTop(), - childLeft, child.getBottom()); - mShadowRight.setAlpha((int) (0xff * alpha)); - mShadowRight.draw(canvas); + if (scrimOpacity > 0 && drawingContent) { + scrimPaint.setColor((int) (((0x99000000 & 0xff000000) >>> 24) * scrimOpacity) << 24); + canvas.drawRect(clipLeft, 0, clipRight, getHeight(), scrimPaint); + } else if (shadowLeft != null) { + final float alpha = Math.max(0, Math.min((float) drawerPosition / AndroidUtilities.dp(20), 1.f)); + shadowLeft.setBounds(drawerPosition, child.getTop(), drawerPosition + shadowLeft.getIntrinsicWidth(), child.getBottom()); + shadowLeft.setAlpha((int) (0xff * alpha)); + shadowLeft.draw(canvas); } return result; } - - boolean isContentView(View child) { - return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY; - } - - boolean isDrawerView(View child) { - final int gravity = ((LayoutParams) child.getLayoutParams()).gravity; - final int absGravity = GravityCompat.getAbsoluteGravity(gravity, - ViewCompat.getLayoutDirection(child)); - return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - final int action = MotionEventCompat.getActionMasked(ev); - - // "|" used deliberately here; both methods should be invoked. - final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) | - mRightDragger.shouldInterceptTouchEvent(ev); - - boolean interceptForTap = false; - - switch (action) { - case MotionEvent.ACTION_DOWN: { - final float x = ev.getX(); - final float y = ev.getY(); - mInitialMotionX = x; - mInitialMotionY = y; - if (mScrimOpacity > 0 && - isContentView(mLeftDragger.findTopChildUnder((int) x, (int) y))) { - interceptForTap = true; - } - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - // If we cross the touch slop, don't perform the delayed peek for an edge touch. - if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { - mLeftCallback.removeCallbacks(); - mRightCallback.removeCallbacks(); - } - break; - } - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: { - closeDrawers(true); - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - } - } - - return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - mLeftDragger.processTouchEvent(ev); - mRightDragger.processTouchEvent(ev); - - final int action = ev.getAction(); - boolean wantTouchEvents = true; - - switch (action & MotionEventCompat.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: { - final float x = ev.getX(); - final float y = ev.getY(); - mInitialMotionX = x; - mInitialMotionY = y; - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - - case MotionEvent.ACTION_UP: { - final float x = ev.getX(); - final float y = ev.getY(); - boolean peekingOnly = true; - final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y); - if (touchedView != null && isContentView(touchedView)) { - final float dx = x - mInitialMotionX; - final float dy = y - mInitialMotionY; - final int slop = mLeftDragger.getTouchSlop(); - if (dx * dx + dy * dy < slop * slop) { - // Taps close a dimmed open drawer but only if it isn't locked open. - final View openDrawer = findOpenDrawer(); - if (openDrawer != null) { - peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN; - } - } - } - closeDrawers(peekingOnly); - mDisallowInterceptRequested = false; - break; - } - - case MotionEvent.ACTION_CANCEL: { - closeDrawers(true); - mDisallowInterceptRequested = false; - mChildrenCanceledTouch = false; - break; - } - } - - return wantTouchEvents; - } - - public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { - if (CHILDREN_DISALLOW_INTERCEPT || - (!mLeftDragger.isEdgeTouched(ViewDragHelper.EDGE_LEFT) && - !mRightDragger.isEdgeTouched(ViewDragHelper.EDGE_RIGHT))) { - // If we have an edge touch we want to skip this and track it for later instead. - super.requestDisallowInterceptTouchEvent(disallowIntercept); - } - mDisallowInterceptRequested = disallowIntercept; - if (disallowIntercept) { - closeDrawers(true); - } - } - - public void closeDrawers() { - closeDrawers(false); - } - - void closeDrawers(boolean peekingOnly) { - boolean needsInvalidate = false; - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - - if (!isDrawerView(child) || (peekingOnly && !lp.isPeeking)) { - continue; - } - - final int childWidth = child.getWidth(); - - if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - needsInvalidate |= mLeftDragger.smoothSlideViewTo(child, - -childWidth, child.getTop()); - } else { - needsInvalidate |= mRightDragger.smoothSlideViewTo(child, - getWidth(), child.getTop()); - } - - lp.isPeeking = false; - } - - mLeftCallback.removeCallbacks(); - mRightCallback.removeCallbacks(); - - if (needsInvalidate) { - invalidate(); - } - } - - public void openDrawer(View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); - } - - if (mFirstLayout) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - lp.onScreen = 1.f; - lp.knownOpen = true; - - View content = getChildAt(0); - if (content != null) { - ViewCompat.setImportantForAccessibility(content, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - } - ViewCompat.setImportantForAccessibility(drawerView, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES); - } else { - if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { - mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop()); - } else { - mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(), - drawerView.getTop()); - } - } - invalidate(); - } - - public void openDrawer(@EdgeGravity int gravity) { - final View drawerView = findDrawerWithGravity(gravity); - if (drawerView == null) { - throw new IllegalArgumentException("No drawer view found with gravity " + - gravityToString(gravity)); - } - openDrawer(drawerView); - } - - public void closeDrawer(View drawerView) { - if (!isDrawerView(drawerView)) { - throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); - } - - if (mFirstLayout) { - final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams(); - lp.onScreen = 0.f; - lp.knownOpen = false; - } else { - if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) { - mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(), - drawerView.getTop()); - } else { - mRightDragger.smoothSlideViewTo(drawerView, getWidth(), drawerView.getTop()); - } - } - invalidate(); - } - - public void closeDrawer(@EdgeGravity int gravity) { - final View drawerView = findDrawerWithGravity(gravity); - if (drawerView == null) { - throw new IllegalArgumentException("No drawer view found with gravity " + - gravityToString(gravity)); - } - closeDrawer(drawerView); - } - - public boolean isDrawerOpen(View drawer) { - if (!isDrawerView(drawer)) { - throw new IllegalArgumentException("View " + drawer + " is not a drawer"); - } - return ((LayoutParams) drawer.getLayoutParams()).knownOpen; - } - - public boolean isDrawerOpen(@EdgeGravity int drawerGravity) { - final View drawerView = findDrawerWithGravity(drawerGravity); - if (drawerView != null) { - return isDrawerOpen(drawerView); - } - return false; - } - - public boolean isDrawerVisible(View drawer) { - if (!isDrawerView(drawer)) { - throw new IllegalArgumentException("View " + drawer + " is not a drawer"); - } - return ((LayoutParams) drawer.getLayoutParams()).onScreen > 0; - } - - public boolean isDrawerVisible(@EdgeGravity int drawerGravity) { - final View drawerView = findDrawerWithGravity(drawerGravity); - if (drawerView != null) { - return isDrawerVisible(drawerView); - } - return false; - } - - private boolean hasPeekingDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams(); - if (lp.isPeeking) { - return true; - } - } - return false; - } - - @Override - protected ViewGroup.LayoutParams generateDefaultLayoutParams() { - return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); - } - - @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof LayoutParams - ? new LayoutParams((LayoutParams) p) - : p instanceof ViewGroup.MarginLayoutParams - ? new LayoutParams((MarginLayoutParams) p) - : new LayoutParams(p); - } - - @Override - protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { - return p instanceof LayoutParams && super.checkLayoutParams(p); - } - - @Override - public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { - return new LayoutParams(getContext(), attrs); - } - - private boolean hasVisibleDrawer() { - return findVisibleDrawer() != null; - } - - private View findVisibleDrawer() { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (isDrawerView(child) && isDrawerVisible(child)) { - return child; - } - } - return null; - } - - void cancelChildViewTouch() { - // Cancel child touches - if (!mChildrenCanceledTouch) { - final long now = SystemClock.uptimeMillis(); - final MotionEvent cancelEvent = MotionEvent.obtain(now, now, - MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - getChildAt(i).dispatchTouchEvent(cancelEvent); - } - cancelEvent.recycle(); - mChildrenCanceledTouch = true; - } - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && hasVisibleDrawer()) { - KeyEventCompat.startTracking(event); - return true; - } - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - final View visibleDrawer = findVisibleDrawer(); - if (visibleDrawer != null && getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED) { - closeDrawers(); - } - return visibleDrawer != null; - } - return super.onKeyUp(keyCode, event); - } - - private class ViewDragCallback extends ViewDragHelper.Callback { - private final int mAbsGravity; - private ViewDragHelper mDragger; - - private final Runnable mPeekRunnable = new Runnable() { - @Override public void run() { - peekDrawer(); - } - }; - - public ViewDragCallback(int gravity) { - mAbsGravity = gravity; - } - - public void setDragger(ViewDragHelper dragger) { - mDragger = dragger; - } - - public void removeCallbacks() { - DrawerLayout.this.removeCallbacks(mPeekRunnable); - } - - @Override - public boolean tryCaptureView(View child, int pointerId) { - // Only capture views where the gravity matches what we're looking for. - // This lets us use two ViewDragHelpers, one for each side drawer. - return isDrawerView(child) && checkDrawerViewAbsoluteGravity(child, mAbsGravity) - && getDrawerLockMode(child) == LOCK_MODE_UNLOCKED; - } - - @Override - public void onViewDragStateChanged(int state) { - updateDrawerState(mAbsGravity, state, mDragger.getCapturedView()); - } - - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { - float offset; - final int childWidth = changedView.getWidth(); - - // This reverses the positioning shown in onLayout. - if (checkDrawerViewAbsoluteGravity(changedView, Gravity.LEFT)) { - offset = (float) (childWidth + left) / childWidth; - } else { - final int width = getWidth(); - offset = (float) (width - left) / childWidth; - } - setDrawerViewOffset(changedView, offset); - changedView.setVisibility(offset == 0 ? INVISIBLE : VISIBLE); - invalidate(); - } - - @Override - public void onViewCaptured(View capturedChild, int activePointerId) { - final LayoutParams lp = (LayoutParams) capturedChild.getLayoutParams(); - lp.isPeeking = false; - - closeOtherDrawer(); - } - - private void closeOtherDrawer() { - final int otherGrav = mAbsGravity == Gravity.LEFT ? Gravity.RIGHT : Gravity.LEFT; - final View toClose = findDrawerWithGravity(otherGrav); - if (toClose != null) { - closeDrawer(toClose); - } - } - - @Override - public void onViewReleased(View releasedChild, float xvel, float yvel) { - // Offset is how open the drawer is, therefore left/right values - // are reversed from one another. - final float offset = getDrawerViewOffset(releasedChild); - final int childWidth = releasedChild.getWidth(); - - int left; - if (checkDrawerViewAbsoluteGravity(releasedChild, Gravity.LEFT)) { - left = xvel > 0 || xvel == 0 && offset > 0.5f ? 0 : -childWidth; - } else { - final int width = getWidth(); - left = xvel < 0 || xvel == 0 && offset > 0.5f ? width - childWidth : width; - } - - mDragger.settleCapturedViewAt(left, releasedChild.getTop()); - invalidate(); - } - - @Override - public void onEdgeTouched(int edgeFlags, int pointerId) { - postDelayed(mPeekRunnable, PEEK_DELAY); - } - - private void peekDrawer() { - final View toCapture; - final int childLeft; - final int peekDistance = mDragger.getEdgeSize(); - final boolean leftEdge = mAbsGravity == Gravity.LEFT; - if (leftEdge) { - toCapture = findDrawerWithGravity(Gravity.LEFT); - childLeft = (toCapture != null ? -toCapture.getWidth() : 0) + peekDistance; - } else { - toCapture = findDrawerWithGravity(Gravity.RIGHT); - childLeft = getWidth() - peekDistance; - } - // Only peek if it would mean making the drawer more visible and the drawer isn't locked - if (toCapture != null && ((leftEdge && toCapture.getLeft() < childLeft) || - (!leftEdge && toCapture.getLeft() > childLeft)) && - getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { - final LayoutParams lp = (LayoutParams) toCapture.getLayoutParams(); - mDragger.smoothSlideViewTo(toCapture, childLeft, toCapture.getTop()); - lp.isPeeking = true; - invalidate(); - - closeOtherDrawer(); - - cancelChildViewTouch(); - } - } - - @Override - public boolean onEdgeLock(int edgeFlags) { - if (ALLOW_EDGE_LOCK) { - final View drawer = findDrawerWithGravity(mAbsGravity); - if (drawer != null && !isDrawerOpen(drawer)) { - closeDrawer(drawer); - } - return true; - } - return false; - } - - @Override - public void onEdgeDragStarted(int edgeFlags, int pointerId) { - final View toCapture; - if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) { - toCapture = findDrawerWithGravity(Gravity.LEFT); - } else { - toCapture = findDrawerWithGravity(Gravity.RIGHT); - } - - if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) { - mDragger.captureChildView(toCapture, pointerId); - } - } - - @Override - public int getViewHorizontalDragRange(View child) { - return isDrawerView(child) ? child.getWidth() : 0; - } - - @Override - public int clampViewPositionHorizontal(View child, int left, int dx) { - if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { - return Math.max(-child.getWidth(), Math.min(left, 0)); - } else { - final int width = getWidth(); - return Math.max(width - child.getWidth(), Math.min(left, width)); - } - } - - @Override - public int clampViewPositionVertical(View child, int top, int dy) { - return child.getTop(); - } - } -*/ } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarDrawable.java index 24922c0c6..23a406d07 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarDrawable.java @@ -72,6 +72,10 @@ public class AvatarDrawable extends Drawable { } } + public void setColor(int value) { + color = value; + } + public void setInfo(int id, String firstName, String lastName, boolean isBroadcast) { color = arrColors[Math.abs(id) % arrColors.length]; diff --git a/TMessagesProj/src/main/res/drawable-hdpi/floating.png b/TMessagesProj/src/main/res/drawable-hdpi/floating.png index 5b3784248..419d0b821 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/floating.png and b/TMessagesProj/src/main/res/drawable-hdpi/floating.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/floating_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/floating_pressed.png index 285040bf4..418c3ac59 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/floating_pressed.png and b/TMessagesProj/src/main/res/drawable-hdpi/floating_pressed.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_broadcast.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_broadcast.png new file mode 100755 index 000000000..439cbb7cd Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_contacts.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_contacts.png new file mode 100755 index 000000000..d2ce6e645 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_contacts.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_help.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_help.png new file mode 100755 index 000000000..3acaa23ee Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_help.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_invite.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_invite.png new file mode 100755 index 000000000..eee0ec8f1 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_invite.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_newgroup.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_newgroup.png new file mode 100755 index 000000000..09dec72f6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_newgroup.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_secret.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_secret.png new file mode 100755 index 000000000..60c65a29c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_secret.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_settings.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_settings.png new file mode 100755 index 000000000..012774675 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_settings.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_shadow.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_shadow.png new file mode 100755 index 000000000..e60f9bf98 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_shadow.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/floating.png b/TMessagesProj/src/main/res/drawable-mdpi/floating.png index bc566ba39..11b10cf31 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/floating.png and b/TMessagesProj/src/main/res/drawable-mdpi/floating.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/floating_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/floating_pressed.png index 50dfdc652..bdcb34f27 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/floating_pressed.png and b/TMessagesProj/src/main/res/drawable-mdpi/floating_pressed.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_broadcast.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_broadcast.png new file mode 100755 index 000000000..ff619d43b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_contacts.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_contacts.png new file mode 100755 index 000000000..d068de483 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_contacts.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_help.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_help.png new file mode 100755 index 000000000..73fa5a6b5 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_help.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_invite.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_invite.png new file mode 100755 index 000000000..6f2d41a50 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_invite.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_newgroup.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_newgroup.png new file mode 100755 index 000000000..7b5185f95 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_newgroup.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_secret.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_secret.png new file mode 100755 index 000000000..c24175901 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_secret.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_settings.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_settings.png new file mode 100755 index 000000000..c3d57c210 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_settings.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_shadow.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_shadow.png new file mode 100755 index 000000000..1ffe94269 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_shadow.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/floating.png b/TMessagesProj/src/main/res/drawable-xhdpi/floating.png index c087569c8..a7e9c09f6 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/floating.png and b/TMessagesProj/src/main/res/drawable-xhdpi/floating.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/floating_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/floating_pressed.png index 12374fc27..81cccd447 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/floating_pressed.png and b/TMessagesProj/src/main/res/drawable-xhdpi/floating_pressed.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_broadcast.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_broadcast.png new file mode 100755 index 000000000..1a2a61a0c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_contacts.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_contacts.png new file mode 100755 index 000000000..a7cc40dff Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_contacts.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_help.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_help.png new file mode 100755 index 000000000..256a4fc15 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_help.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_invite.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_invite.png new file mode 100755 index 000000000..67ff57b19 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_invite.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_newgroup.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_newgroup.png new file mode 100755 index 000000000..a55f0aa5f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_newgroup.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_secret.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_secret.png new file mode 100755 index 000000000..ffb647b0b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_secret.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_settings.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_settings.png new file mode 100755 index 000000000..972c2ab6b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_settings.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_shadow.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_shadow.png new file mode 100755 index 000000000..8d539199a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_shadow.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/floating.png b/TMessagesProj/src/main/res/drawable-xxhdpi/floating.png index bd6d1c2c2..e8d384d6b 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/floating.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/floating.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/floating_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/floating_pressed.png index 68f657512..37e2a6f10 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/floating_pressed.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/floating_pressed.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_broadcast.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_broadcast.png new file mode 100755 index 000000000..cf8e5baa9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_contacts.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_contacts.png new file mode 100755 index 000000000..483e8669b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_contacts.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_help.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_help.png new file mode 100755 index 000000000..6d46163da Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_help.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_invite.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_invite.png new file mode 100755 index 000000000..e7e1adbeb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_invite.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_newgroup.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_newgroup.png new file mode 100755 index 000000000..d83702f7b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_newgroup.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_secret.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_secret.png new file mode 100755 index 000000000..9c1b7903f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_secret.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_settings.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_settings.png new file mode 100755 index 000000000..bcd8ec6b9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_settings.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_shadow.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_shadow.png new file mode 100755 index 000000000..bc4fc1ea9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_shadow.png differ