drew 6 лет назад
Родитель
Сommit
6a59e19e79
38 измененных файлов с 955 добавлено и 169 удалено
  1. 2 0
      app/build.gradle
  2. 1 0
      app/src/main/AndroidManifest.xml
  3. 14 0
      app/src/main/assets/mockData/Room.json
  4. 44 0
      app/src/main/assets/mockData/RoomMeetings.json
  5. 90 0
      app/src/main/assets/mockData/投顾.json
  6. 63 0
      app/src/main/assets/mockData/非投顾.json
  7. 7 0
      app/src/main/java/com/ht/gate/ApiService.java
  8. 7 0
      app/src/main/java/com/ht/gate/Constants.java
  9. 4 1
      app/src/main/java/com/ht/gate/DoorService.java
  10. 1 2
      app/src/main/java/com/ht/gate/LaunchActivity.java
  11. 38 14
      app/src/main/java/com/ht/gate/LoginActivity.java
  12. 75 19
      app/src/main/java/com/ht/gate/MainActivity.java
  13. 3 3
      app/src/main/java/com/ht/gate/MeetingAdapter.java
  14. 66 0
      app/src/main/java/com/ht/gate/MockServer.java
  15. 39 11
      app/src/main/java/com/ht/gate/MyApplication.java
  16. 1 3
      app/src/main/java/com/ht/gate/PasswordDialog.java
  17. 12 6
      app/src/main/java/com/ht/gate/RetrofitManager.java
  18. 41 44
      app/src/main/java/com/ht/gate/SettingsActivity.java
  19. 5 0
      app/src/main/java/com/ht/gate/Utils.java
  20. 132 12
      app/src/main/java/com/ht/gate/WelcomeActivity.java
  21. 2 1
      app/src/main/java/com/ht/gate/domain/Meeting.java
  22. 1 1
      app/src/main/java/com/ht/gate/domain/Room.java
  23. 2 1
      app/src/main/java/com/ht/gate/domain/RoomMeetings.java
  24. 3 1
      app/src/main/java/com/ht/gate/domain/User.java
  25. 31 0
      app/src/main/java/com/ht/gate/domain/emp/EmpCertification.java
  26. 37 0
      app/src/main/java/com/ht/gate/domain/emp/EmpContactInfo.java
  27. 105 0
      app/src/main/java/com/ht/gate/domain/emp/EmpInfo.java
  28. 44 0
      app/src/main/java/com/ht/gate/domain/emp/EmpJobInfo.java
  29. 28 0
      app/src/main/java/com/ht/gate/domain/emp/EmpLabel.java
  30. BIN
      app/src/main/res/drawable/portrait.jpg
  31. 2 2
      app/src/main/res/layout/activity_login.xml
  32. 4 4
      app/src/main/res/layout/activity_main.xml
  33. 37 37
      app/src/main/res/layout/activity_settings.xml
  34. 13 6
      app/src/main/res/layout/activity_welcome.xml
  35. 1 1
      app/src/main/res/layout/dialog_password.xml
  36. BIN
      app/src/main/res/mipmap-xhdpi/portrait.png
  37. BIN
      app/src/main/res/mipmap-xxhdpi/portrait.png
  38. BIN
      app/src/main/res/mipmap-xxxhdpi/portrait.png

+ 2 - 0
app/build.gradle

@@ -50,4 +50,6 @@ dependencies {
     implementation "com.squareup.okhttp3:logging-interceptor:3.10.0"
     implementation 'org.projectlombok:lombok:1.16.8'
     implementation 'org.glassfish:javax.annotation:10.0-b28'
+    implementation 'com.squareup.picasso:picasso:2.71828'
+    implementation 'com.zy.mocknet:mocknet:1.0'
 }

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -13,6 +13,7 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="false"
         android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true"
         tools:ignore="GoogleAppIndexingWarning"
         tools:replace="android:supportsRtl">
         <service

+ 14 - 0
app/src/main/assets/mockData/Room.json

@@ -0,0 +1,14 @@
+{
+    "roomNo": "NK_1BAJC",
+    "roomName": "一号会议室",
+    "siteCode": "zz001001",
+    "siteName": "营业部名称",
+    "branchDeptCode": "分公司zz编号",
+    "branchDeptName": "分公司名称",
+    "remark": "会议室描述",
+    "deviceCode": "电子屏设备号",
+    "devicePassword": "电子屏设备管理密码",
+    "capacity": "12",
+    "provideService": "可提供的服务",
+    "roomBizNum": "A03"
+}

+ 44 - 0
app/src/main/assets/mockData/RoomMeetings.json

@@ -0,0 +1,44 @@
+[
+    {
+        "room": {
+            "roomNo": "NK_1BAJC",
+            "roomName": "一号会议室",
+            "siteCode": "zz001001",
+            "siteName": "营业部名称",
+            "branchDeptCode": "分公司zz编号",
+            "branchDeptName": "分公司名称",
+            "remark": "会议室描述",
+            "deviceCode": "111111",
+            "devicePassword": "8888",
+            "capacity": "12",
+            "provideService": "可提供的服务",
+            "roomBizNum": "A03"
+        },
+        "meetings": [
+            {
+                "uuid": "会议唯一ID",
+                "createTime": "会议创建时间",
+                "subject": "会议主题",
+                "description": "会议描述",
+                "status": "NEW",
+                "beginDate": "2020-01-08",
+                "beginTimeStr": "2020-01-08 10:00:00",
+                "endTimeStr": "2020-01-08 21:37:00",
+                "createUser": {
+                    "userId": "012901",
+                    "userName": "鲁啸"
+                },
+                "attendees": [
+                    {
+                        "userId": "011111",
+                        "userName": "张三"
+                    }
+                ],
+                "meetingPurpose": "会议用途",
+                "welcomeText": "欢迎词",
+                "attendeeNum": 1,
+                "meetingService": "选择的会议服务"
+            }
+        ]
+    }
+]

+ 90 - 0
app/src/main/assets/mockData/投顾.json

@@ -0,0 +1,90 @@
+{
+    "birthPlace": "南京",
+    "birthday": null,
+    "certNo": "320103198303161545",
+    "certType": "ID_CARD",
+    "certifications": [
+        {
+            "certiedType": "02",
+            "certificateAcquisitionTime": 1563206400000,
+            "certificateNumber": "S0570610120372",
+            "class": "com.htsc.crm.employee.core.dto.EmpCertificationDTO",
+            "id": 209197,
+            "userId": "002332"
+        }
+    ],
+    "class": "com.htsc.crm.employee.core.dto.EmpInfoDTO",
+    "contactInfo": {
+        "class": "com.htsc.crm.employee.core.dto.EmpContactInfoDTO",
+        "email": "Tqinxiao@htzq.htsc.com.cn",
+        "mobile": "18951810511",
+        "officeNo": "",
+        "officePhone": "025-84798983",
+        "rowId": 244104,
+        "userId": "002332",
+        "userName": "魏巍"
+    },
+    "depcity": "DF1501",
+    "description": "123",
+    "empLabelDTOs": [
+        {
+            "class": "com.htsc.crm.employee.extend.dto.EmpLabelDTO",
+            "createdBy": "006073",
+            "id": 58,
+            "lastUpdatedBy": "006073",
+            "name": "融资服务"
+        },
+        {
+            "class": "com.htsc.crm.employee.extend.dto.EmpLabelDTO",
+            "createdBy": "006073",
+            "id": 48,
+            "lastUpdatedBy": "006073",
+            "name": "波段操作"
+        },
+        {
+            "class": "com.htsc.crm.employee.extend.dto.EmpLabelDTO",
+            "createdBy": "006073",
+            "id": 47,
+            "lastUpdatedBy": "006073",
+            "name": "趋势投资"
+        },
+        {
+            "class": "com.htsc.crm.employee.extend.dto.EmpLabelDTO",
+            "createdBy": "006073",
+            "id": 41,
+            "lastUpdatedBy": "006073",
+            "name": "稳健投资"
+        }
+    ],
+    "entryTime": null,
+    "gender": "女",
+    "halfBodyPhoto": "http://s3.cn-north-1.amazonaws.com.cn/s3-000045-cfglpic/632fda26-4e7c-4048-af28-1dd078276aea_QQ图片20190730144159.png",
+    "hasExhibitionQua": true,
+    "headShot": "https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2020-01-08-17-05-20ZEhHJDfT.png",
+    "highLevel": "BACHELOR",
+    "incumbency": "NORMAL",
+    "levTime": null,
+    "marriage": "MARRIED",
+    "nation": "1",
+    "nativePlace": "南京",
+    "onDutyInvest": true,
+    "onLineInvest": true,
+    "party": "MEMBER_CCP",
+    "primaryJob": {
+        "class": "com.htsc.crm.employee.core.dto.EmpJobInfoDTO",
+        "jobId": 4923,
+        "jobName": "投资顾问",
+        "major": true,
+        "orgId": "ZZ001041051",
+        "orgName": "南京长江路证券营业部",
+        "parOrgCode": "ZZ001041093",
+        "parOrgName": "南京分公司",
+        "rowId": 93260,
+        "userId": "002332"
+    },
+    "rowId": 449590,
+    "tgStarLevel": 4.8,
+    "userId": "002332",
+    "userName": "魏巍",
+    "userStatus": "ON_DUTY"
+}

+ 63 - 0
app/src/main/assets/mockData/非投顾.json

@@ -0,0 +1,63 @@
+{
+    "birthPlace": "上海",
+    "birthday": null,
+    "certNo": "310105198601170061",
+    "certType": "ID_CARD",
+    "certifications": [
+        {
+            "certiedType": "01",
+            "certificateAcquisitionTime": null,
+            "certificateNumber": "S0570111070109",
+            "class": "com.htsc.crm.employee.core.dto.EmpCertificationDTO",
+            "id": 191055,
+            "userId": "003750"
+        }
+    ],
+    "class": "com.htsc.crm.employee.core.dto.EmpInfoDTO",
+    "contactInfo": {
+        "class": "com.htsc.crm.employee.core.dto.EmpContactInfoDTO",
+        "email": "shiweijun@htsc.com",
+        "homePhone": "",
+        "mobile": "13817775749",
+        "officeNo": "",
+        "officePhone": "021-28972235",
+        "rowId": 244441,
+        "userId": "003750",
+        "userName": "施惟君"
+    },
+    "depcity": "DF2401",
+    "description": null,
+    "empLabelDTOs": [],
+    "entryTime": null,
+    "gender": "女",
+    "halfBodyPhoto": null,
+    "hasExhibitionQua": true,
+    "headShot": null,
+    "highLevel": "MASTER",
+    "incumbency": "NORMAL",
+    "levTime": null,
+    "marriage": "MARRIED",
+    "nation": "1",
+    "nativePlace": "上海",
+    "onDutyInvest": false,
+    "onLineInvest": false,
+    "party": "GENERAL",
+    "primaryJob": {
+        "class": "com.htsc.crm.employee.core.dto.EmpJobInfoDTO",
+        "jobId": 2725,
+        "jobName": "营销人员管理岗",
+        "major": true,
+        "orgId": "ZZ001041107",
+        "orgName": "上海分公司",
+        "parOrgCode": "ZZ001",
+        "parOrgName": "华泰证券股份有限公司",
+        "rowId": 93299,
+        "userId": "003750"
+    },
+    "properties": {},
+    "rowId": 449928,
+    "tgStarLevel": null,
+    "userId": "003750",
+    "userName": "施惟君",
+    "userStatus": "ON_DUTY"
+}

+ 7 - 0
app/src/main/java/com/ht/gate/ApiService.java

@@ -2,10 +2,12 @@ package com.ht.gate;
 
 import com.ht.gate.domain.Room;
 import com.ht.gate.domain.RoomMeetings;
+import com.ht.gate.domain.emp.EmpInfo;
 
 import java.util.List;
 
 import retrofit2.Call;
+import retrofit2.http.Multipart;
 import retrofit2.http.POST;
 import retrofit2.http.Part;
 import retrofit2.http.Path;
@@ -15,5 +17,10 @@ public interface ApiService {
     Call<Room> bindDevice(@Path("deviceId") String deviceId);
 
     @POST("/meeting/service-api/crmnew/find-room-meetings")
+    @Multipart
     Call<List<RoomMeetings>> roomMeetings(@Part("beginTime") String beginTime, @Part("endTime") String endTime, @Part("roomNo") String roomNo);
+
+    @POST("/empInfo")
+    @Multipart
+    Call<EmpInfo> getEmpInfo(@Part("empId") String empId);
 }

+ 7 - 0
app/src/main/java/com/ht/gate/Constants.java

@@ -0,0 +1,7 @@
+package com.ht.gate;
+
+public interface Constants {
+    String PREF_ROOM_INFO = "roomInfo";
+    String PREF_PASSWORD = "password";
+    String EVENT_MEETINGS = "meetings";
+}

+ 4 - 1
app/src/main/java/com/ht/gate/DoorService.java

@@ -8,6 +8,8 @@ import android.os.Handler;
 import android.util.Log;
 import android.widget.Toast;
 
+import com.ht.gate.domain.Room;
+
 import org.greenrobot.eventbus.EventBus;
 
 import java.net.DatagramPacket;
@@ -104,7 +106,8 @@ public class DoorService extends Service {
         if (socket != null) {
             new Thread(() -> {
                 try {
-                    String spaceId = sharedPreferences.getString(SettingsActivity.PREF_KEY_SPACE_ID, "");
+                    Room room = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
+                    String spaceId = sharedPreferences.getString(room.getRoomNo(), "");
                     byte[] data = spaceId.getBytes();
                     Log.d(TAG, "UDP发送消息:" + spaceId);
                     DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, port);

+ 1 - 2
app/src/main/java/com/ht/gate/LaunchActivity.java

@@ -11,8 +11,7 @@ public class LaunchActivity extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (TextUtils.isEmpty(getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE)
-                .getString(SettingsActivity.PREF_KEY_SPACE_ID, null))) {
+        if (MyApplication.roomInfo == null) {
             startActivity(new Intent(this, LoginActivity.class));
         } else {
             startActivity(new Intent(this, MainActivity.class));

+ 38 - 14
app/src/main/java/com/ht/gate/LoginActivity.java

@@ -1,5 +1,6 @@
 package com.ht.gate;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.constraintlayout.widget.ConstraintLayout;
 
@@ -12,9 +13,17 @@ import android.view.MotionEvent;
 import android.view.View;
 import android.widget.EditText;
 
+import com.ht.gate.domain.Room;
+
+import java.io.IOException;
+
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
+import es.dmoral.toasty.Toasty;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
 
 public class LoginActivity extends AppCompatActivity {
 
@@ -27,7 +36,7 @@ public class LoginActivity extends AppCompatActivity {
     @BindView(R.id.unlock_view)
     UnlockView unlockView;
 
-    private boolean captalize;
+    private boolean capitalize;
     private KeyboardUtil keyboardUtil;
 
     @SuppressLint("ClickableViewAccessibility")
@@ -68,7 +77,7 @@ public class LoginActivity extends AppCompatActivity {
                 int start = et.getSelectionStart();
                 switch (primaryCode) {
                     case CustomKeyboardView.KEYCODE_SHIFT:
-                        captalize = !captalize;
+                        capitalize = !capitalize;
                         break;
                     case CustomKeyboardView.KEYCODE_CANCEL:
                         keyboardView.hide();
@@ -76,17 +85,32 @@ public class LoginActivity extends AppCompatActivity {
                         unlockView.setVisibility(View.VISIBLE);
                         break;
                     case CustomKeyboardView.KEYCODE_DONE:
-                        String roomNo = "";
-                        if (et.getText().toString().contains("-")) {
-                            roomNo = et.getText().toString().split("-")[et.getText().toString().split("-").length - 1];
-                        }
-                        getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE)
-                                .edit()
-                                .putString(SettingsActivity.PREF_KEY_SPACE_ID, et.getText().toString())
-                                .putString(SettingsActivity.PREF_KEY_ROOM_NO, roomNo)
-                                .apply();
-                        startActivity(new Intent(LoginActivity.this, MainActivity.class));
-                        finish();
+                        RetrofitManager.getInstance().getRetrofit().create(ApiService.class)
+                                .bindDevice(et.getText().toString()).enqueue(new Callback<Room>() {
+                            @Override
+                            public void onResponse(@NonNull Call<Room> call, @NonNull Response<Room> response) {
+                                if (response.code() == 200) {
+                                    getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE)
+                                            .edit()
+                                            .putString(Constants.PREF_ROOM_INFO, response.body().toBase64())
+                                            .apply();
+                                    MyApplication.roomInfo = response.body();
+                                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
+                                    finish();
+                                } else {
+                                    try {
+                                        Toasty.error(LoginActivity.this, response.errorBody().string()).show();
+                                    } catch (IOException e) {
+                                        e.printStackTrace();
+                                    }
+                                }
+                            }
+
+                            @Override
+                            public void onFailure(@NonNull Call<Room> call, @NonNull Throwable t) {
+                                Toasty.info(LoginActivity.this, "登录失败,请稍后再试").show();
+                            }
+                        });
                         break;
                     case CustomKeyboardView.KEYCODE_DELETE:
                         if (editable != null && editable.length() > 0) {
@@ -97,7 +121,7 @@ public class LoginActivity extends AppCompatActivity {
                         break;
                     default:
                         String str = Character.toString((char) primaryCode);
-                        editable.insert(start, captalize ? str.toUpperCase() : str.toLowerCase());
+                        editable.insert(start, capitalize ? str.toUpperCase() : str.toLowerCase());
                         break;
                 }
             }

+ 75 - 19
app/src/main/java/com/ht/gate/MainActivity.java

@@ -1,54 +1,60 @@
 package com.ht.gate;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.content.ContextCompat;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import android.annotation.SuppressLint;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.ServiceConnection;
-import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.util.Log;
-import android.view.Gravity;
+import android.util.TypedValue;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
-import android.widget.Toast;
 
 
 import com.ht.gate.domain.Meeting;
+import com.ht.gate.domain.RoomMeetings;
+import com.ht.gate.domain.emp.EmpInfo;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.io.IOException;
+import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
 import es.dmoral.toasty.Toasty;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
 
 public class MainActivity extends AppCompatActivity {
     private static final String TAG = "MainActivity";
 
     @BindView(R.id.unlock_view)
     UnlockView unlockView;
-    @BindView(R.id.tv_space_name)
-    TextView tvSpaceName;
-    @BindView(R.id.tv_room_no)
-    TextView tvRoomNo;
+    @BindView(R.id.tv_room_name)
+    TextView tvRoomName;
+    @BindView(R.id.tv_room_num)
+    TextView tvRoomNum;
     @BindView(R.id.rl_meetings)
     RelativeLayout rlMeetings;
     @BindView(R.id.rv_meetings)
     RecyclerView rvMeetings;
     private MeetingAdapter adapter;
-    private SharedPreferences sharedPreferences;
     private DoorService.DoorBinder mDoorBinder;
 
     private ServiceConnection connection = new ServiceConnection() {
@@ -71,7 +77,6 @@ public class MainActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         ButterKnife.bind(this);
-        sharedPreferences = getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE);
         unlockView.setUnlockListener(() -> {
             PasswordDialog passwordDialog = new PasswordDialog(MainActivity.this);
             passwordDialog.setListener(new PasswordDialog.DialogListener() {
@@ -83,7 +88,7 @@ public class MainActivity extends AppCompatActivity {
                 @Override
                 public void onConfirm(PasswordDialog dialog, String password) {
                     dialog.dismiss();
-                    if (password.equals("8888")) {
+                    if (MyApplication.password != null && MyApplication.password.equals(password)) {
                         if (mDoorBinder != null) {
                             mDoorBinder.getService().openDoor();
                         }
@@ -106,16 +111,65 @@ public class MainActivity extends AppCompatActivity {
         startActivity(new Intent(this, SettingsActivity.class));
     }
 
+    @OnClick(R.id.iv_arrow)
+    void clickArrow() {
+        ViewGroup.LayoutParams layoutParams = rlMeetings.getLayoutParams();
+        int dp36 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 36, getResources().getDisplayMetrics());
+        int dp108 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 108, getResources().getDisplayMetrics());
+        layoutParams.height = layoutParams.height < dp108 ? dp108 : dp36;
+        rlMeetings.setLayoutParams(layoutParams);
+    }
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMessageEvent(String msg) {
         updateStatus();
-        if ("meetings".equals(msg)) {
-            if (MyApplication.todayMeetings.isEmpty()) {
-                rlMeetings.setVisibility(View.GONE);
-            } else {
-                rlMeetings.setVisibility(View.VISIBLE);
+        if (Constants.EVENT_MEETINGS.equals(msg)) {
+            updateMeetings();
+        }
+    }
+
+    private void updateMeetings() {
+        if (MyApplication.todayMeetings.isEmpty()) {
+            rlMeetings.setVisibility(View.GONE);
+        } else {
+            rlMeetings.setVisibility(View.VISIBLE);
+        }
+        adapter.notifyDataSetChanged();
+        List<Meeting> meetings = new ArrayList<>();
+        for (RoomMeetings todayMeeting : MyApplication.todayMeetings) {
+            meetings.addAll(todayMeeting.getMeetings());
+        }
+        for (Meeting meeting : meetings) {
+            try {
+                Date start = Utils.parseDateTime(meeting.getBeginTimeStr());
+                Date end = Utils.parseDateTime(meeting.getEndTimeStr());
+                Date date = new Date();
+                if ((date.equals(start) || date.after(start)) && (date.equals(end) || date.before(end))) {
+                    RetrofitManager.getInstance().getRetrofit().create(ApiService.class)
+                            .getEmpInfo(meeting.getCreateUser().getUserId()).enqueue(new Callback<EmpInfo>() {
+                        @Override
+                        public void onResponse(@NonNull Call<EmpInfo> call, @NonNull Response<EmpInfo> response) {
+                            if (response.code() == 200) {
+                                WelcomeActivity.start(MainActivity.this, meeting, response.body());
+                            } else {
+                                try {
+                                    Toasty.error(MainActivity.this, response.errorBody().string()).show();
+                                } catch (IOException e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        }
+
+                        @Override
+                        public void onFailure(@NonNull Call<EmpInfo> call, @NonNull Throwable t) {
+                            Toasty.error(MainActivity.this, "设备绑定失败,请稍后再试").show();
+                        }
+                    });
+                    break;
+                }
+            } catch (ParseException e) {
+                e.printStackTrace();
             }
-            adapter.notify();
         }
     }
 
@@ -138,8 +192,10 @@ public class MainActivity extends AppCompatActivity {
                 | View.SYSTEM_UI_FLAG_FULLSCREEN
                 | View.SYSTEM_UI_FLAG_IMMERSIVE;
         decorView.setSystemUiVisibility(uiOptions);
-        tvSpaceName.setText(sharedPreferences.getString(SettingsActivity.PREF_KEY_SPACE_NAME, ""));
-        tvRoomNo.setText(sharedPreferences.getString(SettingsActivity.PREF_KEY_ROOM_NO, ""));
+        if (MyApplication.roomInfo != null) {
+            tvRoomName.setText(MyApplication.roomInfo.getRoomName());
+            tvRoomNum.setText(MyApplication.roomInfo.getRoomBizNum());
+        }
         updateStatus();
     }
 

+ 3 - 3
app/src/main/java/com/ht/gate/MeetingAdapter.java

@@ -18,7 +18,7 @@ import butterknife.ButterKnife;
 public class MeetingAdapter extends RecyclerView.Adapter<MeetingAdapter.MeetingHolder> {
     private Context context;
 
-    public MeetingAdapter(Context context ) {
+    public MeetingAdapter(Context context) {
         this.context = context;
     }
 
@@ -31,7 +31,7 @@ public class MeetingAdapter extends RecyclerView.Adapter<MeetingAdapter.MeetingH
     @SuppressLint("SetTextI18n")
     @Override
     public void onBindViewHolder(@NonNull MeetingHolder holder, int position) {
-        Meeting meeting = MyApplication.todayMeetings.get(position);
+        Meeting meeting = MyApplication.todayMeetings.get(position).getMeetings().get(0);
         holder.tvContent.setText(Utils.formatDateStr(meeting.getBeginDate()) + " "
                 + Utils.getWeekDay(meeting.getBeginDate()) + " "
                 + Utils.getTimeStr(meeting.getBeginTimeStr()) + "-"
@@ -50,7 +50,7 @@ public class MeetingAdapter extends RecyclerView.Adapter<MeetingAdapter.MeetingH
 
         public MeetingHolder(@NonNull View itemView) {
             super(itemView);
-            ButterKnife.bind(itemView);
+            ButterKnife.bind(this, itemView);
         }
     }
 }

+ 66 - 0
app/src/main/java/com/ht/gate/MockServer.java

@@ -0,0 +1,66 @@
+package com.ht.gate;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.zy.mocknet.MockNet;
+import com.zy.mocknet.application.MockConnection;
+import com.zy.mocknet.application.MockConnectionFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class MockServer {
+    public static void start(Context context) {
+        MockNet mockNet = MockNet.create();
+        mockNet.addConnection(MockConnectionFactory.getInstance()
+                .createGeneralConnection(MockConnection.POST,
+                        "/meeting/service-api/crmnew/bind-device/ABC-123",
+                        "text/json",
+                        loadAssetTextAsString(context, "mockData/Room.json")))
+                .addConnection(MockConnectionFactory.getInstance()
+                        .createGeneralConnection(MockConnection.POST,
+                                "/meeting/service-api/crmnew/find-room-meetings",
+                                "text/json",
+                                loadAssetTextAsString(context, "mockData/RoomMeetings.json")))
+                .addConnection(MockConnectionFactory.getInstance()
+                        .createGeneralConnection(MockConnection.POST,
+                                "/empInfo",
+                                "text/json",
+                                loadAssetTextAsString(context, "mockData/投顾.json")))
+                .start(8080);
+    }
+
+    @NonNull
+    private static String loadAssetTextAsString(Context context, String name) {
+        BufferedReader in = null;
+        try {
+            StringBuilder buf = new StringBuilder();
+            InputStream is = context.getAssets().open(name);
+            in = new BufferedReader(new InputStreamReader(is));
+
+            String str;
+            boolean isFirst = true;
+            while ((str = in.readLine()) != null) {
+                if (isFirst)
+                    isFirst = false;
+                else
+                    buf.append('\n');
+                buf.append(str);
+            }
+            return buf.toString();
+        } catch (IOException ignored) {
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException ignored) {
+                }
+            }
+        }
+        return "";
+    }
+}

+ 39 - 11
app/src/main/java/com/ht/gate/MyApplication.java

@@ -1,14 +1,21 @@
 package com.ht.gate;
 
 import android.app.Application;
+import android.content.Context;
 import android.content.SharedPreferences;
+import android.util.DisplayMetrics;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
 
 import com.ht.gate.domain.Meeting;
 import com.ht.gate.domain.Room;
 import com.ht.gate.domain.RoomMeetings;
+import com.squareup.picasso.Picasso;
 
+import org.greenrobot.eventbus.EventBus;
+
+import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -17,6 +24,7 @@ import java.util.Locale;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import es.dmoral.toasty.Toasty;
 import okhttp3.OkHttpClient;
 import okhttp3.logging.HttpLoggingInterceptor;
 import retrofit2.Call;
@@ -24,28 +32,39 @@ import retrofit2.Callback;
 import retrofit2.Response;
 
 public class MyApplication extends Application {
-    public static List<Meeting> todayMeetings;
+
+    public static List<RoomMeetings> todayMeetings;
+    public static Room roomInfo;
+    public static String password;
+
+    public static void setPassword(Context context, String password) {
+        MyApplication.password = password;
+        SharedPreferences sharedPreferences = context.getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE);
+        sharedPreferences.edit().putString(Constants.PREF_PASSWORD, password).apply();
+    }
 
     @Override
     public void onCreate() {
         super.onCreate();
         SharedPreferences sharedPreferences = getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE);
-        String spaceName = sharedPreferences.getString(SettingsActivity.PREF_KEY_SPACE_NAME, null);
-        if (spaceName == null) {
-            spaceName = "财富管理室";
-            sharedPreferences.edit().putString(SettingsActivity.PREF_KEY_SPACE_NAME, spaceName).apply();
+        roomInfo = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
+        password = sharedPreferences.getString(Constants.PREF_PASSWORD, null);
+        if (password == null && roomInfo != null) {
+            password = roomInfo.getDevicePassword();
+            sharedPreferences.edit().putString(Constants.PREF_PASSWORD, password).apply();
         }
-
+        Picasso picasso = new Picasso.Builder(this).loggingEnabled(true).build();
+        Picasso.setSingletonInstance(picasso);
         RetrofitManager.getInstance().init();
         if (todayMeetings == null) {
             todayMeetings = new ArrayList<>();
         }
-
+        MockServer.start(this);
         Timer timer = new Timer();
         timer.schedule(new TimerTask() {
             @Override
             public void run() {
-                Room room = Room.fromBase64(sharedPreferences.getString("room", null));
+                Room room = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
                 if (room != null) {
                     Date date = new Date();
                     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
@@ -54,16 +73,25 @@ public class MyApplication extends Application {
                             .roomMeetings(dateStr + "00:00:00", dateStr + "23:59:59", room.getRoomNo()).enqueue(new Callback<List<RoomMeetings>>() {
                         @Override
                         public void onResponse(@NonNull Call<List<RoomMeetings>> call, @NonNull Response<List<RoomMeetings>> response) {
-
+                            if (response.code() == 200) {
+                                todayMeetings = response.body();
+                                EventBus.getDefault().post(Constants.EVENT_MEETINGS);
+                            } else {
+                                try {
+                                    Toasty.error(MyApplication.this, response.errorBody().string()).show();
+                                } catch (IOException e) {
+                                    e.printStackTrace();
+                                }
+                            }
                         }
 
                         @Override
                         public void onFailure(@NonNull Call<List<RoomMeetings>> call, @NonNull Throwable t) {
-
+                            Toasty.info(MyApplication.this, "获取会议列表失败").show();
                         }
                     });
                 }
             }
-        }, 0, 60 * 1000);
+        }, 0, 10 * 60 * 1000);
     }
 }

+ 1 - 3
app/src/main/java/com/ht/gate/PasswordDialog.java

@@ -1,7 +1,6 @@
 package com.ht.gate;
 
 import android.content.Context;
-import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.text.TextUtils;
@@ -11,7 +10,6 @@ import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.TextView;
-import android.widget.Toast;
 
 import androidx.appcompat.app.AppCompatDialog;
 
@@ -30,7 +28,7 @@ public class PasswordDialog extends AppCompatDialog {
 
     @BindView(R.id.keyboard_view)
     CustomKeyboardView keyboardView;
-    @BindView(R.id.tv1)
+    @BindView(R.id.tv_room_name)
     TextView tv1;
     @BindView(R.id.tv_space_name)
     TextView tv2;

+ 12 - 6
app/src/main/java/com/ht/gate/RetrofitManager.java

@@ -1,5 +1,8 @@
 package com.ht.gate;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
 import java.util.concurrent.TimeUnit;
 
 import okhttp3.OkHttpClient;
@@ -9,9 +12,10 @@ import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
 import retrofit2.converter.gson.GsonConverterFactory;
 
 public class RetrofitManager {
-    private final String BASE_URL = "https://api.github.com";
+    private final String BASE_URL = "http://localhost:8080";
     private static RetrofitManager sInstance;
     private Retrofit mRetrofit;
+
     public static RetrofitManager getInstance() {
         if (null == sInstance) {
             synchronized (RetrofitManager.class) {
@@ -24,7 +28,7 @@ public class RetrofitManager {
     }
 
     public void init() {
-        if(mRetrofit == null) {
+        if (mRetrofit == null) {
             //初始化一个OkHttpClient
             OkHttpClient.Builder builder = new OkHttpClient.Builder()
                     .connectTimeout(30000, TimeUnit.MILLISECONDS)
@@ -34,11 +38,13 @@ public class RetrofitManager {
             loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
             builder.addInterceptor(loggingInterceptor);
             OkHttpClient okHttpClient = builder.build();
-
+            Gson gson = new GsonBuilder()
+                    .setDateFormat("yyyy-MM-dd HH:mm:ss")
+                    .create();
             //使用该OkHttpClient创建一个Retrofit对象
             mRetrofit = new Retrofit.Builder()
                     //添加Gson数据格式转换器支持
-                    .addConverterFactory(GsonConverterFactory.create())
+                    .addConverterFactory(GsonConverterFactory.create(gson))
                     //添加RxJava语言支持
                     .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                     //指定网络请求client
@@ -49,8 +55,8 @@ public class RetrofitManager {
     }
 
     public Retrofit getRetrofit() {
-        if(mRetrofit == null) {
-            throw  new IllegalStateException("Retrofit instance hasn't init!");
+        if (mRetrofit == null) {
+            throw new IllegalStateException("Retrofit instance hasn't init!");
         }
         return mRetrofit;
     }

+ 41 - 44
app/src/main/java/com/ht/gate/SettingsActivity.java

@@ -3,6 +3,7 @@ package com.ht.gate;
 import androidx.appcompat.app.AppCompatActivity;
 
 import android.annotation.SuppressLint;
+import android.app.ProgressDialog;
 import android.content.ComponentName;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -10,14 +11,23 @@ import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.provider.Settings;
 import android.text.InputType;
 import android.util.Log;
 import android.view.View;
 import android.widget.TextView;
 
+import com.ht.gate.domain.Room;
+
+import java.io.IOException;
+
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
+import es.dmoral.toasty.Toasty;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
 
 @SuppressLint("SetTextI18n")
 public class SettingsActivity extends AppCompatActivity {
@@ -27,15 +37,10 @@ public class SettingsActivity extends AppCompatActivity {
     TextView tvTitle;
     @BindView(R.id.tv_space_id)
     TextView tvSpaceId;
-    @BindView(R.id.tv_space_name)
-    TextView tvSpaceName;
     @BindView(R.id.tv_address)
     TextView tvAddress;
 
     public static final String PREF_NAME_SETTINGS = "settings";
-    public static final String PREF_KEY_SPACE_ID = "spaceId";
-    public static final String PREF_KEY_SPACE_NAME = "spaceName";
-    public static final String PREF_KEY_ROOM_NO = "roomNo";
     public static final String PREF_KEY_ADDRESS = "address";
 
     private SharedPreferences sharedPreferences;
@@ -72,9 +77,11 @@ public class SettingsActivity extends AppCompatActivity {
                 | View.SYSTEM_UI_FLAG_FULLSCREEN
                 | View.SYSTEM_UI_FLAG_IMMERSIVE;
         decorView.setSystemUiVisibility(uiOptions);
-        tvTitle.setText(sharedPreferences.getString(PREF_KEY_SPACE_NAME, "") + sharedPreferences.getString(PREF_KEY_ROOM_NO, ""));
-        tvSpaceId.setText(sharedPreferences.getString(PREF_KEY_SPACE_ID, ""));
-        tvSpaceName.setText(sharedPreferences.getString(PREF_KEY_SPACE_NAME, ""));
+        Room room = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
+        if (room != null) {
+            tvTitle.setText(room.getRoomName() + room.getRoomBizNum());
+            tvSpaceId.setText(room.getRoomNo());
+        }
         tvAddress.setText(sharedPreferences.getString(PREF_KEY_ADDRESS, ""));
     }
 
@@ -108,42 +115,32 @@ public class SettingsActivity extends AppCompatActivity {
                     @Override
                     public void onConfirm(DialogInterface dialog, String value) {
                         dialog.dismiss();
-                        tvSpaceId.setText(value);
-                        if (value.contains("-")) {
-                            sharedPreferences.edit()
-                                    .putString(PREF_KEY_ROOM_NO, value.split("-")[value.split("-").length - 1])
-                                    .apply();
-                        }
-                        sharedPreferences.edit()
-                                .putString(PREF_KEY_SPACE_ID, value)
-                                .apply();
-                        tvTitle.setText(sharedPreferences.getString(PREF_KEY_SPACE_NAME, "") + sharedPreferences.getString(PREF_KEY_ROOM_NO, ""));
-                    }
-                })
-                .show();
-    }
-
-    @OnClick(R.id.btn_change_space_name)
-    void changeSpaceName() {
-        new PromptBuilder(this)
-                .setTitle("输入空间名称")
-                .setValue(tvSpaceName.getText().toString())
-                .setPositiveButton("确定")
-                .setNegativeButton("取消")
-                .setPromptListener(new PromptBuilder.PromptListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialog) {
-                        dialog.dismiss();
-                    }
-
-                    @Override
-                    public void onConfirm(DialogInterface dialog, String value) {
-                        dialog.dismiss();
-                        tvSpaceName.setText(value);
-                        sharedPreferences.edit()
-                                .putString(PREF_KEY_SPACE_NAME, value)
-                                .apply();
-                        tvTitle.setText(sharedPreferences.getString(PREF_KEY_SPACE_NAME, "") + sharedPreferences.getString(PREF_KEY_ROOM_NO, ""));
+                        ProgressDialog progressDialog = new ProgressDialog(SettingsActivity.this);
+                        progressDialog.show();
+                        RetrofitManager.getInstance().getRetrofit().create(ApiService.class).bindDevice(value).enqueue(new Callback<Room>() {
+                            @Override
+                            public void onResponse(Call<Room> call, Response<Room> response) {
+                                progressDialog.dismiss();
+                                if (response.code() == 200) {
+                                    Room room = response.body();
+                                    sharedPreferences.edit().putString(Constants.PREF_ROOM_INFO, room.toBase64()).apply();
+                                    tvTitle.setText(room.getRoomName() + room.getRoomBizNum());
+                                    tvSpaceId.setText(room.getRoomNo());
+                                } else {
+                                    try {
+                                        Toasty.error(SettingsActivity.this, response.errorBody().string()).show();
+                                    } catch (IOException e) {
+                                        e.printStackTrace();
+                                    }
+                                }
+                            }
+
+                            @Override
+                            public void onFailure(Call<Room> call, Throwable t) {
+                                progressDialog.dismiss();
+                                Toasty.error(SettingsActivity.this, "设备绑定失败,请稍后再试").show();
+                            }
+                        });
                     }
                 })
                 .show();

+ 5 - 0
app/src/main/java/com/ht/gate/Utils.java

@@ -52,4 +52,9 @@ public class Utils {
             return "";
         }
     }
+
+    public static Date parseDateTime(String str) throws ParseException {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
+        return simpleDateFormat.parse(str);
+    }
 }

+ 132 - 12
app/src/main/java/com/ht/gate/WelcomeActivity.java

@@ -4,39 +4,89 @@ import androidx.appcompat.app.AppCompatActivity;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import android.annotation.SuppressLint;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.text.TextUtils;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import com.ht.gate.domain.Meeting;
+import com.ht.gate.domain.RoomMeetings;
+import com.ht.gate.domain.emp.EmpInfo;
+import com.squareup.picasso.Picasso;
+
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Timer;
+import java.util.TimerTask;
+
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
 
+@SuppressLint("SetTextI18n")
 public class WelcomeActivity extends AppCompatActivity {
     private static final String TAG = "WelcomeActivity";
 
+    public static void start(Context context, Meeting meeting, EmpInfo empInfo) {
+        Intent intent = new Intent(context, WelcomeActivity.class);
+        intent.putExtra("meeting", meeting);
+        intent.putExtra("empInfo", empInfo);
+        context.startActivity(intent);
+    }
+
     @BindView(R.id.unlock_view)
     UnlockView unlockView;
-    @BindView(R.id.tv_space_name)
-    TextView tvSpaceName;
+    @BindView(R.id.tv_room_name)
+    TextView tvRoomName;
+    @BindView(R.id.tv_room_num)
+    TextView tvRoomNum;
     @BindView(R.id.rl_meetings)
     RelativeLayout rlMeetings;
     @BindView(R.id.rv_meetings)
     RecyclerView rvMeetings;
+    @BindView(R.id.iv_portrait)
+    ImageView ivPortrait;
+    @BindView(R.id.tv_welcome)
+    TextView tvWelcome;
+    @BindView(R.id.tv_adviser_name)
+    TextView tvAdviserName;
+    @BindView(R.id.tv_rate)
+    TextView tvRate;
+    @BindView(R.id.tv_rate_d)
+    TextView tvRateD;
+    @BindView(R.id.tv_intro)
+    TextView tvIntro;
+    @BindView(R.id.tv_cert_no)
+    TextView tvCertNo;
+    @BindView(R.id.rl_job_year)
+    RelativeLayout rlJobYear;
+    @BindView(R.id.tv_job_year)
+    TextView tvJobYear;
+
     private MeetingAdapter adapter;
-    private SharedPreferences sharedPreferences;
     private DoorService.DoorBinder mDoorBinder;
+    private Meeting meeting;
+    private EmpInfo empInfo;
 
     private ServiceConnection connection = new ServiceConnection() {
         @Override
@@ -58,7 +108,8 @@ public class WelcomeActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_welcome);
         ButterKnife.bind(this);
-        sharedPreferences = getSharedPreferences(SettingsActivity.PREF_NAME_SETTINGS, MODE_PRIVATE);
+        meeting = (Meeting) getIntent().getSerializableExtra("meeting");
+        empInfo = (EmpInfo) getIntent().getSerializableExtra("empInfo");
         unlockView.setUnlockListener(() -> {
             if (mDoorBinder != null) {
                 mDoorBinder.getService().openDoor();
@@ -68,6 +119,57 @@ public class WelcomeActivity extends AppCompatActivity {
         adapter = new MeetingAdapter(this);
         rvMeetings.setLayoutManager(new LinearLayoutManager(this));
         rvMeetings.setAdapter(adapter);
+
+        if (empInfo.getHeadShot() != null) {
+            Picasso.get().load(empInfo.getHeadShot()).placeholder(R.mipmap.portrait).into(ivPortrait);
+        }
+        if (TextUtils.isEmpty(meeting.getWelcomeText())) {
+            tvWelcome.setText("欢迎");
+            tvWelcome.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 63, getResources().getDisplayMetrics()));
+        } else {
+            if (meeting.getWelcomeText().length() <= 4) {
+                tvWelcome.setText("欢迎," + meeting.getWelcomeText());
+                tvWelcome.setTextSize(TypedValue.COMPLEX_UNIT_SP, 63);
+            } else if (meeting.getWelcomeText().length() <= 8) {
+                tvWelcome.setText("欢迎\n" + meeting.getWelcomeText());
+                tvWelcome.setTextSize(TypedValue.COMPLEX_UNIT_SP, 55);
+            } else {
+                tvWelcome.setText("欢迎\n" + meeting.getWelcomeText());
+                tvWelcome.setTextSize(TypedValue.COMPLEX_UNIT_SP, 44);
+            }
+        }
+        tvAdviserName.setText(empInfo.getUserName());
+        if (empInfo.getTgStarLevel() != null) {
+            tvRate.setText(empInfo.getTgStarLevel().toString());
+        } else {
+            tvRate.setVisibility(View.GONE);
+            tvRateD.setVisibility(View.VISIBLE);
+        }
+        if (empInfo.getCertifications() == null || empInfo.getCertifications().isEmpty()) {
+            tvCertNo.setVisibility(View.GONE);
+            rlJobYear.setVisibility(View.GONE);
+        } else {
+            tvCertNo.setText("执业证书编号:" + empInfo.getCertifications().get(0).getCertificateNumber());
+            int year = (int) ((System.currentTimeMillis() - empInfo.getCertifications().get(0).getCertificateAcquisitionTime()) / 1000 / 60 / 60 / 24 / 365);
+            if (year < 1) {
+                rlJobYear.setVisibility(View.GONE);
+            } else {
+                tvJobYear.setText(year + "年");
+            }
+        }
+
+        try {
+            Date endTime = Utils.parseDateTime(meeting.getEndTimeStr());
+            Timer timer = new Timer();
+            timer.schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    finish();
+                }
+            }, endTime);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
     }
 
     @OnClick(R.id.btn_settings)
@@ -75,22 +177,35 @@ public class WelcomeActivity extends AppCompatActivity {
         startActivity(new Intent(this, SettingsActivity.class));
     }
 
+    @OnClick(R.id.iv_arrow)
+    void clickArrow() {
+        ViewGroup.LayoutParams layoutParams = rlMeetings.getLayoutParams();
+        int dp36 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 36, getResources().getDisplayMetrics());
+        int dp108 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 108, getResources().getDisplayMetrics());
+        layoutParams.height = layoutParams.height < dp108 ? dp108 : dp36;
+        rlMeetings.setLayoutParams(layoutParams);
+    }
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMessageEvent(String msg) {
         updateStatus();
         if ("closed".equals(msg)) {
             finish();
         }
-        if ("meetings".equals(msg)) {
-            if (MyApplication.todayMeetings.isEmpty()) {
-                rlMeetings.setVisibility(View.GONE);
-            } else {
-                rlMeetings.setVisibility(View.VISIBLE);
-            }
-            adapter.notify();
+        if (Constants.EVENT_MEETINGS.equals(msg)) {
+            updateMeetings();
         }
     }
 
+    private void updateMeetings() {
+        if (MyApplication.todayMeetings.isEmpty()) {
+            rlMeetings.setVisibility(View.GONE);
+        } else {
+            rlMeetings.setVisibility(View.VISIBLE);
+        }
+        adapter.notifyDataSetChanged();
+    }
+
     private void updateStatus() {
         if (mDoorBinder != null) {
             String status = mDoorBinder.getService().getStatus();
@@ -110,7 +225,8 @@ public class WelcomeActivity extends AppCompatActivity {
                 | View.SYSTEM_UI_FLAG_FULLSCREEN
                 | View.SYSTEM_UI_FLAG_IMMERSIVE;
         decorView.setSystemUiVisibility(uiOptions);
-        tvSpaceName.setText(sharedPreferences.getString(SettingsActivity.PREF_KEY_SPACE_NAME, ""));
+        tvRoomName.setText(MyApplication.roomInfo.getRoomName());
+        tvRoomNum.setText(MyApplication.roomInfo.getRoomBizNum());
         updateStatus();
     }
 
@@ -134,4 +250,8 @@ public class WelcomeActivity extends AppCompatActivity {
             unbindService(connection);
         }
     }
+
+    @Override
+    public void onBackPressed() {
+    }
 }

+ 2 - 1
app/src/main/java/com/ht/gate/domain/Meeting.java

@@ -1,5 +1,6 @@
 package com.ht.gate.domain;
 
+import java.io.Serializable;
 import java.util.List;
 
 import lombok.Data;
@@ -7,7 +8,7 @@ import lombok.NoArgsConstructor;
 
 @Data
 @NoArgsConstructor
-public class Meeting {
+public class Meeting implements Serializable {
     private String uuid;
     private String createTime;
     private String subject;

+ 1 - 1
app/src/main/java/com/ht/gate/domain/Room.java

@@ -58,7 +58,7 @@ public class Room implements Serializable {
             ipos.close();
             is.close();
             return room;
-        } catch (IOException | ClassNotFoundException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return null;

+ 2 - 1
app/src/main/java/com/ht/gate/domain/RoomMeetings.java

@@ -1,5 +1,6 @@
 package com.ht.gate.domain;
 
+import java.io.Serializable;
 import java.util.List;
 
 import lombok.Data;
@@ -7,7 +8,7 @@ import lombok.NoArgsConstructor;
 
 @Data
 @NoArgsConstructor
-public class RoomMeetings {
+public class RoomMeetings implements Serializable {
     private Room room;
     private List<Meeting> meetings;
 }

+ 3 - 1
app/src/main/java/com/ht/gate/domain/User.java

@@ -1,12 +1,14 @@
 package com.ht.gate.domain;
 
+import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 @Data
 @NoArgsConstructor
-public class User {
+public class User implements Serializable {
     private String userId;
     private String userName;
 }

+ 31 - 0
app/src/main/java/com/ht/gate/domain/emp/EmpCertification.java

@@ -0,0 +1,31 @@
+package com.ht.gate.domain.emp;
+
+import javax.annotation.Generated;
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+@Data
+@Generated("com.robohorse.robopojogenerator")
+public class EmpCertification implements Serializable {
+
+	@SerializedName("certiedType")
+	private String certiedType;
+
+	@SerializedName("certificateNumber")
+	private String certificateNumber;
+
+	@SerializedName("certificateAcquisitionTime")
+	private long certificateAcquisitionTime;
+
+	@SerializedName("id")
+	private long id;
+
+	@SerializedName("class")
+	private String jsonMemberClass;
+
+	@SerializedName("userId")
+	private String userId;
+}

+ 37 - 0
app/src/main/java/com/ht/gate/domain/emp/EmpContactInfo.java

@@ -0,0 +1,37 @@
+package com.ht.gate.domain.emp;
+
+import javax.annotation.Generated;
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+@Data
+@Generated("com.robohorse.robopojogenerator")
+public class EmpContactInfo implements Serializable {
+
+	@SerializedName("officePhone")
+	private String officePhone;
+
+	@SerializedName("mobile")
+	private String mobile;
+
+	@SerializedName("userName")
+	private String userName;
+
+	@SerializedName("class")
+	private String jsonMemberClass;
+
+	@SerializedName("userId")
+	private String userId;
+
+	@SerializedName("email")
+	private String email;
+
+	@SerializedName("officeNo")
+	private String officeNo;
+
+	@SerializedName("rowId")
+	private long rowId;
+}

+ 105 - 0
app/src/main/java/com/ht/gate/domain/emp/EmpInfo.java

@@ -0,0 +1,105 @@
+package com.ht.gate.domain.emp;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.annotation.Generated;
+
+import com.google.gson.annotations.SerializedName;
+
+import lombok.Data;
+
+@Data
+@Generated("com.robohorse.robopojogenerator")
+public class EmpInfo implements Serializable {
+
+    @SerializedName("birthday")
+    private String birthday;
+
+    @SerializedName("certType")
+    private String certType;
+
+    @SerializedName("userStatus")
+    private String userStatus;
+
+    @SerializedName("contactInfo")
+    private EmpContactInfo contactInfo;
+
+    @SerializedName("gender")
+    private String gender;
+
+    @SerializedName("headShot")
+    private String headShot;
+
+    @SerializedName("nation")
+    private String nation;
+
+    @SerializedName("description")
+    private String description;
+
+    @SerializedName("onLineInvest")
+    private boolean onLineInvest;
+
+    @SerializedName("birthPlace")
+    private String birthPlace;
+
+    @SerializedName("marriage")
+    private String marriage;
+
+    @SerializedName("tgStarLevel")
+    private Double tgStarLevel;
+
+    @SerializedName("primaryJob")
+    private EmpJobInfo primaryJob;
+
+    @SerializedName("depcity")
+    private String depcity;
+
+    @SerializedName("class")
+    private String jsonMemberClass;
+
+    @SerializedName("incumbency")
+    private String incumbency;
+
+    @SerializedName("highLevel")
+    private String highLevel;
+
+    @SerializedName("empLabelDTOs")
+    private List<EmpLabel> empLabelDTOs;
+
+    @SerializedName("levTime")
+    private String levTime;
+
+    @SerializedName("certifications")
+    private List<EmpCertification> certifications;
+
+    @SerializedName("halfBodyPhoto")
+    private String halfBodyPhoto;
+
+    @SerializedName("userName")
+    private String userName;
+
+    @SerializedName("userId")
+    private String userId;
+
+    @SerializedName("onDutyInvest")
+    private boolean onDutyInvest;
+
+    @SerializedName("rowId")
+    private int rowId;
+
+    @SerializedName("certNo")
+    private String certNo;
+
+    @SerializedName("entryTime")
+    private String entryTime;
+
+    @SerializedName("hasExhibitionQua")
+    private boolean hasExhibitionQua;
+
+    @SerializedName("nativePlace")
+    private String nativePlace;
+
+    @SerializedName("party")
+    private String party;
+}

+ 44 - 0
app/src/main/java/com/ht/gate/domain/emp/EmpJobInfo.java

@@ -0,0 +1,44 @@
+package com.ht.gate.domain.emp;
+
+import javax.annotation.Generated;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+@Data
+@Generated("com.robohorse.robopojogenerator")
+public class EmpJobInfo implements Serializable {
+
+    @SerializedName("jobName")
+    private String jobName;
+
+    @SerializedName("jobId")
+    private long jobId;
+
+    @SerializedName("orgName")
+    private String orgName;
+
+    @SerializedName("major")
+    private boolean major;
+
+    @SerializedName("parOrgName")
+    private String parOrgName;
+
+    @SerializedName("parOrgCode")
+    private String parOrgCode;
+
+    @SerializedName("class")
+    private String jsonMemberClass;
+
+    @SerializedName("userId")
+    private String userId;
+
+    @SerializedName("orgId")
+    private String orgId;
+
+    @SerializedName("rowId")
+    private long rowId;
+}

+ 28 - 0
app/src/main/java/com/ht/gate/domain/emp/EmpLabel.java

@@ -0,0 +1,28 @@
+package com.ht.gate.domain.emp;
+
+import javax.annotation.Generated;
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+@Data
+@Generated("com.robohorse.robopojogenerator")
+public class EmpLabel implements Serializable {
+
+	@SerializedName("lastUpdatedBy")
+	private String lastUpdatedBy;
+
+	@SerializedName("createdBy")
+	private String createdBy;
+
+	@SerializedName("name")
+	private String name;
+
+	@SerializedName("id")
+	private long id;
+
+	@SerializedName("class")
+	private String jsonMemberClass;
+}

BIN
app/src/main/res/drawable/portrait.jpg


+ 2 - 2
app/src/main/res/layout/activity_login.xml

@@ -36,7 +36,7 @@
         app:layout_constraintTop_toTopOf="parent" />
 
     <TextView
-        android:id="@+id/tv1"
+        android:id="@+id/tv_room_name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="61dp"
@@ -58,7 +58,7 @@
         app:hint="滑动登录"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv1" />
+        app:layout_constraintTop_toBottomOf="@id/tv_room_name" />
 
     <EditText
         android:id="@+id/et"

+ 4 - 4
app/src/main/res/layout/activity_main.xml

@@ -33,7 +33,7 @@
         app:layout_constraintTop_toTopOf="parent" />
 
     <TextView
-        android:id="@+id/tv_space_name"
+        android:id="@+id/tv_room_name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="61dp"
@@ -47,7 +47,7 @@
         app:layout_constraintTop_toBottomOf="@id/iv_logo" />
 
     <TextView
-        android:id="@+id/tv_room_no"
+        android:id="@+id/tv_room_num"
         android:layout_width="wrap_content"
         android:layout_height="227dp"
         android:fontFamily="@font/fzqkbysjw"
@@ -58,7 +58,7 @@
         android:textSize="208sp"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_space_name" />
+        app:layout_constraintTop_toBottomOf="@id/tv_room_name" />
 
     <com.ht.gate.UnlockView
         android:id="@+id/unlock_view"
@@ -67,7 +67,7 @@
         android:layout_marginTop="41dp"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_room_no" />
+        app:layout_constraintTop_toBottomOf="@id/tv_room_num" />
 
     <RelativeLayout
         android:id="@+id/rl_meetings"

+ 37 - 37
app/src/main/res/layout/activity_settings.xml

@@ -93,43 +93,43 @@
             android:layout_height="1dp"
             android:background="#4df2f4f5" />
 
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="89dp"
-            android:gravity="center"
-            android:orientation="horizontal">
-
-            <TextView
-                android:layout_width="115dp"
-                android:layout_height="wrap_content"
-                android:text="空间名称"
-                android:textColor="@android:color/white"
-                android:textSize="18sp" />
-
-            <TextView
-                android:id="@+id/tv_space_name"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:fontFamily="@font/source_han_sans_sc_medium"
-                android:text="A101"
-                android:textColor="@android:color/white"
-                android:textSize="18sp" />
-
-            <Button
-                android:id="@+id/btn_change_space_name"
-                style="@style/Widget.AppCompat.Button.Borderless"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:background="?selectableItemBackgroundBorderless"
-                android:fontFamily="@font/source_han_sans_sc_medium"
-                android:minWidth="0dp"
-                android:paddingLeft="9dp"
-                android:paddingRight="9dp"
-                android:text="修改"
-                android:textColor="#E4BF85"
-                android:textSize="18sp" />
-        </LinearLayout>
+<!--        <LinearLayout-->
+<!--            android:layout_width="match_parent"-->
+<!--            android:layout_height="89dp"-->
+<!--            android:gravity="center"-->
+<!--            android:orientation="horizontal">-->
+
+<!--            <TextView-->
+<!--                android:layout_width="115dp"-->
+<!--                android:layout_height="wrap_content"-->
+<!--                android:text="空间名称"-->
+<!--                android:textColor="@android:color/white"-->
+<!--                android:textSize="18sp" />-->
+
+<!--            <TextView-->
+<!--                android:id="@+id/tv_space_name"-->
+<!--                android:layout_width="0dp"-->
+<!--                android:layout_height="wrap_content"-->
+<!--                android:layout_weight="1"-->
+<!--                android:fontFamily="@font/source_han_sans_sc_medium"-->
+<!--                android:text="A101"-->
+<!--                android:textColor="@android:color/white"-->
+<!--                android:textSize="18sp" />-->
+
+<!--            <Button-->
+<!--                android:id="@+id/btn_change_space_name"-->
+<!--                style="@style/Widget.AppCompat.Button.Borderless"-->
+<!--                android:layout_width="wrap_content"-->
+<!--                android:layout_height="wrap_content"-->
+<!--                android:background="?selectableItemBackgroundBorderless"-->
+<!--                android:fontFamily="@font/source_han_sans_sc_medium"-->
+<!--                android:minWidth="0dp"-->
+<!--                android:paddingLeft="9dp"-->
+<!--                android:paddingRight="9dp"-->
+<!--                android:text="修改"-->
+<!--                android:textColor="#E4BF85"-->
+<!--                android:textSize="18sp" />-->
+<!--        </LinearLayout>-->
 
         <View
             android:layout_width="match_parent"

+ 13 - 6
app/src/main/res/layout/activity_welcome.xml

@@ -20,7 +20,7 @@
         app:layout_constraintTop_toTopOf="parent">
 
         <TextView
-            android:id="@+id/tv1"
+            android:id="@+id/tv_room_name"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="68dp"
@@ -30,11 +30,11 @@
             android:textSize="32sp"
             app:layout_constraintHorizontal_chainStyle="packed"
             app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toLeftOf="@id/tv_space_name"
+            app:layout_constraintRight_toLeftOf="@id/tv_room_num"
             app:layout_constraintTop_toTopOf="parent" />
 
         <TextView
-            android:id="@+id/tv_space_name"
+            android:id="@+id/tv_room_num"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginLeft="12dp"
@@ -42,9 +42,9 @@
             android:text="A101"
             android:textColor="#222639"
             android:textSize="80sp"
-            app:layout_constraintBaseline_toBaselineOf="@id/tv1"
+            app:layout_constraintBaseline_toBaselineOf="@id/tv_room_name"
             app:layout_constraintHorizontal_chainStyle="packed"
-            app:layout_constraintLeft_toRightOf="@id/tv1"
+            app:layout_constraintLeft_toRightOf="@id/tv_room_name"
             app:layout_constraintRight_toRightOf="parent" />
 
         <com.ht.gate.UnlockView
@@ -90,6 +90,7 @@
             app:layout_constraintTop_toTopOf="parent">
 
             <TextView
+                android:id="@+id/tv_welcome"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:fontFamily="@font/fzqkbysjw"
@@ -152,6 +153,7 @@
                     app:layout_constraintLeft_toRightOf="@id/tv_adviser_name" />
 
                 <TextView
+                    android:id="@+id/tv_rate_d"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:fontFamily="@font/source_han_sans_sc_light"
@@ -163,6 +165,7 @@
             </androidx.constraintlayout.widget.ConstraintLayout>
 
             <TextView
+                android:id="@+id/tv_intro"
                 android:layout_width="192dp"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="11dp"
@@ -172,6 +175,7 @@
                 android:textSize="12sp" />
 
             <TextView
+                android:id="@+id/tv_cert_no"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="21dp"
@@ -181,6 +185,7 @@
                 android:textSize="12sp" />
 
             <RelativeLayout
+                android:id="@+id/rl_job_year"
                 android:layout_width="72dp"
                 android:layout_height="72dp"
                 android:layout_marginTop="36dp">
@@ -191,6 +196,7 @@
                     android:src="@mipmap/icon_award" />
 
                 <TextView
+                    android:id="@+id/tv_job_year"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_centerHorizontal="true"
@@ -203,11 +209,12 @@
         </LinearLayout>
 
         <ImageView
+            android:id="@+id/iv_portrait"
             android:layout_width="311dp"
             android:layout_height="373dp"
             android:foregroundGravity="bottom|right"
             android:scaleType="fitEnd"
-            android:src="@drawable/portrait"
+            android:src="@mipmap/portrait"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintRight_toRightOf="parent" />
     </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
app/src/main/res/layout/dialog_password.xml

@@ -12,7 +12,7 @@
         android:gravity="center">
 
         <TextView
-            android:id="@+id/tv1"
+            android:id="@+id/tv_room_name"
             android:layout_width="71dp"
             android:layout_height="71dp"
             android:layout_marginLeft="11dp"

BIN
app/src/main/res/mipmap-xhdpi/portrait.png


BIN
app/src/main/res/mipmap-xxhdpi/portrait.png


BIN
app/src/main/res/mipmap-xxxhdpi/portrait.png