diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 52f5f62..e4f2468 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,7 +7,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index c1f24a5..c71d1b1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,6 +3,7 @@ + @@ -36,6 +37,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 9b6aef0..ba387bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,4 +68,8 @@ implementation 'com.google.android.material:material:1.1.0-alpha08' implementation 'androidx.viewpager2:viewpager2:1.0.0-beta02' + // WeSocketで追加 + implementation 'com.squareup.okhttp3:okhttp:4.9.1' + implementation 'javax.websocket:javax.websocket-api:1.1' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc21aea..c05e2c7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -14,7 +15,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.IrisClient" - android:usesCleartextTraffic="true" > + android:usesCleartextTraffic="true" + tools:targetApi="31"> (); this.retrofit = new Retrofit.Builder() - .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/iris/") + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/iris-websocket/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.gameRest = retrofit.create(GameRest.class); diff --git a/app/src/main/java/org/ntlab/irisclient/viewmodels/RoomViewModel.java b/app/src/main/java/org/ntlab/irisclient/viewmodels/RoomViewModel.java index 64e4a7d..725566a 100644 --- a/app/src/main/java/org/ntlab/irisclient/viewmodels/RoomViewModel.java +++ b/app/src/main/java/org/ntlab/irisclient/viewmodels/RoomViewModel.java @@ -1,5 +1,7 @@ package org.ntlab.irisclient.viewmodels; +import android.os.Handler; + import org.ntlab.irisclient.models.Member; import org.ntlab.irisclient.models.Settings; import org.ntlab.irisclient.resources.RoomsRest; @@ -11,6 +13,11 @@ import java.util.List; import java.util.Objects; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -21,6 +28,7 @@ //フィールド private String rid; + private String nickname; final private Retrofit retrofit; final private RoomsRest roomsRest; @@ -35,6 +43,11 @@ final private MutableLiveData settingsMutableLiveData; final private MutableLiveData stateLiveData; + // WebSocket用追加フィールド + private GameStartWebSocket gameStartWebSocket; + public MutableLiveData webSocketMessageLiveData; + + //----------------------------------------------------------------------------- //コンストラクタ public RoomViewModel() { @@ -42,10 +55,13 @@ this.settingsMutableLiveData = new MutableLiveData<>(); this.stateLiveData = new MutableLiveData<>(); this.retrofit = new Retrofit.Builder() - .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/iris/") + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/iris-websocket/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.roomsRest = retrofit.create(RoomsRest.class); + + // webSocket用追加コンストラクタ + this.webSocketMessageLiveData = new MutableLiveData<>(); } //----------------------------------------------------------------------------- @@ -53,6 +69,13 @@ public void setRid(String rid){ this.rid = rid; } + // webSocket用追加 + public void closeWebSocket() { + gameStartWebSocket.webSocket.close(1000,"切断のボタンを押した"); + } + public void openWebSocket(String rid, String nickname) { + gameStartWebSocket = new GameStartWebSocket(rid, nickname); + } // getter public LiveData> getMembersLiveData() { @@ -64,6 +87,10 @@ public LiveData getStateLiveData() { return this.stateLiveData; } + // webSocket用追加 + public LiveData getTextLiveData() { + return this.webSocketMessageLiveData; + } //----------------------------------------------------------------------------- //roomViewModelのみの機能的なメソッド @@ -238,23 +265,9 @@ } //スタートボタンの処理(OwnerActivityのみ) - public void startDrawing(String rid, String nickname) { - Call call = roomsRest.putState(rid,nickname,2); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()){ - //System.out.println("通信成功:startDrawing"); - } else { - //System.out.println("通信可能:startDrawing: " + response.code()); - } - } - @Override - public void onFailure(Call call, Throwable t) { - //System.out.println("通信失敗:startDrawing"); - } - }); + // TODO: ここー!! + public void startDrawing(String nickname) { + gameStartWebSocket.sendMessage(nickname+",2"); } //ランダムボタンの処理(OwnerActivityのみ) @@ -315,7 +328,7 @@ public void update(){ updateMembers(rid); updateSettings(rid); - updateState(rid); + //updateState(rid); } //部屋の情報の更新(List) @@ -406,25 +419,112 @@ } //部屋の状態情報の更新(Integer) - public void updateState(String rid) { - Call call = roomsRest.getState(rid); + // TODO: ここー!!! +// public void updateState(String rid) { +// Call call = roomsRest.getState(rid); +// +// call.enqueue(new Callback() { +// @Override +// public void onResponse(Call call, Response response) { +// if (response.isSuccessful()){ +// +// //値が一緒なら書き換えない +// if(preState != response.body()){ +// preState = response.body(); +// stateLiveData.setValue(response.body()); +// } +// } +// } +// +// @Override +// public void onFailure(Call call, Throwable t) { +// } +// }); +// } - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()){ - //値が一緒なら書き換えない - if(preState != response.body()){ - preState = response.body(); - stateLiveData.setValue(response.body()); - } + /* + WebSocketに関わる内部クラス + */ + public class GameStartWebSocket extends WebSocketListener { + + private WebSocket webSocket; + private Handler mHandler = new Handler(); + + // 外部クラスのLiveDateにアクセスする + private void setTextLiveData(String message) { + // UIスレッドにしないと動かない... + mHandler.post(new Runnable() { + public void run() { + // UIの操作 + webSocketMessageLiveData.setValue(message); } - } + }); + } - @Override - public void onFailure(Call call, Throwable t) { + public GameStartWebSocket(String rid, String nickname) { + OkHttpClient client = new OkHttpClient(); + + Request.Builder request = new Request.Builder(); + String url = "ws://nitta-lab-www.is.konan-u.ac.jp/iris-websocket/game-start/" + rid + "?nickname=" + nickname; + request.url(url); + webSocket = client.newWebSocket(request.build(), this); + } + + //----------------------------------------------------------------------------- + //setter + public void sendMessage(String message) { + System.out.println(message); + webSocket.send(message); + } + //----------------------------------------------------------------------------- + + + @Override + public void onOpen(WebSocket webSocket, okhttp3.Response response) { + this.setTextLiveData("接続完了"); + System.out.println("kota: WebSocketの接続成功"); + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + this.setTextLiveData("接続中"+text); + if(text.equals("changeState-2")) { + + // メインで実行しなければいけない + mHandler.post(new Runnable() { + public void run() { + // UIの操作 + System.out.println("kota: stateLiveDataの値変更: " + text); + stateLiveData.setValue(2); + } + }); + + // ここでwebsocketは必要なくなるからCloseする。 + webSocket.close(1000, null); + System.out.println("kota: websocketクローズ完了" ); + } - }); + System.out.println("kota: サーバーからメッセージ受信(text): " + text); + } + + @Override + public void onMessage(WebSocket webSocket, ByteString bytes) { + this.setTextLiveData("接続中"+bytes.hex()); + System.out.println("kota: サーバーからメッセージ受信(bytes): " + bytes.hex()); + } + + @Override + public void onClosing(WebSocket webSocket, int code, String reason) { + webSocket.close(1000, null); + this.setTextLiveData("切断しました"); + System.out.println("kota: WebSocketが切断: " + code + reason); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, okhttp3.Response response) { + this.setTextLiveData("接続失敗"); + System.out.println("kota: WebSocketの接続が失敗: "+ t.getLocalizedMessage()); + } } } diff --git a/app/src/main/res/layout/activity_drawing.xml b/app/src/main/res/layout/activity_drawing.xml index 42d07cf..5497a3d 100644 --- a/app/src/main/res/layout/activity_drawing.xml +++ b/app/src/main/res/layout/activity_drawing.xml @@ -31,7 +31,7 @@