Merge branch 'master' of http://khuhub.khu.ac.kr/cse437_e/smartdoorlock-frontend into sumin
Showing
15 changed files
with
424 additions
and
78 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,13 +57,12 @@ public class Api { | ... | @@ -54,13 +57,12 @@ 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"); | 61 | + OutputStream os = conn.getOutputStream(); |
| 62 | + os.write(params.toString().getBytes()); | ||
| 63 | + os.flush(); | ||
| 64 | + os.close(); | ||
| 59 | } | 65 | } |
| 60 | - OutputStream os = conn.getOutputStream(); | ||
| 61 | - os.write(params.toString().getBytes()); | ||
| 62 | - os.flush(); | ||
| 63 | - os.close(); | ||
| 64 | } | 66 | } |
| 65 | 67 | ||
| 66 | int status = conn.getResponseCode(); | 68 | int status = conn.getResponseCode(); |
| ... | @@ -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,26 +83,21 @@ public class DeviceManagerActivity extends AppCompatActivity { | ... | @@ -78,26 +83,21 @@ 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")); | 97 | + mAdapter.notifyDataSetChanged(); |
| 93 | - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); | 98 | + } |
| 94 | - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); | 99 | + } |
| 95 | - mList.add(temp = new Device("0047617826460", "2020.10.08 17:21:30")); | 100 | + }); |
| 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(); | ||
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | private void remoteControlDialog() { | 103 | private void remoteControlDialog() { |
| ... | @@ -107,7 +107,18 @@ public class DeviceManagerActivity extends AppCompatActivity { | ... | @@ -107,7 +107,18 @@ 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 | - Toast.makeText(DeviceManagerActivity.this, "도어락에 기기를 태그해주세요.", Toast.LENGTH_LONG).show(); | 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 { | ||
| 118 | + Toast.makeText(DeviceManagerActivity.this, "도어락에 기기를 태그해주세요.", Toast.LENGTH_LONG).show(); | ||
| 119 | + } | ||
| 120 | + } | ||
| 121 | + }); | ||
| 111 | } | 122 | } |
| 112 | }); | 123 | }); |
| 113 | builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { | 124 | builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { | ... | ... |
| 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,8 +221,17 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -220,8 +221,17 @@ 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() { |
| 224 | - Toast.makeText(MainActivity.this, "도어락이 열렸습니다.", Toast.LENGTH_SHORT).show(); | 225 | + @Override |
| 226 | + public void callbackMethod(Object obj) { | ||
| 227 | + if(obj == null) { | ||
| 228 | + Toast.makeText(getApplicationContext(),"연결 상태가 불안정합니다.",Toast.LENGTH_SHORT).show(); | ||
| 229 | + return; | ||
| 230 | + } else { | ||
| 231 | + Toast.makeText(MainActivity.this, "도어락이 열렸습니다.", Toast.LENGTH_SHORT).show(); | ||
| 232 | + } | ||
| 233 | + } | ||
| 234 | + }); | ||
| 225 | } | 235 | } |
| 226 | }); | 236 | }); |
| 227 | builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { | 237 | builder.setNegativeButton("취소", new DialogInterface.OnClickListener() { | ... | ... |
| ... | @@ -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