Merge branch 'master' of http://khuhub.khu.ac.kr/cse437_e/smartdoorlock-frontend into sumin
Showing
15 changed files
with
418 additions
and
72 deletions
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.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.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 | ... | ... |
-
Please register or login to post a comment