Browse Source

修复手机通讯录联系人

Junqin Wang 8 years ago
parent
commit
7069f3aa78
32 changed files with 1295 additions and 78 deletions
  1. 9 1
      app/AndroidManifest.xml
  2. 6 0
      app/res/drawable/shape_button_rc_solid_bg_green.xml
  3. 5 0
      app/res/drawable/shape_edittext_rc_solid_bg_white.xml
  4. 1 1
      app/res/layout/circle_item.xml
  5. 32 0
      app/res/layout/friends_phone_contacts.xml
  6. 24 0
      app/res/layout/item_add_photos_layout.xml
  7. 64 0
      app/res/layout/item_phone_contact_layout.xml
  8. 119 0
      app/res/layout/mine_account_and_security_activity.xml
  9. 1 19
      app/res/layout/mine_fragment.xml
  10. 32 0
      app/res/layout/mine_upload_photos_activity.xml
  11. 1 0
      app/res/layout/team_setttins.xml
  12. 0 1
      app/res/layout/trade_list_item.xml
  13. 1 0
      app/res/values/colors.xml
  14. 44 0
      app/src/com/sheishuo/app/common/beans/ContactRelationshipBean.java
  15. 39 0
      app/src/com/sheishuo/app/common/util/img/ImgUtil.java
  16. 5 1
      app/src/com/sheishuo/app/common/util/net/INet.java
  17. 149 32
      app/src/com/sheishuo/app/common/util/net/NetImpl.java
  18. 4 1
      app/src/com/sheishuo/app/common/util/net/NetInfo.java
  19. 1 1
      app/src/com/sheishuo/app/core_module/friends/activity/AddNewFriendActivity.java
  20. 2 1
      app/src/com/sheishuo/app/core_module/friends/activity/ContactsListActivity.java
  21. 112 1
      app/src/com/sheishuo/app/core_module/friends/activity/PhoneContactsActivity.java
  22. 143 0
      app/src/com/sheishuo/app/core_module/friends/adapter/PhoneContactItemAdapter.java
  23. 55 0
      app/src/com/sheishuo/app/core_module/mine/view/ui/activity/AccountAndSecurityActivity.java
  24. 251 0
      app/src/com/sheishuo/app/core_module/mine/view/ui/activity/MineUploadPhotoActivity.java
  25. 8 0
      app/src/com/sheishuo/app/core_module/mine/view/ui/activity/SettingsActivity.java
  26. 49 7
      app/src/com/sheishuo/app/core_module/mine/view/ui/activity/UserInfoDetailActivity.java
  27. 27 1
      app/src/com/sheishuo/app/core_module/sheishuo/view/ui/TeamSettingsActivity.java
  28. 1 0
      app/src/com/sheishuo/app/impl/SheishuoTeamMessageActivity.java
  29. 2 1
      app/src/com/sheishuo/app/main/activity/MainActivity.java
  30. 105 6
      app/src/com/sheishuo/app/main/fragment/MineFragment.java
  31. 2 3
      app/src/com/sheishuo/app/main/fragment/SessionListFragment.java
  32. 1 1
      app/src/com/sheishuo/app/main/fragment/TradeListFragment.java

+ 9 - 1
app/AndroidManifest.xml

@@ -12,6 +12,8 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 
+    <!--读取通讯录-->
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
     <!-- 手机状态 -->
     <uses-permission android:name="android.permission.GET_TASKS" />
     <uses-permission android:name="android.permission.FLASHLIGHT" />
@@ -149,6 +151,10 @@
             android:theme="@style/AppTheme.NoActionBar"/>
         <activity android:name=".core_module.mine.view.ui.activity.PrivacyActivity"
             android:theme="@style/AppTheme.NoActionBar"/>
+        <activity android:name=".core_module.mine.view.ui.activity.MineUploadPhotoActivity"
+            android:theme="@style/AppTheme.NoActionBar"/>
+        <activity android:name=".core_module.mine.view.ui.activity.AccountAndSecurityActivity"
+            android:theme="@style/AppTheme.NoActionBar"/>
 
         <!--交易帖相关Activity-->
         <activity android:name=".core_module.trade.view.ui.activity.TradeChangePriorityActivity"
@@ -163,7 +169,9 @@
         <!--联系人界面-->
         <activity android:name=".core_module.friends.activity.ContactsListActivity"
             android:theme="@style/AppTheme.NoActionBar"/>
-        <activity android:name=".core_module.friends.activity.AddNewFriend"
+        <activity android:name=".core_module.friends.activity.AddNewFriendActivity"
+            android:theme="@style/AppTheme.NoActionBar"/>
+        <activity android:name=".core_module.friends.activity.PhoneContactsActivity"
             android:theme="@style/AppTheme.NoActionBar"/>
 
 

+ 6 - 0
app/res/drawable/shape_button_rc_solid_bg_green.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <corners android:radius="15dp"/>
+    <solid android:color="@color/green_4DC0A4"/>
+</shape>

+ 5 - 0
app/res/drawable/shape_edittext_rc_solid_bg_white.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="15dp"/>
+    <solid android:color="@color/white"/>
+</shape>

+ 1 - 1
app/res/layout/circle_item.xml

@@ -15,7 +15,7 @@
         android:id="@+id/circle_item_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:cardBackgroundColor="@android:color/white">
+        android:background="@color/white">
 
         <LinearLayout
             android:layout_width="match_parent"

+ 32 - 0
app/res/layout/friends_phone_contacts.xml

@@ -3,4 +3,36 @@
     android:orientation="vertical" android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+    <android.support.design.widget.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <com.sheishuo.app.common.views.BaseToolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/action_bar_height"
+            style="@style/fullToolbarStyle"/>
+    </android.support.design.widget.AppBarLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:padding="8dp"
+        android:background="@color/grey_light_light">
+        <EditText
+            android:id="@+id/friends_phone_contacts_search_ET"
+            android:layout_width="300dp"
+            android:layout_height="wrap_content"
+            android:background="@drawable/shape_edittext_rc_solid_bg_white"
+            android:hint="搜索用户名或ID"
+            android:textColorHint="@color/grey_light_light"
+            android:gravity="center"
+            android:padding="4dp"/>
+    </LinearLayout>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recyclerview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
 </LinearLayout>

+ 24 - 0
app/res/layout/item_add_photos_layout.xml

@@ -0,0 +1,24 @@
+<?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="96dp"
+        android:layout_height="96dp"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/mine_fragment_edit_photos_img"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/mine_edit_photos" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="添加照片" />
+    </LinearLayout>
+</LinearLayout>

+ 64 - 0
app/res/layout/item_phone_contact_layout.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+
+    <android.support.constraint.ConstraintLayout
+        android:orientation="vertical" android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="8dp">
+
+    <com.netease.nim.uikit.common.ui.imageview.HeadImageView
+        android:id="@+id/item_phone_contact_avtar"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:src="@drawable/nim_avatar_default"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent" />
+
+
+    <TextView
+        android:id="@+id/item_phone_contact_nickname_TV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="用户昵称"
+        app:layout_constraintLeft_toRightOf="@+id/item_phone_contact_avtar"
+        android:layout_marginLeft="9dp"
+        app:layout_constraintTop_toTopOf="@+id/item_phone_contact_avtar"
+        android:layout_marginTop="-8dp" />
+
+    <TextView
+        android:id="@+id/item_phone_contact_name_TV"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="手机通讯录XXX"
+        android:layout_marginLeft="0dp"
+        app:layout_constraintLeft_toLeftOf="@+id/item_phone_contact_nickname_TV"
+        android:layout_marginTop="14dp"
+        app:layout_constraintTop_toBottomOf="@+id/item_phone_contact_nickname_TV" />
+
+    <Button
+        android:id="@+id/item_phone_contact_add_friends_btn"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="已关注"
+        android:textColor="@color/white"
+        android:background="@drawable/shape_button_rc_solid_bg_green"
+        android:layout_marginRight="8dp"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginTop="8dp"
+        android:enabled="false"/>
+
+    </android.support.constraint.ConstraintLayout>
+
+    <View android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="@color/grey_light_light"/>
+
+
+</LinearLayout>

+ 119 - 0
app/res/layout/mine_account_and_security_activity.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/grey_light_light_light">
+
+    <android.support.design.widget.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <com.sheishuo.app.common.views.BaseToolbar
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/action_bar_height"
+            android:title="账户与安全"
+            app:left_text="返回"/>
+    </android.support.design.widget.AppBarLayout>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+        android:background="@color/white">
+
+        <TextView
+            android:layout_weight="7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="谁说号"
+            android:textSize="18sp"/>
+        <TextView
+            android:id="@+id/mine_account_and_security_id_TV"
+            android:layout_weight="1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="谁说号ID"
+            android:textSize="18sp"
+            android:textColor="@color/grey_light"
+            android:gravity="center"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/right_arrow"/>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="@color/grey_light"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+        android:background="@color/white">
+
+        <TextView
+            android:layout_weight="7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="手机号"
+            android:textSize="18sp"/>
+        <TextView
+            android:id="@+id/mine_account_and_security_mobile_TV"
+            android:layout_weight="1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="12345678901"
+            android:textSize="18sp"
+            android:textColor="@color/grey_light"
+            android:gravity="center"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/right_arrow"/>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="@color/grey_light"/>
+
+
+    <LinearLayout
+        android:id="@+id/mine_account_and_security_change_pwd_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+        android:background="@color/white"
+        android:layout_marginTop="16dp">
+
+        <TextView
+            android:layout_weight="7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="密码修改"
+            android:textSize="18sp"/>
+
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/right_arrow"/>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="@color/grey_light"/>
+</LinearLayout>

+ 1 - 19
app/res/layout/mine_fragment.xml

@@ -84,27 +84,9 @@
                 android:id="@+id/mine_fragment_photos_layout"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:columnCount="4">
+                android:columnCount="4"/>
 
-                <LinearLayout
-                    android:layout_width="96dp"
-                    android:layout_height="96dp"
-                    android:gravity="center"
-                    android:orientation="vertical">
-
-                    <ImageView
-                        android:id="@+id/mine_fragment_edit_photos_img"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:src="@drawable/mine_edit_photos" />
-
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="添加照片" />
-                </LinearLayout>
 
-            </GridLayout>
 
             <LinearLayout
                 android:id="@+id/mine_fragment_options_layout"

+ 32 - 0
app/res/layout/mine_upload_photos_activity.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <android.support.design.widget.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <com.sheishuo.app.common.views.BaseToolbar
+            android:id="@id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/action_bar_height"
+            app:left_text="取消"
+            app:right_text="完成"
+            app:title="添加照片" />
+    </android.support.design.widget.AppBarLayout>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <GridLayout
+            android:id="@+id/grid_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:columnCount="3" />
+    </ScrollView>
+
+</LinearLayout>

+ 1 - 0
app/res/layout/team_setttins.xml

@@ -62,6 +62,7 @@
                 android:padding="16dp">
 
                 <TextView
+                    android:id="@+id/team_settings_introduction_title_TV"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="群聊注意事项"

+ 0 - 1
app/res/layout/trade_list_item.xml

@@ -4,7 +4,6 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:layout_marginTop="16dp"
     android:clickable="true"
     android:foreground="?android:attr/selectableItemBackground"
     android:id="@+id/trade_list_item_layout"

+ 1 - 0
app/res/values/colors.xml

@@ -83,6 +83,7 @@
     <color name="black">#000000</color>
     <color name="grey_light">#c4c4c4</color>
     <color name="grey_light_light">#e6e6e6</color>
+    <color name="grey_light_light_light">#f1f1f1</color>
     <color name="blue">#06a1f4</color>
     <color name="transparent">#00000000</color>
 

+ 44 - 0
app/src/com/sheishuo/app/common/beans/ContactRelationshipBean.java

@@ -0,0 +1,44 @@
+package com.sheishuo.app.common.beans;
+
+import java.io.Serializable;
+
+/**
+ * Created by KN on 2017/8/27.
+ */
+
+public class ContactRelationshipBean implements Serializable {
+
+    /**
+     * id : 200034
+     * mobile : 13175812396
+     * follow : 0
+     */
+
+    private String id;
+    private String mobile;
+    private int follow;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public int getFollow() {
+        return follow;
+    }
+
+    public void setFollow(int follow) {
+        this.follow = follow;
+    }
+}

+ 39 - 0
app/src/com/sheishuo/app/common/util/img/ImgUtil.java

@@ -1,8 +1,11 @@
 package com.sheishuo.app.common.util.img;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Point;
 import android.util.DisplayMetrics;
+import android.view.WindowManager;
 import android.widget.ImageView;
 
 import com.bumptech.glide.Glide;
@@ -35,4 +38,40 @@ public class ImgUtil {
         float dp = px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
         return dp;
     }
+
+
+    public static ImageView createImageView(Context context,int width,int height){
+        ImageView imageView = new ImageView(context);
+        imageView.setAdjustViewBounds(true);
+        imageView.setMinimumWidth(width);
+        imageView.setMinimumHeight(height);
+        imageView.setMaxWidth(width);
+        imageView.setMaxHeight(height);
+        return imageView;
+    }
+
+
+    /**
+     * 获取屏幕宽度
+     * @param context
+     * @return
+     */
+    public static int getScreenWidth(Context context){
+        Point point = new Point();
+        ((Activity)context).getWindowManager().getDefaultDisplay().getSize(point);
+
+        return point.x;
+    }
+
+    /**
+     * 获取屏幕高度
+     * @param context
+     * @return
+     */
+    public static int getScreenHeight(Context context){
+        Point point = new Point();
+        ((Activity)context).getWindowManager().getDefaultDisplay().getSize(point);
+
+        return point.y;
+    }
 }

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

@@ -19,16 +19,20 @@ public interface INet {
     void updateLatitudeAndLongitude(ResponseCallback callback);
     void updateLocation(String province,String city,String district,ResponseCallback callback);
     void loginQuery(String mobile,String pwd,ResponseCallback callback);
+    void getVerificationCode(String mobile,ResponseCallback callback);
     void getGiftList(ResponseCallback callback);
     void uploadImgs(String filePath, ResponseCallback callback);
+    void uploadSocialPhoto(String filePath,ResponseCallback callback);
     void getSocialInfo(String targetID,ResponseCallback callback);
     void getCityDataList(ResponseCallback callback);
     void getNearbyPeople(String userId,String page,ResponseCallback callback);
     void getCircleList(String targetId,String lastId,ResponseCallback callback);
     void getTradeList(int type,int page,ResponseCallback callback);
     void publishTrade(int type,String content,String pics,int priority,int priorityType,String roomId,ResponseCallback callback);
-    void queryContact(String contactsListStr,ResponseCallback callback);
     void searchTrade(int page,int sort,String key,ResponseCallback callback);
     void newComment(int socialId, @Nullable int replyId, String comment, ResponseCallback callback);
     void updateBanner(String filePath,ResponseCallback callback);
+    void getPhoneContactRelationship(String phoneListStr,ResponseCallback callback);
+    void sendAddFriendRequest(String targetId,String msg);
+    void followOrUnfollow(String targetId);
 }

+ 149 - 32
app/src/com/sheishuo/app/common/util/net/NetImpl.java

@@ -4,9 +4,11 @@ import android.support.annotation.Nullable;
 import android.util.Log;
 
 import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.cache.SocialInfoCache;
 import com.sheishuo.app.common.beans.CircleBean;
+import com.sheishuo.app.common.beans.ContactRelationshipBean;
 import com.sheishuo.app.common.beans.GiftBean;
 import com.sheishuo.app.common.beans.SocialInfoBean;
 import com.sheishuo.app.common.beans.TradeBean;
@@ -18,6 +20,7 @@ import org.json.JSONObject;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 import okhttp3.Call;
 import okhttp3.Callback;
@@ -240,6 +243,21 @@ public class NetImpl implements INet {
 
     }
 
+    @Override
+    public void getVerificationCode(final String mobile, ResponseCallback callback) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                FormBody body = new FormBody.Builder()
+                        .add("mobile", mobile)
+                        .build();
+                Request request = new Request.Builder()
+                        .post(body)
+                        .url()
+            }
+        }).start();
+    }
+
 
     @Override
     public void getGiftList(final ResponseCallback callback) {
@@ -313,6 +331,49 @@ public class NetImpl implements INet {
         });
     }
 
+    @Override
+    public void uploadSocialPhoto(String filePath, final ResponseCallback callback) {
+        File file = new File(filePath);
+        MultipartBody.Builder builder = new MultipartBody.Builder();
+        builder.setType(MultipartBody.FORM);
+
+        builder.addFormDataPart("user_id", AccountCache.getAccount().getId());
+        builder.addFormDataPart("upload", file.getName(), RequestBody.create(null, file));
+
+
+        RequestBody body = builder.build();
+        Request request = new Request.Builder()
+                .url(UPLOAD_SOCIAL_PHOTO)
+                .post(body)
+                .build();
+
+        Call call = client.newCall(request);
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                callback.onFailed();
+                e.printStackTrace();
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                try {
+                    String resultStr = response.body().string();
+                    Log.e("resultStr",resultStr);
+                    JSONObject jsonObject = new JSONObject(resultStr);
+                    if (jsonObject.getInt("c") == 0) {
+                        callback.onSuccess(null);
+                    } else {
+                        callback.onFailed();
+                    }
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                    callback.onFailed();
+                }
+            }
+        });
+    }
+
 
     @Override
     public void getSocialInfo(final String targetID, final ResponseCallback callback) {
@@ -539,38 +600,6 @@ public class NetImpl implements INet {
     }
 
     @Override
-    public void queryContact(final String contactsListStr, final ResponseCallback callback) {
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                FormBody body = new FormBody.Builder()
-                        .add("user_id",AccountCache.getAccount().getId())
-                        .add("mobiles",contactsListStr)
-                        .build();
-
-                Request request = new Request.Builder()
-                        .post(body)
-                        .url(CONTACTS_RELATIONSHIP)
-                        .build();
-
-                try {
-                    Response response = client.newCall(request).execute();
-                    if (200 == response.code()){
-                        String resultJson = response.body().string();
-                        callback.onSuccess(resultJson);
-                    }else{
-                        callback.onFailed();
-                    }
-
-                }catch (Exception e){
-                    e.printStackTrace();
-                    callback.onFailed();
-                }
-            }
-        }).start();
-    }
-
-    @Override
     public void searchTrade(int page, int sort, String key, ResponseCallback callback) {
 
     }
@@ -662,5 +691,93 @@ public class NetImpl implements INet {
 
     }
 
+    @Override
+    public void getPhoneContactRelationship(final String phoneListStr, final ResponseCallback callback) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                FormBody body = new FormBody.Builder()
+                        .add("user_id",AccountCache.getAccount().getId())
+                        .add("mobiles",phoneListStr)
+                        .build();
+
+                Request request = new Request.Builder()
+                        .post(body)
+                        .url(CONTACTS_RELATIONSHIP)
+                        .build();
+
+                try {
+                    Response response = client.newCall(request).execute();
+                    if (200 == response.code()){
+                        String resultStr = response.body().string();
+                        Log.e("result",resultStr);
+                        String resultJson = new JSONObject(resultStr).getString("d");
+                        List<ContactRelationshipBean> list = new Gson().fromJson(resultJson,new TypeToken<List<ContactRelationshipBean>>(){}.getType());
+                        callback.onSuccess(list);
+                    }else{
+                        callback.onFailed();
+                    }
+
+                }catch (Exception e){
+                    e.printStackTrace();
+                    callback.onFailed();
+                }
+            }
+        }).start();
+    }
+
+    @Override
+    public void sendAddFriendRequest(final String targetId, final String msg) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                FormBody body = new FormBody.Builder()
+                        .add("user_id",AccountCache.getAccount().getId())
+                        .add("target_id",targetId)
+                        .add("msg",msg)
+                        .build();
+
+                Request request = new Request.Builder()
+                        .post(body)
+                        .url(REQUEST_FRIEND)
+                        .build();
+
+                Response response = null;
+                try {
+                    response = client.newCall(request).execute();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+    @Override
+    public void followOrUnfollow(final String targetId) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                FormBody body = new FormBody.Builder()
+                        .add("user_id",AccountCache.getAccount().getId())
+                        .add("follow_id",targetId)
+                        .build();
+
+                Request request = new Request.Builder()
+                        .post(body)
+                        .url(FOLLOW_OR_UNFOLLOW_USER)
+                        .build();
+
+                Response response = null;
+                try {
+                    response = client.newCall(request).execute();
+
+                    Log.e("follow",response.body().string());
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
 
 }

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

@@ -15,6 +15,7 @@ public class NetInfo {
     public final static String GIFT_LIST = INDEX + "?m=who&c=index&a=gift_list";
     public final static String GET_CODE = INDEX + "?m=who&c=index&a=send_code";
     public final static String UPLOAD_IMG = INDEX + "?m=who&c=social&a=upload";
+    public final static String UPLOAD_SOCIAL_PHOTO = INDEX + "?m=who&c=social&a=photo_upload";
     public final static String TRADE_LIST = INDEX + "?m=who&c=trade&a=lists";
     public final static String FOLLOW_TRADE = INDEX + "?m=who&c=trade&a=follow";
     public final static String UNFOLLOW_TRADE = INDEX + "?m=who&c=trade&a=delete_follow";
@@ -24,8 +25,10 @@ public class NetInfo {
     public final static String UPDATE_LATITUDE_AND_LONGITUDE = INDEX + "?m=who&c=index&a=coordinate_2_location";
     public final static String NEARBY_PEOPLE = INDEX + "?m=who&c=index&a=near_user";
     public final static String NEW_TRADE = INDEX + "?m=who&c=trade&a=publish";
-    public final static String CONTACTS_RELATIONSHIP = "m=who&c=social&a=contact";
+    public final static String CONTACTS_RELATIONSHIP = INDEX + "?m=who&c=social&a=contact";
     public final static String TRADE_SEARCH = INDEX + "?m=who&c=trade&a=search";
     public final static String CIRCLE_COMMENT = INDEX + "?m=who&c=social&a=comment";
     public final static String UPDATE_BANNER = INDEX + "?m=who&c=social&a=banner_upload";
+    public final static String REQUEST_FRIEND = INDEX + "?m=who&c=social&a=request_friend";
+    public final static String FOLLOW_OR_UNFOLLOW_USER = INDEX + "?m=who&c=social&a=follow";
 }

+ 1 - 1
app/src/com/sheishuo/app/core_module/friends/activity/AddNewFriend.java → app/src/com/sheishuo/app/core_module/friends/activity/AddNewFriendActivity.java

@@ -15,7 +15,7 @@ import com.sheishuo.app.impl.SheishuoUI;
  * Created by KN on 2017/8/16.
  */
 
-public class AddNewFriend extends SheishuoUI {
+public class AddNewFriendActivity extends SheishuoUI {
 
 
     private String TAG = this.getClass().getSimpleName();

+ 2 - 1
app/src/com/sheishuo/app/core_module/friends/activity/ContactsListActivity.java

@@ -1,6 +1,7 @@
 package com.sheishuo.app.core_module.friends.activity;
 
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
@@ -200,7 +201,7 @@ public class ContactsListActivity extends SheishuoUI {
             } else if (item == BLACK_LIST) {
                 BlackListActivity.start(context);
             }else if(item == PHONE_CONTACTS){
-
+                context.startActivity(new Intent(context,PhoneContactsActivity.class));
             }
         }
     }

+ 112 - 1
app/src/com/sheishuo/app/core_module/friends/activity/PhoneContactsActivity.java

@@ -1,19 +1,130 @@
 package com.sheishuo.app.core_module.friends.activity;
 
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
 import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
 
+import com.sheishuo.app.R;
+import com.sheishuo.app.common.beans.ContactRelationshipBean;
+import com.sheishuo.app.common.util.net.INet;
+import com.sheishuo.app.common.util.net.NetImpl;
+import com.sheishuo.app.common.util.net.ResponseCallback;
+import com.sheishuo.app.common.views.BaseToolbar;
+import com.sheishuo.app.core_module.friends.adapter.PhoneContactItemAdapter;
 import com.sheishuo.app.impl.SheishuoUI;
 
+import java.util.List;
+
 /**
- * Created by KN on 2017/8/18.
+ * Created by KN on 2017/8/27.
  */
 
 public class PhoneContactsActivity extends SheishuoUI {
 
 
+    private String TAG = this.getClass().getSimpleName();
+    private Context context = this;
+
+
+    private BaseToolbar toolbar;
+
+    private RecyclerView recyclerView;
+
+    private EditText searchET;
+
+    private PhoneContactItemAdapter adapter = new PhoneContactItemAdapter();
+
+    private LinearLayoutManager layoutManager = new LinearLayoutManager(context);
+
+    private INet net = new NetImpl();
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        setContentView(R.layout.friends_phone_contacts);
+        findViews();
+        init();
+    }
+
+    void findViews(){
+        toolbar = findView(R.id.toolbar);
+        recyclerView = findView(R.id.recyclerview);
+        searchET = findView(R.id.friends_phone_contacts_search_ET);
+    }
+
+    void init(){
+
+        //查找手机中所有联系人信息
+        net.getPhoneContactRelationship(getContacts(), new ResponseCallback() {
+            @Override
+            public void onSuccess(Object object) {
+                List<ContactRelationshipBean> list = (List<ContactRelationshipBean>) object;
+                showContactRelationShip(list);
+            }
+
+            @Override
+            public void onFailed() {
+
+            }
+        });
+    }
+
+
+    /**
+     * 获得所有通讯录联系人号码
+     * @return
+     */
+    private String getContacts(){
+        String phoneNumStr = "";
+
+        Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                null, null, null, null);
+
+        while (cursor.moveToNext()){
+            String number = cursor.getString(cursor
+                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
+            phoneNumStr += (number + ",");
+        }
+
+        //特殊处理号码格式
+        phoneNumStr = phoneNumStr.replace("+86","");
+        phoneNumStr = phoneNumStr.replace("+","");
+        phoneNumStr = phoneNumStr.replace(" ","");
+        phoneNumStr = phoneNumStr.replace("-","");
+
+
+        if (phoneNumStr.length() > 0){
+            return phoneNumStr.substring(0,phoneNumStr.length() - 1).trim();
+        }
+
+        return "";
+    }
 
+    private void showContactRelationShip(final List<ContactRelationshipBean> list){
+        getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+                recyclerView.setLayoutManager(layoutManager);
+                recyclerView.setAdapter(adapter);
+                adapter.addAll(list);
+                adapter.setOnAddFriendListenner(new PhoneContactItemAdapter.AddFriendButtonClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        net.sendAddFriendRequest((String) view.getTag(),"请求添加好友");
+                        showToast(context,"已发送好友申请");
+                    }
+                });
+            }
+        });
     }
 }

+ 143 - 0
app/src/com/sheishuo/app/core_module/friends/adapter/PhoneContactItemAdapter.java

@@ -0,0 +1,143 @@
+package com.sheishuo.app.core_module.friends.adapter;
+
+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.Button;
+import android.widget.TextView;
+
+import com.bumptech.glide.Glide;
+import com.netease.nim.uikit.common.ui.imageview.HeadImageView;
+import com.netease.nim.uikit.session.module.Container;
+import com.netease.nimlib.sdk.NIMClient;
+import com.netease.nimlib.sdk.RequestCallback;
+import com.netease.nimlib.sdk.uinfo.UserService;
+import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
+import com.sheishuo.app.R;
+import com.sheishuo.app.common.beans.ContactRelationshipBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by KN on 2017/8/27.
+ */
+
+public class PhoneContactItemAdapter extends RecyclerView.Adapter<PhoneContactItemAdapter.PhoneContactItemViewHolder> implements View.OnClickListener{
+
+
+    private List<ContactRelationshipBean> data = new ArrayList<>();
+
+    private AddFriendButtonClickListener listener = null;
+
+    private Context context;
+
+    @Override
+    public PhoneContactItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        context = parent.getContext();
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_phone_contact_layout,parent,false);
+        return new PhoneContactItemViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(PhoneContactItemViewHolder holder, int position) {
+        ContactRelationshipBean bean = data.get(position);
+
+        if (getAvatar(bean.getId()) != null){
+            Glide.with(context)
+                    .load(getAvatar(bean.getId()))
+                    .into(holder.avatar);
+        }
+
+
+
+        holder.nickname.setText(getName(bean.getId()));
+
+        holder.name.setText("手机联系人:" + bean.getMobile());
+
+        if (0 == bean.getFollow()){
+            holder.addFriendBtn.setText("关注");
+            holder.addFriendBtn.setEnabled(true);
+            holder.addFriendBtn.setTag(bean.getId());
+            holder.addFriendBtn.setOnClickListener(this);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return data.size();
+    }
+
+
+    private String getName(String userId){
+        if (NIMClient.getService(UserService.class).getUserInfo(userId).getName() != null){
+            return NIMClient.getService(UserService.class).getUserInfo(userId).getName();
+        }
+
+        return userId;
+    }
+
+    private String getAvatar(String userId){
+        if (NIMClient.getService(UserService.class).getUserInfo(userId).getAvatar() != null){
+            return NIMClient.getService(UserService.class).getUserInfo(userId).getAvatar();
+        }
+        return null;
+    }
+
+    public void addAll(final List<ContactRelationshipBean> list){
+        List<String> userIds = new ArrayList<>();
+        for (ContactRelationshipBean bean : list){
+            userIds.add(bean.getId());
+        }
+
+        NIMClient.getService(UserService.class).fetchUserInfo(userIds).setCallback(new RequestCallback<List<NimUserInfo>>() {
+            @Override
+            public void onSuccess(List<NimUserInfo> nimUserInfos) {
+                data.addAll(list);
+                notifyDataSetChanged();
+            }
+
+            @Override
+            public void onFailed(int i) {
+                Log.e("PhoneContactItemAdapter",""+i);
+            }
+
+            @Override
+            public void onException(Throwable throwable) {
+                throwable.printStackTrace();
+            }
+        });
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (listener != null){
+            listener.onClick(v);
+        }
+    }
+
+    public void setOnAddFriendListenner(AddFriendButtonClickListener listener){
+        this.listener = listener;
+    }
+
+    class PhoneContactItemViewHolder extends RecyclerView.ViewHolder{
+
+        HeadImageView avatar;
+        TextView nickname,name;
+        Button addFriendBtn;
+        public PhoneContactItemViewHolder(View view) {
+            super(view);
+            avatar = (HeadImageView) view.findViewById(R.id.item_phone_contact_avtar);
+            nickname = (TextView) view.findViewById(R.id.item_phone_contact_nickname_TV);
+            name = (TextView) view.findViewById(R.id.item_phone_contact_name_TV);
+            addFriendBtn = (Button) view.findViewById(R.id.item_phone_contact_add_friends_btn);
+        }
+    }
+
+    public interface AddFriendButtonClickListener{
+        void onClick(View view);
+    }
+}

+ 55 - 0
app/src/com/sheishuo/app/core_module/mine/view/ui/activity/AccountAndSecurityActivity.java

@@ -0,0 +1,55 @@
+package com.sheishuo.app.core_module.mine.view.ui.activity;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.sheishuo.app.R;
+import com.sheishuo.app.cache.AccountCache;
+import com.sheishuo.app.impl.SheishuoUI;
+
+/**
+ * Created by KN on 2017/8/28.
+ */
+
+public class AccountAndSecurityActivity extends SheishuoUI {
+
+
+    private String TAG = this.getClass().getSimpleName();
+    private Context context = this;
+
+
+    private TextView idTV,mobileTV;
+
+    private LinearLayout changePwdLayout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.mine_account_and_security_activity);
+        findViews();
+        init();
+
+
+    }
+
+
+    void findViews(){
+        idTV = findView(R.id.mine_account_and_security_id_TV);
+        mobileTV = findView(R.id.mine_account_and_security_mobile_TV);
+        changePwdLayout = findView(R.id.mine_account_and_security_change_pwd_layout);
+    }
+
+    void init(){
+        idTV.setText(AccountCache.getAccount().getId());
+        mobileTV.setText(AccountCache.getAccount().getMobile());
+        changePwdLayout.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+            }
+        });
+    }
+}

+ 251 - 0
app/src/com/sheishuo/app/core_module/mine/view/ui/activity/MineUploadPhotoActivity.java

@@ -0,0 +1,251 @@
+package com.sheishuo.app.core_module.mine.view.ui.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.GridLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.bumptech.glide.Glide;
+import com.netease.nim.uikit.common.media.picker.PickImageHelper;
+import com.netease.nim.uikit.common.media.picker.activity.PickImageActivity;
+import com.netease.nim.uikit.common.media.picker.activity.PickerAlbumActivity;
+import com.netease.nim.uikit.common.media.picker.model.PhotoInfo;
+import com.netease.nim.uikit.session.activity.WatchPictureActivity;
+import com.sheishuo.app.R;
+import com.sheishuo.app.cache.AccountCache;
+import com.sheishuo.app.cache.SocialInfoCache;
+import com.sheishuo.app.common.beans.SocialPhoto;
+import com.sheishuo.app.common.util.img.ImgUtil;
+import com.sheishuo.app.common.util.net.INet;
+import com.sheishuo.app.common.util.net.NetImpl;
+import com.sheishuo.app.common.util.net.ResponseCallback;
+import com.sheishuo.app.common.views.BaseToolbar;
+import com.sheishuo.app.impl.SheishuoUI;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by KN on 2017/8/27.
+ */
+
+public class MineUploadPhotoActivity extends SheishuoUI {
+
+    public static final int ADD_PHOTOS_CODE = 5300;
+
+    private String TAG = this.getClass().getSimpleName();
+    private Context context = this;
+
+    private BaseToolbar toolbar;
+
+    private GridLayout gridLayout;
+
+    private INet net = new NetImpl();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.mine_upload_photos_activity);
+        findViews();
+        init();
+
+    }
+
+    void findViews(){
+        toolbar = findView(R.id.toolbar);
+        gridLayout = findView(R.id.grid_layout);
+    }
+
+    void init(){
+        //初始化toolbar
+        initToolbar();
+
+        //初始化照片墙
+        final String mineId = AccountCache.getAccount().getId();
+        net.getSocialInfo(mineId, new ResponseCallback() {
+            @Override
+            public void onSuccess(Object object) {
+
+                initPhotosWall(mineId);
+
+            }
+
+            @Override
+            public void onFailed() {
+                showToast(context,"加载失败,请检查网络");
+            }
+        });
+    }
+
+
+    /**
+     * 初始化Toolbar
+     */
+    void initToolbar(){
+        toolbar.getLeftTV().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+
+
+        toolbar.getRightTV().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+    }
+
+    /**
+     * 初始化照片墙
+     */
+    void initPhotosWall(final String mineId){
+
+        getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                final List<SocialPhoto> photos = SocialInfoCache.get(mineId).getPhotos();
+
+
+                final List<String> thumbUrls = new ArrayList<>();
+                final List<String> photoUrls = new ArrayList<>();
+                for (final SocialPhoto photo : photos){
+                    thumbUrls.add(photo.getThumb());
+                    photoUrls.add(photo.getPic());
+                }
+
+                //每行3张
+                int widthAndHeight = ImgUtil.getScreenWidth(context) / 3;
+                for (int i = 0;i < thumbUrls.size();i++){
+                    ImageView imageView = ImgUtil.createImageView(context,widthAndHeight,widthAndHeight);
+                    Glide.with(context)
+                            .load(thumbUrls.get(i))
+                            .into(imageView);
+
+                    final int finalI = i;
+                    imageView.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            WatchPictureActivity.start(context,photoUrls,thumbUrls, finalI);
+                        }
+                    });
+
+
+                    gridLayout.addView(imageView);
+                }
+
+
+                //添加占位按钮
+                createAddPhotoBtn();
+            }
+        });
+
+
+
+
+    }
+
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (Activity.RESULT_OK == resultCode){
+            if (ADD_PHOTOS_CODE == requestCode){
+                toolbar.getRightTV().setEnabled(false);
+                toolbar.setRightText("上传中...");
+
+                Bundle result = data.getExtras();
+                List<PhotoInfo> photoInfoList = (List<PhotoInfo>) result.getSerializable("photo_list");
+                uploadPhotos(photoInfoList);
+
+            }
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    /**
+     * 上传照片
+     * @param photos
+     */
+    private void uploadPhotos(final List<PhotoInfo> photos){
+
+        for (int i = 0;i < photos.size();i++){
+            final int finalI = i;
+            final int finalI1 = i;
+            net.uploadSocialPhoto(photos.get(i).getAbsolutePath(), new ResponseCallback() {
+                @Override
+                public void onSuccess(Object object) {
+
+                    getHandler().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            //移除占位按钮
+                            gridLayout.removeViewAt(gridLayout.getChildCount() - 1);
+                            showToast(context,"第" + finalI + 1 + "上传成功");
+                            int widthAndHeight = ImgUtil.getScreenWidth(context) / 3;
+                            ImageView imageView = ImgUtil.createImageView(context,widthAndHeight,widthAndHeight);
+                            Glide.with(context)
+                                    .load(photos.get(finalI).getAbsolutePath())
+                                    .centerCrop()
+                                    .into(imageView);
+                            gridLayout.addView(imageView);
+
+                            //重新添加占位按钮
+                            createAddPhotoBtn();
+
+                            //解锁完成按钮
+                            toolbar.setRightText("完成");
+                            toolbar.getRightTV().setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    finish();
+                                }
+                            });
+                        }
+                    });
+
+                }
+
+                @Override
+                public void onFailed() {
+                    showToast(context,"第" + finalI1 + 1 + "上传失败");
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 添加占位按钮
+     */
+    private void createAddPhotoBtn(){
+        int widthAndHeight = ImgUtil.getScreenWidth(context) / 3;
+        View addPhotoBtn = LayoutInflater.from(context).inflate(R.layout.item_add_photos_layout,gridLayout);
+
+        GridLayout.LayoutParams params = (GridLayout.LayoutParams) addPhotoBtn.getLayoutParams();
+        params.height = widthAndHeight;
+        params.width = widthAndHeight;
+        addPhotoBtn.setLayoutParams(params);
+        addPhotoBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                PickImageHelper.PickImageOption option = new PickImageHelper.PickImageOption();
+                PickImageActivity.start((Activity) context, ADD_PHOTOS_CODE, PickImageActivity.FROM_LOCAL, option.outputPath, option.multiSelect,
+                        option.multiSelectMaxCount, true, false, 0, 0);
+            }
+        });
+        gridLayout.addView(addPhotoBtn);
+    }
+}

+ 8 - 0
app/src/com/sheishuo/app/core_module/mine/view/ui/activity/SettingsActivity.java

@@ -16,6 +16,7 @@ import com.sheishuo.app.R;
 import com.sheishuo.app.SheishuoCache;
 import com.sheishuo.app.chatroom.helper.ChatRoomHelper;
 import com.sheishuo.app.common.util.data.SPHelper;
+import com.sheishuo.app.common.util.net.NetImpl;
 import com.sheishuo.app.common.views.BaseToolbar;
 import com.sheishuo.app.impl.SheishuoUI;
 import com.sheishuo.app.impl.SheishuoUIKit;
@@ -84,6 +85,13 @@ public class SettingsActivity extends SheishuoUI {
             }
         });
 
+        //初始化账户与安全
+        securityLayout.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(context,AccountAndSecurityActivity.class));
+            }
+        });
 
 
         //初始化隐私

+ 49 - 7
app/src/com/sheishuo/app/core_module/mine/view/ui/activity/UserInfoDetailActivity.java

@@ -51,6 +51,9 @@ public class UserInfoDetailActivity extends SheishuoUI {
 
     private String userId = "";
 
+    //FLAGS
+    private boolean FOLLOWED = false;
+
     public static void start(Context context, String account) {
         Intent intent = new Intent();
         intent.setClass(context, UserInfoDetailActivity.class);
@@ -96,6 +99,7 @@ public class UserInfoDetailActivity extends SheishuoUI {
                         @Override
                         public void run() {
                             showInfo(userId);
+                            followOrUnfollow();
                         }
                     });
                 }
@@ -107,16 +111,16 @@ public class UserInfoDetailActivity extends SheishuoUI {
             });
         } else {
             showInfo(userId);
+            followOrUnfollow();
         }
 
 
-        //关注用户
-        followBtn.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
 
-            }
-        });
+
+
+
+
+
 
         //发送消息
         chatBtn.setOnClickListener(new View.OnClickListener() {
@@ -127,10 +131,10 @@ public class UserInfoDetailActivity extends SheishuoUI {
         });
 
 
-        //NIMClient.getService(UserService.class).fetchUserInfo()
     }
 
 
+    //展示用户信息
     public void showInfo(String id) {
         //展示年龄
         SocialInfoBean info = SocialInfoCache.get(id);
@@ -235,4 +239,42 @@ public class UserInfoDetailActivity extends SheishuoUI {
             }
         });
     }
+
+
+    //关注相关
+    public void followOrUnfollow(){
+        //是否关注
+        if (1 == SocialInfoCache.get(userId).getFollow()){
+            FOLLOWED = true;
+            followBtn.setText("已关注");
+        }else {
+            FOLLOWED = false;
+            followBtn.setText("关注");
+        }
+
+        //关注或者取关用户
+        followBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (FOLLOWED){
+                    FOLLOWED = false;
+                    followBtn.setText("关注");
+                    showToast(context,"取消关注成功");
+                    //更新缓存
+                    SocialInfoCache.get(userId).setFollow(0);
+                }else {
+                    FOLLOWED = true;
+                    followBtn.setText("已关注");
+                    showToast(context,"关注成功");
+
+                    //更新缓存
+                    SocialInfoCache.get(userId).setFollow(1);
+                }
+                net.followOrUnfollow(userId);
+
+
+            }
+        });
+    }
+
 }

+ 27 - 1
app/src/com/sheishuo/app/core_module/sheishuo/view/ui/TeamSettingsActivity.java

@@ -46,7 +46,7 @@ public class TeamSettingsActivity extends SheishuoUI implements View.OnClickList
 
     private LinearLayout teamNameLayout, teamIntroductionLayout, teamMemberCountLayout, teamMemberAvatarLayout, chatRecordLayout, clearChatRecordLayout;
 
-    private TextView teamNameTV, teamIntroductionTV, teamMemberCountTV;
+    private TextView teamNameTV, teamIntroductionTV,getTeamIntroductionTitleTV, teamMemberCountTV;
 
     private Switch muteSwitch, pinSwitch;
 
@@ -75,6 +75,7 @@ public class TeamSettingsActivity extends SheishuoUI implements View.OnClickList
 
         teamNameTV = findView(R.id.team_settings_room_name_TV);
         teamIntroductionTV = findView(R.id.team_settings_introduction_TV);
+        getTeamIntroductionTitleTV = findView(R.id.team_settings_introduction_title_TV);
         teamMemberCountTV = findView(R.id.team_settings_member_count_tv);
 
         muteSwitch = findView(R.id.team_settings_room_mute_switch);
@@ -115,6 +116,11 @@ public class TeamSettingsActivity extends SheishuoUI implements View.OnClickList
         clearChatRecordLayout.setOnClickListener(this);
         quitBtn.setOnClickListener(this);
 
+        //加载类型
+        if (!isSystemTeam(team)){
+            getTeamIntroductionTitleTV.setText("群公告");
+        }
+
 
         //加载群成员头像
         getTeamService().queryMemberList(teamRoomId).setCallback(new RequestCallback<List<TeamMember>>() {
@@ -281,4 +287,24 @@ public class TeamSettingsActivity extends SheishuoUI implements View.OnClickList
             }
         });
     }
+
+
+    /**
+     * 判断是否为系统群
+     * @param team
+     * @return
+     */
+    public boolean isSystemTeam(Team team){
+        if (team.getName().contains("国家")
+                ||team.getName().contains("省")
+                ||team.getName().contains("市")
+                ||team.getName().contains("区")
+                ||team.getName().contains("县")
+                ||team.getName().contains("自治")
+                ||team.getName().contains("特别行政区")){
+            return true;
+        }
+
+        return false;
+    }
 }

+ 1 - 0
app/src/com/sheishuo/app/impl/SheishuoTeamMessageActivity.java

@@ -112,6 +112,7 @@ public class SheishuoTeamMessageActivity extends TeamMessageActivity {
     protected void onDestroy() {
         super.onDestroy();
 
+
         registerTeamUpdateObserver(false);
     }
 

+ 2 - 1
app/src/com/sheishuo/app/main/activity/MainActivity.java

@@ -145,7 +145,8 @@ public class MainActivity extends SheishuoUI {
             Manifest.permission.READ_PHONE_STATE,
             Manifest.permission.RECORD_AUDIO,
             Manifest.permission.ACCESS_COARSE_LOCATION,
-            Manifest.permission.ACCESS_FINE_LOCATION
+            Manifest.permission.ACCESS_FINE_LOCATION,
+            Manifest.permission.READ_CONTACTS
     };
 
     private void requestBasicPermission() {

+ 105 - 6
app/src/com/sheishuo/app/main/fragment/MineFragment.java

@@ -4,7 +4,9 @@ import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.GridLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
@@ -12,9 +14,12 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.google.gson.Gson;
 import com.netease.nim.uikit.common.media.picker.PickImageHelper;
+import com.netease.nim.uikit.common.media.picker.activity.PickImageActivity;
 import com.netease.nim.uikit.common.media.picker.model.PhotoInfo;
+import com.netease.nim.uikit.common.util.media.ImageUtil;
 import com.netease.nimlib.sdk.NIMClient;
 import com.netease.nimlib.sdk.RequestCallback;
 import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
@@ -23,22 +28,29 @@ import com.netease.nimlib.sdk.uinfo.constant.UserInfoFieldEnum;
 import com.sheishuo.app.R;
 import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.cache.MineSocialCache;
+import com.sheishuo.app.cache.SocialInfoCache;
 import com.sheishuo.app.common.beans.SocialInfoBean;
+import com.sheishuo.app.common.beans.SocialPhoto;
+import com.sheishuo.app.common.util.img.ImgUtil;
 import com.sheishuo.app.common.util.net.INet;
 import com.sheishuo.app.common.util.net.NetImpl;
 import com.sheishuo.app.common.util.net.ResponseCallback;
 import com.sheishuo.app.common.views.BaseToolbar;
 import com.sheishuo.app.core_module.mine.view.ui.activity.MineTradeActivity;
+import com.sheishuo.app.core_module.mine.view.ui.activity.MineUploadPhotoActivity;
 import com.sheishuo.app.core_module.mine.view.ui.activity.NearbyPeopleActivity;
 import com.sheishuo.app.core_module.mine.view.ui.activity.PersonalSettingsActivity;
 import com.sheishuo.app.core_module.mine.view.ui.activity.SettingsActivity;
 import com.sheishuo.app.core_module.mine.view.ui.activity.UserInfoDetailActivity;
 import com.sheishuo.app.main.activity.MainActivity;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import static com.netease.nim.uikit.ContextCache.context;
+
 /**
  * Created by KN on 2017/8/8.
  */
@@ -52,9 +64,11 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
     private ImageView avatarImg,settingsImg,bannerImg,editPhotoImg;
     private TextView usernameTV,userIdTV;
     private LinearLayout neabyPeopleOption,mineTradeOption,settingsOptions;
+    private GridLayout photosLayout;
     private Toast toast = null;
     private INet net = new NetImpl();
 
+
     //FLAGS
     public final static int AVATAR_SELECTED = 5000;
     public final static int BANNER_SELECTED = 5001;
@@ -81,19 +95,18 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
         bannerImg = findView(R.id.mine_fragment_banner);
         usernameTV = findView(R.id.mine_fragment_username_tv);
         userIdTV = findView(R.id.mine_fragment_id_tv);
-        editPhotoImg = findView(R.id.mine_fragment_edit_photos_img);
         neabyPeopleOption = findView(R.id.mine_fragment_nearby_people);
         mineTradeOption = findView(R.id.mine_fragment_trade);
         settingsOptions = findView(R.id.mine_fragment_setting);
+        photosLayout = findView(R.id.mine_fragment_photos_layout);
 
         avatarImg.setOnClickListener(this);
         bannerImg.setOnClickListener(this);
         settingsImg.setOnClickListener(this);
-        editPhotoImg.setOnClickListener(this);
         neabyPeopleOption.setOnClickListener(this);
         mineTradeOption.setOnClickListener(this);
         settingsOptions.setOnClickListener(this);
-
+        photosLayout.setOnClickListener(this);
     }
 
     private void init(){
@@ -103,12 +116,19 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
 
 
 
-        UserInfoProvider.UserInfo user = NIMClient.getService(UserService.class).getUserInfo(AccountCache.getAccount().getId());
+        final String mineId =AccountCache.getAccount().getId();
+
+                UserInfoProvider.UserInfo user = NIMClient.getService(UserService.class).getUserInfo(AccountCache.getAccount().getId());
         if (user.getAvatar() != null)
             Glide.with(getActivity()).load(user.getAvatar()).into(avatarImg);
 
-        usernameTV.setText(getName(AccountCache.getAccount().getId()));
-        userIdTV.setText("ID:" + AccountCache.getAccount().getId());
+        usernameTV.setText(getName(mineId));
+        userIdTV.setText("ID:" + mineId);
+
+        //初始化照片墙
+        initPhotosWall(mineId);
+
+
 
 
 
@@ -165,6 +185,8 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
             case R.id.mine_fragment_setting:
                 startActivity(new Intent(getActivity(), SettingsActivity.class));
                 break;
+            case R.id.mine_fragment_photos_layout:
+                break;
         }
     }
 
@@ -291,6 +313,13 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
         PickImageHelper.pickImage(getContext(),requestCode,option);
     }
 
+    private void pickImageFromLocal(int requestCode){
+        PickImageHelper.PickImageOption option = new PickImageHelper.PickImageOption();
+        option.multiSelectMaxCount = 9 - photosLayout.getChildCount();
+        PickImageActivity.start((Activity) context, requestCode, PickImageActivity.FROM_LOCAL, option.outputPath, option.multiSelect,
+                option.multiSelectMaxCount, true, false, 0, 0);
+    }
+
 
     private void fetchSocialInfo(){
         net.getSocialInfo(AccountCache.getAccount().getId(), new ResponseCallback() {
@@ -326,5 +355,75 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
         });
     }
 
+    //初始化照片墙
+    private void initPhotosWall(final String mineId){
+
+        //判断有无缓存
+        if (SocialInfoCache.get(mineId) != null){
+            SocialInfoBean bean = SocialInfoCache.get(mineId);
+            List<String> photoUrls = new ArrayList<>();
+            for (SocialPhoto photo : bean.getPhotos()){
+                photoUrls.add(photo.getThumb());
+            }
+            updatePhotosWall(photoUrls);
+        }else {
+            net.getSocialInfo(mineId, new ResponseCallback() {
+                @Override
+                public void onSuccess(Object object) {
+                    SocialInfoBean bean = SocialInfoCache.get(mineId);
+                    List<String> photoUrls = new ArrayList<>();
+                    for (SocialPhoto photo : bean.getPhotos()){
+                        photoUrls.add(photo.getThumb());
+                    }
+                    updatePhotosWall(photoUrls);
+                }
+
+                @Override
+                public void onFailed() {
+                    showToast("获取用户照片墙失败");
+                }
+            });
+        }
+    }
+    //更新照片墙
+    private void updatePhotosWall(final List<String> photos){
+
+        getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                int widthAndHeight = ImgUtil.getScreenWidth(getActivity()) / 4;
+
+                for (int i = 0;i < 7 && i < photos.size();i++){
+                    ImageView imageView = new ImageView(context);
+                    imageView.setAdjustViewBounds(true);
+                    imageView.setMaxWidth(widthAndHeight);
+                    imageView.setMaxHeight(widthAndHeight);
+
+                    Glide.with(context)
+                            .load(photos.get(i))
+                            .diskCacheStrategy(DiskCacheStrategy.ALL)
+                            .into(imageView);
+                    //添加布局
+                    photosLayout.addView(imageView);
+                }
+
+                //初始化占位按钮
+                View uploadBtn = LayoutInflater.from(context).inflate(R.layout.item_add_photos_layout,null);
+                uploadBtn.setMinimumWidth(widthAndHeight);
+                uploadBtn.setMinimumHeight(widthAndHeight);
+                uploadBtn.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        startActivity(new Intent(getActivity(), MineUploadPhotoActivity.class));
+                    }
+                });
+
+                //添加布局
+                photosLayout.addView(uploadBtn);
+            }
+        });
+
+    }
+
 
 }

+ 2 - 3
app/src/com/sheishuo/app/main/fragment/SessionListFragment.java

@@ -23,7 +23,7 @@ import com.netease.nimlib.sdk.msg.model.RecentContact;
 import com.sheishuo.app.R;
 import com.sheishuo.app.common.views.BaseToolbar;
 import com.sheishuo.app.config.preference.Preferences;
-import com.sheishuo.app.core_module.friends.activity.AddNewFriend;
+import com.sheishuo.app.core_module.friends.activity.AddNewFriendActivity;
 import com.sheishuo.app.core_module.friends.activity.ContactsListActivity;
 import com.sheishuo.app.impl.SheishuoUIKit;
 import com.sheishuo.app.login.LoginActivity;
@@ -33,7 +33,6 @@ import com.sheishuo.app.main.activity.MainActivity;
 import com.sheishuo.app.main.activity.MultiportActivity;
 import com.sheishuo.app.main.model.MainTab;
 import com.sheishuo.app.main.reminder.ReminderManager;
-import com.sheishuo.app.session.SessionHelper;
 import com.sheishuo.app.session.extension.GuessAttachment;
 import com.sheishuo.app.session.extension.RTSAttachment;
 import com.sheishuo.app.session.extension.SnapChatAttachment;
@@ -168,7 +167,7 @@ public class SessionListFragment extends MainTabFragment {
             toolbar.getIcoLayout().getChildAt(1).setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    startActivity(new Intent(getActivity(), AddNewFriend.class));
+                    startActivity(new Intent(getActivity(), AddNewFriendActivity.class));
                 }
             });
         }

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

@@ -194,7 +194,7 @@ public class TradeListFragment extends MainTabFragment {
             adapter.setOnTradeItemClickListener(new TradeItemAdapter.OnTradeItemClickListener() {
                 @Override
                 public void onClick(View view) {
-                    if (view instanceof CardView){
+                    if (view instanceof LinearLayout){
                         TradeBean.DBean.ListBean bean = (TradeBean.DBean.ListBean) view.getTag();
                         Intent intent = new Intent(getActivity(), TradeDetailsActivity.class);
                         intent.putExtra(TradeDetailsActivity.DATA,bean);