Commit a4d42cb9 authored by DrKLO's avatar DrKLO

More Android L design (still not usable)

parent 65e93f91
...@@ -457,6 +457,7 @@ public class AndroidUtilities { ...@@ -457,6 +457,7 @@ public class AndroidUtilities {
Method mGetRawH = Display.class.getMethod("getRawHeight"); Method mGetRawH = Display.class.getMethod("getRawHeight");
size.set((Integer) mGetRawW.invoke(windowManager.getDefaultDisplay()), (Integer) mGetRawH.invoke(windowManager.getDefaultDisplay())); size.set((Integer) mGetRawW.invoke(windowManager.getDefaultDisplay()), (Integer) mGetRawH.invoke(windowManager.getDefaultDisplay()));
} catch (Exception e) { } catch (Exception e) {
size.set(windowManager.getDefaultDisplay().getWidth(), windowManager.getDefaultDisplay().getHeight());
FileLog.e("tmessages", e); FileLog.e("tmessages", e);
} }
} }
......
/*
* 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();
}
}
...@@ -11,11 +11,11 @@ package org.telegram.ui.AnimationCompat; ...@@ -11,11 +11,11 @@ package org.telegram.ui.AnimationCompat;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.view.animation.Interpolator;
import org.telegram.ui.Animation.Animator10; import org.telegram.ui.Animation.Animator10;
import org.telegram.ui.Animation.AnimatorListenerAdapter10; import org.telegram.ui.Animation.AnimatorListenerAdapter10;
import org.telegram.ui.Animation.AnimatorSet10; import org.telegram.ui.Animation.AnimatorSet10;
import org.telegram.ui.Animation.ObjectAnimator10;
import org.telegram.ui.Animation.View10; import org.telegram.ui.Animation.View10;
import java.util.Arrays; import java.util.Arrays;
...@@ -58,11 +58,27 @@ public class AnimatorSetProxy { ...@@ -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) { public void addListener(AnimatorListenerAdapterProxy listener) {
if (View10.NEED_PROXY) { if (View10.NEED_PROXY) {
((AnimatorSet10) animatorSet).addListener((AnimatorListenerAdapter10)listener.animatorListenerAdapter); ((AnimatorSet10) animatorSet).addListener((AnimatorListenerAdapter10) listener.animatorListenerAdapter);
} else { } else {
((AnimatorSet) animatorSet).addListener((AnimatorListenerAdapter) listener.animatorListenerAdapter); ((AnimatorSet) animatorSet).addListener((AnimatorListenerAdapter) listener.animatorListenerAdapter);
} }
} }
public void setInterpolator(Interpolator interpolator) {
if (View10.NEED_PROXY) {
((AnimatorSet10) animatorSet).setInterpolator(interpolator);
} else {
((AnimatorSet) animatorSet).setInterpolator(interpolator);
}
}
} }
/*
* 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);
}
}
/*
* 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));
}
}
/*
* 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));
}
}
/*
* 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);
}
}
...@@ -2852,8 +2852,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not ...@@ -2852,8 +2852,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
} else if (lower_part < 0) { } else if (lower_part < 0) {
args.putInt("chat_id", -lower_part); args.putInt("chat_id", -lower_part);
} }
presentFragment(new ChatActivity(args), true);
forwardSelectedMessages(did, param); forwardSelectedMessages(did, param);
presentFragment(new ChatActivity(args), true);
if (!AndroidUtilities.isTablet()) { if (!AndroidUtilities.isTablet()) {
removeSelfFromStack(); removeSelfFromStack();
} }
......
...@@ -27,9 +27,12 @@ import android.view.View; ...@@ -27,9 +27,12 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
...@@ -45,6 +48,7 @@ import org.telegram.messenger.R; ...@@ -45,6 +48,7 @@ import org.telegram.messenger.R;
import org.telegram.messenger.TLRPC; import org.telegram.messenger.TLRPC;
import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities; import org.telegram.messenger.Utilities;
import org.telegram.ui.Adapters.DrawerLayoutAdapter;
import org.telegram.ui.Views.ActionBar.ActionBarLayout; import org.telegram.ui.Views.ActionBar.ActionBarLayout;
import org.telegram.ui.Views.ActionBar.BaseFragment; import org.telegram.ui.Views.ActionBar.BaseFragment;
import org.telegram.ui.Views.ActionBar.DrawerLayoutContainer; import org.telegram.ui.Views.ActionBar.DrawerLayoutContainer;
...@@ -75,6 +79,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa ...@@ -75,6 +79,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
private LinearLayout buttonLayoutTablet = null; private LinearLayout buttonLayoutTablet = null;
private FrameLayout shadowTabletSide = null; private FrameLayout shadowTabletSide = null;
private ImageView backgroundTablet = null; private ImageView backgroundTablet = null;
private DrawerLayoutContainer drawerLayoutContainer = null;
private boolean tabletFullSize = false; private boolean tabletFullSize = false;
@Override @Override
...@@ -233,21 +239,62 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa ...@@ -233,21 +239,62 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
} }
}); });
} else { } else {
DrawerLayoutContainer drawerLayoutContainer = new DrawerLayoutContainer(this); drawerLayoutContainer = new DrawerLayoutContainer(this);
drawerLayoutContainer.setStatusBarColor(0xff54759e); drawerLayoutContainer.setStatusBarColor(0xff54759e);
drawerLayoutContainer.addView(actionBarLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); drawerLayoutContainer.addView(actionBarLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
FrameLayout frameLayout = new FrameLayout(this); ListView listView = new ListView(this);
drawerLayoutContainer.setDrawerLayout(frameLayout); listView.setAdapter(new DrawerLayoutAdapter(this));
frameLayout.setBackgroundColor(0xffff0000); drawerLayoutContainer.setDrawerLayout(listView);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)frameLayout.getLayoutParams(); listView.setBackgroundColor(0xffffffff);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)listView.getLayoutParams();
Point screenSize = AndroidUtilities.getRealScreenSize(); Point screenSize = AndroidUtilities.getRealScreenSize();
layoutParams.width = Math.min(screenSize.x, screenSize.y) - AndroidUtilities.dp(56); layoutParams.width = Math.min(screenSize.x, screenSize.y) - AndroidUtilities.dp(56);
layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; 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)); setContentView(drawerLayoutContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
actionBarLayout.setDrawerLayout(drawerLayoutContainer); drawerLayoutContainer.setParentActionBarLayout(actionBarLayout);
actionBarLayout.setAllowOpenDrawer(true); drawerLayoutContainer.setAllowOpenDrawer(true);
actionBarLayout.setDrawerLayoutContainer(drawerLayoutContainer);
} }
actionBarLayout.init(mainFragmentsStack); actionBarLayout.init(mainFragmentsStack);
actionBarLayout.setDelegate(this); actionBarLayout.setDelegate(this);
...@@ -965,23 +1012,23 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa ...@@ -965,23 +1012,23 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
public void onBackPressed() { public void onBackPressed() {
if (PhotoViewer.getInstance().isVisible()) { if (PhotoViewer.getInstance().isVisible()) {
PhotoViewer.getInstance().closePhoto(true); PhotoViewer.getInstance().closePhoto(true);
} else { } else if (drawerLayoutContainer.isDrawerOpened()) {
if (AndroidUtilities.isTablet()) { drawerLayoutContainer.closeDrawer(false);
if (layersActionBarLayout.getVisibility() == View.VISIBLE) { } else if (AndroidUtilities.isTablet()) {
layersActionBarLayout.onBackPressed(); if (layersActionBarLayout.getVisibility() == View.VISIBLE) {
} else { layersActionBarLayout.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 { } 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();
} }
} }
......
...@@ -82,13 +82,6 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter ...@@ -82,13 +82,6 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
private long openedDialogId = 0; 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 static interface MessagesActivityDelegate {
public abstract void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param); public abstract void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param);
} }
...@@ -201,39 +194,18 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter ...@@ -201,39 +194,18 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
} else { } else {
actionBarLayer.setBackButtonDrawable(new MenuDrawable()); actionBarLayer.setBackButtonDrawable(new MenuDrawable());
actionBarLayer.setTitle(LocaleController.getString("AppName", R.string.AppName)); 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.setBackOverlay(R.layout.updating_state_layout);
actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() {
@Override @Override
public void onItemClick(int id) { public void onItemClick(int id) {
if (id == messages_list_menu_settings) { if (id == -1) {
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 (onlySelect) { if (onlySelect) {
finishFragment(); 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));
} }
} }
}); });
......
...@@ -66,8 +66,6 @@ public class ActionBarLayout extends FrameLayout { ...@@ -66,8 +66,6 @@ public class ActionBarLayout extends FrameLayout {
private View shadowView; private View shadowView;
private DrawerLayoutContainer drawerLayoutContainer; private DrawerLayoutContainer drawerLayoutContainer;
private boolean allowOpenDrawer;
private Animation openAnimation; private Animation openAnimation;
private Animation closeAnimation; private Animation closeAnimation;
private Animation alphaOpenAnimation; private Animation alphaOpenAnimation;
...@@ -243,14 +241,6 @@ public class ActionBarLayout extends FrameLayout { ...@@ -243,14 +241,6 @@ public class ActionBarLayout extends FrameLayout {
ViewProxy.setTranslationX(shadowView, -AndroidUtilities.dp(2)); 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) { private void prepareForMoving(MotionEvent ev) {
maybeStartTracking = false; maybeStartTracking = false;
startedTracking = true; startedTracking = true;
...@@ -327,6 +317,12 @@ public class ActionBarLayout extends FrameLayout { ...@@ -327,6 +317,12 @@ public class ActionBarLayout extends FrameLayout {
float velY = velocityTracker.getYVelocity(); float velY = velocityTracker.getYVelocity();
if (velX >= 3500 && velX > velY) { if (velX >= 3500 && velX > velY) {
prepareForMoving(ev); prepareForMoving(ev);
if (!beginTrackingSent) {
if (((Activity)getContext()).getCurrentFocus() != null) {
AndroidUtilities.hideKeyboard(((Activity)getContext()).getCurrentFocus());
}
beginTrackingSent = true;
}
} }
} }
if (startedTracking) { if (startedTracking) {
...@@ -386,77 +382,6 @@ public class ActionBarLayout extends FrameLayout { ...@@ -386,77 +382,6 @@ public class ActionBarLayout extends FrameLayout {
velocityTracker = null; 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; return startedTracking;
} }
...@@ -909,11 +834,11 @@ public class ActionBarLayout extends FrameLayout { ...@@ -909,11 +834,11 @@ public class ActionBarLayout extends FrameLayout {
backgroundView = view; backgroundView = view;
} }
public void setDrawerLayout(DrawerLayoutContainer layout) { public void setDrawerLayoutContainer(DrawerLayoutContainer layout) {
drawerLayoutContainer = layout; drawerLayoutContainer = layout;
} }
public void setAllowOpenDrawer(boolean value) { public DrawerLayoutContainer getDrawerLayoutContainer() {
allowOpenDrawer = value; return drawerLayoutContainer;
} }
} }
...@@ -382,7 +382,7 @@ public class ActionBarMenuItem extends ImageView { ...@@ -382,7 +382,7 @@ public class ActionBarMenuItem extends ImageView {
layoutParams.width = 0; layoutParams.width = 0;
layoutParams.gravity = Gravity.CENTER_VERTICAL; layoutParams.gravity = Gravity.CENTER_VERTICAL;
layoutParams.height = AndroidUtilities.dp(36); layoutParams.height = AndroidUtilities.dp(36);
layoutParams.rightMargin = AndroidUtilities.dp(4); layoutParams.rightMargin = AndroidUtilities.dp(16);
searchField.setLayoutParams(layoutParams); searchField.setLayoutParams(layoutParams);
searchField.setVisibility(GONE); searchField.setVisibility(GONE);
} }
......
...@@ -8,30 +8,56 @@ ...@@ -8,30 +8,56 @@
package org.telegram.ui.Views.ActionBar; package org.telegram.ui.Views.ActionBar;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.view.Gravity; import android.view.Gravity;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowInsets; import android.view.WindowInsets;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ListView;
import org.telegram.android.AndroidUtilities; 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 { public class DrawerLayoutContainer extends FrameLayout {
private static final int MIN_DRAWER_MARGIN = 64; private static final int MIN_DRAWER_MARGIN = 64;
private View drawerLayout; 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 statusBarPaint = new Paint();
private Paint scrimPaint = new Paint();
private Object lastInsets; private Object lastInsets;
private boolean inLayout; private boolean inLayout;
private int minDrawerMargin; 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) { public DrawerLayoutContainer(Context context) {
super(context); super(context);
...@@ -44,6 +70,8 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -44,6 +70,8 @@ public class DrawerLayoutContainer extends FrameLayout {
setFitsSystemWindows(true); setFitsSystemWindows(true);
configureApplyInsets(this); configureApplyInsets(this);
} }
shadowLeft = getResources().getDrawable(R.drawable.menu_shadow);
} }
private class InsetsListener implements View.OnApplyWindowInsetsListener { private class InsetsListener implements View.OnApplyWindowInsetsListener {
...@@ -111,29 +139,228 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -111,29 +139,228 @@ public class DrawerLayoutContainer extends FrameLayout {
} }
public void moveDrawerByX(int dx) { public void moveDrawerByX(int dx) {
if (dx > drawerLayout.getMeasuredWidth()) { setDrawerPosition(drawerPosition + dx);
dx = drawerLayout.getMeasuredWidth(); }
public void setDrawerPosition(int value) {
drawerPosition = value;
if (drawerPosition > drawerLayout.getMeasuredWidth()) {
drawerPosition = drawerLayout.getMeasuredWidth();
} else if (drawerPosition < 0) {
drawerPosition = 0;
} }
ViewProxy.setTranslationX(drawerLayout, dx); requestLayout();
final int newVisibility = dx > 0 ? VISIBLE : INVISIBLE; final int newVisibility = drawerPosition > 0 ? VISIBLE : INVISIBLE;
if (drawerLayout.getVisibility() != newVisibility) { if (drawerLayout.getVisibility() != newVisibility) {
drawerLayout.setVisibility(newVisibility); drawerLayout.setVisibility(newVisibility);
} }
setScrimOpacity((float)drawerPosition / (float)drawerLayout.getMeasuredWidth());
}
public int getDrawerPosition() {
return drawerPosition;
}
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 openDrawer() { 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();
} }
public void closeDrawer() { 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() { public View getDrawerLayout() {
return drawerLayout; 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 @Override
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
super.onDraw(canvas); super.onDraw(canvas);
...@@ -159,7 +386,7 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -159,7 +386,7 @@ public class DrawerLayoutContainer extends FrameLayout {
if (drawerLayout != child) { if (drawerLayout != child) {
child.layout(lp.leftMargin, lp.topMargin, lp.leftMargin + child.getMeasuredWidth(), lp.topMargin + child.getMeasuredHeight()); child.layout(lp.leftMargin, lp.topMargin, lp.leftMargin + child.getMeasuredWidth(), lp.topMargin + child.getMeasuredHeight());
} else { } 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; inLayout = false;
...@@ -207,6 +434,7 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -207,6 +434,7 @@ public class DrawerLayoutContainer extends FrameLayout {
final int contentHeightSpec = MeasureSpec.makeMeasureSpec(heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY); final int contentHeightSpec = MeasureSpec.makeMeasureSpec(heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);
child.measure(contentWidthSpec, contentHeightSpec); child.measure(contentWidthSpec, contentHeightSpec);
} else { } else {
child.setPadding(0, 0, 0, 0);
final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec, minDrawerMargin + lp.leftMargin + lp.rightMargin, lp.width); final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec, minDrawerMargin + lp.leftMargin + lp.rightMargin, lp.width);
final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec, lp.topMargin + lp.bottomMargin, lp.height); final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec, lp.topMargin + lp.bottomMargin, lp.height);
child.measure(drawerWidthSpec, drawerHeightSpec); child.measure(drawerWidthSpec, drawerHeightSpec);
...@@ -214,403 +442,10 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -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 @Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) { protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
final int height = getHeight(); final int height = getHeight();
final boolean drawingContent = isContentView(child); final boolean drawingContent = child != drawerLayout;
int clipLeft = 0, clipRight = getWidth(); int clipLeft = 0, clipRight = getWidth();
final int restoreCount = canvas.save(); final int restoreCount = canvas.save();
...@@ -618,18 +453,13 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -618,18 +453,13 @@ public class DrawerLayoutContainer extends FrameLayout {
final int childCount = getChildCount(); final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) { for (int i = 0; i < childCount; i++) {
final View v = getChildAt(i); final View v = getChildAt(i);
if (v == child || v.getVisibility() != VISIBLE || if (v == child || v.getVisibility() != VISIBLE || v != drawerLayout || v.getHeight() < height) {
!hasOpaqueBackground(v) || !isDrawerView(v) ||
v.getHeight() < height) {
continue; continue;
} }
if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) { final int vright = v.getRight();
final int vright = v.getRight(); if (vright > clipLeft) {
if (vright > clipLeft) clipLeft = vright; clipLeft = vright;
} else {
final int vleft = v.getLeft();
if (vleft < clipRight) clipRight = vleft;
} }
} }
canvas.clipRect(clipLeft, 0, clipRight, getHeight()); canvas.clipRect(clipLeft, 0, clipRight, getHeight());
...@@ -637,541 +467,15 @@ public class DrawerLayoutContainer extends FrameLayout { ...@@ -637,541 +467,15 @@ public class DrawerLayoutContainer extends FrameLayout {
final boolean result = super.drawChild(canvas, child, drawingTime); final boolean result = super.drawChild(canvas, child, drawingTime);
canvas.restoreToCount(restoreCount); canvas.restoreToCount(restoreCount);
if (mScrimOpacity > 0 && drawingContent) { if (scrimOpacity > 0 && drawingContent) {
final int baseAlpha = (mScrimColor & 0xff000000) >>> 24; scrimPaint.setColor((int) (((0x99000000 & 0xff000000) >>> 24) * scrimOpacity) << 24);
final int imag = (int) (baseAlpha * mScrimOpacity); canvas.drawRect(clipLeft, 0, clipRight, getHeight(), scrimPaint);
final int color = imag << 24 | (mScrimColor & 0xffffff); } else if (shadowLeft != null) {
mScrimPaint.setColor(color); 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());
canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint); shadowLeft.setAlpha((int) (0xff * alpha));
} else if (mShadowLeft != null && checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) { shadowLeft.draw(canvas);
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);
} }
return result; 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();
}
}
*/
} }
...@@ -72,6 +72,10 @@ public class AvatarDrawable extends Drawable { ...@@ -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) { public void setInfo(int id, String firstName, String lastName, boolean isBroadcast) {
color = arrColors[Math.abs(id) % arrColors.length]; color = arrColors[Math.abs(id) % arrColors.length];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment