Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////// Java classes /////////////
- // ----------- MainActivity.java ------
- package com.sgl.mychat;
- import androidx.appcompat.app.AppCompatActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.EditText;
- import com.backendless.Backendless;
- import static com.sgl.mychat.Defaults.*;
- public class MainActivity extends AppCompatActivity {
- private EditText userNameEditText;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Backendless.setUrl(SERVER_URL);
- Backendless.initApp(this, MY_APPLICATION_ID, MY_API_KEY);
- userNameEditText = findViewById(R.id.user_name);
- findViewById(R.id.start_chat_button).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startChat();
- }
- });
- }
- private void startChat() {
- Intent intent = new Intent(this, ChatRoomActivity.class);
- String name = userNameEditText.getText().toString();
- intent.putExtra("name", name);
- startActivity(intent);
- }
- }
- // ------------- ChatRoomActivity.java --------------------
- package com.sgl.mychatroom;
- import androidx.appcompat.app.AppCompatActivity;
- import android.annotation.SuppressLint;
- import android.media.MediaPlayer;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.text.Html;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.inputmethod.EditorInfo;
- import android.widget.AdapterView;
- import android.widget.ArrayAdapter;
- import android.widget.EditText;
- import android.widget.Spinner;
- import android.widget.TextView;
- import com.backendless.Backendless;
- import com.backendless.async.callback.AsyncCallback;
- import com.backendless.exceptions.BackendlessFault;
- import com.backendless.messaging.MessageStatus;
- import com.backendless.rt.messaging.Channel;
- import java.io.BufferedInputStream;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLEncoder;
- public class ChatRoomActivity extends AppCompatActivity {
- public static final String TAG = "RTChat";
- private EditText message;
- private TextView messages;
- private Channel channel;
- private String color = ColorPickerUtility.next();
- protected Spinner spinner;
- private static final String BACKENDLESS_URL = "https://api.backendless.com/644E29B8-6584-ADE2-FF90-B401C64BFC00/2231FF77-0AE4-4DDD-98EB-63D17FE98AC6/services/VoiceTranslator/VoiceTranslator";
- private static final String BACKENDLESS_TRANS = "https://api.backendless.com/644E29B8-6584-ADE2-FF90-B401C64BFC00/2231FF77-0AE4-4DDD-98EB-63D17FE98AC6/services/VoiceTranslator/Translate";
- private String transText;
- String lang;
- private MediaPlayer mediaPlayer;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_chat_room);
- setPointer();
- }
- private void setPointer() {
- message = findViewById(R.id.message);
- messages = findViewById(R.id.messages);
- transText = "";
- lang = "en"; // Default language set to english
- spinner = (Spinner)findViewById(R.id.languages);
- // Create an array adapter using the string array and a default spinner layout
- ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.languages, android.R.layout.simple_spinner_item);
- // Specify the layout to use when the list of choices appears
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- // Apply the adapter to the spinner
- spinner.setAdapter(adapter);
- spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- // Retrieving the language from the selected item
- lang = parent.getItemAtPosition(position).toString();
- Log.e(TAG, "onItemSelected: " + lang );
- }
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
- final String name = getIntent().getStringExtra("name");
- // Subscribe to a room
- channel = Backendless.Messaging.subscribe(Defaults.DEFAULT_CHANNEL);
- // Join to a room
- channel.addJoinListener(new AsyncCallback<Void>() {
- @Override
- public void handleResponse(Void response) {
- Backendless.Messaging.publish(Defaults.DEFAULT_CHANNEL, wrapToColor(name) + " joined", new AsyncCallback<MessageStatus>() {
- @Override
- public void handleResponse(MessageStatus response) {
- Log.d(TAG, "handleResponse: sent joined " + response );
- }
- @Override
- public void handleFault(BackendlessFault fault) {
- ChatRoomActivity.this.handleFault(fault);
- }
- });
- channel.addMessageListener(new AsyncCallback<String>() {
- @Override
- public void handleResponse(String response) {
- messages.append(Html.fromHtml("<br/>" + response));
- }
- @Override
- public void handleFault(BackendlessFault fault) {
- ChatRoomActivity.this.handleFault(fault);
- }
- });
- message.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @SuppressLint("StaticFieldLeak")
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- final boolean[] handled = {false};
- if(actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
- // Don't allow the user to enter messages
- message.setEnabled(false);
- final String transUrl = buildUrl(BACKENDLESS_TRANS, message.getText().toString(), getPreferredLanguage(lang));
- new AsyncTask<String, Void, String>() {
- @Override
- protected String doInBackground(String... strings) {
- HttpURLConnection urlConnection = null;
- StringBuilder result = new StringBuilder();
- try {
- URL url = new URL(transUrl);
- urlConnection = (HttpURLConnection)url.openConnection();
- int statusCode = urlConnection.getResponseCode();
- if(statusCode == 200) {
- InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream());
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
- String line;
- while((line = bufferedReader.readLine()) != null) result.append(line);
- inputStream.close();
- return result.toString();
- } else {
- Log.e("Network Error", "doInBackground: The request responded with code " + statusCode + "; " + urlConnection.getResponseMessage());
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- assert urlConnection != null;
- urlConnection.disconnect();
- }
- return result.toString();
- }
- @Override
- protected void onPostExecute(final String be_response) {
- Backendless.Messaging.publish(Defaults.DEFAULT_CHANNEL, wrapToColor("[" + name + "]") + ": "
- + be_response, new AsyncCallback<MessageStatus>() {
- @Override
- public void handleResponse(MessageStatus response) {
- Log.d(TAG, "sent message: " + response );
- message.setText("", TextView.BufferType.EDITABLE);
- message.setEnabled(true);
- Log.e(TAG, "FINAL RESOURCES: " + transText + "; " + lang + "; " + getPreferredLanguage(lang));
- getSoundUrl(be_response, getPreferredLanguage(lang), "FEMALE");
- }
- @Override
- public void handleFault(BackendlessFault fault) {
- ChatRoomActivity.this.handleFault(fault);
- message.setEnabled(true);
- }
- });
- handled[0] = true;
- }
- }.execute();
- }
- return handled[0];
- }
- });
- }
- @Override
- public void handleFault(BackendlessFault fault) {
- ChatRoomActivity.this.handleFault(fault);
- }
- });
- }
- private void getSoundUrl(String textToSpeech, String language, String isFemale) {
- String transVoiceUrl = buildUrl(BACKENDLESS_URL, textToSpeech, language, isFemale);
- getUrl(transVoiceUrl, true);
- }
- @SuppressLint("StaticFieldLeak")
- private void getUrl(final String requestUrl, final boolean b) {
- transText = "";
- new AsyncTask<String, Void, String>() {
- @Override
- protected String doInBackground(String... strings) {
- HttpURLConnection urlConnection = null;
- StringBuilder result = new StringBuilder();
- try {
- URL url = new URL(requestUrl);
- urlConnection = (HttpURLConnection)url.openConnection();
- int statusCode = urlConnection.getResponseCode();
- if(statusCode == 200) {
- InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream());
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
- String line;
- while((line = bufferedReader.readLine()) != null) result.append(line);
- inputStream.close();
- return result.toString();
- } else {
- Log.e("Network Error", "doInBackground: The request responded with code " + statusCode + "; " + urlConnection.getResponseMessage());
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- assert urlConnection != null;
- urlConnection.disconnect();
- }
- return result.toString();
- }
- @Override
- protected void onPostExecute(String be_response) {
- playSound(be_response);
- }
- }.execute();
- }
- private String buildUrl(String backUrl, String textToSpeech, String language, String isFemale) {
- String resUrl;
- try {
- textToSpeech = URLEncoder.encode(textToSpeech.trim(), "UTF-8");
- language = URLEncoder.encode(language.trim(), "UTF-8");
- if(isFemale != null) {
- isFemale = URLEncoder.encode(isFemale.trim(), "UTF-8");
- }
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- resUrl = backUrl + "?text=" + textToSpeech + "&lang=" + language;
- if(isFemale != null) resUrl.concat("&isFemale=" + isFemale);
- Log.i("FULL_URL", "buildUrl: " + resUrl);
- return resUrl;
- }
- private String buildUrl(String backUrl, String textToSpeech, String language) {
- return buildUrl(backUrl, textToSpeech, language, null);
- }
- private void playSound(String myUrl) {
- final MediaPlayer mediaPlayer = new MediaPlayer();
- try {
- Log.e("myUrl", "playSound: " + myUrl.replace("\"", ""));
- mediaPlayer.setDataSource(myUrl.replace("\"", ""));
- mediaPlayer.prepareAsync();
- mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
- @Override
- public void onPrepared(MediaPlayer mp) {
- mp.start();
- }
- });
- mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
- @Override
- public void onCompletion(MediaPlayer mp) {
- mp.reset();
- }
- });
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private String wrapToColor(String value) {
- return "<font color='" + color + "'>" + value + "</font>";
- }
- private void handleFault(BackendlessFault fault) {
- Log.e(TAG, fault.toString());
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if(channel != null) {
- channel.leave();
- }
- if(mediaPlayer != null) {
- mediaPlayer.release();
- }
- }
- private String getPreferredLanguage(String str) {
- String lng = "";
- switch(str) {
- case "Russian":
- lng = "ru";
- break;
- case "Spanish":
- lng = "es";
- break;
- case "French":
- lng = "fr";
- break;
- case "German":
- lng = "de";
- break;
- case "Italian":
- lng = "it";
- break;
- case "Hebrew":
- lng = "iw";
- break;
- default:
- lng = "en";
- break;
- }
- return lng;
- }
- }
- // ---------------- Defaults.java --------------------
- package com.sgl.mychat;
- public class Defaults {
- public static final String SERVER_URL = "https://api.backendless.com";
- public static final String MY_APPLICATION_ID = "APP_ID";
- public static final String MY_API_KEY = "API_KEY";
- public static final String DEFAULT_CHANNEL = "EranAndDaniel";
- }
- // ---------- ColorPickerUtility --------------
- package com.sgl.mychat;
- import java.util.Random;
- public class ColorPickerUtility {
- //private static final String[] colors = new String[]{"#b1ffb0", "#660002", "#191970", "#f38630", "#057e95", "#7bb020"};
- private static final Random random = new Random();
- public static String next() {
- String acceptableChars = "0123456789ABCDEF";
- String color = "#";
- for(int i = 0; i < 6; i++) {
- color += Character.toString(acceptableChars.charAt(random.nextInt(acceptableChars.length()-1)));
- }
- return color;
- }
- }
- /////////////// XML files ////////////////
- // ----------- activity_main.xml ----------
- <?xml version="1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:gravity="center_horizontal"
- android:padding="16dp">
- <!-- Login progress -->
- <ProgressBar
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="8dp"
- style="?android:attr/progressBarStyleLarge"
- android:visibility="gone"/>
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:id="@+id/login_form">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:id="@+id/email_login_form">
- <EditText
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/user_name"
- android:hint="user name"
- android:inputType="text"
- android:maxLines="1"
- android:singleLine="true"/>
- <Button
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/start_chat_button"
- style="?android:textAppearanceSmall"
- android:layout_marginTop="16dp"
- android:text="Start chat"
- android:textStyle="bold"
- android:background="#9C27B0"
- android:textColor="#FFFFFF"/>
- </LinearLayout>
- </ScrollView>
- </LinearLayout>
- </androidx.constraintlayout.widget.ConstraintLayout>
- // ----------- activity_chat_room.xml -------------
- <?xml version="1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".ChatRoomActivity">
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center_horizontal"
- android:padding="16dp">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:orientation="horizontal">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/title"
- android:text="Welcome to the chat room"
- android:layout_marginEnd="20dp"
- android:textSize="20sp"/>
- <Spinner
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="right"
- android:id="@+id/languages"/>
- </LinearLayout>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:id="@+id/messages"
- android:text=""
- android:layout_marginTop="50dp"
- android:layout_marginBottom="50dp"/>
- <EditText
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/message"
- android:hint="message"
- android:imeOptions="actionSend"
- android:inputType="text"
- android:maxLines="1"
- android:singleLine="true"
- android:layout_alignParentBottom="true"/>
- </RelativeLayout>
- </androidx.constraintlayout.widget.ConstraintLayout>
- ///////////////// values ////////////
- // ------------- strings.xml -------------
- <resources>
- <string name="app_name">MyChat</string>
- <string-array name="languages">
- <item>English</item>
- <item>Russian</item>
- <item>Spanish</item>
- <item>French</item>
- <item>Italian</item>
- <item>German</item>
- </string-array>
- </resources>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement