+ *
* 下午3:18:45 */ -public class ChatMessageAdapter extends CommonAdapter
+     *             false   initial position
+     */
+    public void MoveVideoView(boolean flag) {
+
+        if (flag) {
+            if (mScreenHeight > mScreenWidth) {
+                SUB_Y = 80;
+                SUB_WIDTH = 20;
+                SUB_HEIGHT = 18;
+
+            } else {
+                SUB_Y = 65;
+                SUB_WIDTH = 20;
+                SUB_HEIGHT = 25;
+            }
+
+        } else {
+            if (mScreenHeight > mScreenWidth) {
+                SUB_Y = 65;
+                SUB_WIDTH = 20;
+                SUB_HEIGHT = 18;
+
+            } else {
+                SUB_Y = 45;
+                SUB_WIDTH = 20;
+                SUB_HEIGHT = 25;
+            }
+        }
+
+        int startPosition = (100 - SUB_WIDTH * mRemoteRenders.size()) / 2;
+        int remotePosition;
+        int index;
+        Iterator
- *         create at 2015-12-1 上午10:35:11
+ *         create at 2015-12-1 ??10:35:11
  */
-public class Utils
-{
-
+public class Utils {
 	public static Toast mToast;
 
 	/**
 	 * @param mContext
 	 * @param msg
 	 */
-	public static void showToast(Context mContext, String msg)
-	{
-		if (mToast == null)
-		{
+	public static void showToast(Context mContext, String msg) {
+		if (mToast == null) {
 			mToast = Toast.makeText(mContext, "", Toast.LENGTH_SHORT);
 		}
+
 		mToast.setText(msg);
 		mToast.show();
 	}
 
 	/**
-	 * 
+	 *
 	 * @param event
 	 * @return
 	 */
-	public static String getActionName(MotionEvent event)
-	{
+	public static String getActionName(MotionEvent event) {
 		String action = "unknow";
-		switch (MotionEventCompat.getActionMasked(event))
-		{
-		case MotionEvent.ACTION_DOWN:
-			action = "ACTION_DOWN";
-			break;
-		case MotionEvent.ACTION_MOVE:
-			action = "ACTION_MOVE";
-			break;
-		case MotionEvent.ACTION_UP:
-			action = "ACTION_UP";
-			break;
-		case MotionEvent.ACTION_CANCEL:
-			action = "ACTION_CANCEL";
-			break;
-		case MotionEvent.ACTION_OUTSIDE:
-			action = "ACTION_SCROLL";
-			break;
-		default:
-			break;
+
+		switch (MotionEventCompat.getActionMasked(event)) {
+			case MotionEvent.ACTION_DOWN:
+				action = "ACTION_DOWN";
+
+				break;
+
+			case MotionEvent.ACTION_MOVE:
+				action = "ACTION_MOVE";
+
+				break;
+
+			case MotionEvent.ACTION_UP:
+				action = "ACTION_UP";
+
+				break;
+
+			case MotionEvent.ACTION_CANCEL:
+				action = "ACTION_CANCEL";
+
+				break;
+
+			case MotionEvent.ACTION_OUTSIDE:
+				action = "ACTION_SCROLL";
+
+				break;
+
+			default:
+				break;
 		}
+
 		return action;
 	}
 }
diff --git a/app/src/main/java/org/dync/teameeting/widgets/BottomMenu.java b/app/src/main/java/org/dync/teameeting/widgets/BottomMenu.java
index c1cf6dc..be5e770 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/BottomMenu.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/BottomMenu.java
@@ -1,48 +1,48 @@
 package org.dync.teameeting.widgets;
 
-import org.dync.teameeting.R;
-import org.dync.teameeting.TeamMeetingApp;
-import org.dync.teameeting.utils.ScreenUtils;
-import org.w3c.dom.ls.LSException;
-
 import android.content.Context;
-import android.text.Html;
+
+import android.net.MailTo;
+
 import android.util.AttributeSet;
 import android.util.Log;
+
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
 import android.view.View;
-import android.view.ViewConfiguration;
 import android.view.ViewGroup;
+
 import android.widget.Scroller;
 
+import com.orhanobut.logger.Logger;
+
+import org.dync.teameeting.R;
+import org.dync.teameeting.TeamMeetingApp;
+import org.dync.teameeting.utils.ScreenUtils;
+
+
 /**
  * org.dync.teammeeting.ui.BottomMenu
  *
  * @author ZLang 
- *         后期努力完善 有部分bug 不影响使用 create at 2015-11-30 下午7:01:22
  */
-public class BottomMenu extends ViewGroup
-{
-
+public class BottomMenu extends ViewGroup {
+    private static String TAG = "BottomMenu";
+    private static final int TOUCH_STATE_REST = 0;
+    private static final int TOUCH_STATE_SCROLLING = 1;
     private Context mContext;
-    private static String TAG = "xbl";
     private boolean mDebug = TeamMeetingApp.mIsDebug;
     private Scroller mScroller = null;
-
-    private static final int TOUCH_STATE_REST = 0;
-    private static final int TOUCH_STATE_SCROLLING = 1;
     private int mTouchState = TOUCH_STATE_REST;
+
     // --------------------
     // onTouCh proportion
     private float mTouchSlop = 2.5f;
     private float mLastionMotionX = 0;
     private float mLastMotionY = 0;
-
     private VelocityTracker mVelocityTracker = null; // Touch Tracker
     private int mMenuHeight;
     private int mScreenHeight;
-
     private int mMaxTop;
     private int mTop;
     private int mBottom;
@@ -50,36 +50,31 @@ public class BottomMenu extends ViewGroup
     private int mDyration = 800;
     private int mXDiff;
     private View seetingLayout;
+    private OnTouchSpeedListener touchSpeedListener;
 
-    public BottomMenu(Context context)
-    {
+    public BottomMenu(Context context) {
         super(context);
         mContext = context;
         init();
     }
 
-    public BottomMenu(Context context, AttributeSet attrs)
-    {
+    public BottomMenu(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
         init();
     }
 
     @Override
-    public void computeScroll()
-    {
-        if (mScroller.computeScrollOffset())
-        {
+    public void computeScroll() {
+        if (mScroller.computeScrollOffset()) {
             scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
             postInvalidate();
         }
     }
 
-    private void init()
-    {
+    private void init() {
         mScroller = new Scroller(mContext);
 
-
         final float density = mContext.getResources().getDisplayMetrics().density;
 
         int tagHeight = Integer.parseInt(this.getTag().toString());
@@ -88,144 +83,115 @@ private void init()
         mScreenHeight = ScreenUtils.getScreenHeight(getContext());
         speedClose = mTouchSlop * ScreenUtils.getScreenHeight(getContext());
 
-        if (mDebug)
-        {
-            Log.e(TAG, "init: mScreenHeight"+mScreenHeight +"speedClose"+speedClose );
+        if (mDebug) {
+            Log.e(TAG,
+                    "init: mScreenHeight" + mScreenHeight + "speedClose" +
+                            speedClose);
         }
 
         mTop = mScreenHeight - mMenuHeight;
-        if (TeamMeetingApp.isPad)
-        {
-            mTop = mTop / 2;
-            if (mDebug)
-            {
-                Log.e(TAG, "平板: mTop" + mTop);
-            }
 
+        if (TeamMeetingApp.isPad) {
+            mTop = mTop / 2;
+            mMaxTop = 0;
+        } else {
+            mMaxTop = ScreenUtils.dpToP(getResources(), 50);
         }
-        mMaxTop = 0;
 
-        if (mDebug)
-        {
+        if (mDebug) {
             Log.e(TAG, "mMaxTop--" + mMaxTop);
         }
 
-
-	    /*	if (tagHeight < 400)
-        {
-			mTop = mScreenHeight - mMenuHeight;
-			mMaxTop = 0;
-		} else
-		{
-			mTop = mScreenHeight - mMenuHeight / 2;
-			mMaxTop = mMenuHeight / 2;
-		}*/
-
-        if (mDebug)
+        if (mDebug) {
             Log.e(TAG, "---menuHeight --" + mMenuHeight);
+        }
     }
 
     @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
-    {
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int width = MeasureSpec.getSize(widthMeasureSpec);
         int height = MeasureSpec.getSize(heightMeasureSpec);
 
-        //测量宽高
         setMeasuredDimension(width, height);
 
-        for (int i = 0; i < getChildCount(); i++)
-        {
+        for (int i = 0; i < getChildCount(); i++) {
             View child = getChildAt(i);
             child.measure(widthMeasureSpec, heightMeasureSpec);
         }
     }
 
     @Override
-    protected void onFinishInflate()
-    {
+    protected void onFinishInflate() {
         super.onFinishInflate();
         seetingLayout = findViewById(R.id.rl_seetingLayout);
-        Log.e(TAG, "onFinishInflate: "+seetingLayout.getMeasuredHeight());
+        Log.e(TAG, "onFinishInflate: " + seetingLayout.getMeasuredHeight());
     }
 
-    // layout过程
+    // layout??
     @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b)
-    {
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        Log.e(TAG, "onLayout: " + seetingLayout.getMeasuredHeight());
 
-        Log.e(TAG, "onLayout: "+seetingLayout.getMeasuredHeight() );
-        if (!TeamMeetingApp.isPad)
-        {
-            t = mTop;
-        }
-
-        for (int i = 0; i < getChildCount(); i++)
-        {
+        for (int i = 0; i < getChildCount(); i++) {
             View child = getChildAt(i);
-            child.layout(l,t, r, b);
+            child.layout(l, t, r, b);
         }
     }
 
     @Override
-    public boolean dispatchTouchEvent(MotionEvent ev)
-    {
-        // final int action = ev.getAction();
+    public boolean dispatchTouchEvent(MotionEvent ev) {
         return super.dispatchTouchEvent(ev);
     }
 
     // @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev)
-    {
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
         final int action = ev.getAction();
 
         final float x = ev.getX();
         final float y = ev.getY();
 
-        switch (action)
-        {
+        switch (action) {
             case MotionEvent.ACTION_MOVE:
+
                 // Log.e(TAG, "onInterceptTouchEvent move");
                 final int xDiff = (int) Math.abs(mLastionMotionX - x);
                 int yDiff = (int) Math.abs(mLastMotionY - y);
 
-                if (Math.abs(xDiff) > Math.abs(yDiff))
-                {
+                if (Math.abs(xDiff) > Math.abs(yDiff)) {
                     return false;
                 }
 
-                if (xDiff > 0)
-                {
+                if (xDiff > 0) {
                     mTouchState = TOUCH_STATE_SCROLLING;
                 }
+
                 break;
 
             case MotionEvent.ACTION_DOWN:
-                // Log.e(TAG, "onInterceptTouchEvent down");
                 mLastionMotionX = x;
                 mLastMotionY = y;
-                // Log.e(TAG, mScroller.isFinished() + "");
-                if (mScroller != null)
-                {
-                    if (!mScroller.isFinished())
-                    {
+
+                if (mScroller != null) {
+                    if (!mScroller.isFinished()) {
                         mScroller.abortAnimation();
                     }
                 }
+
                 mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
                         : TOUCH_STATE_SCROLLING;
-                // mTouchState = TOUCH_STATE_SCROLLING;
 
+                // mTouchState = TOUCH_STATE_SCROLLING;
                 break;
 
             case MotionEvent.ACTION_CANCEL:
             case MotionEvent.ACTION_UP:
                 Log.e(TAG, "onInterceptTouchEvent up or cancel");
                 mTouchState = TOUCH_STATE_REST;
+
                 break;
         }
-        if (mDebug)
-        {
+
+        if (mDebug) {
             Log.e(TAG, mTouchState + "====" + TOUCH_STATE_REST);
         }
 
@@ -233,121 +199,106 @@ public boolean onInterceptTouchEvent(MotionEvent ev)
     }
 
     @Override
-    public boolean onTouchEvent(MotionEvent event)
-    {
-        if (mVelocityTracker == null)
-        {
+    public boolean onTouchEvent(MotionEvent event) {
+        if (mVelocityTracker == null) {
             mVelocityTracker = VelocityTracker.obtain();
         }
+
         mVelocityTracker.addMovement(event);
 
         float x = event.getX();
         float y = event.getY();
-        switch (event.getAction())
-        {
+
+        switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
 
-                if (mScroller != null)
-                {
-                    if (!mScroller.isFinished())
-                    {
+                if (mScroller != null) {
+                    if (!mScroller.isFinished()) {
                         mScroller.abortAnimation();
                     }
                 }
+
                 mLastMotionY = y;
                 mLastionMotionX = x;
+
                 break;
+
             case MotionEvent.ACTION_MOVE:
+
                 // Log.e(TAG, "onTouchEvent = MOVE" + getScrollY());
                 int detaX = (int) (mLastionMotionX - x);
                 int detaY = (int) (mLastMotionY - y);
 
-                if (Math.abs(detaY) < 500)
-                {
+                if (Math.abs(detaY) < 500) {
                     scrollBy(0, detaY);
                 }
+
                 mLastionMotionX = x;
                 mLastMotionY = y;
 
                 // mTouchState = TOUCH_STATE_REST;
-
                 break;
+
             case MotionEvent.ACTION_UP:
                 Log.e(TAG, "onTouchEvent = UP" + getScrollY());
+
                 final VelocityTracker velocityTracker = mVelocityTracker;
                 velocityTracker.computeCurrentVelocity(1000);
+
                 int velocityX = (int) velocityTracker.getXVelocity();
                 int velocityY = (int) velocityTracker.getYVelocity();
 
-
-
-                if (velocityY > speedClose)
-                {
-                    if (touchSpeedListener != null)
-                    {
+                if (velocityY > speedClose) {
+                    if (touchSpeedListener != null) {
                         scrollBy(0, -mScreenHeight);
                         touchSpeedListener.touchSpeed(velocityX, velocityY);
                     }
-
-                } else
-                {
+                } else {
                     ScrollView(velocityX, velocityY);
                 }
+
                 mTouchState = TOUCH_STATE_REST;
+
                 break;
+
             case MotionEvent.ACTION_CANCEL:
                 Log.e(TAG, "onTouchEvent = CANCEL" + getScrollY());
                 mTouchState = TOUCH_STATE_REST;
+
                 break;
         }
 
         return true;
     }
 
-    private void ScrollView(int velocityX, int velocityY)
-    {
-
-        if (getScrollY() < mMaxTop && getScrollY() >= 0)
-        {
+    private void ScrollView(int velocityX, int velocityY) {
+        if ((getScrollY() < mMaxTop) && (getScrollY() >= 0)) {
             mScroller.fling(getScrollX(), getScrollY(), 0, (int) (-velocityY),
                     0, 0, 0, mMaxTop);
-
-        } else
-        {
-            if (getScrollY() < 0)
-            {
+        } else {
+            if (getScrollY() < 0) {
                 mScroller.startScroll(0, getScrollY(), 0, -(getScrollY()),
                         Math.abs(mDyration));
-            } else
-            {
-
+            } else {
                 mScroller.startScroll(0, getScrollY(), 0,
                         -(getScrollY() - mMaxTop), Math.abs(mDyration));
             }
-
         }
 
         invalidate();
-        if (mVelocityTracker != null)
-        {
+
+        if (mVelocityTracker != null) {
             mVelocityTracker.recycle();
             mVelocityTracker = null;
         }
-
     }
 
-    public interface OnTouchSpeedListener
-    {
-        public void touchSpeed(int velocityX, int velocityY);
-    }
-
-    ;
-
-    private OnTouchSpeedListener touchSpeedListener;
-
     public void setOnTouchQuickSpeedListener(
-            OnTouchSpeedListener touchSpeedListener)
-    {
+            OnTouchSpeedListener touchSpeedListener) {
         this.touchSpeedListener = touchSpeedListener;
     }
+
+    public interface OnTouchSpeedListener {
+         void touchSpeed(int velocityX, int velocityY);
+    }
 }
diff --git a/app/src/main/java/org/dync/teameeting/widgets/ConfirmDialog.java b/app/src/main/java/org/dync/teameeting/widgets/ConfirmDialog.java
new file mode 100644
index 0000000..f4a605e
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/ConfirmDialog.java
@@ -0,0 +1,88 @@
+package org.dync.teameeting.widgets;
+
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import org.dync.teameeting.R;
+
+/**
+ * 确定在右,取消在左
+ */
+public class ConfirmDialog extends AlertDialog implements View.OnClickListener {
+
+
+    private String title;
+    private String userName;
+    private String ok;
+    private boolean isdefaut = true;
+
+    private final OnDialogButtonClickListener listener;
+    private EditText evUsername;
+    private TextView tvTitleText;
+
+    public ConfirmDialog(Context context, String title, String userName, String ok, OnDialogButtonClickListener listener) {
+        super(context);
+        this.title = title;
+        this.userName = userName;
+        this.ok = ok;
+        this.listener = listener;
+    }
+
+    public ConfirmDialog(Context context, String userName, OnDialogButtonClickListener listener) {
+        super(context);
+        this.isdefaut = false;
+        this.userName = userName;
+        this.listener = listener;
+    }
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_ecaluation);
+        tvTitleText = (TextView) findViewById(R.id.tv_title_text);
+        evUsername = (EditText) findViewById(R.id.et_user_name);
+        Button btn_ok = (Button) findViewById(R.id.confirm_button);
+        if (isdefaut) {
+            tvTitleText.setText(title);
+            btn_ok.setText(ok);
+        }
+        evUsername.setText(userName);
+        btn_ok.setOnClickListener(this);
+    }
+
+
+    /**
+     * 对话框按钮单击的监听器
+     */
+    public interface OnDialogButtonClickListener {
+
+        /**
+         * 当确定按钮被单击的时候会执行
+         */
+        void onOkClick(Dialog dialog, View v, String username);
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.confirm_button: // 确定
+                if (listener != null) {
+                    listener.onOkClick(this, v, evUsername.getText().toString().trim());
+                }
+                cancel();
+                break;
+        }
+    }
+
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/MyListView.java b/app/src/main/java/org/dync/teameeting/widgets/MyListView.java
new file mode 100644
index 0000000..3303205
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/MyListView.java
@@ -0,0 +1,31 @@
+package org.dync.teameeting.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.widget.ListView;
+
+/**
+ * Created by Xiao_Bailong on 2016/1/21.
+ */
+public class MyListView extends ListView {
+    public MyListView(Context context) {
+        super(context);
+    }
+
+    public MyListView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MyListView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+    @Override
+    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX,
+                                   int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
+
+        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY,
+                maxOverScrollX, 100, isTouchEvent);
+    }
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/MySwipeRefreshLayout.java b/app/src/main/java/org/dync/teameeting/widgets/MySwipeRefreshLayout.java
new file mode 100644
index 0000000..0963031
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/MySwipeRefreshLayout.java
@@ -0,0 +1,46 @@
+package org.dync.teameeting.widgets;
+
+import android.content.Context;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+
+/**
+ * Created by H_lang on 2016/1/11.
+ */
+public class MySwipeRefreshLayout extends SwipeRefreshLayout {
+    public MySwipeRefreshLayout(Context context) {
+        super(context);
+    }
+
+    public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    private int downY;
+    private int downX;
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent event) {
+        final int action = event.getAction();
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                downY = (int) event.getY();
+                downX = (int) event.getX();
+                return super.onInterceptTouchEvent(event);
+            case MotionEvent.ACTION_MOVE:
+                int deltaY = (int) (event.getY() - downY);
+                int deltaX = (int) (event.getX() - downX);
+                if (deltaY - Math.abs(deltaX) > 10)
+                    return super.onInterceptTouchEvent(event);
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                break;
+        }
+        return false;
+    }
+
+
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/PopupWindowCustom.java b/app/src/main/java/org/dync/teameeting/widgets/PopupWindowCustom.java
index 2f1e674..298a12d 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/PopupWindowCustom.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/PopupWindowCustom.java
@@ -16,124 +16,117 @@
 import org.dync.teameeting.utils.ScreenUtils;
 
 /**
- * 
  * @author ZLang create at 
  *         zhangqilu updata 2015-12-10 下午8:15:02
  */
-public class PopupWindowCustom
-{
-
-	private Context mContext;
-	private PopupWindow mWindow;
-	private LinearLayout mContentView;
-	private ImageButton mClosePopup, mInviteMessagePopup, mInviteWeixinPopup;
-	private TextView mCopyLinkText;
-	private Button mCopyLinkButton;
-	private OnPopupWindowClickListener mOnListener;
-	private int margin_top = 110; // The default distance from the bottom
-	private int mScreenWidth;
-	private int mScreenHeight;
-
-	public PopupWindowCustom(Context context, View btnView, View topbar,
-			OnPopupWindowClickListener listener)
-	{
-		// TODO Auto-generated constructor stub
-		mContext = context;
-		mOnListener = listener;
-		initData();
-		inintView();
-		layoutPopup(btnView, topbar);
-	}
-
-	/**
-	 * 
-	 */
-	private void initData()
-	{
-		mScreenWidth = ScreenUtils.getScreenWidth(mContext);
-		mScreenHeight = ScreenUtils.getScreenHeight(mContext);
-	}
-
-	public interface OnPopupWindowClickListener
-	{
-		public void onPopupClickListener(View view);
-	}
-
-	private void layoutPopup(View btnView, View topbar)
-	{
+public class PopupWindowCustom {
+
+    private Context mContext;
+    private PopupWindow mWindow;
+    private LinearLayout mContentView;
+    private ImageButton mClosePopup, mInviteMessagePopup, mInviteWeixinPopup;
+    private TextView mCopyLinkText;
+    private Button mCopyLinkButton;
+    private OnPopupWindowClickListener mOnListener;
+    private int margin_top = 110; // The default distance from the bottom
+    private int mScreenWidth;
+    private int mScreenHeight;
+    private String mShareUrl;
+
+    public PopupWindowCustom(Context context, View btnView, View topbar,
+                             OnPopupWindowClickListener listener, String shareUrl) {
+        // TODO Auto-generated constructor stub
+        mContext = context;
+        mOnListener = listener;
+        mShareUrl = shareUrl;
+        initData();
+        inintView();
+        layoutPopup(btnView, topbar);
+    }
+
+    /**
+     *
+     */
+    private void initData() {
+        mScreenWidth = ScreenUtils.getScreenWidth(mContext);
+        mScreenHeight = ScreenUtils.getScreenHeight(mContext);
+    }
+
+    public interface OnPopupWindowClickListener {
+        public void onPopupClickListener(View view);
+    }
+
+    private void layoutPopup(View btnView, View topbar) {
         int popupWidth = mScreenWidth - btnView.getWidth();
         int[] location = new int[2];
         btnView.getLocationOnScreen(location);
         int btn_weight = btnView.getWidth() / 2;
         int locationY = location[1] + btn_weight;
-        int yoff = btn_weight /2;
+        int yoff = btn_weight / 2;
         int popupheight = mScreenHeight - (locationY * 2);
         mWindow = new PopupWindow(mContext);
         final float density = mContext.getResources().getDisplayMetrics().density;
 
 
-        if (TeamMeetingApp.isPad)
-        {
+        if (TeamMeetingApp.isPad) {
             popupheight = mScreenHeight / 2;
-            popupWidth = (int) ScreenUtils.dip2Dimension(320,mContext);
-            btn_weight = mScreenWidth-popupWidth-btn_weight;
+            popupWidth = (int) ScreenUtils.dip2Dimension(320, mContext);
+            btn_weight = mScreenWidth - popupWidth - btn_weight;
         }
 
-		int marginTop = (int) (margin_top * density);
-
-		mWindow.setHeight(popupheight - marginTop);
-		mWindow.setWidth(popupWidth);
-		mWindow.setContentView(mContentView);
-		mWindow.setFocusable(true);
-		mWindow.setTouchable(true);
-		mWindow.setOutsideTouchable(true);
-		mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
-		mWindow.setAnimationStyle(R.style.popwin_anim_style);
-		mWindow.showAsDropDown(topbar, btn_weight,yoff);
-	}
-
-	private void inintView()
-	{
-
-		if (mScreenHeight < mScreenWidth )
-		{
-			mContentView = (LinearLayout) View.inflate(mContext, R.layout.popup_layout_horiz, null);
-			margin_top = 0;
-		} else
-		{
-			mContentView = (LinearLayout) View.inflate(mContext, R.layout.popup_layout, null);
-			margin_top = 110;
-		}
-
-		mClosePopup = (ImageButton) mContentView.findViewById(R.id.ibtn_close);
-		mInviteMessagePopup = (ImageButton) mContentView.findViewById(R.id.ibtn_message);
-		mInviteWeixinPopup = (ImageButton) mContentView.findViewById(R.id.ibtn_weixin);
-		mCopyLinkText = (TextView) mContentView.findViewById(R.id.tv_copy);
-		mCopyLinkButton = (Button) mContentView.findViewById(R.id.btn_copy);
-
-		mClosePopup.setOnClickListener(mOnClickListener);
-		mInviteMessagePopup.setOnClickListener(mOnClickListener);
-		mInviteWeixinPopup.setOnClickListener(mOnClickListener);
-		mCopyLinkButton.setOnClickListener(mOnClickListener);
-		mCopyLinkText.setOnClickListener(mOnClickListener);
-	}
-
-	private OnClickListener mOnClickListener = new OnClickListener()
-	{
-
-		@Override
-		public void onClick(View view)
-		{
-			mOnListener.onPopupClickListener(view);
-		}
-	};
-
-	/**
-	 * Dismiss the popup window.
-	 */
-	public void dismiss()
-	{
-		mWindow.dismiss();
-	}
+        int marginTop = (int) (margin_top * density);
+
+        mWindow.setHeight(popupheight - marginTop);
+        mWindow.setWidth(popupWidth);
+        mWindow.setContentView(mContentView);
+        mWindow.setFocusable(true);
+        mWindow.setTouchable(true);
+        mWindow.setOutsideTouchable(true);
+        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+        mWindow.setAnimationStyle(R.style.popwin_anim_style);
+        mWindow.showAsDropDown(topbar, btn_weight, yoff);
+    }
+
+    private void inintView() {
+
+        if (mScreenHeight < mScreenWidth) {
+            mContentView = (LinearLayout) View.inflate(mContext, R.layout.popup_layout_horiz, null);
+            margin_top = 0;
+        } else {
+            mContentView = (LinearLayout) View.inflate(mContext, R.layout.popup_layout, null);
+            margin_top = 110;
+        }
+
+        mClosePopup = (ImageButton) mContentView.findViewById(R.id.ibtn_close);
+        mInviteMessagePopup = (ImageButton) mContentView.findViewById(R.id.ibtn_message);
+        mInviteWeixinPopup = (ImageButton) mContentView.findViewById(R.id.ibtn_weixin);
+        mCopyLinkText = (TextView) mContentView.findViewById(R.id.tv_copy);
+        mCopyLinkButton = (Button) mContentView.findViewById(R.id.btn_copy);
+        mCopyLinkText.setText(mShareUrl);
+
+        mClosePopup.setOnClickListener(mOnClickListener);
+        mInviteMessagePopup.setOnClickListener(mOnClickListener);
+        mInviteWeixinPopup.setOnClickListener(mOnClickListener);
+        mCopyLinkButton.setOnClickListener(mOnClickListener);
+        mCopyLinkText.setOnClickListener(mOnClickListener);
+    }
+
+    private OnClickListener mOnClickListener = new OnClickListener() {
+
+        @Override
+        public void onClick(View view) {
+            mOnListener.onPopupClickListener(view);
+        }
+    };
+
+    /**
+     * Dismiss the popup window.
+     */
+    public void dismiss() {
+        mWindow.dismiss();
+        if (mContext != null) {
+            mContext = null;
+        }
+    }
 
 }
diff --git a/app/src/main/java/org/dync/teameeting/widgets/ReFlashListView.java b/app/src/main/java/org/dync/teameeting/widgets/ReFlashListView.java
new file mode 100644
index 0000000..1326a46
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/ReFlashListView.java
@@ -0,0 +1,269 @@
+package org.dync.teameeting.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.RotateAnimation;
+import android.view.animation.TranslateAnimation;
+import android.widget.AbsListView;
+import android.widget.AbsListView.OnScrollListener;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import org.dync.teameeting.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class ReFlashListView extends ListView implements OnScrollListener {
+	View header;
+	int headerHeight;
+	int firstVisibleItem;
+	int scrollState;
+	boolean isRemark;
+	int startY;
+
+	int state;
+	final int NONE = 0;
+	final int PULL = 1;
+	final int RELESE = 2;
+	final int REFLASHING = 3;
+	IReflashListener iReflashListener;
+	public ReFlashListView(Context context) {
+		super(context);
+		// TODO Auto-generated constructor stub
+		initView(context);
+	}
+
+	public ReFlashListView(Context context, AttributeSet attrs) {
+		super(context, attrs);
+		// TODO Auto-generated constructor stub
+		initView(context);
+	}
+
+	public ReFlashListView(Context context, AttributeSet attrs, int defStyle) {
+		super(context, attrs, defStyle);
+		// TODO Auto-generated constructor stub
+		initView(context);
+	}
+
+	/**
+	 *
+	 * @param context
+     */
+
+	private void initView(Context context) {
+		LayoutInflater inflater = LayoutInflater.from(context);
+		header = inflater.inflate(R.layout.header_layout, null);
+		measureView(header);
+		headerHeight = header.getMeasuredHeight();
+		Log.i("tag", "headerHeight = " + headerHeight);
+		topPadding(-headerHeight);
+		this.addHeaderView(header);
+		this.setOnScrollListener(this);
+	}
+
+	/**
+	 * measureView
+	 *
+	 * @param view
+     */
+	private void measureView(View view) {
+		ViewGroup.LayoutParams p = view.getLayoutParams();
+		if (p == null) {
+			p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+					ViewGroup.LayoutParams.WRAP_CONTENT);
+		}
+		int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);
+		int height;
+		int tempHeight = p.height;
+		if (tempHeight > 0) {
+			height = MeasureSpec.makeMeasureSpec(tempHeight,
+					MeasureSpec.EXACTLY);
+		} else {
+			height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+		}
+		view.measure(width, height);
+	}
+
+	/**
+	 * topPadding
+	 *
+	 * @param topPadding
+     */
+	private void topPadding(int topPadding) {
+		header.setPadding(header.getPaddingLeft(), topPadding,
+				header.getPaddingRight(), header.getPaddingBottom());
+		header.invalidate();
+	}
+
+	@Override
+	public void onScroll(AbsListView view, int firstVisibleItem,
+			int visibleItemCount, int totalItemCount) {
+		// TODO Auto-generated method stub
+		this.firstVisibleItem = firstVisibleItem;
+	}
+
+	@Override
+	public void onScrollStateChanged(AbsListView view, int scrollState) {
+		// TODO Auto-generated method stub
+		this.scrollState = scrollState;
+	}
+
+	@Override
+	public boolean onTouchEvent(MotionEvent ev) {
+		// TODO Auto-generated method stub
+		switch (ev.getAction()) {
+		case MotionEvent.ACTION_DOWN:
+			if (firstVisibleItem == 0) {
+				isRemark = true;
+				startY = (int) ev.getY();
+			}
+			break;
+
+		case MotionEvent.ACTION_MOVE:
+			onMove(ev);
+			break;
+		case MotionEvent.ACTION_UP:
+			if (state == RELESE) {
+				state = REFLASHING;
+				reflashViewByState();
+				iReflashListener.onReflash();
+			} else if (state == PULL) {
+				state = NONE;
+				isRemark = false;
+				reflashViewByState();
+			}
+			break;
+		}
+		return super.onTouchEvent(ev);
+	}
+
+	/**
+	 *
+	 * @param ev
+     */
+	int topPadding;
+	private void onMove(MotionEvent ev) {
+		if (!isRemark) {
+			return;
+		}
+		int tempY = (int) ev.getY();
+		int space = tempY - startY;
+		topPadding = space - headerHeight;
+		Log.e("onMove", "onMove: "+ topPadding);
+		switch (state) {
+		case NONE:
+			if (space > 0) {
+				state = PULL;
+				reflashViewByState();
+			}
+			break;
+		case PULL:
+			topPadding(topPadding);
+			if (space > headerHeight + 30
+					&& scrollState == SCROLL_STATE_TOUCH_SCROLL) {
+				state = RELESE;
+				reflashViewByState();
+			}
+			break;
+		case RELESE:
+			topPadding(topPadding);
+			if (space < headerHeight + 30) {
+				state = PULL;
+				reflashViewByState();
+			} else if (space <= 0) {
+				state = NONE;
+				isRemark = false;
+				reflashViewByState();
+			}
+			break;
+		}
+	}
+
+
+	private void reflashViewByState() {
+		TextView tip = (TextView) header.findViewById(R.id.tip);
+		ImageView arrow = (ImageView) header.findViewById(R.id.arrow);
+		ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);
+		TextView lastupdatetime = (TextView) header
+				.findViewById(R.id.lastupdate_time);
+		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
+		Date date = new Date(System.currentTimeMillis());
+		String time = format.format(date);
+		lastupdatetime.setText(time);
+		RotateAnimation anim = new RotateAnimation(0, 180,
+				RotateAnimation.RELATIVE_TO_SELF, 0.5f,
+				RotateAnimation.RELATIVE_TO_SELF, 0.5f);
+		anim.setDuration(500);
+		anim.setFillAfter(true);
+		RotateAnimation anim1 = new RotateAnimation(180, 0,
+				RotateAnimation.RELATIVE_TO_SELF, 0.5f,
+				RotateAnimation.RELATIVE_TO_SELF, 0.5f);
+		anim1.setDuration(500);
+		anim1.setFillAfter(true);
+		switch (state) {
+		case NONE:
+			arrow.clearAnimation();
+			topPadding(-headerHeight);
+/*			TranslateAnimation translateAnimation = new TranslateAnimation(0,0,0,-(topPadding+headerHeight));
+			translateAnimation.setDuration(500);
+			translateAnimation.setFillAfter(true);
+			header.setAnimation(translateAnimation);*/
+			break;
+
+		case PULL:
+			arrow.setVisibility(View.VISIBLE);
+			progress.setVisibility(View.GONE);
+			tip.setText(getResources().getText(R.string.str_refresh_pull));
+			arrow.clearAnimation();
+			arrow.setAnimation(anim1);
+			break;
+		case RELESE:
+			arrow.setVisibility(View.VISIBLE);
+			progress.setVisibility(View.GONE);
+			tip.setText(getResources().getText(R.string.str_refresh_relese));
+			arrow.clearAnimation();
+			arrow.setAnimation(anim);
+			break;
+		case REFLASHING:
+			topPadding(50);
+			arrow.setVisibility(View.GONE);
+			progress.setVisibility(View.VISIBLE);
+			tip.setText(getResources().getText(R.string.str_refresh_loading));
+			arrow.clearAnimation();
+			break;
+		}
+	}
+
+	/**
+	 * reflashComplete
+	 */
+	public void reflashComplete() {
+		state = NONE;
+		isRemark = false;
+		reflashViewByState();
+/*		TextView lastupdatetime = (TextView) header
+				.findViewById(R.id.lastupdate_time);
+		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
+		Date date = new Date(System.currentTimeMillis());
+		String time = format.format(date);
+		lastupdatetime.setText(time);*/
+	}
+	
+	public void setInterface(IReflashListener iReflashListener){
+		this.iReflashListener = iReflashListener;
+	}
+
+
+
+	public interface IReflashListener{
+		public void onReflash();
+	}
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/RoomControls.java b/app/src/main/java/org/dync/teameeting/widgets/RoomControls.java
index 4819003..08b1204 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/RoomControls.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/RoomControls.java
@@ -1,75 +1,66 @@
 /**
  * RoomControls.java [V 1.0.0]
  * classes:cn.zldemo.touchitem.view.RoomControls
- * Zlang Create at 2015-12-20.下午12:41:12 
+ * Zlang Create at 2015-12-20.下午12:41:12
  */
 package org.dync.teameeting.widgets;
 
-import org.dync.teameeting.ui.helper.Anims;
-import org.dync.teameeting.utils.ScreenUtils;
-
 import android.content.Context;
 import android.util.AttributeSet;
 import android.widget.LinearLayout;
 
+import org.dync.teameeting.ui.helper.Anims;
+import org.dync.teameeting.utils.ScreenUtils;
+
 /**
  * cn.zldemo.touchitem.view.RoomControls
- * 
+ *
  * @author ZLang 
  *         create at 2015-12-20 下午12:41:12
  */
-public class RoomControls extends LinearLayout
-{
+public class RoomControls extends LinearLayout {
 
-	public boolean mAvailable;
+    public boolean mAvailable;
 
-	public RoomControls(Context paramContext)
-	{
-		super(paramContext);
-		init(paramContext, null);
-	}
+    public RoomControls(Context paramContext) {
+        super(paramContext);
+        init(paramContext, null);
+    }
 
-	public RoomControls(Context paramContext, AttributeSet paramAttributeSet)
-	{
-		super(paramContext, paramAttributeSet);
-		init(paramContext, paramAttributeSet);
-	}
+    public RoomControls(Context paramContext, AttributeSet paramAttributeSet) {
+        super(paramContext, paramAttributeSet);
+        init(paramContext, paramAttributeSet);
+    }
 
-	public RoomControls(Context paramContext, AttributeSet paramAttributeSet, int paramInt)
-	{
-		super(paramContext, paramAttributeSet, paramInt);
-		init(paramContext, paramAttributeSet);
-	}
+    public RoomControls(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
+        super(paramContext, paramAttributeSet, paramInt);
+        init(paramContext, paramAttributeSet);
+    }
 
-	private void init(Context paramContext, AttributeSet paramAttributeSet)
-	{
-		this.mAvailable = true;
-	}
+    private void init(Context paramContext, AttributeSet paramAttributeSet) {
+        this.mAvailable = true;
+    }
 
-	public void hide()
-	{
-		this.mAvailable = false;
-		Anims.animateBottomMarginTo(this, ScreenUtils.dpToP(getResources(), -90), 300L,
-				Anims.ACCELERATE);
-		makeInvisible();
-	}
+    public void hide() {
+        this.mAvailable = false;
+        Anims.animateBottomMarginTo(this, ScreenUtils.dpToP(getResources(), -90), 300L,
+                Anims.ACCELERATE);
+        makeInvisible();
+    }
 
-	public void makeInvisible()
-	{
-		Anims.fadeOut(this, 300L);
-	}
+    public void makeInvisible() {
+        Anims.fadeOut(this, 300L);
+    }
 
-	public void show()
-	{
-		this.mAvailable = true;
-		Anims.animateBottomMarginTo(this, ScreenUtils.dpToP(getResources(), 20), 300L,
-				Anims.EASE_OUT);
-		makeVisible();
-	}
+    public void show() {
+        this.mAvailable = true;
+        Anims.animateBottomMarginTo(this, ScreenUtils.dpToP(getResources(), 20), 300L,
+                Anims.EASE_OUT);
+        makeVisible();
+    }
 
-	public void makeVisible()
-	{
-		Anims.fadeIn(this, 300L, 0L);
-	}
+    public void makeVisible() {
+        Anims.fadeIn(this, 300L, 0L);
+    }
 
 }
diff --git a/app/src/main/java/org/dync/teameeting/widgets/ScrollListView.java b/app/src/main/java/org/dync/teameeting/widgets/ScrollListView.java
new file mode 100644
index 0000000..e89ccdf
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/ScrollListView.java
@@ -0,0 +1,28 @@
+package org.dync.teameeting.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ListView;
+
+/**
+ * Created by 小白龙 on 2016/1/6 0006.
+ */
+public class ScrollListView extends ListView
+{
+    public ScrollListView(Context context)
+    {
+        super(context);
+    }
+
+    public ScrollListView(Context context, AttributeSet attrs)
+    {
+        super(context, attrs);
+    }
+
+    public ScrollListView(Context context, AttributeSet attrs, int defStyle)
+    {
+        super(context, attrs, defStyle);
+    }
+
+    
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/SlideSwitch.java b/app/src/main/java/org/dync/teameeting/widgets/SlideSwitch.java
index 8ac4fb4..99548ab 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/SlideSwitch.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/SlideSwitch.java
@@ -15,8 +15,6 @@
  */
 package org.dync.teameeting.widgets;
 
-import org.dync.teameeting.R;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
@@ -37,6 +35,8 @@
 import android.view.View;
 import android.view.animation.AccelerateDecelerateInterpolator;
 
+import org.dync.teameeting.R;
+
 public class SlideSwitch extends View
 {
 
diff --git a/app/src/main/java/org/dync/teameeting/widgets/VitualKey.java b/app/src/main/java/org/dync/teameeting/widgets/VitualKey.java
new file mode 100644
index 0000000..9cbaf2c
--- /dev/null
+++ b/app/src/main/java/org/dync/teameeting/widgets/VitualKey.java
@@ -0,0 +1,50 @@
+package org.dync.teameeting.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+/**
+ * Created by zhangqilu on 2016/3/2.
+ */
+public class VitualKey extends RelativeLayout {
+
+    private LayoutKeyChange mLayoutKeyChange ;
+
+    public VitualKey(Context context) {
+
+        super(context);
+
+
+    }
+
+    public VitualKey(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public VitualKey(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+        //Log.e("onLayout", "onLayout: b "+b);
+        if(changed)
+            if (mLayoutKeyChange != null) {
+                mLayoutKeyChange.onLayoutKeyChange(b);
+            }
+    }
+
+
+    public void setInterface(LayoutKeyChange layoutKeyChange){
+        mLayoutKeyChange = layoutKeyChange;
+    }
+
+
+    public interface LayoutKeyChange{
+        public void onLayoutKeyChange(int b);
+    }
+
+}
diff --git a/app/src/main/java/org/dync/teameeting/widgets/swipe/FrontLayout.java b/app/src/main/java/org/dync/teameeting/widgets/swipe/FrontLayout.java
index 11c1945..88c72b4 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/swipe/FrontLayout.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/swipe/FrontLayout.java
@@ -1,12 +1,12 @@
 package org.dync.teameeting.widgets.swipe;
 
-import org.dync.teameeting.widgets.swipe.SwipeLayout.Status;
-
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.widget.RelativeLayout;
 
+import org.dync.teameeting.widgets.swipe.SwipeLayout.Status;
+
 public class FrontLayout extends RelativeLayout
 {
 
diff --git a/app/src/main/java/org/dync/teameeting/widgets/swipe/SwipeLayout.java b/app/src/main/java/org/dync/teameeting/widgets/swipe/SwipeLayout.java
index 74e5b12..46aaf34 100644
--- a/app/src/main/java/org/dync/teameeting/widgets/swipe/SwipeLayout.java
+++ b/app/src/main/java/org/dync/teameeting/widgets/swipe/SwipeLayout.java
@@ -8,7 +8,6 @@
 import android.support.v4.widget.ViewDragHelper;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.view.GestureDetector;
 import android.view.GestureDetector.SimpleOnGestureListener;
 import android.view.MotionEvent;
 import android.view.View;
@@ -17,7 +16,7 @@
 /**
  * 
  * 
- * @author PoplarTang H_lang 修改 2015年12月1日14:08:13
+ * @author PoplarTang H_lang
  * 
  */
 public class SwipeLayout extends FrameLayout implements SwipeLayoutInterface
@@ -74,7 +73,7 @@ public SwipeLayout(Context context, AttributeSet attrs, int defStyle)
 
 	}
 
-	private SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener()
+	private SimpleOnGestureListener mOnGestureListener = new SimpleOnGestureListener()
 	{
 
 		@Override
@@ -100,7 +99,7 @@ public int getViewHorizontalDragRange(View child)
 		{
 
 			return mDragDistance;
-		};
+		}
 
 		@Override
 		public int clampViewPositionHorizontal(View child, int left, int dx)
@@ -152,7 +151,7 @@ else if (newLeft > 0)
 			}
 
 			return newLeft;
-		};
+		}
 
 		@Override
 		public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy)
@@ -186,7 +185,7 @@ public void onViewReleased(View releasedChild, float xvel, float yvel)
 				processBackViewRelease(xvel, yvel);
 			}
 			invalidate();
-		};
+		}
 
 	};
 	private float mDownX;
@@ -398,7 +397,7 @@ public void computeScroll()
 	}
 
 	@Override
-	public boolean onInterceptTouchEvent(android.view.MotionEvent ev)
+	public boolean onInterceptTouchEvent(MotionEvent ev)
 	{
 
 		return mDragHelper.shouldInterceptTouchEvent(ev) & mGestureDetector.onTouchEvent(ev);
diff --git a/app/src/main/jniLibs/armeabi-v7a/libanyrtc-jni.so b/app/src/main/jniLibs/armeabi-v7a/libanyrtc-jni.so
deleted file mode 100644
index 05ca855..0000000
Binary files a/app/src/main/jniLibs/armeabi-v7a/libanyrtc-jni.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libanyrtc.so b/app/src/main/jniLibs/armeabi-v7a/libanyrtc.so
deleted file mode 100644
index 5819acf..0000000
Binary files a/app/src/main/jniLibs/armeabi-v7a/libanyrtc.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libjpush210.so b/app/src/main/jniLibs/armeabi-v7a/libjpush210.so
new file mode 100644
index 0000000..e8ffa23
Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libjpush210.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libmeet-jni.so b/app/src/main/jniLibs/armeabi-v7a/libmeet-jni.so
new file mode 100644
index 0000000..919f345
Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libmeet-jni.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libmsgclient-jni.so b/app/src/main/jniLibs/armeabi-v7a/libmsgclient-jni.so
index 2098c00..a2102e0 100755
Binary files a/app/src/main/jniLibs/armeabi-v7a/libmsgclient-jni.so and b/app/src/main/jniLibs/armeabi-v7a/libmsgclient-jni.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libopenh264.so b/app/src/main/jniLibs/armeabi-v7a/libopenh264.so
new file mode 100644
index 0000000..6f74ccd
Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libopenh264.so differ
diff --git a/app/src/main/jniLibs/armeabi/libmsgclient-jni.so b/app/src/main/jniLibs/armeabi/libmsgclient-jni.so
index 2098c00..d7761e0 100755
Binary files a/app/src/main/jniLibs/armeabi/libmsgclient-jni.so and b/app/src/main/jniLibs/armeabi/libmsgclient-jni.so differ
diff --git a/app/src/main/res/anim/scalebottom.xml b/app/src/main/res/anim/scalebottom.xml
new file mode 100644
index 0000000..482ec88
--- /dev/null
+++ b/app/src/main/res/anim/scalebottom.xml
@@ -0,0 +1,13 @@
+
+