sunnnl

Merge branch 'master' of http://khuhub.khu.ac.kr/cse437_e/smartdoorlock-frontend into sumin

1 package com.sunnni.smartdoorlock.api; 1 package com.sunnni.smartdoorlock.api;
2 2
3 +import android.os.Build;
3 import android.os.Handler; 4 import android.os.Handler;
4 import android.util.Log; 5 import android.util.Log;
5 6
6 -import com.google.gson.JsonArray;
7 import com.google.gson.JsonElement; 7 import com.google.gson.JsonElement;
8 import com.google.gson.JsonObject; 8 import com.google.gson.JsonObject;
9 import com.google.gson.JsonParser; 9 import com.google.gson.JsonParser;
10 +import com.sunnni.smartdoorlock.data.Auth;
11 +import com.sunnni.smartdoorlock.data.Device;
12 +import com.sunnni.smartdoorlock.data.RemoteRecord;
13 +import com.sunnni.smartdoorlock.data.Setting;
14 +import com.sunnni.smartdoorlock.data.Video;
10 15
11 -import org.json.JSONObject;
12 -
13 -import java.io.BufferedInputStream;
14 import java.io.BufferedReader; 16 import java.io.BufferedReader;
15 import java.io.InputStream; 17 import java.io.InputStream;
16 import java.io.InputStreamReader; 18 import java.io.InputStreamReader;
17 import java.io.OutputStream; 19 import java.io.OutputStream;
18 import java.net.HttpURLConnection; 20 import java.net.HttpURLConnection;
19 import java.net.URL; 21 import java.net.URL;
22 +import java.util.ArrayList;
20 import java.util.Iterator; 23 import java.util.Iterator;
21 import java.util.Set; 24 import java.util.Set;
22 25
...@@ -54,14 +57,13 @@ public class Api { ...@@ -54,14 +57,13 @@ public class Api {
54 } 57 }
55 58
56 if("POST".equals(method) || "PUT".equals(method)) { 59 if("POST".equals(method) || "PUT".equals(method)) {
57 - if(params == null) { 60 + if(params != null) {
58 - throw new Exception("params is null");
59 - }
60 OutputStream os = conn.getOutputStream(); 61 OutputStream os = conn.getOutputStream();
61 os.write(params.toString().getBytes()); 62 os.write(params.toString().getBytes());
62 os.flush(); 63 os.flush();
63 os.close(); 64 os.close();
64 } 65 }
66 + }
65 67
66 int status = conn.getResponseCode(); 68 int status = conn.getResponseCode();
67 Log.d("status", String.valueOf(status)); 69 Log.d("status", String.valueOf(status));
...@@ -158,4 +160,158 @@ public class Api { ...@@ -158,4 +160,158 @@ public class Api {
158 } 160 }
159 }); 161 });
160 } 162 }
163 +
164 + static public void requestRemote(final Callback callback) {
165 + JsonObject params = new JsonObject();
166 + params.addProperty("device_name", Build.MODEL);
167 +
168 + callApi("POST", "/api/remote", params, new Callback() {
169 + @Override
170 + public void callbackMethod(Object obj) {
171 + ApiResult apiResult = (ApiResult) obj;
172 + if(apiResult.isSuccess()) {
173 + callback.callbackMethod(new Boolean(true));
174 + } else {
175 + callback.callbackMethod(null);
176 + }
177 + }
178 + });
179 + }
180 +
181 + static public void getRemotes(final Callback callback) {
182 + callApi("GET", "/api/remote", null, new Callback() {
183 + @Override
184 + public void callbackMethod(Object obj) {
185 + ApiResult apiResult = (ApiResult) obj;
186 + if(apiResult.isSuccess()) {
187 + JsonObject resp = (JsonObject) apiResult.getData();
188 + if(resp.has("remoteHistoryList")) {
189 + ArrayList<RemoteRecord> remoteRecords = new ArrayList<RemoteRecord>();
190 + Iterator it = resp.getAsJsonArray("remoteHistoryList").iterator();
191 + while(it.hasNext()) {
192 + JsonObject jsonObject = (JsonObject) it.next();
193 + remoteRecords.add(new RemoteRecord(jsonObject.get("device_name").getAsString(), jsonObject.get("created").getAsString()));
194 + }
195 + callback.callbackMethod(remoteRecords);
196 + } else {
197 + callback.callbackMethod(null);
198 + }
199 + } else {
200 + callback.callbackMethod(null);
201 + }
202 + }
203 + });
204 + }
205 +
206 + static public void getVideos(final Callback callback) {
207 + callApi("GET", "/api/video", null, new Callback() {
208 + @Override
209 + public void callbackMethod(Object obj) {
210 + ApiResult apiResult = (ApiResult) obj;
211 + if(apiResult.isSuccess()) {
212 + JsonObject resp = (JsonObject) apiResult.getData();
213 + if(resp.has("videoList")) {
214 + ArrayList<Video> videos = new ArrayList<Video>();
215 + Iterator it = resp.getAsJsonArray("videoList").iterator();
216 + while(it.hasNext()) {
217 + JsonObject jsonObject = (JsonObject) it.next();
218 + videos.add(new Video(jsonObject.get("vid_name").getAsString(), jsonObject.get("thumb").getAsString(), jsonObject.get("created").getAsString()));
219 + }
220 + callback.callbackMethod(videos);
221 + } else {
222 + callback.callbackMethod(null);
223 + }
224 + } else {
225 + callback.callbackMethod(null);
226 + }
227 + }
228 + });
229 + }
230 +
231 + static public void getVideo(Video video, final Callback callback) {
232 + callApi("GET", "/api/video/" + video.getVidName(), null, new Callback() {
233 + @Override
234 + public void callbackMethod(Object obj) {
235 + ApiResult apiResult = (ApiResult) obj;
236 + if(apiResult.isSuccess()) {
237 + JsonObject resp = (JsonObject) apiResult.getData();
238 + if(resp.has("s3link")) {
239 + callback.callbackMethod(resp.get("s3link").getAsString());
240 + } else {
241 + callback.callbackMethod(null);
242 + }
243 + } else {
244 + callback.callbackMethod(null);
245 + }
246 + }
247 + });
248 + }
249 +
250 + static public void removeVideo(Video video, final Callback callback) {
251 + callApi("DELETE", "/api/video/" + video.getVidName(), null, new Callback() {
252 + @Override
253 + public void callbackMethod(Object obj) {
254 + ApiResult apiResult = (ApiResult) obj;
255 + if(apiResult.isSuccess()) {
256 + callback.callbackMethod(new Boolean(true));
257 + } else {
258 + callback.callbackMethod(null);
259 + }
260 + }
261 + });
262 + }
263 +
264 + static public void getDevices(final Callback callback) {
265 + callApi("GET", "/api/device", null, new Callback() {
266 + @Override
267 + public void callbackMethod(Object obj) {
268 + ApiResult apiResult = (ApiResult) obj;
269 + if(apiResult.isSuccess()) {
270 + JsonObject resp = (JsonObject) apiResult.getData();
271 + if(resp.has("deviceList")) {
272 + ArrayList<Device> videos = new ArrayList<Device>();
273 + Iterator it = resp.getAsJsonArray("deviceList").iterator();
274 + while(it.hasNext()) {
275 + JsonObject jsonObject = (JsonObject) it.next();
276 + videos.add(new Device(jsonObject.get("device_id").getAsInt(), jsonObject.get("rfid_id").getAsString(), jsonObject.get("created").getAsString()));
277 + }
278 + callback.callbackMethod(videos);
279 + } else {
280 + callback.callbackMethod(null);
281 + }
282 + } else {
283 + callback.callbackMethod(null);
284 + }
285 + }
286 + });
287 + }
288 +
289 + static public void removeDevice(Device device, final Callback callback) {
290 + callApi("DELETE", "/api/device/" + device.getDeviceId(), null, new Callback() {
291 + @Override
292 + public void callbackMethod(Object obj) {
293 + ApiResult apiResult = (ApiResult) obj;
294 + if(apiResult.isSuccess()) {
295 + callback.callbackMethod(new Boolean(true));
296 + } else {
297 + callback.callbackMethod(null);
298 + }
299 + }
300 + });
301 + }
302 +
303 + static public void requestAddDevice(final Callback callback) {
304 + callApi("POST", "/api/device/request", null, new Callback() {
305 + @Override
306 + public void callbackMethod(Object obj) {
307 + ApiResult apiResult = (ApiResult) obj;
308 + if(apiResult.isSuccess()) {
309 + callback.callbackMethod(new Boolean(true));
310 + } else {
311 + callback.callbackMethod(null);
312 + }
313 + }
314 + });
315 + }
316 +
161 } 317 }
......
1 -package com.sunnni.smartdoorlock.api; 1 +package com.sunnni.smartdoorlock.data;
2 2
3 public class Auth { 3 public class Auth {
4 private boolean isAvailable; 4 private boolean isAvailable;
......
1 package com.sunnni.smartdoorlock.data; 1 package com.sunnni.smartdoorlock.data;
2 2
3 public class Device { 3 public class Device {
4 - public String deviceNumber; 4 + private int deviceId;
5 - public String registerDate; 5 + private String RFIDId;
6 + private String created;
6 7
7 - public Device(String number, String date){ 8 + public Device(int deviceId, String RFIDId, String created){
8 - this.deviceNumber = number; 9 + this.deviceId = deviceId;
9 - this.registerDate = date; 10 + this.RFIDId = RFIDId;
11 + this.created = created;
12 + }
13 +
14 + public String getCreated() {
15 + return created;
16 + }
17 +
18 + public int getDeviceId() {
19 + return deviceId;
20 + }
21 +
22 + public String getRFIDId() {
23 + return RFIDId;
10 } 24 }
11 } 25 }
......
1 package com.sunnni.smartdoorlock.data; 1 package com.sunnni.smartdoorlock.data;
2 2
3 public class RemoteRecord { 3 public class RemoteRecord {
4 - public String deviceName; 4 + private String deviceName;
5 - public String remoteDate; 5 + private String created;
6 6
7 - public RemoteRecord(String name, String date){ 7 + public RemoteRecord(String deviceName, String created){
8 - this.deviceName = name; 8 + this.deviceName = deviceName;
9 - this.remoteDate = date; 9 + this.created = created;
10 + }
11 +
12 + public String getDeviceName() {
13 + return deviceName;
14 + }
15 +
16 + public String getCreated() {
17 + return created;
10 } 18 }
11 } 19 }
......
1 -package com.sunnni.smartdoorlock.api; 1 +package com.sunnni.smartdoorlock.data;
2 2
3 public class Setting { 3 public class Setting {
4 private boolean recording; 4 private boolean recording;
......
1 +package com.sunnni.smartdoorlock.data;
2 +
3 +public class Video {
4 + private String vidName;
5 + private String thumb;
6 + private String created;
7 + private String s3link;
8 +
9 + public Video(String vidName, String thumb, String created) {
10 + this.vidName = vidName;
11 + this.thumb = thumb;
12 + this.created = created;
13 + }
14 +
15 + public void setS3link(String s3link) {
16 + this.s3link = s3link;
17 + }
18 +
19 + public String getCreated() {
20 + return created;
21 + }
22 +
23 + public String getS3link() {
24 + return s3link;
25 + }
26 +
27 + public String getThumb() {
28 + return thumb;
29 + }
30 +
31 + public String getVidName() {
32 + return vidName;
33 + }
34 +}
...@@ -9,17 +9,22 @@ import androidx.recyclerview.widget.LinearLayoutManager; ...@@ -9,17 +9,22 @@ import androidx.recyclerview.widget.LinearLayoutManager;
9 import androidx.recyclerview.widget.RecyclerView; 9 import androidx.recyclerview.widget.RecyclerView;
10 10
11 import android.content.DialogInterface; 11 import android.content.DialogInterface;
12 +import android.content.Intent;
12 import android.os.Bundle; 13 import android.os.Bundle;
13 import android.view.View; 14 import android.view.View;
14 import android.widget.ScrollView; 15 import android.widget.ScrollView;
15 import android.widget.Toast; 16 import android.widget.Toast;
16 17
17 import com.sunnni.smartdoorlock.R; 18 import com.sunnni.smartdoorlock.R;
19 +import com.sunnni.smartdoorlock.api.Api;
18 import com.sunnni.smartdoorlock.data.Device; 20 import com.sunnni.smartdoorlock.data.Device;
21 +import com.sunnni.smartdoorlock.data.RemoteRecord;
19 22
20 import java.util.ArrayList; 23 import java.util.ArrayList;
21 import java.util.Objects; 24 import java.util.Objects;
22 25
26 +import static android.view.InputDevice.getDevice;
27 +
23 public class DeviceManagerActivity extends AppCompatActivity { 28 public class DeviceManagerActivity extends AppCompatActivity {
24 29
25 ArrayList<Device> mList = new ArrayList<Device>(); 30 ArrayList<Device> mList = new ArrayList<Device>();
...@@ -37,7 +42,7 @@ public class DeviceManagerActivity extends AppCompatActivity { ...@@ -37,7 +42,7 @@ public class DeviceManagerActivity extends AppCompatActivity {
37 setToolbar(mToolbar); 42 setToolbar(mToolbar);
38 43
39 setRecyclerView(); 44 setRecyclerView();
40 - setDeviceList(); 45 + getDevice();
41 46
42 init(); 47 init();
43 } 48 }
...@@ -78,27 +83,22 @@ public class DeviceManagerActivity extends AppCompatActivity { ...@@ -78,27 +83,22 @@ public class DeviceManagerActivity extends AppCompatActivity {
78 mRecyclerView.setAdapter(mAdapter); 83 mRecyclerView.setAdapter(mAdapter);
79 } 84 }
80 85
81 - // 기기 목록 dummy data -> api 생성되면 수정 86 + public void getDevice() {
82 - private void setDeviceList(){ 87 + Api.getDevices(new Api.Callback() {
83 - Device temp; 88 + @Override
84 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 89 + public void callbackMethod(Object obj) {
85 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 90 + if(obj == null) {
86 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 91 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
87 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 92 + startActivity(new Intent(DeviceManagerActivity.this, MainActivity.class));
88 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 93 + return;
89 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 94 + } else {
90 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 95 + mList.clear();
91 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); 96 + mList.addAll(0, (ArrayList<Device>) obj);
92 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
93 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
94 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
95 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
96 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
97 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
98 - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30"));
99 -
100 mAdapter.notifyDataSetChanged(); 97 mAdapter.notifyDataSetChanged();
101 } 98 }
99 + }
100 + });
101 + }
102 102
103 private void remoteControlDialog() { 103 private void remoteControlDialog() {
104 AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme); 104 AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
...@@ -107,8 +107,19 @@ public class DeviceManagerActivity extends AppCompatActivity { ...@@ -107,8 +107,19 @@ public class DeviceManagerActivity extends AppCompatActivity {
107 builder.setPositiveButton("추가", new DialogInterface.OnClickListener() { 107 builder.setPositiveButton("추가", new DialogInterface.OnClickListener() {
108 @Override 108 @Override
109 public void onClick(DialogInterface dialog, int which) { 109 public void onClick(DialogInterface dialog, int which) {
110 + Api.requestAddDevice(new Api.Callback() {
111 + @Override
112 + public void callbackMethod(Object obj) {
113 + if(obj == null) {
114 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
115 + startActivity(new Intent(DeviceManagerActivity.this, MainActivity.class));
116 + return;
117 + } else {
110 Toast.makeText(DeviceManagerActivity.this, "도어락에 기기를 태그해주세요.", Toast.LENGTH_LONG).show(); 118 Toast.makeText(DeviceManagerActivity.this, "도어락에 기기를 태그해주세요.", Toast.LENGTH_LONG).show();
111 } 119 }
120 + }
121 + });
122 + }
112 }); 123 });
113 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { 124 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
114 @Override 125 @Override
......
1 package com.sunnni.smartdoorlock.ui; 1 package com.sunnni.smartdoorlock.ui;
2 2
3 import android.content.DialogInterface; 3 import android.content.DialogInterface;
4 +import android.content.Intent;
4 import android.view.LayoutInflater; 5 import android.view.LayoutInflater;
5 import android.view.View; 6 import android.view.View;
6 import android.view.ViewGroup; 7 import android.view.ViewGroup;
...@@ -14,6 +15,7 @@ import androidx.core.content.res.ResourcesCompat; ...@@ -14,6 +15,7 @@ import androidx.core.content.res.ResourcesCompat;
14 import androidx.recyclerview.widget.RecyclerView; 15 import androidx.recyclerview.widget.RecyclerView;
15 16
16 import com.sunnni.smartdoorlock.R; 17 import com.sunnni.smartdoorlock.R;
18 +import com.sunnni.smartdoorlock.api.Api;
17 import com.sunnni.smartdoorlock.data.Device; 19 import com.sunnni.smartdoorlock.data.Device;
18 20
19 import java.util.ArrayList; 21 import java.util.ArrayList;
...@@ -33,9 +35,9 @@ public class DeviceRecyclerViewAdapter extends RecyclerView.Adapter<DeviceRecycl ...@@ -33,9 +35,9 @@ public class DeviceRecyclerViewAdapter extends RecyclerView.Adapter<DeviceRecycl
33 this.mTrashcan = v.findViewById(R.id.img_trashcan); 35 this.mTrashcan = v.findViewById(R.id.img_trashcan);
34 } 36 }
35 37
36 - void bind(Device device) { 38 + void bind(final Device device) {
37 - mTvDeviceNum.setText(device.deviceNumber); 39 + mTvDeviceNum.setText(device.getRFIDId());
38 - mTvRegisterDate.setText(device.registerDate); 40 + mTvRegisterDate.setText(device.getCreated());
39 41
40 mTrashcan.setOnClickListener(new View.OnClickListener() { 42 mTrashcan.setOnClickListener(new View.OnClickListener() {
41 @Override 43 @Override
...@@ -46,7 +48,19 @@ public class DeviceRecyclerViewAdapter extends RecyclerView.Adapter<DeviceRecycl ...@@ -46,7 +48,19 @@ public class DeviceRecyclerViewAdapter extends RecyclerView.Adapter<DeviceRecycl
46 builder.setPositiveButton("삭제", new DialogInterface.OnClickListener() { 48 builder.setPositiveButton("삭제", new DialogInterface.OnClickListener() {
47 @Override 49 @Override
48 public void onClick(DialogInterface dialog, int which) { 50 public void onClick(DialogInterface dialog, int which) {
49 - Toast.makeText(itemView.getContext(), "삭제되었습니다.", Toast.LENGTH_SHORT).show(); 51 + Api.removeDevice(device, new Api.Callback() {
52 + @Override
53 + public void callbackMethod(Object obj) {
54 + if(obj == null) {
55 + Toast.makeText(itemView.getContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
56 + return;
57 + } else {
58 + Toast.makeText(itemView.getContext(), "삭제되었습니다.", Toast.LENGTH_LONG).show();
59 + // TODO : 목록 refresh
60 + // DeviceManagerActivity.getDevices 를 호출하거나 DeviceManagerActivity.mList에서 device 제거
61 + }
62 + }
63 + });
50 } 64 }
51 }); 65 });
52 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { 66 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
......
...@@ -22,6 +22,7 @@ import android.widget.Toast; ...@@ -22,6 +22,7 @@ import android.widget.Toast;
22 22
23 import com.google.android.material.navigation.NavigationView; 23 import com.google.android.material.navigation.NavigationView;
24 import com.sunnni.smartdoorlock.R; 24 import com.sunnni.smartdoorlock.R;
25 +import com.sunnni.smartdoorlock.api.Api;
25 26
26 import java.util.Objects; 27 import java.util.Objects;
27 28
...@@ -220,9 +221,18 @@ public class MainActivity extends AppCompatActivity { ...@@ -220,9 +221,18 @@ public class MainActivity extends AppCompatActivity {
220 builder.setPositiveButton("열기", new DialogInterface.OnClickListener() { 221 builder.setPositiveButton("열기", new DialogInterface.OnClickListener() {
221 @Override 222 @Override
222 public void onClick(DialogInterface dialog, int which) { 223 public void onClick(DialogInterface dialog, int which) {
223 - // 원격 해제 구현 부분 224 + Api.requestRemote(new Api.Callback() {
225 + @Override
226 + public void callbackMethod(Object obj) {
227 + if(obj == null) {
228 + Toast.makeText(getApplicationContext(),"연결 상태가 불안정합니다.",Toast.LENGTH_SHORT).show();
229 + return;
230 + } else {
224 Toast.makeText(MainActivity.this, "도어락이 열렸습니다.", Toast.LENGTH_SHORT).show(); 231 Toast.makeText(MainActivity.this, "도어락이 열렸습니다.", Toast.LENGTH_SHORT).show();
225 } 232 }
233 + }
234 + });
235 + }
226 }); 236 });
227 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { 237 builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
228 @Override 238 @Override
......
...@@ -7,12 +7,15 @@ import androidx.core.widget.NestedScrollView; ...@@ -7,12 +7,15 @@ import androidx.core.widget.NestedScrollView;
7 import androidx.recyclerview.widget.LinearLayoutManager; 7 import androidx.recyclerview.widget.LinearLayoutManager;
8 import androidx.recyclerview.widget.RecyclerView; 8 import androidx.recyclerview.widget.RecyclerView;
9 9
10 +import android.content.Intent;
10 import android.os.Bundle; 11 import android.os.Bundle;
12 +import android.telecom.Call;
11 import android.view.View; 13 import android.view.View;
12 import android.widget.LinearLayout; 14 import android.widget.LinearLayout;
13 import android.widget.Toast; 15 import android.widget.Toast;
14 16
15 import com.sunnni.smartdoorlock.R; 17 import com.sunnni.smartdoorlock.R;
18 +import com.sunnni.smartdoorlock.api.Api;
16 import com.sunnni.smartdoorlock.data.Device; 19 import com.sunnni.smartdoorlock.data.Device;
17 import com.sunnni.smartdoorlock.data.RemoteRecord; 20 import com.sunnni.smartdoorlock.data.RemoteRecord;
18 21
...@@ -34,7 +37,20 @@ public class RemoteControlRecordActivity extends AppCompatActivity { ...@@ -34,7 +37,20 @@ public class RemoteControlRecordActivity extends AppCompatActivity {
34 setToolbar(mToolbar); 37 setToolbar(mToolbar);
35 38
36 setRecyclerView(); 39 setRecyclerView();
37 - setRecordList(); 40 + Api.getRemotes(new Api.Callback() {
41 + @Override
42 + public void callbackMethod(Object obj) {
43 + if(obj == null) {
44 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
45 + startActivity(new Intent(RemoteControlRecordActivity.this, MainActivity.class));
46 + return;
47 + } else {
48 + mRecordList.clear();
49 + mRecordList.addAll(0, (ArrayList<RemoteRecord>) obj);
50 + mAdapter.notifyDataSetChanged();
51 + }
52 + }
53 + });
38 54
39 init(); 55 init();
40 } 56 }
...@@ -66,24 +82,4 @@ public class RemoteControlRecordActivity extends AppCompatActivity { ...@@ -66,24 +82,4 @@ public class RemoteControlRecordActivity extends AppCompatActivity {
66 mRecyclerView.setLayoutManager(manager); 82 mRecyclerView.setLayoutManager(manager);
67 mRecyclerView.setAdapter(mAdapter); 83 mRecyclerView.setAdapter(mAdapter);
68 } 84 }
69 -
70 - private void setRecordList(){
71 - RemoteRecord temp;
72 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
73 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
74 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
75 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
76 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
77 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
78 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
79 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
80 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
81 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
82 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
83 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
84 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
85 - mRecordList.add(temp = new RemoteRecord("Galaxy Note 10", "2020.10.07(수) 17:50:00"));
86 -
87 - mAdapter.notifyDataSetChanged();
88 - }
89 } 85 }
......
...@@ -29,8 +29,8 @@ public class RemoteRecordRvAdapter extends RecyclerView.Adapter<RemoteRecordRvAd ...@@ -29,8 +29,8 @@ public class RemoteRecordRvAdapter extends RecyclerView.Adapter<RemoteRecordRvAd
29 } 29 }
30 30
31 void bind(RemoteRecord record){ 31 void bind(RemoteRecord record){
32 - mTvDeviceName.setText(record.deviceName); 32 + mTvDeviceName.setText(record.getDeviceName());
33 - mTvRemoteDate.setText(record.remoteDate); 33 + mTvRemoteDate.setText(record.getCreated());
34 } 34 }
35 } 35 }
36 36
......
...@@ -12,7 +12,7 @@ import android.widget.Toast; ...@@ -12,7 +12,7 @@ import android.widget.Toast;
12 12
13 import com.sunnni.smartdoorlock.R; 13 import com.sunnni.smartdoorlock.R;
14 import com.sunnni.smartdoorlock.api.Api; 14 import com.sunnni.smartdoorlock.api.Api;
15 -import com.sunnni.smartdoorlock.api.Setting; 15 +import com.sunnni.smartdoorlock.data.Setting;
16 16
17 import androidx.appcompat.app.AlertDialog; 17 import androidx.appcompat.app.AlertDialog;
18 import androidx.appcompat.app.AppCompatActivity; 18 import androidx.appcompat.app.AppCompatActivity;
......
...@@ -8,12 +8,9 @@ import android.content.Intent; ...@@ -8,12 +8,9 @@ import android.content.Intent;
8 import android.content.SharedPreferences; 8 import android.content.SharedPreferences;
9 import android.os.Bundle; 9 import android.os.Bundle;
10 import android.os.Handler; 10 import android.os.Handler;
11 -import android.util.Log;
12 -import android.view.MotionEvent;
13 import android.view.View; 11 import android.view.View;
14 import android.view.animation.Animation; 12 import android.view.animation.Animation;
15 import android.view.animation.AnimationUtils; 13 import android.view.animation.AnimationUtils;
16 -import android.widget.Button;
17 import android.widget.ImageView; 14 import android.widget.ImageView;
18 import android.widget.LinearLayout; 15 import android.widget.LinearLayout;
19 import android.widget.Toast; 16 import android.widget.Toast;
...@@ -22,7 +19,7 @@ import com.google.android.material.textfield.TextInputEditText; ...@@ -22,7 +19,7 @@ import com.google.android.material.textfield.TextInputEditText;
22 import com.google.android.material.textfield.TextInputLayout; 19 import com.google.android.material.textfield.TextInputLayout;
23 import com.sunnni.smartdoorlock.R; 20 import com.sunnni.smartdoorlock.R;
24 import com.sunnni.smartdoorlock.api.Api; 21 import com.sunnni.smartdoorlock.api.Api;
25 -import com.sunnni.smartdoorlock.api.Auth; 22 +import com.sunnni.smartdoorlock.data.Auth;
26 23
27 public class SplashActivity extends AppCompatActivity { 24 public class SplashActivity extends AppCompatActivity {
28 25
......
...@@ -3,15 +3,26 @@ package com.sunnni.smartdoorlock.ui; ...@@ -3,15 +3,26 @@ package com.sunnni.smartdoorlock.ui;
3 import androidx.appcompat.app.AppCompatActivity; 3 import androidx.appcompat.app.AppCompatActivity;
4 import androidx.appcompat.widget.Toolbar; 4 import androidx.appcompat.widget.Toolbar;
5 5
6 +import android.content.Intent;
6 import android.os.Bundle; 7 import android.os.Bundle;
7 import android.view.View; 8 import android.view.View;
9 +import android.widget.Button;
10 +import android.widget.Toast;
8 11
9 import com.sunnni.smartdoorlock.R; 12 import com.sunnni.smartdoorlock.R;
13 +import com.sunnni.smartdoorlock.api.Api;
14 +import com.sunnni.smartdoorlock.data.RemoteRecord;
15 +import com.sunnni.smartdoorlock.data.Video;
10 16
17 +import java.util.ArrayList;
11 import java.util.Objects; 18 import java.util.Objects;
12 19
13 public class VideoCheckActivity extends AppCompatActivity { 20 public class VideoCheckActivity extends AppCompatActivity {
14 21
22 + ArrayList<Video> mVideoList = new ArrayList<Video>();
23 + Button mBtnRemoveVideo;
24 + Button mBtnViewVideo;
25 +
15 @Override 26 @Override
16 protected void onCreate(Bundle savedInstanceState) { 27 protected void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState); 28 super.onCreate(savedInstanceState);
...@@ -19,6 +30,61 @@ public class VideoCheckActivity extends AppCompatActivity { ...@@ -19,6 +30,61 @@ public class VideoCheckActivity extends AppCompatActivity {
19 30
20 Toolbar mToolbar = findViewById(R.id.toolbar_video_check); 31 Toolbar mToolbar = findViewById(R.id.toolbar_video_check);
21 setToolbar(mToolbar); 32 setToolbar(mToolbar);
33 +
34 + mBtnRemoveVideo = (Button) findViewById(R.id.btn_remove_video);
35 + mBtnViewVideo = (Button) findViewById(R.id.btn_view_video);
36 +
37 + getVideos();
38 +
39 + mBtnRemoveVideo.setOnClickListener(new View.OnClickListener() {
40 + @Override
41 + public void onClick(View view) {
42 + // TODO : 삭제 버튼이 클릭되었을 때
43 + // 원래는 각 비디오에 대해서 동작해야 함. 코드 의미 전달을 위해 video[0]에 대해 삭제하는 코드만 구현
44 + Api.removeVideo(mVideoList.get(0), new Api.Callback() {
45 + @Override
46 + public void callbackMethod(Object obj) {
47 + if(obj == null) {
48 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
49 + startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
50 + return;
51 + } else {
52 + // 삭제가 완료되었으므로 비디오 리스트 다시 조회
53 + // (또는 해당 비디오만 삭제하고 notifyDataSetChanged)
54 + getVideos();
55 + }
56 + }
57 + });
58 + }
59 + });
60 +
61 + mBtnViewVideo.setOnClickListener(new View.OnClickListener() {
62 + @Override
63 + public void onClick(View view) {
64 + // TODO : 비디오가 클릭되었을 때 (비디오 재생)
65 + // 원래는 각 비디오에 대해서 동작해야 함. 코드 의미 전달을 위해 video[0]에 대해 재생하는 코드만 구현
66 + final Video video = mVideoList.get(0);
67 + // s3 링크를 받아오지 못한 경우에만 조회. 이미 받아온 경우 바로 해당 링크로 재생
68 + if(video.getS3link() == null) {
69 + Api.getVideo(mVideoList.get(0), new Api.Callback() {
70 + @Override
71 + public void callbackMethod(Object obj) {
72 + if (obj == null) {
73 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
74 + startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
75 + return;
76 + } else {
77 + String s3link = (String) obj;
78 + video.setS3link(s3link);
79 + // TODO : 비디오 재생 코드 구현 (video.setS3link를 통해)
80 + }
81 + }
82 + });
83 + } else {
84 + // TODO : 비디오 재생 코드 구현 (video.setS3link를 통해)
85 + }
86 + }
87 + });
22 } 88 }
23 89
24 private void setToolbar(Toolbar toolbar){ 90 private void setToolbar(Toolbar toolbar){
...@@ -35,4 +101,22 @@ public class VideoCheckActivity extends AppCompatActivity { ...@@ -35,4 +101,22 @@ public class VideoCheckActivity extends AppCompatActivity {
35 } 101 }
36 }); 102 });
37 } 103 }
104 +
105 + private void getVideos() {
106 + Api.getVideos(new Api.Callback() {
107 + @Override
108 + public void callbackMethod(Object obj) {
109 + // TODO : 비디오 리스트가 로드되었을 때
110 + if(obj == null) {
111 + Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
112 + startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
113 + return;
114 + } else {
115 + mVideoList.clear();
116 + mVideoList.addAll(0, (ArrayList<Video>) obj);
117 + //mAdapter.notifyDataSetChanged();
118 + }
119 + }
120 + });
121 + }
38 } 122 }
......
...@@ -26,4 +26,26 @@ ...@@ -26,4 +26,26 @@
26 26
27 </androidx.appcompat.widget.Toolbar> 27 </androidx.appcompat.widget.Toolbar>
28 28
29 + <Button
30 + android:id="@+id/btn_remove_video"
31 + android:layout_width="wrap_content"
32 + android:layout_height="wrap_content"
33 + android:layout_marginBottom="563dp"
34 + android:layout_marginStart="100dp"
35 + android:text="btn_remove_video"
36 + app:layout_constraintBottom_toBottomOf="parent"
37 + app:layout_constraintStart_toStartOf="parent"
38 + app:layout_constraintTop_toBottomOf="@+id/toolbar_video_check" />
39 +
40 + <Button
41 + android:id="@+id/btn_view_video"
42 + android:layout_width="wrap_content"
43 + android:layout_height="wrap_content"
44 + android:layout_marginBottom="504dp"
45 + android:layout_marginStart="6dp"
46 + android:text="btn_view_video"
47 + app:layout_constraintBottom_toBottomOf="parent"
48 + app:layout_constraintStart_toStartOf="@+id/btn_remove_video"
49 + app:layout_constraintTop_toBottomOf="@+id/toolbar_video_check" />
50 +
29 </androidx.constraintlayout.widget.ConstraintLayout> 51 </androidx.constraintlayout.widget.ConstraintLayout>
...\ No newline at end of file ...\ No newline at end of file
......