diff --git a/.idea/dictionaries/Admin.xml b/.idea/dictionaries/Admin.xml index 901eade..f5915cb 100644 --- a/.idea/dictionaries/Admin.xml +++ b/.idea/dictionaries/Admin.xml @@ -2,10 +2,13 @@ handshakedata + javatime morelia moreliatalkclient + newapi newreg noninfringement + outjson servername testuser diff --git a/app/build.gradle b/app/build.gradle index e4aa91c..7a5e39c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "ru.wtw.moreliatalkclient" minSdkVersion 14 targetSdkVersion 30 - versionCode 2 - versionName "0.1.2" + versionCode 4 + versionName "0.1.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -27,9 +27,9 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - implementation 'org.java-websocket:Java-WebSocket:1.4.0' + implementation 'org.java-websocket:Java-WebSocket:1.5.1' implementation 'com.google.code.gson:gson:2.8.6' } \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 4178bfd..ebd2ff8 100644 Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/ru/wtw/moreliatalkclient/LoginActivity.java b/app/src/main/java/ru/wtw/moreliatalkclient/LoginActivity.java index 26fb397..50e08be 100644 --- a/app/src/main/java/ru/wtw/moreliatalkclient/LoginActivity.java +++ b/app/src/main/java/ru/wtw/moreliatalkclient/LoginActivity.java @@ -9,6 +9,7 @@ import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.Switch; public class LoginActivity extends Activity { @@ -34,6 +35,9 @@ protected void onCreate(Bundle savedInstanceState) { if (settings.contains("password")) { ((EditText)findViewById(R.id.editPassword)).setText(settings.getString("password", "")); } + ((Switch)findViewById(R.id.switchReconnect)).setChecked(settings.getBoolean("reconnect", false)); + ((Switch)findViewById(R.id.switchJSON)).setChecked(settings.getBoolean("outjson", false)); + ((Switch)findViewById(R.id.switchNewAPI)).setChecked(settings.getBoolean("newapi", false)); btnLogin.setOnClickListener(new View.OnClickListener() { @Override @@ -41,9 +45,15 @@ public void onClick(View view) { EditText editServername = findViewById(R.id.editServername); EditText editUsername = findViewById(R.id.editUsername); EditText editPassword = findViewById(R.id.editPassword); + Switch switchReconnect = findViewById(R.id.switchReconnect); + Switch switchJSON = findViewById(R.id.switchJSON); + Switch switchNewAPI = findViewById(R.id.switchNewAPI); String username = editUsername.getText().toString(); String password = editPassword.getText().toString(); String servername = editServername.getText().toString(); + boolean reconnect = switchReconnect.isChecked(); + boolean outJSON = switchJSON.isChecked(); + boolean newAPI = switchNewAPI.isChecked(); if (servername.isEmpty() || username.isEmpty() || password.isEmpty()) { Log.e("SERVER", "Must be filled"); } else { @@ -51,10 +61,16 @@ public void onClick(View view) { intent.putExtra("username", username); intent.putExtra("password", password); intent.putExtra("servername", servername); + intent.putExtra("reconnect", reconnect); + intent.putExtra("outjson", outJSON); + intent.putExtra("newapi", newAPI); SharedPreferences.Editor editor = settings.edit(); editor.putString("servername", servername); editor.putString("username", username); editor.putString("password", password); + editor.putBoolean("reconnect", reconnect); + editor.putBoolean("outjson", outJSON); + editor.putBoolean("newapi", newAPI); editor.apply(); startActivity(intent); } diff --git a/app/src/main/java/ru/wtw/moreliatalkclient/MainActivity.java b/app/src/main/java/ru/wtw/moreliatalkclient/MainActivity.java index e378628..03f482b 100644 --- a/app/src/main/java/ru/wtw/moreliatalkclient/MainActivity.java +++ b/app/src/main/java/ru/wtw/moreliatalkclient/MainActivity.java @@ -28,6 +28,9 @@ protected void onCreate(Bundle savedInstanceState) { network.setUsername(extras.getString("username")); network.setPassword(extras.getString("password")); network.setServername(extras.getString("servername")); + network.setReconnect(extras.getBoolean("reconnect")); + network.setShowJSON(extras.getBoolean("outjson")); + network.setUseNewAPI(extras.getBoolean("newapi")); network.connect(); } diff --git a/app/src/main/java/ru/wtw/moreliatalkclient/Network.java b/app/src/main/java/ru/wtw/moreliatalkclient/Network.java index 7c77b4f..4472609 100644 --- a/app/src/main/java/ru/wtw/moreliatalkclient/Network.java +++ b/app/src/main/java/ru/wtw/moreliatalkclient/Network.java @@ -1,6 +1,8 @@ package ru.wtw.moreliatalkclient; import android.app.Activity; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.widget.ScrollView; import android.widget.TextView; @@ -8,13 +10,13 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.ByteBuffer; +import java.nio.channels.NonReadableChannelException; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import com.google.gson.Gson; - public class Network { private URI socketURI; private WebSocketClient socket; @@ -24,6 +26,10 @@ public class Network { private String username; private String password; private String servername; + private boolean reconnect; + private boolean showJSON; + private boolean useNewAPI; + private boolean isConnected; public Network(Activity activity){ @@ -43,65 +49,97 @@ public void setPassword(String password) { this.password = password; } + public void setReconnect(boolean reconnect) { this.reconnect = reconnect; } + + public void setShowJSON(boolean showJSON) { this.showJSON = showJSON; } + + public void setUseNewAPI(boolean useNewAPI) { this.useNewAPI = useNewAPI; } + public boolean isConnected() { return isConnected; } + public void reconnect(){ + final Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + @Override + public void run() { + socket.reconnect(); + } + }, 1000); + } + public void connect() { - try { - socketURI = new URI(servername); - } catch (URISyntaxException e) { - e.printStackTrace(); - return; + if (socketURI == null) { + try { + socketURI = new URI(servername); + } catch (URISyntaxException e) { + e.printStackTrace(); + return; + } + } - socket = new WebSocketClient(socketURI) { - @Override + if (socket == null) socket = new WebSocketClient(socketURI) { + @Override public void onOpen(ServerHandshake handshakedata) { - isConnected=true; - sendAuth(); - Log.i("SERVER","Connected"); + isConnected = true; + if (useNewAPI) { + sendReg(); + } else { + sendAuth(); + } + Log.i("SERVER", "Connected"); } @Override public void onMessage(String message) { - Protocol protocol = new Gson().fromJson(message,Protocol.class); - String status=protocol.getStatus(); - String reply; - if (protocol.getMode().equals("message")) { - reply = protocol.getUsername() + ": " + protocol.getText(); - outChat(reply); - } - if (protocol.getMode().equals("reg")) { - reply = activity.getResources().getString(R.string.auth_status_unknown); - if (status.equals("true")) - reply = activity.getResources().getString(R.string.auth_status_true); - if (status.equals("false")) - reply = activity.getResources().getString(R.string.auth_status_false); - if (status.equals("newreg")) - reply = activity.getResources().getString(R.string.auth_status_newreg); - outChat(reply); + if (showJSON) { + outChat("Received: "+message); + } else { + Protocol protocol = new Gson().fromJson(message, Protocol.class); + String status = protocol.getStatus(); + String reply; + if (protocol.getMode().equals("message")) { + reply = protocol.getTime() + " - " + protocol.getUsername() + ": " + protocol.getText(); + outChat(reply); + } + if (protocol.getMode().equals("reg")) { + reply = activity.getResources().getString(R.string.auth_status_unknown); + if (status.equals("true")) + reply = activity.getResources().getString(R.string.auth_status_true); + if (status.equals("false")) + reply = activity.getResources().getString(R.string.auth_status_false); + if (status.equals("newreg")) + reply = activity.getResources().getString(R.string.auth_status_newreg); + outChat(reply); + } } - Log.i("SERVER","Message: "+message); + Log.i("SERVER", "Message: " + message); } @Override public void onMessage(ByteBuffer message) { - Log.i("SERVER","Message byte buffer"); + Log.i("SERVER", "Message byte buffer"); } @Override public void onClose(final int code, String reason, boolean remote) { - Log.i("SERVER","Disconnected with exit code " + code + " additional info: " + reason); - outChat(activity.getResources().getString(R.string.socket_close)+code); + Log.i("SERVER", "Disconnected with exit code " + String.valueOf(code) + " additional info: " + reason); + outChat(activity.getResources().getString(R.string.socket_close) + String.valueOf(code)); + if (reconnect) { + outChat(activity.getResources().getString(R.string.reconnecting)); + Network.this.reconnect(); + } } @Override public void onError(Exception ex) { - Log.e("SERVER","Error", ex); - outChat(activity.getResources().getString(R.string.socket_error)+ex.toString()); + Log.e("SERVER", "Error", ex); + outChat(activity.getResources().getString(R.string.socket_error) + ex.toString()); } }; + Log.i("SERVER","Connect"); socket.connect(); @@ -125,6 +163,22 @@ public void run() }); } + public void sendReg () { + Gson gson = new Gson(); + Protocol protocol = new Protocol(); + protocol.setMode("reg"); + protocol.setUsername(username); + protocol.setPassword(password); + String json = "{ \"type\": \"register_user\", \"data\": { \"user\": { \"password\": \"" + password+ + "\", \"login\": \""+username+"\", \"email\": \"qwwer@qwer.ru\", \"username\": \"User1\" }, "+ + "\"meta\": \"None\" }, \"jsonapi\": { \"version\": \"1.0\" }, \"meta\": \"None\" }"; + if (socket != null && socket.isOpen()) { + if (showJSON) outChat("Sending: "+json); + Log.i("SERVER","Send reg"); + socket.send(json); + } + } + public void sendAuth () { Gson gson = new Gson(); Protocol protocol = new Protocol(); @@ -133,6 +187,7 @@ public void sendAuth () { protocol.setPassword(password); String json = gson.toJson(protocol); if (socket != null && socket.isOpen()) { + if (showJSON) outChat("Sending: "+json); Log.i("SERVER","Send auth"); socket.send(json); } @@ -146,6 +201,7 @@ public void sendMessage (String text) { protocol.setText(text); String json = gson.toJson(protocol); if (socket != null && socket.isOpen()) { + if (showJSON) outChat("Sending: "+json); Log.i("SERVER","Send text"); Log.i("SERVER",json); socket.send(json); diff --git a/app/src/main/java/ru/wtw/moreliatalkclient/Protocol.java b/app/src/main/java/ru/wtw/moreliatalkclient/Protocol.java index e899450..0f18ddb 100644 --- a/app/src/main/java/ru/wtw/moreliatalkclient/Protocol.java +++ b/app/src/main/java/ru/wtw/moreliatalkclient/Protocol.java @@ -1,5 +1,11 @@ package ru.wtw.moreliatalkclient; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static java.util.TimeZone.LONG; + @SuppressWarnings("unused") public class Protocol { @@ -26,6 +32,21 @@ public String getStatus() { return status; } + public String getPassword() { + return password; + } + + public String getTimestamp() { + return timestamp; + } + + public String getTime() { + long javatime = Math.round(Double.parseDouble(timestamp) * 1000); + Date time = new Date(javatime); + DateFormat df = new SimpleDateFormat("HH:mm:ss"); + return df.format(time); + } + public void setStatus(String status) { this.status = status; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } @@ -46,12 +67,5 @@ public void setPassword(String password) { this.password = password; } - public String getPassword() { - return password; - } - - public String getTimestamp() { - return timestamp; - } } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 0688a5d..52ba0c4 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -93,6 +93,39 @@ android:inputType="textPassword" /> + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 6defc63..861f751 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 2a1fba4..ceed466 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 7a8150e..1b89a3a 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index a6bd88b..9c65940 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index ec00d4a..00547c7 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 8e4f8bd..9c20429 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 2a20d4b..6998885 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index 03bcfad..cdf75d3 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index e84f55e..b1280f0 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 17e9cc0..1d7452a 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 60892be..2285008 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index d95acc3..da99cf7 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 943b847..4604d47 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index e59cfbd..1c570ce 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 743c942..420c29c 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e68aa2c..7cacf69 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -8,7 +8,6 @@ Пароль Подключиться Отмена - ws://77.50.90.123:8000/ws Testuser 123456 Авторизация успешна @@ -17,5 +16,9 @@ Незвестный ответ от сервера при авторизации Соединение закрыто с кодом: "Ошибка соединения: " + Автоматически переподключаться + Отображать JSON вместо чата + Повторное подключение + Использовать новое API \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4068734..acfc264 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,7 +7,7 @@ Password Login Cancel - ws://77.50.90.123:8000/ws + ws://m.wtw.ru/ws Testuser 123456 Authorization successfully @@ -16,4 +16,8 @@ Unknown server answer received "Connection closed with code: " Connection error: + "Auto reconnect " + Show JSON instead of chat + Reconnecring to server + Use new develop API \ No newline at end of file