浏览代码

完成礼物赠送功能

Junqin Wang 8 年之前
父节点
当前提交
96eaa16d96
共有 31 个文件被更改,包括 1146 次插入88 次删除
  1. 8 1
      app/app.iml
  2. 6 3
      app/src/com/sheishuo/app/cache/AccountCache.java
  3. 25 0
      app/src/com/sheishuo/app/cache/GiftCache.java
  4. 1 3
      app/src/com/sheishuo/app/circle/activity/NewTweetingActivity.java
  5. 1 1
      app/src/com/sheishuo/app/circle/model/NewTweetModel.java
  6. 12 0
      app/src/com/sheishuo/app/common/beans/GiftBean.java
  7. 1 0
      app/src/com/sheishuo/app/common/util/net/INet.java
  8. 35 0
      app/src/com/sheishuo/app/common/util/net/NetImpl.java
  9. 1 0
      app/src/com/sheishuo/app/common/util/net/NetInfo.java
  10. 4 2
      app/src/com/sheishuo/app/login/LoginActivity.java
  11. 33 17
      app/src/com/sheishuo/app/main/fragment/AreaGroupsFragment.java
  12. 1 1
      app/src/com/sheishuo/app/main/fragment/CircleOfFriendsFragment.java
  13. 1 3
      app/src/com/sheishuo/app/main/fragment/HomeFragment.java
  14. 1 1
      app/src/com/sheishuo/app/main/model/CircleModel.java
  15. 6 3
      app/src/com/sheishuo/app/session/SessionHelper.java
  16. 2 1
      uikit/build.gradle
  17. 3 1
      uikit/proguard-rules.pro
  18. 15 0
      uikit/res-ptr2/layout/gift_item_layout.xml
  19. 35 0
      uikit/res/layout/gift_item.xml
  20. 87 0
      uikit/res/layout/gift_panel.xml
  21. 42 0
      uikit/res/layout/input_panel_bottom_func_bar.xml
  22. 8 37
      uikit/res/layout/nim_message_activity_bottom_layout.xml
  23. 1 0
      uikit/res/values/strings.xml
  24. 339 0
      uikit/src/com/netease/nim/uikit/UIKitCache.java
  25. 75 3
      uikit/src/com/netease/nim/uikit/session/extension/GiftAttachment.java
  26. 97 0
      uikit/src/com/netease/nim/uikit/session/module/gift/GiftItemAdapter.java
  27. 175 0
      uikit/src/com/netease/nim/uikit/session/module/gift/GiftPanel.java
  28. 11 0
      uikit/src/com/netease/nim/uikit/session/module/gift/OnGiftCheckedListener.java
  29. 32 3
      uikit/src/com/netease/nim/uikit/session/module/input/InputPanel.java
  30. 79 0
      uikit/src/com/netease/nim/uikit/session/viewholder/MsgViewHolderGift.java
  31. 9 8
      uikit/uikit.iml

+ 8 - 1
app/app.iml

@@ -87,7 +87,6 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/multi-dex" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
@@ -140,5 +139,13 @@
     <orderEntry type="library" exported="" name="support-compat-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="animated-vector-drawable-25.3.1" level="project" />
     <orderEntry type="module" module-name="uikit" exported="" />
+    <orderEntry type="library" exported="" name="java-json" level="project" />
+    <orderEntry type="library" exported="" name="renderscript-v8" level="project" />
+    <orderEntry type="library" exported="" name="glide-3.7.0" level="project" />
+    <orderEntry type="library" exported="" name="nim-avchat-4.0.0" level="project" />
+    <orderEntry type="library" exported="" name="constraint-layout-solver-1.0.2" level="project" />
+    <orderEntry type="library" exported="" name="nim-basesdk-4.0.0" level="project" />
+    <orderEntry type="library" exported="" name="fastjson-1.1.34.android" level="project" />
+    <orderEntry type="library" exported="" name="nim-lucene-4.0.0" level="project" />
   </component>
 </module>

+ 6 - 3
app/src/com/sheishuo/app/AccountCache.java → app/src/com/sheishuo/app/cache/AccountCache.java

@@ -1,9 +1,9 @@
-package com.sheishuo.app;
+package com.sheishuo.app.cache;
 
+import com.google.gson.Gson;
+import com.netease.nim.uikit.UIKitCache;
 import com.sheishuo.app.login.beans.LoginBean;
 
-import java.util.List;
-
 /**
  * Created by KN on 2017/7/17.
  */
@@ -13,6 +13,9 @@ public class AccountCache{
 
     public static void setCache(LoginBean.DBean account){
         AccountCache.account =account;
+
+        //同时更改UIKit中的缓存
+        UIKitCache.setAccount(new Gson().toJson(account));
     }
 
     public static LoginBean.DBean getAccount(){

+ 25 - 0
app/src/com/sheishuo/app/cache/GiftCache.java

@@ -0,0 +1,25 @@
+package com.sheishuo.app.cache;
+
+import com.google.gson.Gson;
+import com.netease.nim.uikit.UIKitCache;
+import com.sheishuo.app.common.beans.GiftBean;
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public class GiftCache {
+    private static GiftBean.DBean gift;
+
+    public static void setCache(GiftBean.DBean gift){
+        GiftCache.gift = gift;
+
+        //同时存入UIKitCache便于调用
+        UIKitCache.setGifts(new Gson().toJson(gift));
+    }
+
+    public static GiftBean.DBean getGift(){
+        return gift;
+    }
+
+}

+ 1 - 3
app/src/com/sheishuo/app/circle/activity/NewTweetingActivity.java

@@ -3,15 +3,13 @@ package com.sheishuo.app.circle.activity;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.support.v7.widget.Toolbar;
 import android.util.Log;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.netease.nimlib.sdk.NIMClient;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
 import com.sheishuo.app.circle.presenter.NewTweetPresenter;
 import com.sheishuo.app.common.util.location.LocationHelper;

+ 1 - 1
app/src/com/sheishuo/app/circle/model/NewTweetModel.java

@@ -1,7 +1,7 @@
 package com.sheishuo.app.circle.model;
 
 import com.google.gson.Gson;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.circle.model.beans.NewTweetingBean;
 import com.sheishuo.app.circle.presenter.NewTweetPresenter;
 import com.sheishuo.app.common.util.net.INet;

文件差异内容过多而无法显示
+ 12 - 0
app/src/com/sheishuo/app/common/beans/GiftBean.java


+ 1 - 0
app/src/com/sheishuo/app/common/util/net/INet.java

@@ -10,4 +10,5 @@ public interface INet {
     void baseQuery();
     void post(String url,FormBody body,ResponseCallback callback);
     void loginQuery(String mobile,String pwd,ResponseCallback callback);
+    void getGiftList(ResponseCallback callback);
 }

+ 35 - 0
app/src/com/sheishuo/app/common/util/net/NetImpl.java

@@ -1,6 +1,11 @@
 package com.sheishuo.app.common.util.net;
 
+import android.util.Log;
+
 import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.sheishuo.app.cache.GiftCache;
+import com.sheishuo.app.common.beans.GiftBean;
 import com.sheishuo.app.login.beans.LoginBean;
 
 import java.io.IOException;
@@ -94,5 +99,35 @@ public class  NetImpl implements INet {
 
 
 
+    @Override
+    public void getGiftList(final ResponseCallback callback) {
+
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Request request = new Request.Builder()
+                            .url(NetInfo.GIFT_LIST)
+                            .build();
+                    Response response = client.newCall(request).execute();
+
+                    if (200 == response.code()){
+                        String result = response.body().string();
+                        GiftBean.DBean gift = (new Gson().fromJson(result,GiftBean.class)).getD();
+                        callback.onSuccess(gift);
+                    }else {
+                        callback.onFailed();
+                    }
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    callback.onFailed();
+                }
+            }
+        }).start();
+
+    }
+
 
 }

+ 1 - 0
app/src/com/sheishuo/app/common/util/net/NetInfo.java

@@ -12,4 +12,5 @@ public class NetInfo {
     public final static String CIRCLE_LIST = INDEX + "?m=who&c=social&a=lists";
     public final static String CIRCLE_USER_LIKED = INDEX + "?m=who&c=social&a=like";
     public final static String NEW_TWEETING = INDEX + "?m=who&c=social&a=publish";
+    public final static String GIFT_LIST = INDEX + "?m=who&c=index&a=gift_list";
 }

+ 4 - 2
app/src/com/sheishuo/app/login/LoginActivity.java

@@ -10,8 +10,7 @@ import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
 
-import com.netease.nimlib.sdk.NIMClient;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
 import com.sheishuo.app.common.util.net.INet;
 import com.sheishuo.app.common.util.net.NetImpl;
@@ -100,9 +99,12 @@ public class LoginActivity extends SheishuoUI implements View.OnClickListener{
                 //将用户信息放入缓存
                 AccountCache.setCache(bean.getD());
 
+
+
                 //登录NIM服务
                 new LoginHelper(context,bean).loginToNIM();
 
+
             }
 
             @Override

+ 33 - 17
app/src/com/sheishuo/app/main/fragment/AreaGroupsFragment.java

@@ -1,32 +1,22 @@
 package com.sheishuo.app.main.fragment;
 
-import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.Toolbar;
 import android.util.Log;
 import android.view.View;
-import android.widget.TextView;
+import android.widget.Toast;
 
 import com.google.gson.Gson;
 import com.netease.nim.uikit.NimUIKit;
-import com.netease.nim.uikit.common.activity.UI;
 import com.netease.nim.uikit.contact_selector.activity.ContactSelectActivity;
-import com.netease.nim.uikit.robot.parser.elements.group.LinearLayout;
-import com.netease.nim.uikit.session.SessionCustomization;
 import com.netease.nim.uikit.team.helper.TeamHelper;
-import com.netease.nim.uikit.team.model.TeamRequestCode;
 import com.netease.nimlib.sdk.NIMClient;
-import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
 import com.netease.nimlib.sdk.team.TeamService;
-import com.netease.nimlib.sdk.team.model.Team;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
-import com.sheishuo.app.SheishuoApplication;
+import com.sheishuo.app.cache.GiftCache;
+import com.sheishuo.app.common.beans.GiftBean;
 import com.sheishuo.app.common.beans.NearbyGroupsBean;
 import com.sheishuo.app.common.util.net.INet;
 import com.sheishuo.app.common.util.net.NetImpl;
@@ -37,7 +27,6 @@ import com.sheishuo.app.login.beans.LoginBean;
 import com.sheishuo.app.main.activity.MainActivity;
 import com.sheishuo.app.main.adapter.AreaGroupsAdapter;
 import com.sheishuo.app.main.adapter.OnItemClickListener;
-import com.sheishuo.app.team.TeamCreateHelper;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -69,7 +58,7 @@ public class AreaGroupsFragment extends MainTabFragment {
         findViews();
         loadGroups();
         initToolbar();
-
+        loadGiftCache();
 
     }
 
@@ -80,6 +69,7 @@ public class AreaGroupsFragment extends MainTabFragment {
         nearbyGroupsRecyclerview = findView(R.id.area_groups_nearby_recyclerview);
     }
 
+    //初始化Toolbar
     void initToolbar(){
         toolbar.init();
         toolbar.setTitle("群组");
@@ -93,6 +83,8 @@ public class AreaGroupsFragment extends MainTabFragment {
             }
         });
     }
+
+    //加载群组信息
     void loadGroups(){
         List<String> groupIds = new ArrayList<>();
         groupIds.add(AccountCache.getAccount().getCountry_room_id());
@@ -181,6 +173,23 @@ public class AreaGroupsFragment extends MainTabFragment {
     }
 
 
+    //预加载礼物信息
+    void loadGiftCache(){
+        net.getGiftList(new ResponseCallback() {
+            @Override
+            public void onSuccess(Object object) {
+                Log.e(TAG,"礼物列表加载成功");
+                GiftBean.DBean gift = (GiftBean.DBean)object;
+                GiftCache.setCache(gift);
+            }
+
+            @Override
+            public void onFailed() {
+                showToast("礼物列表加载失败");
+            }
+        });
+    }
+
 
 
     @Override
@@ -193,7 +202,14 @@ public class AreaGroupsFragment extends MainTabFragment {
 
 
 
-
+    protected void showToast(final String toast){
+        getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                Toast.makeText(getActivity(),toast,Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
 
 
 }

+ 1 - 1
app/src/com/sheishuo/app/main/fragment/CircleOfFriendsFragment.java

@@ -15,7 +15,7 @@ import com.bumptech.glide.Glide;
 import com.netease.nimlib.sdk.NIMClient;
 import com.netease.nimlib.sdk.uinfo.UserService;
 import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
 import com.sheishuo.app.SheishuoApplication;
 import com.sheishuo.app.circle.activity.NewTweetingActivity;

+ 1 - 3
app/src/com/sheishuo/app/main/fragment/HomeFragment.java

@@ -6,7 +6,6 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.design.widget.BottomNavigationView;
-import android.support.v4.app.Fragment;
 import android.support.v4.view.ViewPager;
 import android.support.v4.view.ViewPager.OnPageChangeListener;
 import android.support.v7.widget.Toolbar;
@@ -29,7 +28,7 @@ import com.netease.nimlib.sdk.msg.SystemMessageService;
 import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
 import com.netease.nimlib.sdk.msg.model.RecentContact;
 import com.netease.nimlib.sdk.team.TeamService;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
 import com.sheishuo.app.common.ui.viewpager.FadeInOutPageTransformer;
 import com.sheishuo.app.common.ui.viewpager.PagerSlidingTabStrip;
@@ -40,7 +39,6 @@ import com.sheishuo.app.main.model.MainTab;
 import com.sheishuo.app.main.reminder.ReminderItem;
 import com.sheishuo.app.main.reminder.ReminderManager;
 import com.sheishuo.app.team.TeamCreateHelper;
-import com.sheishuo.app.uikit_implements.SheishuoToolbarOptions;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
app/src/com/sheishuo/app/main/model/CircleModel.java

@@ -1,7 +1,7 @@
 package com.sheishuo.app.main.model;
 
 import com.google.gson.Gson;
-import com.sheishuo.app.AccountCache;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.common.beans.CircleBean;
 import com.sheishuo.app.common.beans.CircleUserLikedBean;
 import com.sheishuo.app.common.util.net.INet;

+ 6 - 3
app/src/com/sheishuo/app/session/SessionHelper.java

@@ -8,6 +8,7 @@ import android.text.TextUtils;
 import android.view.View;
 import android.widget.Toast;
 
+import com.netease.nim.uikit.session.extension.GiftAttachment;
 import com.sheishuo.app.SheishuoCache;
 import com.sheishuo.app.contact.activity.UserProfileActivity;
 import com.sheishuo.app.session.action.AVChatAction;
@@ -16,15 +17,14 @@ import com.sheishuo.app.session.action.GuessAction;
 import com.sheishuo.app.session.action.RTSAction;
 import com.sheishuo.app.session.action.SnapChatAction;
 import com.sheishuo.app.session.action.TeamAVChatAction;
-import com.sheishuo.app.session.action.TipAction;
 import com.sheishuo.app.session.activity.MessageInfoActivity;
-import com.sheishuo.app.session.extension.CustomAttachParser;
 import com.sheishuo.app.session.extension.CustomAttachment;
 import com.sheishuo.app.session.extension.GuessAttachment;
 import com.sheishuo.app.session.extension.SnapChatAttachment;
 import com.sheishuo.app.session.extension.StickerAttachment;
 import com.sheishuo.app.session.viewholder.MsgViewHolderAVChat;
 import com.sheishuo.app.session.viewholder.MsgViewHolderDefCustom;
+import com.netease.nim.uikit.session.viewholder.MsgViewHolderGift;
 import com.sheishuo.app.session.viewholder.MsgViewHolderGuess;
 import com.sheishuo.app.session.viewholder.MsgViewHolderRTS;
 import com.sheishuo.app.session.viewholder.MsgViewHolderSticker;
@@ -91,7 +91,7 @@ public class SessionHelper {
 
     public static void init() {
         // 注册自定义消息附件解析器
-        NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());
+        NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new com.netease.nim.uikit.session.extension.CustomAttachParser());
 
         // 注册各种扩展消息类型的显示ViewHolder
         registerViewHolders();
@@ -396,6 +396,9 @@ public class SessionHelper {
         NimUIKit.registerMsgItemViewHolder(SnapChatAttachment.class, MsgViewHolderSnapChat.class);
         NimUIKit.registerMsgItemViewHolder(RTSAttachment.class, MsgViewHolderRTS.class);
         NimUIKit.registerTipMsgViewHolder(MsgViewHolderTip.class);
+
+        //自定义礼物ViewHolder
+        NimUIKit.registerMsgItemViewHolder(GiftAttachment.class, MsgViewHolderGift.class);
     }
 
     private static void setSessionListener() {

+ 2 - 1
uikit/build.gradle

@@ -36,6 +36,7 @@ dependencies {
     compile 'jp.wasabeef:glide-transformations:2.0.2'
     //compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1' // if you want to use the Glide GPU Filters
 
-
+    //Gson
+    compile 'com.google.code.gson:gson:2.8.1'
 
 }

+ 3 - 1
uikit/proguard-rules.pro

@@ -17,4 +17,6 @@
 #}
 
 -dontwarn okio.**
--dontwarn javax.annotation.**
+-dontwarn javax.annotation.**
+
+-keep package com.netease.nim.uikit.UIKitCache;

+ 15 - 0
uikit/res-ptr2/layout/gift_item_layout.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:padding="8dp">
+    <ImageView
+        android:id="@+id/gift_item_img"
+        android:layout_width="128dp"
+        android:layout_height="128dp" />
+    <TextView
+        android:id="@+id/gift_item_TV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="礼物赠送消息"/>
+</LinearLayout>

+ 35 - 0
uikit/res/layout/gift_item.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/gift_item_layout"
+    android:orientation="vertical" android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:padding="16dp">
+    <ImageView
+        android:id="@+id/gift_item_img"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:src="@drawable/nim_emoji_icon"
+        android:padding="8dp"/>
+    <TextView
+        android:id="@+id/gift_item_name"
+        android:layout_width="64dp"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:text="礼物名称"
+        android:layout_below="@id/gift_item_img"
+        android:layout_alignStart="@id/gift_item_img"
+        android:layout_alignLeft="@id/gift_item_img"
+        />
+    <TextView
+        android:id="@+id/gift_item_price"
+        android:layout_width="64dp"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:text="10"
+        android:layout_below="@id/gift_item_name"
+        android:layout_alignStart="@id/gift_item_name"
+        android:layout_alignLeft="@id/gift_item_name"
+        android:textColor="#ffbba9"
+        android:textStyle="bold"
+        android:padding="8dp" />
+</RelativeLayout>

+ 87 - 0
uikit/res/layout/gift_panel.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="8dp"
+    android:background="@drawable/nim_message_view_bottom"
+    >
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="8dp">
+        <TextView
+            android:layout_weight="7"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="赠送礼物"
+            android:textColor="@color/color_gray_cbd0d8"
+            android:gravity="start"/>
+        <TextView
+            android:id="@+id/gift_panel_balance_TV"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="余额"
+            android:textColor="@color/black"
+            android:layout_gravity="end" />
+        <TextView
+            android:id="@+id/gift_panel_recharge_TV"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/rechage"
+            android:textColor="@color/green_4DC0A4"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="8dp">
+        <TextView
+            android:id="@+id/gift_panel_select_person_TV"
+            android:layout_weight="3"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="选择赠送人"
+            android:textColor="@color/green_4DC0A4"/>
+        <EditText
+            android:id="@+id/gift_panel_gift_message_ET"
+            android:layout_weight="7"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:hint="请输入赠言"/>
+    </LinearLayout>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="8dp">
+        <TextView
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="数量"/>
+        <SeekBar
+            android:id="@+id/gift_panel_num_seekbar"
+            android:layout_weight="9"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:max="25"
+            android:progress="1"/>
+        <TextView
+            android:id="@+id/gift_panel_num_TV"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="1"
+            android:gravity="center"/>
+    </LinearLayout>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/gift_panel_recyclerview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+</LinearLayout>

+ 42 - 0
uikit/res/layout/input_panel_bottom_func_bar.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:background="@drawable/nim_message_view_bottom"
+        android:padding="8dp">
+        <ImageView
+            android:id="@+id/chat_bottom_bar_01"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chat_01_unpressed"/>
+        <ImageView
+            android:id="@+id/chat_bottom_bar_02"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chat_02_unpressed"/>
+        <ImageView
+            android:id="@+id/chat_bottom_bar_03"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chat_03_unpressed"/>
+        <ImageView
+            android:id="@+id/chat_bottom_bar_04"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chat_04_unpressed"/>
+        <ImageView
+            android:id="@+id/chat_bottom_bar_05"
+            android:layout_weight="2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chat_05_unpressed"/>
+    </LinearLayout>
+</LinearLayout>

+ 8 - 37
uikit/res/layout/nim_message_activity_bottom_layout.xml

@@ -7,46 +7,17 @@
     android:orientation="vertical">
 
     <include layout="@layout/nim_message_activity_text_layout"/>
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:background="@drawable/nim_message_view_bottom"
-        android:padding="8dp">
-        <ImageView
-            android:id="@+id/chat_bottom_bar_01"
-            android:layout_weight="2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:src="@drawable/chat_01_unpressed"/>
-        <ImageView
-            android:id="@+id/chat_bottom_bar_02"
-            android:layout_weight="2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:src="@drawable/chat_02_unpressed"/>
-        <ImageView
-            android:id="@+id/chat_bottom_bar_03"
-            android:layout_weight="2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:src="@drawable/chat_03_unpressed"/>
-        <ImageView
-            android:id="@+id/chat_bottom_bar_04"
-            android:layout_weight="2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:src="@drawable/chat_04_unpressed"/>
-        <ImageView
-            android:id="@+id/chat_bottom_bar_05"
-            android:layout_weight="2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:src="@drawable/chat_05_unpressed"/>
-    </LinearLayout>
+    <include layout="@layout/input_panel_bottom_func_bar"/>
+
     <com.netease.nim.uikit.session.emoji.EmoticonPickerView
         android:id="@+id/emoticon_picker_view"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:visibility="gone"/>
+
+    <com.netease.nim.uikit.session.module.gift.GiftPanel
+        android:id="@+id/gift_panel"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="gone"/>
 </LinearLayout>

+ 1 - 0
uikit/res/values/strings.xml

@@ -220,5 +220,6 @@
     <string name="fts_prefix_hit">前缀匹配高亮检索结果</string>
     <string name="msg_search">全文检索</string>
     <string name="msg_search_limit">全文检索显示条数</string>
+    <string name="rechage">充值</string>
 
 </resources>

+ 339 - 0
uikit/src/com/netease/nim/uikit/UIKitCache.java

@@ -0,0 +1,339 @@
+package com.netease.nim.uikit;
+
+import com.google.gson.Gson;
+
+import java.util.List;
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public class UIKitCache {
+    private static AccountBean account;
+    private static GiftBean gifts;
+    private static String selectedGiftId;
+
+    public static void setAccount(String account){
+        UIKitCache.account = new Gson().fromJson(account,AccountBean.class);
+    }
+    public static void setGifts(String gifts) {
+        UIKitCache.gifts = new Gson().fromJson(gifts,GiftBean.class);
+    }
+
+    public static void setSelectedGiftId(String selectedGiftId) {
+        UIKitCache.selectedGiftId = selectedGiftId;
+    }
+
+    public static AccountBean getAccount() {
+        return account;
+    }
+
+    public static GiftBean getGifts() {
+        return gifts;
+    }
+
+    public static String getSelectedGiftId() {
+        return selectedGiftId;
+    }
+
+    public class GiftBean {
+        private List<ListBean> list;
+
+        public List<ListBean> getList() {
+            return list;
+        }
+
+        public void setList(List<ListBean> list) {
+            this.list = list;
+        }
+
+        public class ListBean {
+            /**
+             * id : 10
+             * name : 么么哒
+             * price : 10
+             * listorder : 0
+             * icon : http://whosay.dashgame.com/uploadfile/2017/0703/20170703035936326.jpg
+             * movie : http://whosay.dashgame.com/uploadfile/2017/0703/20170703040241238.gif
+             * inputtime : 1499068964
+             */
+
+            private String id;
+            private String name;
+            private String price;
+            private String listorder;
+            private String icon;
+            private String movie;
+            private String inputtime;
+
+            public String getId() {
+                return id;
+            }
+
+            public void setId(String id) {
+                this.id = id;
+            }
+
+            public String getName() {
+                return name;
+            }
+
+            public void setName(String name) {
+                this.name = name;
+            }
+
+            public String getPrice() {
+                return price;
+            }
+
+            public void setPrice(String price) {
+                this.price = price;
+            }
+
+            public String getListorder() {
+                return listorder;
+            }
+
+            public void setListorder(String listorder) {
+                this.listorder = listorder;
+            }
+
+            public String getIcon() {
+                return icon;
+            }
+
+            public void setIcon(String icon) {
+                this.icon = icon;
+            }
+
+            public String getMovie() {
+                return movie;
+            }
+
+            public void setMovie(String movie) {
+                this.movie = movie;
+            }
+
+            public String getInputtime() {
+                return inputtime;
+            }
+
+            public void setInputtime(String inputtime) {
+                this.inputtime = inputtime;
+            }
+        }
+    }
+
+    public class AccountBean {
+        /**
+         * id : 200016
+         * nick :
+         * coin : 0
+         * latitude : 0
+         * longitude : 0
+         * province :
+         * city :
+         * district :
+         * mobile : 18523545395
+         * token : e10adc3949ba59abbe56e057f20f883e
+         * country_room_id : 54519240
+         * province_room_id :
+         * city_room_id :
+         * district_room_id :
+         * trade_priority : [{"id":"1","name":"国家道具","type":"0","price":"10","inputtime":"2017-07-12 17:30:42"},{"id":"2","name":"省道具","type":"1","price":"8","inputtime":"2017-07-12 17:30:59"},{"id":"3","name":"市道具","type":"2","price":"6","inputtime":"2017-07-12 17:31:11"},{"id":"4","name":"区县道具","type":"3","price":"4","inputtime":"2017-07-12 17:31:23"}]
+         */
+
+        private String id;
+        private String nick;
+        private String coin;
+        private String latitude;
+        private String longitude;
+        private String province;
+        private String city;
+        private String district;
+        private String mobile;
+        private String token;
+        private String country_room_id;
+        private String province_room_id;
+        private String city_room_id;
+        private String district_room_id;
+        private List<TradePriorityBean> trade_priority;
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getNick() {
+            return nick;
+        }
+
+        public void setNick(String nick) {
+            this.nick = nick;
+        }
+
+        public String getCoin() {
+            return coin;
+        }
+
+        public void setCoin(String coin) {
+            this.coin = coin;
+        }
+
+        public String getLatitude() {
+            return latitude;
+        }
+
+        public void setLatitude(String latitude) {
+            this.latitude = latitude;
+        }
+
+        public String getLongitude() {
+            return longitude;
+        }
+
+        public void setLongitude(String longitude) {
+            this.longitude = longitude;
+        }
+
+        public String getProvince() {
+            return province;
+        }
+
+        public void setProvince(String province) {
+            this.province = province;
+        }
+
+        public String getCity() {
+            return city;
+        }
+
+        public void setCity(String city) {
+            this.city = city;
+        }
+
+        public String getDistrict() {
+            return district;
+        }
+
+        public void setDistrict(String district) {
+            this.district = district;
+        }
+
+        public String getMobile() {
+            return mobile;
+        }
+
+        public void setMobile(String mobile) {
+            this.mobile = mobile;
+        }
+
+        public String getToken() {
+            return token;
+        }
+
+        public void setToken(String token) {
+            this.token = token;
+        }
+
+        public String getCountry_room_id() {
+            return country_room_id;
+        }
+
+        public void setCountry_room_id(String country_room_id) {
+            this.country_room_id = country_room_id;
+        }
+
+        public String getProvince_room_id() {
+            return province_room_id;
+        }
+
+        public void setProvince_room_id(String province_room_id) {
+            this.province_room_id = province_room_id;
+        }
+
+        public String getCity_room_id() {
+            return city_room_id;
+        }
+
+        public void setCity_room_id(String city_room_id) {
+            this.city_room_id = city_room_id;
+        }
+
+        public String getDistrict_room_id() {
+            return district_room_id;
+        }
+
+        public void setDistrict_room_id(String district_room_id) {
+            this.district_room_id = district_room_id;
+        }
+
+        public List<TradePriorityBean> getTrade_priority() {
+            return trade_priority;
+        }
+
+        public void setTrade_priority(List<TradePriorityBean> trade_priority) {
+            this.trade_priority = trade_priority;
+        }
+
+        public class TradePriorityBean {
+            /**
+             * id : 1
+             * name : 国家道具
+             * type : 0
+             * price : 10
+             * inputtime : 2017-07-12 17:30:42
+             */
+
+            private String id;
+            private String name;
+            private String type;
+            private String price;
+            private String inputtime;
+
+            public String getId() {
+                return id;
+            }
+
+            public void setId(String id) {
+                this.id = id;
+            }
+
+            public String getName() {
+                return name;
+            }
+
+            public void setName(String name) {
+                this.name = name;
+            }
+
+            public String getType() {
+                return type;
+            }
+
+            public void setType(String type) {
+                this.type = type;
+            }
+
+            public String getPrice() {
+                return price;
+            }
+
+            public void setPrice(String price) {
+                this.price = price;
+            }
+
+            public String getInputtime() {
+                return inputtime;
+            }
+
+            public void setInputtime(String inputtime) {
+                this.inputtime = inputtime;
+            }
+        }
+    }
+
+}

+ 75 - 3
uikit/src/com/netease/nim/uikit/session/extension/GiftAttachment.java

@@ -1,5 +1,6 @@
 package com.netease.nim.uikit.session.extension;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 
 /**
@@ -7,17 +8,88 @@ import com.alibaba.fastjson.JSONObject;
  */
 
 public class GiftAttachment extends CustomAttachment {
-    GiftAttachment() {
+
+    private String iconURL;
+    private String giftId;
+    private String senderId;
+    private String teamId;
+    private String targetId;
+    private String count;
+
+    public GiftAttachment() {
         super(CustomAttachmentType.Gift);
     }
 
     @Override
     protected void parseData(JSONObject data) {
-
+        if (data != null){
+            iconURL = data.getString("iconURL");
+            giftId = data.getString("giftId");
+            senderId = data.getString("senderId");
+            teamId = data.getString("teamId");
+            targetId = data.getString("targetId");
+            count = data.getString("count");
+        }
     }
 
     @Override
     protected JSONObject packData() {
-        return null;
+        JSONObject data = new JSONObject();
+        data.put("iconURL",iconURL);
+        data.put("giftId",giftId);
+        data.put("senderId",senderId);
+        data.put("teamId",teamId);
+        data.put("targetId",targetId);
+        data.put("count",count);
+        return data;
+    }
+
+
+    public String getIconURL() {
+        return iconURL;
+    }
+
+    public String getGiftId() {
+        return giftId;
+    }
+
+    public String getSenderId() {
+        return senderId;
+    }
+
+    public String getTeamId() {
+        return teamId;
+    }
+
+    public String getTargetId() {
+        return targetId;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setIconURL(String iconURL) {
+        this.iconURL = iconURL;
+    }
+
+    public void setGiftId(String giftId) {
+        this.giftId = giftId;
+    }
+
+    public void setSenderId(String senderId) {
+        this.senderId = senderId;
+    }
+
+    public void setTeamId(String teamId) {
+        this.teamId = teamId;
+    }
+
+    public void setTargetId(String targetId) {
+        this.targetId = targetId;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
     }
 }

+ 97 - 0
uikit/src/com/netease/nim/uikit/session/module/gift/GiftItemAdapter.java

@@ -0,0 +1,97 @@
+package com.netease.nim.uikit.session.module.gift;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bumptech.glide.Glide;
+import com.netease.nim.uikit.R;
+import com.netease.nim.uikit.UIKitCache;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public class GiftItemAdapter extends  RecyclerView.Adapter<GiftItemAdapter.GiftItemViewHolder> implements View.OnClickListener{
+
+
+    private UIKitCache.GiftBean giftList;
+    private Context context;
+    private String selectedId;
+    private OnGiftCheckedListener listener;
+    private Map<UIKitCache.GiftBean.ListBean,String>isCheckedMap = new HashMap<>();
+
+
+    public GiftItemAdapter(Context context, UIKitCache.GiftBean giftList){
+        this.context = context;
+        this.giftList = giftList;
+
+        for(UIKitCache.GiftBean.ListBean gift : giftList.getList()){
+            isCheckedMap.put(gift,"");
+        }
+    }
+
+    public void setOnGiftCheckedListener(OnGiftCheckedListener listener){
+        this.listener = listener;
+    }
+
+
+    @Override
+    public GiftItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(context).inflate(R.layout.gift_item,null);
+        return new GiftItemViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(final GiftItemViewHolder holder, int position) {
+        final UIKitCache.GiftBean.ListBean gift = giftList.getList().get(position);
+
+
+        holder.layout.setTag(gift);
+        holder.layout.setOnClickListener(this);
+
+        Glide.with(context).load(gift.getIcon()).into(holder.giftImg);
+
+        holder.giftName.setText(gift.getName());
+        holder.giftPrice.setText(gift.getPrice());
+
+
+    }
+
+
+    @Override
+    public int getItemCount() {
+        return giftList.getList().size();
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        if (listener != null)listener.OnGiftChecked(v);
+    }
+
+    class GiftItemViewHolder extends RecyclerView.ViewHolder{
+
+        private RelativeLayout layout;
+        private ImageView giftImg;
+        private TextView giftName,giftPrice;
+
+        public GiftItemViewHolder(View itemView) {
+            super(itemView);
+            layout = (RelativeLayout) itemView.findViewById(R.id.gift_item_layout);
+            giftImg = (ImageView) itemView.findViewById(R.id.gift_item_img);
+            giftName = (TextView) itemView.findViewById(R.id.gift_item_name);
+            giftPrice = (TextView) itemView.findViewById(R.id.gift_item_price);
+        }
+    }
+}

+ 175 - 0
uikit/src/com/netease/nim/uikit/session/module/gift/GiftPanel.java

@@ -0,0 +1,175 @@
+package com.netease.nim.uikit.session.module.gift;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.netease.nim.uikit.NimUIKit;
+import com.netease.nim.uikit.R;
+import com.netease.nim.uikit.UIKitCache;
+import com.netease.nim.uikit.common.activity.UI;
+import com.netease.nim.uikit.common.ui.dialog.DialogMaker;
+import com.netease.nim.uikit.session.extension.GiftAttachment;
+import com.netease.nim.uikit.session.module.Container;
+import com.netease.nimlib.sdk.NIMClient;
+import com.netease.nimlib.sdk.msg.MessageBuilder;
+import com.netease.nimlib.sdk.msg.MsgService;
+import com.netease.nimlib.sdk.msg.model.IMMessage;
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public class GiftPanel extends LinearLayout{
+    private Container container;
+    private TextView balanceTV
+            ,rechargeTV
+            ,selectPersonTV
+            ,giftNumTV;
+
+    private EditText messageET;
+    private SeekBar numSeekBar;
+    private RecyclerView recyclerView;
+
+    GridLayoutManager layoutManager;
+    GiftItemAdapter adapter;
+    AlertDialog.Builder dialog;
+    private UIKitCache.GiftBean.ListBean giftInfo;
+    public GiftPanel(Context context) {
+        super(context);
+        LayoutInflater.from(context).inflate(R.layout.gift_panel,this,true);
+        findViews();
+        initViews();
+    }
+
+
+    public GiftPanel(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+        LayoutInflater.from(context).inflate(R.layout.gift_panel,this,true);
+        findViews();
+
+    }
+
+
+
+
+    public void setContainer(Container container) {
+        this.container = container;
+        initViews();
+
+
+
+
+    }
+
+    public Container getContainer(){
+        return container;
+    }
+
+
+    void findViews(){
+        balanceTV = findView(R.id.gift_panel_balance_TV);
+        rechargeTV = findView(R.id.gift_panel_recharge_TV);
+        selectPersonTV = findView(R.id.gift_panel_select_person_TV);
+        giftNumTV = findView(R.id.gift_panel_num_TV);
+        messageET = findView(R.id.gift_panel_gift_message_ET);
+        numSeekBar = findView(R.id.gift_panel_num_seekbar);
+        recyclerView = findView(R.id.gift_panel_recyclerview);
+
+    }
+
+
+    void initViews(){
+
+
+        layoutManager = new GridLayoutManager(container.activity,4);
+        adapter = new GiftItemAdapter(container.activity,UIKitCache.getGifts());
+        adapter.setOnGiftCheckedListener(new OnGiftCheckedListener() {
+            @Override
+            public void OnGiftChecked(View view) {
+                giftInfo = (UIKitCache.GiftBean.ListBean)view.getTag();
+                UIKitCache.setSelectedGiftId(giftInfo.getId());
+
+                dialog.setMessage("您确定要送出 " + giftInfo.getName() + "x" + numSeekBar.getProgress() + " 吗?");
+                dialog.show();
+            }
+        });
+        recyclerView.setAdapter(adapter);
+        recyclerView.setLayoutManager(layoutManager);
+
+
+        dialog = new AlertDialog.Builder(container.activity)
+                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        String giftId = UIKitCache.getSelectedGiftId();
+                        String count = String.valueOf(numSeekBar.getProgress());
+                        String accountId = UIKitCache.getAccount().getId();
+
+
+                        GiftAttachment attachment = new GiftAttachment();
+                        attachment.setCount(count);
+                        attachment.setGiftId(giftInfo.getId());
+                        attachment.setIconURL(giftInfo.getIcon());
+                        attachment.setSenderId(UIKitCache.getAccount().getId());
+                        attachment.setTargetId("200030");
+
+
+                        IMMessage message = MessageBuilder.createCustomMessage(container.account,container.sessionType,attachment);
+                        container.proxy.sendMessage(message);
+                        closePanel();
+                        dialog.dismiss();
+                    }
+                })
+                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        dialog.dismiss();
+                    }
+                });
+
+
+        numSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                giftNumTV.setText(String.valueOf(progress));
+                if (progress == 0) seekBar.setProgress(1);
+            }
+
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+
+            }
+
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+
+            }
+        });
+
+
+
+
+    }
+
+    public void closePanel(){
+        this.setVisibility(GONE);
+    }
+
+
+    protected <T extends View> T findView(int resId){
+        return (T) findViewById(resId);
+    }
+
+}

+ 11 - 0
uikit/src/com/netease/nim/uikit/session/module/gift/OnGiftCheckedListener.java

@@ -0,0 +1,11 @@
+package com.netease.nim.uikit.session.module.gift;
+
+import android.view.View;
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public interface OnGiftCheckedListener {
+    void OnGiftChecked(View view);
+}

+ 32 - 3
uikit/src/com/netease/nim/uikit/session/module/input/InputPanel.java

@@ -44,6 +44,7 @@ import com.netease.nim.uikit.session.emoji.EmoticonPickerView;
 import com.netease.nim.uikit.session.emoji.IEmoticonSelectedListener;
 import com.netease.nim.uikit.session.emoji.MoonUtil;
 import com.netease.nim.uikit.session.module.Container;
+import com.netease.nim.uikit.session.module.gift.GiftPanel;
 import com.netease.nimlib.sdk.NIMClient;
 import com.netease.nimlib.sdk.media.record.AudioRecorder;
 import com.netease.nimlib.sdk.media.record.IAudioRecordCallback;
@@ -91,6 +92,8 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
     protected View emojiButtonInInputBar;// 发送消息按钮
     protected View messageInputBar;
 
+
+    protected GiftPanel giftPanel;
     /*************自定义底部按钮***************/
     protected View sendImgBtn,sendPhotoBtn,sendLocationBtn,sendGiftBtn,sendEmojiBtn;
 
@@ -155,7 +158,11 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
 
     public boolean collapse(boolean immediately) {
         boolean respond = (emoticonPickerView != null && emoticonPickerView.getVisibility() == View.VISIBLE
-                || actionPanelBottomLayout != null && actionPanelBottomLayout.getVisibility() == View.VISIBLE);
+                || actionPanelBottomLayout != null && actionPanelBottomLayout.getVisibility() == View.VISIBLE
+                || giftPanel != null && giftPanel.getVisibility() == View.VISIBLE);
+
+
+
 
         hideAllInputLayout(immediately);
 
@@ -201,6 +208,11 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
         sendEmojiBtn = view.findViewById(R.id.chat_bottom_bar_05);
 
 
+        //Gift Panel
+        giftPanel = (GiftPanel) view.findViewById(R.id.gift_panel);
+        giftPanel.setContainer(container);
+
+
         // input bar
         messageActivityBottomLayout = (LinearLayout) view.findViewById(R.id.messageActivityBottomLayout);
         messageInputBar = view.findViewById(R.id.textMessageLayout);
@@ -355,8 +367,6 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
         public void onClick(View v) {
             if (v == sendImgBtn){
                 //发送图片消息
-
-
                 PickImageAction action = new PickImageAction(R.string.add,R.string.add,true) {
                     @Override
                     protected void onPicked(File file) {
@@ -390,6 +400,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
                 });
             }else if(v == sendGiftBtn){
                 //发送礼物消息
+                toggleGiftPanel();
 
             }else if(v == sendEmojiBtn){
                 //打开Emoji表情面板
@@ -472,13 +483,30 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
 
     // 点击表情,切换到表情布局
     private void toggleEmojiLayout() {
+
         if (emoticonPickerView == null || emoticonPickerView.getVisibility() == View.GONE) {
+            giftPanel.setVisibility(View.GONE);
             showEmojiLayout();
         } else {
             hideEmojiLayout();
         }
     }
 
+    //切换赠送礼物面板
+    private void toggleGiftPanel(){
+        if (giftPanel != null){
+            if (giftPanel.getVisibility() == View.GONE){
+                hideEmojiLayout();
+                hideInputMethod();
+                giftPanel.setVisibility(View.VISIBLE);
+
+            }else {
+                giftPanel.setVisibility(View.GONE);
+            }
+        }
+    }
+
+
     // 隐藏表情布局
     private void hideEmojiLayout() {
         uiHandler.removeCallbacks(showEmojiRunnable);
@@ -678,6 +706,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
                     hideInputMethod();
                     hideActionPanelLayout();
                     hideEmojiLayout();
+                    giftPanel.closePanel();
                 }
             };
         }

+ 79 - 0
uikit/src/com/netease/nim/uikit/session/viewholder/MsgViewHolderGift.java

@@ -0,0 +1,79 @@
+package com.netease.nim.uikit.session.viewholder;
+
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.bumptech.glide.Glide;
+import com.netease.nim.uikit.R;
+import com.netease.nim.uikit.UIKitCache;
+import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
+import com.netease.nim.uikit.session.extension.GiftAttachment;
+import com.netease.nimlib.sdk.NIMClient;
+import com.netease.nimlib.sdk.uinfo.UserService;
+
+
+/**
+ * Created by KN on 2017/7/25.
+ */
+
+public class MsgViewHolderGift extends MsgViewHolderBase {
+    protected ImageView giftImg;
+    protected TextView infoTV;
+    public MsgViewHolderGift(BaseMultiItemFetchLoadAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected int getContentResId() {
+        return R.layout.gift_item_layout;
+    }
+
+    @Override
+    protected void inflateContentView() {
+        giftImg = (ImageView) view.findViewById(R.id.gift_item_img);
+        infoTV = (TextView) view.findViewById(R.id.gift_item_TV);
+
+    }
+
+    @Override
+    protected void bindContentView() {
+        GiftAttachment attachment = (GiftAttachment) message.getAttachment();
+        Glide.with(context).load(attachment.getIconURL()).into(giftImg);
+        String sender = getName(attachment.getSenderId());
+        if (targetIsMe(attachment.getTargetId())){
+            infoTV.setText(sender + " 送给我 " + getGiftName(attachment.getGiftId()) + " x" + attachment.getCount());
+        }else {
+            infoTV.setText(sender + " 送给 " + getName(attachment.getTargetId()) + getGiftName(attachment.getGiftId()) + " x" + attachment.getCount());
+        }
+
+    }
+
+
+    private String getName(String Id){
+        String name = NIMClient.getService(UserService.class).getUserInfo(Id).getName();
+        if (name.isEmpty()){
+            return Id;
+        }
+        return name;
+    }
+
+
+    private boolean targetIsMe(String Id){
+        if (UIKitCache.getAccount().getId().equals(Id))
+            return true;
+        return false;
+    }
+
+    private String getGiftName(String Id){
+
+        if (UIKitCache.getGifts().getList() != null){
+            for (UIKitCache.GiftBean.ListBean gift : UIKitCache.getGifts().getList()){
+                if (gift.getId().equals(Id)) return gift.getName();
+            }
+        }else {
+            Log.e("gift list is","null");
+        }
+        return Id;
+    }
+}

+ 9 - 8
uikit/uikit.iml

@@ -91,29 +91,30 @@
     </content>
     <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" exported="" name="nim-avchat-4.0.0" level="project" />
-    <orderEntry type="library" exported="" name="constraint-layout-solver-1.0.2" level="project" />
+    <orderEntry type="library" exported="" name="gson-2.8.1" level="project" />
     <orderEntry type="library" exported="" name="constraint-layout-1.0.2" level="project" />
     <orderEntry type="library" exported="" name="java-json" level="project" />
-    <orderEntry type="library" exported="" name="nim-basesdk-4.0.0" level="project" />
     <orderEntry type="library" exported="" name="transition-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="design-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="support-core-ui-25.3.1" level="project" />
+    <orderEntry type="library" exported="" name="renderscript-v8" level="project" />
+    <orderEntry type="library" exported="" name="glide-3.7.0" level="project" />
+    <orderEntry type="library" exported="" name="support-core-utils-25.3.1" level="project" />
+    <orderEntry type="library" exported="" name="support-fragment-25.3.1" level="project" />
+    <orderEntry type="library" exported="" name="glide-transformations-2.0.2" level="project" />
+    <orderEntry type="library" exported="" name="nim-avchat-4.0.0" level="project" />
+    <orderEntry type="library" exported="" name="constraint-layout-solver-1.0.2" level="project" />
+    <orderEntry type="library" exported="" name="nim-basesdk-4.0.0" level="project" />
     <orderEntry type="library" exported="" name="overscroll-decor-android-1.0.4" level="project" />
     <orderEntry type="library" exported="" name="support-v4-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="support-media-compat-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="renderscript-v8" level="project" />
     <orderEntry type="library" exported="" name="fastjson-1.1.34.android" level="project" />
     <orderEntry type="library" exported="" name="recyclerview-v7-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="support-annotations-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="glide-3.7.0" level="project" />
     <orderEntry type="library" exported="" name="nim-lucene-4.0.0" level="project" />
     <orderEntry type="library" exported="" name="appcompat-v7-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="support-vector-drawable-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="support-compat-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="support-core-utils-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="support-fragment-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="animated-vector-drawable-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="glide-transformations-2.0.2" level="project" />
   </component>
 </module>

部分文件因为文件数量过多而无法显示