Advertisement
eranseg

MyChat

Feb 2nd, 2020
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 21.16 KB | None | 0 0
  1. //////////// Java classes /////////////
  2. // ----------- MainActivity.java ------
  3.  
  4. package com.sgl.mychat;
  5.  
  6. import androidx.appcompat.app.AppCompatActivity;
  7.  
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.widget.EditText;
  12.  
  13. import com.backendless.Backendless;
  14.  
  15. import static com.sgl.mychat.Defaults.*;
  16.  
  17. public class MainActivity extends AppCompatActivity {
  18.  
  19.     private EditText userNameEditText;
  20.  
  21.     @Override
  22.     protected void onCreate(Bundle savedInstanceState) {
  23.         super.onCreate(savedInstanceState);
  24.         setContentView(R.layout.activity_main);
  25.  
  26.         Backendless.setUrl(SERVER_URL);
  27.         Backendless.initApp(this, MY_APPLICATION_ID, MY_API_KEY);
  28.  
  29.         userNameEditText = findViewById(R.id.user_name);
  30.  
  31.         findViewById(R.id.start_chat_button).setOnClickListener(new View.OnClickListener() {
  32.             @Override
  33.             public void onClick(View v) {
  34.                 startChat();
  35.             }
  36.         });
  37.     }
  38.  
  39.     private void startChat() {
  40.         Intent intent = new Intent(this, ChatRoomActivity.class);
  41.         String name = userNameEditText.getText().toString();
  42.         intent.putExtra("name", name);
  43.         startActivity(intent);
  44.     }
  45. }
  46.  
  47. // ------------- ChatRoomActivity.java --------------------
  48.  
  49. package com.sgl.mychatroom;
  50.  
  51. import androidx.appcompat.app.AppCompatActivity;
  52.  
  53. import android.annotation.SuppressLint;
  54. import android.media.MediaPlayer;
  55. import android.os.AsyncTask;
  56. import android.os.Bundle;
  57. import android.text.Html;
  58. import android.util.Log;
  59. import android.view.KeyEvent;
  60. import android.view.View;
  61. import android.view.inputmethod.EditorInfo;
  62. import android.widget.AdapterView;
  63. import android.widget.ArrayAdapter;
  64. import android.widget.EditText;
  65. import android.widget.Spinner;
  66. import android.widget.TextView;
  67.  
  68. import com.backendless.Backendless;
  69. import com.backendless.async.callback.AsyncCallback;
  70. import com.backendless.exceptions.BackendlessFault;
  71. import com.backendless.messaging.MessageStatus;
  72. import com.backendless.rt.messaging.Channel;
  73.  
  74. import java.io.BufferedInputStream;
  75. import java.io.BufferedReader;
  76. import java.io.IOException;
  77. import java.io.InputStream;
  78. import java.io.InputStreamReader;
  79. import java.io.UnsupportedEncodingException;
  80. import java.net.HttpURLConnection;
  81. import java.net.URL;
  82. import java.net.URLEncoder;
  83.  
  84. public class ChatRoomActivity extends AppCompatActivity {
  85.  
  86.     public static final String TAG = "RTChat";
  87.     private EditText message;
  88.     private TextView messages;
  89.     private Channel channel;
  90.     private String color = ColorPickerUtility.next();
  91.     protected Spinner spinner;
  92.     private static final String BACKENDLESS_URL = "https://api.backendless.com/644E29B8-6584-ADE2-FF90-B401C64BFC00/2231FF77-0AE4-4DDD-98EB-63D17FE98AC6/services/VoiceTranslator/VoiceTranslator";
  93.     private static final String BACKENDLESS_TRANS = "https://api.backendless.com/644E29B8-6584-ADE2-FF90-B401C64BFC00/2231FF77-0AE4-4DDD-98EB-63D17FE98AC6/services/VoiceTranslator/Translate";
  94.     private String transText;
  95.     String lang;
  96.     private MediaPlayer mediaPlayer;
  97.  
  98.  
  99.     @Override
  100.     protected void onCreate(Bundle savedInstanceState) {
  101.         super.onCreate(savedInstanceState);
  102.         setContentView(R.layout.activity_chat_room);
  103.         setPointer();
  104.     }
  105.  
  106.     private void setPointer() {
  107.         message = findViewById(R.id.message);
  108.         messages = findViewById(R.id.messages);
  109.         transText = "";
  110.         lang = "en"; // Default language set to english
  111.         spinner = (Spinner)findViewById(R.id.languages);
  112.         // Create an array adapter using the string array and a default spinner layout
  113.         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.languages, android.R.layout.simple_spinner_item);
  114.         // Specify the layout to use when the list of choices appears
  115.         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  116.         // Apply the adapter to the spinner
  117.         spinner.setAdapter(adapter);
  118.         spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  119.             @Override
  120.             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  121.                 // Retrieving the language from the selected item
  122.                 lang = parent.getItemAtPosition(position).toString();
  123.                 Log.e(TAG, "onItemSelected: " + lang );
  124.             }
  125.  
  126.             @Override
  127.             public void onNothingSelected(AdapterView<?> parent) {
  128.  
  129.             }
  130.         });
  131.         final String name = getIntent().getStringExtra("name");
  132.  
  133.         // Subscribe to a room
  134.         channel = Backendless.Messaging.subscribe(Defaults.DEFAULT_CHANNEL);
  135.         // Join to a room
  136.         channel.addJoinListener(new AsyncCallback<Void>() {
  137.             @Override
  138.             public void handleResponse(Void response) {
  139.                 Backendless.Messaging.publish(Defaults.DEFAULT_CHANNEL, wrapToColor(name) + " joined", new AsyncCallback<MessageStatus>() {
  140.                     @Override
  141.                     public void handleResponse(MessageStatus response) {
  142.                         Log.d(TAG, "handleResponse: sent joined " + response );
  143.                     }
  144.  
  145.                     @Override
  146.                     public void handleFault(BackendlessFault fault) {
  147.                         ChatRoomActivity.this.handleFault(fault);
  148.                     }
  149.                 });
  150.  
  151.                 channel.addMessageListener(new AsyncCallback<String>() {
  152.                     @Override
  153.                     public void handleResponse(String response) {
  154.                         messages.append(Html.fromHtml("<br/>" + response));
  155.                     }
  156.  
  157.                     @Override
  158.                     public void handleFault(BackendlessFault fault) {
  159.                         ChatRoomActivity.this.handleFault(fault);
  160.                     }
  161.                 });
  162.  
  163.                 message.setOnEditorActionListener(new TextView.OnEditorActionListener() {
  164.                     @SuppressLint("StaticFieldLeak")
  165.                     @Override
  166.                     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  167.                         final boolean[] handled = {false};
  168.                         if(actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
  169.                             // Don't allow the user to enter messages
  170.                             message.setEnabled(false);
  171.  
  172.                             final String transUrl = buildUrl(BACKENDLESS_TRANS, message.getText().toString(), getPreferredLanguage(lang));
  173.                             new AsyncTask<String, Void, String>() {
  174.  
  175.                                 @Override
  176.                                 protected String doInBackground(String... strings) {
  177.                                     HttpURLConnection urlConnection = null;
  178.                                     StringBuilder result = new StringBuilder();
  179.                                     try {
  180.                                         URL url = new URL(transUrl);
  181.                                         urlConnection = (HttpURLConnection)url.openConnection();
  182.                                         int statusCode = urlConnection.getResponseCode();
  183.                                         if(statusCode == 200) {
  184.                                             InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream());
  185.                                             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  186.                                             String line;
  187.                                             while((line = bufferedReader.readLine()) != null) result.append(line);
  188.                                             inputStream.close();
  189.                                             return result.toString();
  190.                                         } else {
  191.                                             Log.e("Network Error", "doInBackground: The request responded with code " + statusCode + "; " + urlConnection.getResponseMessage());
  192.                                         }
  193.                                     } catch (IOException e) {
  194.                                         e.printStackTrace();
  195.                                     } finally {
  196.                                         assert urlConnection != null;
  197.                                         urlConnection.disconnect();
  198.                                     }
  199.                                     return result.toString();
  200.                                 }
  201.  
  202.                                 @Override
  203.                                 protected void onPostExecute(final String be_response) {
  204.                                     Backendless.Messaging.publish(Defaults.DEFAULT_CHANNEL, wrapToColor("[" + name + "]") + ": "
  205.                                             + be_response, new AsyncCallback<MessageStatus>() {
  206.                                         @Override
  207.                                         public void handleResponse(MessageStatus response) {
  208.                                             Log.d(TAG, "sent message: " + response );
  209.                                             message.setText("", TextView.BufferType.EDITABLE);
  210.                                             message.setEnabled(true);
  211.                                             Log.e(TAG, "FINAL RESOURCES: " + transText + "; " + lang + "; " + getPreferredLanguage(lang));
  212.                                             getSoundUrl(be_response, getPreferredLanguage(lang), "FEMALE");
  213.                                         }
  214.  
  215.                                         @Override
  216.                                         public void handleFault(BackendlessFault fault) {
  217.                                             ChatRoomActivity.this.handleFault(fault);
  218.                                             message.setEnabled(true);
  219.                                         }
  220.                                     });
  221.                                     handled[0] = true;
  222.                                 }
  223.                             }.execute();
  224.                         }
  225.                         return handled[0];
  226.                     }
  227.                 });
  228.             }
  229.  
  230.             @Override
  231.             public void handleFault(BackendlessFault fault) {
  232.                 ChatRoomActivity.this.handleFault(fault);
  233.             }
  234.         });
  235.     }
  236.  
  237.     private void getSoundUrl(String textToSpeech, String language, String isFemale) {
  238.         String transVoiceUrl = buildUrl(BACKENDLESS_URL, textToSpeech, language, isFemale);
  239.         getUrl(transVoiceUrl, true);
  240.     }
  241.  
  242.     @SuppressLint("StaticFieldLeak")
  243.     private void getUrl(final String requestUrl, final boolean b) {
  244.         transText = "";
  245.         new AsyncTask<String, Void, String>() {
  246.  
  247.             @Override
  248.             protected String doInBackground(String... strings) {
  249.                 HttpURLConnection urlConnection = null;
  250.                 StringBuilder result = new StringBuilder();
  251.                 try {
  252.                     URL url = new URL(requestUrl);
  253.                     urlConnection = (HttpURLConnection)url.openConnection();
  254.                     int statusCode = urlConnection.getResponseCode();
  255.                     if(statusCode == 200) {
  256.                         InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream());
  257.                         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  258.                         String line;
  259.                         while((line = bufferedReader.readLine()) != null) result.append(line);
  260.                         inputStream.close();
  261.                         return result.toString();
  262.                     } else {
  263.                         Log.e("Network Error", "doInBackground: The request responded with code " + statusCode + "; " + urlConnection.getResponseMessage());
  264.                     }
  265.                 } catch (IOException e) {
  266.                     e.printStackTrace();
  267.                 } finally {
  268.                     assert urlConnection != null;
  269.                     urlConnection.disconnect();
  270.                 }
  271.                 return result.toString();
  272.             }
  273.  
  274.             @Override
  275.             protected void onPostExecute(String be_response) {
  276.                 playSound(be_response);
  277.             }
  278.         }.execute();
  279.     }
  280.  
  281.     private String buildUrl(String backUrl, String textToSpeech, String language, String isFemale) {
  282.         String resUrl;
  283.         try {
  284.             textToSpeech = URLEncoder.encode(textToSpeech.trim(), "UTF-8");
  285.             language = URLEncoder.encode(language.trim(), "UTF-8");
  286.             if(isFemale != null) {
  287.                 isFemale = URLEncoder.encode(isFemale.trim(), "UTF-8");
  288.             }
  289.         } catch (UnsupportedEncodingException e) {
  290.             e.printStackTrace();
  291.         }
  292.         resUrl = backUrl + "?text=" + textToSpeech + "&lang=" + language;
  293.         if(isFemale != null) resUrl.concat("&isFemale=" + isFemale);
  294.         Log.i("FULL_URL", "buildUrl: " + resUrl);
  295.         return resUrl;
  296.     }
  297.  
  298.     private String buildUrl(String backUrl, String textToSpeech, String language) {
  299.         return buildUrl(backUrl, textToSpeech, language, null);
  300.     }
  301.  
  302.     private void playSound(String myUrl) {
  303.         final MediaPlayer mediaPlayer = new MediaPlayer();
  304.         try {
  305.             Log.e("myUrl", "playSound: " + myUrl.replace("\"", ""));
  306.             mediaPlayer.setDataSource(myUrl.replace("\"", ""));
  307.             mediaPlayer.prepareAsync();
  308.             mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  309.  
  310.                 @Override
  311.                 public void onPrepared(MediaPlayer mp) {
  312.                     mp.start();
  313.                 }
  314.  
  315.             });
  316.             mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  317.                 @Override
  318.                 public void onCompletion(MediaPlayer mp) {
  319.                     mp.reset();
  320.                 }
  321.             });
  322.         } catch (IOException e) {
  323.             e.printStackTrace();
  324.         }
  325.     }
  326.  
  327.     private String wrapToColor(String value) {
  328.         return "<font color='" + color + "'>" + value + "</font>";
  329.     }
  330.  
  331.     private void handleFault(BackendlessFault fault) {
  332.         Log.e(TAG, fault.toString());
  333.     }
  334.  
  335.     @Override
  336.     protected void onDestroy() {
  337.         super.onDestroy();
  338.         if(channel != null) {
  339.             channel.leave();
  340.         }
  341.         if(mediaPlayer != null) {
  342.             mediaPlayer.release();
  343.         }
  344.     }
  345.  
  346.     private String getPreferredLanguage(String str) {
  347.         String lng = "";
  348.         switch(str) {
  349.             case "Russian":
  350.                 lng = "ru";
  351.                 break;
  352.             case "Spanish":
  353.                 lng = "es";
  354.                 break;
  355.             case "French":
  356.                 lng = "fr";
  357.                 break;
  358.             case "German":
  359.                 lng = "de";
  360.                 break;
  361.             case "Italian":
  362.                 lng = "it";
  363.                 break;
  364.             case "Hebrew":
  365.                 lng = "iw";
  366.                 break;
  367.             default:
  368.                 lng = "en";
  369.                 break;
  370.         }
  371.         return lng;
  372.     }
  373. }
  374.  
  375. // ---------------- Defaults.java --------------------
  376.  
  377. package com.sgl.mychat;
  378.  
  379. public class Defaults {
  380.  
  381.     public static final String SERVER_URL = "https://api.backendless.com";
  382.  
  383.     public static final String MY_APPLICATION_ID = "APP_ID";
  384.     public static final String MY_API_KEY = "API_KEY";
  385.  
  386.     public static final String DEFAULT_CHANNEL = "EranAndDaniel";
  387. }
  388.  
  389. // ---------- ColorPickerUtility --------------
  390.  
  391. package com.sgl.mychat;
  392.  
  393. import java.util.Random;
  394.  
  395. public class ColorPickerUtility {
  396.  
  397.     //private static final String[] colors = new String[]{"#b1ffb0", "#660002", "#191970", "#f38630", "#057e95", "#7bb020"};
  398.     private static final Random random = new Random();
  399.     public static String next() {
  400.         String acceptableChars = "0123456789ABCDEF";
  401.         String color = "#";
  402.         for(int i = 0; i < 6; i++) {
  403.             color += Character.toString(acceptableChars.charAt(random.nextInt(acceptableChars.length()-1)));
  404.         }
  405.         return color;
  406.     }
  407. }
  408.  
  409. /////////////// XML files ////////////////
  410. // ----------- activity_main.xml ----------
  411.  
  412. <?xml version="1.0" encoding="utf-8"?>
  413. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  414.     xmlns:app="http://schemas.android.com/apk/res-auto"
  415.     xmlns:tools="http://schemas.android.com/tools"
  416.     android:layout_width="match_parent"
  417.     android:layout_height="match_parent"
  418.     tools:context=".MainActivity">
  419.  
  420.     <LinearLayout
  421.         android:layout_width="match_parent"
  422.         android:layout_height="match_parent"
  423.         android:orientation="vertical"
  424.         android:gravity="center_horizontal"
  425.         android:padding="16dp">
  426.         <!-- Login progress -->
  427.         <ProgressBar
  428.             android:layout_width="wrap_content"
  429.             android:layout_height="wrap_content"
  430.             android:layout_marginBottom="8dp"
  431.             style="?android:attr/progressBarStyleLarge"
  432.             android:visibility="gone"/>
  433.         <ScrollView
  434.             android:layout_width="match_parent"
  435.             android:layout_height="match_parent"
  436.             android:id="@+id/login_form">
  437.             <LinearLayout
  438.                 android:layout_width="match_parent"
  439.                 android:layout_height="wrap_content"
  440.                 android:orientation="vertical"
  441.                 android:id="@+id/email_login_form">
  442.                 <EditText
  443.                     android:layout_width="match_parent"
  444.                     android:layout_height="wrap_content"
  445.                     android:id="@+id/user_name"
  446.                     android:hint="user name"
  447.                     android:inputType="text"
  448.                     android:maxLines="1"
  449.                     android:singleLine="true"/>
  450.                 <Button
  451.                     android:layout_width="match_parent"
  452.                     android:layout_height="wrap_content"
  453.                     android:id="@+id/start_chat_button"
  454.                     style="?android:textAppearanceSmall"
  455.                     android:layout_marginTop="16dp"
  456.                     android:text="Start chat"
  457.                     android:textStyle="bold"
  458.                     android:background="#9C27B0"
  459.                     android:textColor="#FFFFFF"/>
  460.             </LinearLayout>
  461.         </ScrollView>
  462.  
  463.     </LinearLayout>
  464.  
  465. </androidx.constraintlayout.widget.ConstraintLayout>
  466.  
  467. // ----------- activity_chat_room.xml -------------
  468.  
  469. <?xml version="1.0" encoding="utf-8"?>
  470. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  471.     xmlns:app="http://schemas.android.com/apk/res-auto"
  472.     xmlns:tools="http://schemas.android.com/tools"
  473.     android:layout_width="match_parent"
  474.     android:layout_height="match_parent"
  475.     tools:context=".ChatRoomActivity">
  476.     <RelativeLayout
  477.         android:layout_width="match_parent"
  478.         android:layout_height="match_parent"
  479.         android:gravity="center_horizontal"
  480.         android:padding="16dp">
  481.         <LinearLayout
  482.             android:layout_width="match_parent"
  483.             android:layout_height="wrap_content"
  484.             android:layout_alignParentTop="true"
  485.             android:orientation="horizontal">
  486.             <TextView
  487.                 android:layout_width="wrap_content"
  488.                 android:layout_height="wrap_content"
  489.                 android:id="@+id/title"
  490.                 android:text="Welcome to the chat room"
  491.                 android:layout_marginEnd="20dp"
  492.                 android:textSize="20sp"/>
  493.             <Spinner
  494.                 android:layout_width="match_parent"
  495.                 android:layout_height="wrap_content"
  496.                 android:gravity="right"
  497.                 android:id="@+id/languages"/>
  498.         </LinearLayout>
  499.         <TextView
  500.             android:layout_width="match_parent"
  501.             android:layout_height="match_parent"
  502.             android:id="@+id/messages"
  503.             android:text=""
  504.             android:layout_marginTop="50dp"
  505.             android:layout_marginBottom="50dp"/>
  506.         <EditText
  507.             android:layout_width="match_parent"
  508.             android:layout_height="wrap_content"
  509.             android:id="@+id/message"
  510.             android:hint="message"
  511.             android:imeOptions="actionSend"
  512.             android:inputType="text"
  513.             android:maxLines="1"
  514.             android:singleLine="true"
  515.             android:layout_alignParentBottom="true"/>
  516.     </RelativeLayout>
  517.  
  518. </androidx.constraintlayout.widget.ConstraintLayout>
  519.  
  520. ///////////////// values ////////////
  521. // ------------- strings.xml -------------
  522.  
  523. <resources>
  524.     <string name="app_name">MyChat</string>
  525.     <string-array name="languages">
  526.         <item>English</item>
  527.         <item>Russian</item>
  528.         <item>Spanish</item>
  529.         <item>French</item>
  530.         <item>Italian</item>
  531.         <item>German</item>
  532.     </string-array>
  533. </resources>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement