오윤석

비디오 관련 API

......@@ -10,6 +10,7 @@ import com.google.gson.JsonParser;
import com.sunnni.smartdoorlock.data.Auth;
import com.sunnni.smartdoorlock.data.RemoteRecord;
import com.sunnni.smartdoorlock.data.Setting;
import com.sunnni.smartdoorlock.data.Video;
import java.io.BufferedReader;
import java.io.InputStream;
......@@ -55,13 +56,12 @@ public class Api {
}
if("POST".equals(method) || "PUT".equals(method)) {
if(params == null) {
throw new Exception("params is null");
if(params != null) {
OutputStream os = conn.getOutputStream();
os.write(params.toString().getBytes());
os.flush();
os.close();
}
OutputStream os = conn.getOutputStream();
os.write(params.toString().getBytes());
os.flush();
os.close();
}
int status = conn.getResponseCode();
......@@ -201,4 +201,63 @@ public class Api {
}
});
}
static public void getVideos(final Callback callback) {
callApi("GET", "/api/video", null, new Callback() {
@Override
public void callbackMethod(Object obj) {
ApiResult apiResult = (ApiResult) obj;
if(apiResult.isSuccess()) {
JsonObject resp = (JsonObject) apiResult.getData();
if(resp.has("videoList")) {
ArrayList<Video> videos = new ArrayList<Video>();
Iterator it = resp.getAsJsonArray("videoList").iterator();
while(it.hasNext()) {
JsonObject jsonObject = (JsonObject) it.next();
videos.add(new Video(jsonObject.get("vid_name").getAsString(), jsonObject.get("thumb").getAsString(), jsonObject.get("created").getAsString()));
}
callback.callbackMethod(videos);
} else {
callback.callbackMethod(null);
}
} else {
callback.callbackMethod(null);
}
}
});
}
static public void getVideo(Video video, final Callback callback) {
callApi("GET", "/api/video/" + video.getVidName(), null, new Callback() {
@Override
public void callbackMethod(Object obj) {
ApiResult apiResult = (ApiResult) obj;
if(apiResult.isSuccess()) {
JsonObject resp = (JsonObject) apiResult.getData();
if(resp.has("s3link")) {
callback.callbackMethod(resp.get("s3link").getAsString());
} else {
callback.callbackMethod(null);
}
} else {
callback.callbackMethod(null);
}
}
});
}
static public void removeVideo(Video video, final Callback callback) {
callApi("DELETE", "/api/video/" + video.getVidName(), null, new Callback() {
@Override
public void callbackMethod(Object obj) {
ApiResult apiResult = (ApiResult) obj;
if(apiResult.isSuccess()) {
callback.callbackMethod(new Boolean(true));
} else {
callback.callbackMethod(null);
}
}
});
}
}
......
package com.sunnni.smartdoorlock.data;
public class Video {
private String vidName;
private String thumb;
private String created;
private String s3link;
public Video(String vidName, String thumb, String created) {
this.vidName = vidName;
this.thumb = thumb;
this.created = created;
}
public void setS3link(String s3link) {
this.s3link = s3link;
}
public String getCreated() {
return created;
}
public String getS3link() {
return s3link;
}
public String getThumb() {
return thumb;
}
public String getVidName() {
return vidName;
}
}
......@@ -3,15 +3,26 @@ package com.sunnni.smartdoorlock.ui;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.sunnni.smartdoorlock.R;
import com.sunnni.smartdoorlock.api.Api;
import com.sunnni.smartdoorlock.data.RemoteRecord;
import com.sunnni.smartdoorlock.data.Video;
import java.util.ArrayList;
import java.util.Objects;
public class VideoCheckActivity extends AppCompatActivity {
ArrayList<Video> mVideoList = new ArrayList<Video>();
Button mBtnRemoveVideo;
Button mBtnViewVideo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -19,6 +30,61 @@ public class VideoCheckActivity extends AppCompatActivity {
Toolbar mToolbar = findViewById(R.id.toolbar_video_check);
setToolbar(mToolbar);
mBtnRemoveVideo = (Button) findViewById(R.id.btn_remove_video);
mBtnViewVideo = (Button) findViewById(R.id.btn_view_video);
getVideos();
mBtnRemoveVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO : 삭제 버튼이 클릭되었을 때
// 원래는 각 비디오에 대해서 동작해야 함. 코드 의미 전달을 위해 video[0]에 대해 삭제하는 코드만 구현
Api.removeVideo(mVideoList.get(0), new Api.Callback() {
@Override
public void callbackMethod(Object obj) {
if(obj == null) {
Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
return;
} else {
// 삭제가 완료되었으므로 비디오 리스트 다시 조회
// (또는 해당 비디오만 삭제하고 notifyDataSetChanged)
getVideos();
}
}
});
}
});
mBtnViewVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO : 비디오가 클릭되었을 때 (비디오 재생)
// 원래는 각 비디오에 대해서 동작해야 함. 코드 의미 전달을 위해 video[0]에 대해 재생하는 코드만 구현
final Video video = mVideoList.get(0);
// s3 링크를 받아오지 못한 경우에만 조회. 이미 받아온 경우 바로 해당 링크로 재생
if(video.getS3link() == null) {
Api.getVideo(mVideoList.get(0), new Api.Callback() {
@Override
public void callbackMethod(Object obj) {
if (obj == null) {
Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
return;
} else {
String s3link = (String) obj;
video.setS3link(s3link);
// TODO : 비디오 재생 코드 구현 (video.setS3link를 통해)
}
}
});
} else {
// TODO : 비디오 재생 코드 구현 (video.setS3link를 통해)
}
}
});
}
private void setToolbar(Toolbar toolbar){
......@@ -35,4 +101,22 @@ public class VideoCheckActivity extends AppCompatActivity {
}
});
}
private void getVideos() {
Api.getVideos(new Api.Callback() {
@Override
public void callbackMethod(Object obj) {
// TODO : 비디오 리스트가 로드되었을 때
if(obj == null) {
Toast.makeText(getApplicationContext(), "연결 상태가 불안정합니다.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(VideoCheckActivity.this, MainActivity.class));
return;
} else {
mVideoList.clear();
mVideoList.addAll(0, (ArrayList<Video>) obj);
//mAdapter.notifyDataSetChanged();
}
}
});
}
}
......
......@@ -26,4 +26,26 @@
</androidx.appcompat.widget.Toolbar>
<Button
android:id="@+id/btn_remove_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="563dp"
android:layout_marginStart="100dp"
android:text="btn_remove_video"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar_video_check" />
<Button
android:id="@+id/btn_view_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="504dp"
android:layout_marginStart="6dp"
android:text="btn_view_video"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/btn_remove_video"
app:layout_constraintTop_toBottomOf="@+id/toolbar_video_check" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......