소스 검색

last version

Evgeny Polivanov 2 년 전
부모
커밋
8df9e5e6d3

+ 2 - 1
.idea/misc.xml

@@ -10,10 +10,11 @@
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_chat.xml" value="0.25" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_chats_list.xml" value="0.3546875" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_chats_rooms.xml" value="0.3546875" />
-        <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_main.xml" value="0.33" />
+        <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_main.xml" value="0.25" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_main2.xml" value="0.3546875" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_room.xml" value="0.33" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_rooms.xml" value="0.1" />
+        <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/activity_voice_chat.xml" value="0.3546875" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/fragment_blank.xml" value="0.25" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/fragment_chats.xml" value="0.23802083333333332" />
         <entry key="..\:/Users/poliv/AndroidStudioProjects/test2Smack/app/src/main/res/layout/fragment_chats_rooms.xml" value="0.340625" />

+ 17 - 7
app/src/main/AndroidManifest.xml

@@ -1,21 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    package="com.drinkertea.test2smack" >
+    package="com.drinkertea.test2smack">
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        tools:ignore="ScopedStorage" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
         tools:ignore="ScopedStorage" />
-    <uses-permission android:name="android.permission.INSTALL_PACKAGES"
+    <uses-permission android:name="android.permission.STORAGE"/>
+    <uses-permission
+        android:name="android.permission.INSTALL_PACKAGES"
         tools:ignore="ProtectedPermissions" />
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
-    <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"
+    <uses-permission
+        android:name="android.permission.BROADCAST_WAP_PUSH"
         tools:ignore="ProtectedPermissions" />
-    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
+    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
 
     <meta-data
         android:name="com.drinkertea.test2smack.default_notification_channel_id"
@@ -33,7 +40,10 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.Test2Smack"
         android:usesCleartextTraffic="true"
-        tools:targetApi="31" >
+        tools:targetApi="31">
+        <activity
+            android:name=".VoiceActivityChat"
+            android:exported="false" />
         <activity
             android:name=".ChatsRooms"
             android:exported="false"
@@ -47,7 +57,7 @@
             android:exported="false" />
         <activity
             android:name=".MainActivity"
-            android:exported="true" >
+            android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -59,7 +69,7 @@
             android:name="androidx.core.content.FileProvider"
             android:authorities="${applicationId}.provider"
             android:exported="false"
-            android:grantUriPermissions="true" >
+            android:grantUriPermissions="true">
             <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/provider_paths" />

+ 23 - 18
app/src/main/java/com/drinkertea/test2smack/BlankFragment.java

@@ -4,21 +4,19 @@ import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
 import android.os.Handler;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
 import android.widget.EditText;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import androidx.fragment.app.Fragment;
+
 import org.jivesoftware.smack.chat2.Chat;
 import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
 import org.jivesoftware.smack.packet.Message;
@@ -27,14 +25,11 @@ import org.jivesoftware.smack.roster.RosterListener;
 import org.jxmpp.jid.EntityBareJid;
 import org.jxmpp.jid.Jid;
 import org.jxmpp.jid.impl.JidCreate;
-import org.minidns.record.A;
-import org.pgpainless.key.selection.keyring.impl.XMPP;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -61,7 +56,8 @@ public class BlankFragment extends Fragment {
                     try {
                         generateChatsList();
                     }catch (Exception ex){
-                        System.out.println(ex.getMessage());
+                        //ErrorLogFile.WriterLogs(ex.getMessage());
+                        //System.out.println(ex.getMessage());
                     }
                 }
             });
@@ -75,13 +71,13 @@ public class BlankFragment extends Fragment {
             view = inflater.inflate(R.layout.fragment_blank, container, false);
             init();
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
         return view;
 
     }
     public void init(){
-
         try {
             linearLayout = (LinearLayout) view.findViewById(R.id.chatsListLayout);
             searchET = (EditText) view.findViewById(R.id.search_edit_text);
@@ -92,7 +88,8 @@ public class BlankFragment extends Fragment {
             ALLUserChats.addAll(XMPPClass.chatItems);
             runMessageListener();
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -161,12 +158,14 @@ public class BlankFragment extends Fragment {
                         @Override
                         public void onClick(View view) {
                             try {
-                                XMPPClass.chatJid = JidCreate.entityBareFrom(chatItem.jid);
-                                chatItem.message = null;
-                                Intent intent = new Intent(view.getContext(), ChatActivity.class);
-                                startActivity(intent);
+                                if (XMPPClass.connection.isConnected()){
+                                    XMPPClass.chatJid = JidCreate.entityBareFrom(chatItem.jid);
+                                    chatItem.message = null;
+                                    Intent intent = new Intent(view.getContext(), ChatActivity.class);
+                                    startActivity(intent);
+                                }
                             }catch (Exception ex){
-
+                                ErrorLogFile.WriterLogs(ex.getMessage());
                             }
 
                         }
@@ -176,7 +175,8 @@ public class BlankFragment extends Fragment {
             }
             runTimerSchedule();
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
@@ -184,6 +184,7 @@ public class BlankFragment extends Fragment {
         try {
             timer.schedule(timerTask, 0, 5000);
         } catch (Exception e) {
+            //ErrorLogFile.WriterLogs(e.getMessage());
             System.out.println(e.getMessage());
         }
 
@@ -202,6 +203,7 @@ public class BlankFragment extends Fragment {
                             }
                         }
                     } catch (Exception e) {
+                        //ErrorLogFile.WriterLogs(e.getMessage());
                         System.out.println(e.getMessage());
                     }
                 }
@@ -235,6 +237,7 @@ public class BlankFragment extends Fragment {
                             }
                         }
                     } catch (Exception e) {
+                        //ErrorLogFile.WriterLogs(e.getMessage());
                         System.out.println(e.getMessage());
                     }
 
@@ -266,6 +269,7 @@ public class BlankFragment extends Fragment {
                             sortUsers.clear();
                         }
                     }catch (Exception ex){
+                        //ErrorLogFile.WriterLogs(ex.getMessage());
                         System.out.println(ex.getMessage());
                     }
                 }
@@ -276,7 +280,8 @@ public class BlankFragment extends Fragment {
                 }
             });
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }

+ 17 - 15
app/src/main/java/com/drinkertea/test2smack/ChatActivity.java

@@ -1,29 +1,23 @@
 package com.drinkertea.test2smack;
 
-import androidx.appcompat.app.AppCompatActivity;
-
 import android.graphics.Color;
 import android.graphics.Typeface;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.SystemClock;
 import android.view.View;
-import android.view.inputmethod.InputMethodManager;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import androidx.appcompat.app.AppCompatActivity;
+
 import org.jivesoftware.smack.AbstractXMPPConnection;
 import org.jivesoftware.smack.chat2.Chat;
 import org.jivesoftware.smack.chat2.ChatManager;
 import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
 import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smackx.mam.MamManager;
 import org.jxmpp.jid.EntityBareJid;
-import org.jxmpp.jid.impl.JidCreate;
-import org.jxmpp.stringprep.XmppStringprepException;
 
-import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -41,7 +35,8 @@ public class ChatActivity extends AppCompatActivity {
             jid = XMPPClass.chatJid;
 
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
     Chat chat = chatManager.chatWith(jid);
@@ -58,7 +53,8 @@ public class ChatActivity extends AppCompatActivity {
             createMessageForm();
             mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -71,7 +67,8 @@ public class ChatActivity extends AppCompatActivity {
             mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
 
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
@@ -90,7 +87,8 @@ public class ChatActivity extends AppCompatActivity {
             }
             runMessageListener();
         }catch (Exception e){
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
@@ -107,8 +105,9 @@ public class ChatActivity extends AppCompatActivity {
                             try {
                                 addMessage(from.asBareJid().toString(), message.getBody(), true);
                                 timer.schedule(timerTask, 1, 500);
-                                System.out.println("New message from:" + from + ": " + message.toXML().toString());
+                                //System.out.println("New message from:" + from + ": " + message.toXML().toString());
                             } catch (Exception e) {
+                                //ErrorLogFile.WriterLogs(e.getMessage());
                                 System.out.println(e.getMessage());
                             }
                         }
@@ -117,7 +116,8 @@ public class ChatActivity extends AppCompatActivity {
                 }
             });
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -145,7 +145,8 @@ public class ChatActivity extends AppCompatActivity {
 
             chatLayout.addView(linearLayout);
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
     final Handler handler = new Handler();
@@ -159,6 +160,7 @@ public class ChatActivity extends AppCompatActivity {
                     try {
                         mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
                     } catch (Exception e) {
+                        //ErrorLogFile.WriterLogs(e.getMessage());
                         System.out.println(e.getMessage());
                     }
                 }

+ 0 - 2
app/src/main/java/com/drinkertea/test2smack/ChatItem.java

@@ -1,7 +1,5 @@
 package com.drinkertea.test2smack;
 
-import java.util.ArrayList;
-
 public class ChatItem {
     public String jid;
     public String name;

+ 52 - 8
app/src/main/java/com/drinkertea/test2smack/ChatsRooms.java

@@ -1,35 +1,79 @@
 package com.drinkertea.test2smack;
 
+import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
+import android.widget.Toast;
 
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.google.android.material.snackbar.Snackbar;
-import com.google.android.material.tabs.TabLayout;
-
-import androidx.viewpager.widget.ViewPager;
 import androidx.appcompat.app.AppCompatActivity;
+import androidx.viewpager.widget.ViewPager;
 
-import com.drinkertea.test2smack.ui.main.SectionsPagerAdapter;
 import com.drinkertea.test2smack.databinding.ActivityChatsRoomsBinding;
+import com.drinkertea.test2smack.ui.main.SectionsPagerAdapter;
+import com.google.android.material.tabs.TabLayout;
 
 public class ChatsRooms extends AppCompatActivity {
 
     private ActivityChatsRoomsBinding binding;
 
+    Handler handler = new Handler();
+    Runnable runnable;
+    int delay = 7000;
+
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         try {
+            handler.postDelayed(runnable = new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        if (XMPPClass.connection.isConnected()){
+                            handler.postDelayed(runnable, delay);
+                        }
+                        else {
+                            Toast.makeText(ChatsRooms.this, "Not stable internet connection. Reconnecting...", Toast.LENGTH_LONG).show();
+                            XMPPClass.XMPP_Connection(XMPPClass.nickname_local, XMPPClass.pass);
+                            if (XMPPClass.connection.isConnected()){
+                                reload();
+                            }
+                            handler.postDelayed(runnable, delay);
+
+                        }
+                    }catch (Exception ex){
+                        ErrorLogFile.WriterLogs(ex.getMessage());
+                    }
+
+                }
+            }, delay);
             binding = ActivityChatsRoomsBinding.inflate(getLayoutInflater());
             setContentView(binding.getRoot());
+            init();
 
+        } catch (Exception e) {
+            //ErrorLogFile.WriterLogs(e.getMessage());
+            System.out.println(e.getMessage());
+        }
+    }
+    public void reload(){
+        try {
+            finish();
+            startActivity(new Intent(ChatsRooms.this, ChatsRooms.class));
+        }catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
+        }
+
+    }
+    public void init(){
+        try {
             SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
             ViewPager viewPager = binding.viewPager;
             viewPager.setAdapter(sectionsPagerAdapter);
             TabLayout tabs = binding.tabs;
             tabs.setupWithViewPager(viewPager);
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
+        }catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
         }
 
     }

+ 79 - 0
app/src/main/java/com/drinkertea/test2smack/ErrorLogFile.java

@@ -0,0 +1,79 @@
+package com.drinkertea.test2smack;
+
+import android.os.Environment;
+
+import org.jivesoftware.smack.chat2.Chat;
+import org.jxmpp.jid.EntityBareJid;
+import org.jxmpp.jid.impl.JidCreate;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+
+public class ErrorLogFile {
+
+    public void SendLog(String email, String password){
+        try {
+            XMPPClass.XMPP_Connection("test", "test1234@");
+            EntityBareJid jid = JidCreate.entityBareFrom("evgeny.polivanov@msg.sharix-app.org");
+            Chat chat = XMPPClass.chatManager
+                    .chatWith(jid);
+            if (ReadLogs() != ""){
+                chat.send(ReadLogs());
+            }
+            else {
+                chat.send("Logs null");
+            }
+        }catch (Exception e){
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+
+    }
+    private String ReadLogs(){
+        try {
+            File dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+            File logs = new File(dirPath, "ShariXLog.txt");
+            if(!logs.exists()) logs.createNewFile();
+            StringBuilder text = new StringBuilder();
+            BufferedReader br = new BufferedReader(new FileReader(logs));
+            String line;
+            while ((line = br.readLine()) != null) {
+                text.append(line);
+                text.append('\n');
+            }
+
+            br.close();
+            logs.delete();
+            return text.toString();
+
+        }catch (Exception ex){
+            return "error send logs";
+        }
+    }
+
+    public static void WriterLogs(String message){
+        try {
+            File dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+            File logs = new File(dirPath, "ShariXLog.txt");
+            if(!logs.exists()) logs.createNewFile();
+            StringBuilder text = new StringBuilder();
+            BufferedReader br = new BufferedReader(new FileReader(logs));
+            String line;
+            while ((line = br.readLine()) != null) {
+                text.append(line);
+                text.append('\n');
+            }
+            br.close();
+            text.append(message+ "\n");
+            FileWriter writer = new FileWriter(logs);
+            writer.write(text.toString());
+            writer.flush();
+            writer.close();
+        }catch (Exception e){
+            //ErrorLogFile.WriterLogs(e.getMessage());
+            System.out.println(e.getMessage());
+        }
+    }
+}

+ 15 - 22
app/src/main/java/com/drinkertea/test2smack/FragmentRooms.java

@@ -4,32 +4,18 @@ import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
-import android.os.Handler;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
-import android.widget.Switch;
 import android.widget.TextView;
 
 import androidx.fragment.app.Fragment;
 
-import org.jivesoftware.smack.chat2.Chat;
-import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
-import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smack.packet.Presence;
-import org.jivesoftware.smack.roster.RosterListener;
 import org.jivesoftware.smackx.muc.MultiUserChat;
-import org.jxmpp.jid.EntityBareJid;
-import org.jxmpp.jid.Jid;
-import org.jxmpp.jid.impl.JidCreate;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
 
 
 public class FragmentRooms extends Fragment {
@@ -44,7 +30,8 @@ public class FragmentRooms extends Fragment {
             view = inflater.inflate(R.layout.fragment_rooms, container, false);
             init();
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
         return view;
 
@@ -57,7 +44,8 @@ public class FragmentRooms extends Fragment {
             XMPPClass.listForMessageListenerMuc.addAll(listForMessageListener());
             getActivity().startService(new Intent(getActivity(), NotificationService.class));
         } catch (Exception e) {
-            e.printStackTrace();
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //e.printStackTrace();
         }
     }
     public List<MultiUserChat> mySortMethod(){
@@ -74,7 +62,8 @@ public class FragmentRooms extends Fragment {
                 }
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
         return sortMuc;
     }
@@ -87,7 +76,8 @@ public class FragmentRooms extends Fragment {
                 }
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
         return sortMuc;
     }
@@ -129,16 +119,19 @@ public class FragmentRooms extends Fragment {
                 Container.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View view) {
-                        XMPPClass.XMPP_JoinRoom(muc.getRoom().asEntityBareJidString(), "Test Room User");
-                        Intent intent = new Intent(view.getContext(), Room.class);
-                        startActivity(intent);
+                        if (XMPPClass.connection.isConnected()){
+                            XMPPClass.XMPP_JoinRoom(muc.getRoom().asEntityBareJidString(), XMPPClass.nickname_local);
+                            Intent intent = new Intent(view.getContext(), Room.class);
+                            startActivity(intent);
+                        }
                     }
                 });
 
                 mainListRooms.addView(Container);
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }

+ 123 - 54
app/src/main/java/com/drinkertea/test2smack/MainActivity.java

@@ -1,11 +1,10 @@
 package com.drinkertea.test2smack;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
+import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.RECORD_AUDIO;
+import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
 
 import android.Manifest;
-import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -15,22 +14,27 @@ import android.text.method.HideReturnsTransformationMethod;
 import android.text.method.PasswordTransformationMethod;
 import android.view.View;
 import android.widget.EditText;
-import android.widget.ImageButton;
 import android.widget.Switch;
+import android.widget.Toast;
 
-import com.dcastalia.localappupdate.DownloadApk;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
 
+import com.dcastalia.localappupdate.DownloadApk;
 
 
 public class MainActivity extends AppCompatActivity {
 
     private EditText ETemail;
     private EditText ETpassword;
-    private SharedPreferences pref;
+    public SharedPreferences pref;
+    public SharedPreferences.Editor editor;
     private Switch switchPass;
-    private ImageButton imgBtn;
     String email;
     String password;
+    public static final int REQUEST_AUDIO_PERMISSION_CODE = 200;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -40,29 +44,48 @@ public class MainActivity extends AppCompatActivity {
     }
     private void init(){
         try {
-            imgBtn = (ImageButton) findViewById(R.id.notifButtonSound);
+            GetPermissionForLogAndDownload();
             pref = getSharedPreferences("login_pass_pref", MODE_PRIVATE);
             ETemail = (EditText) findViewById(R.id.ETEmail);
             ETpassword = (EditText) findViewById(R.id.ETPassword);
             switchPass = (Switch) findViewById(R.id.SwitchBoxPassword);
             ETemail.setText(pref.getString("email", ""));
+            XMPPClass.nickname_local = pref.getString("email", "Test From User");
             ETpassword.setText(pref.getString("pass", ""));
-            if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_WAP_PUSH) ==
-                    PackageManager.PERMISSION_GRANTED){
-                imgBtn.setVisibility(View.GONE);
-            }
+            ActivityCompat.requestPermissions(this, new String[]{RECORD_AUDIO, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, 1);
         }catch (Exception ex){
-            System.out.println(ex.getMessage());
+            ErrorLogFile.WriterLogs(ex.getMessage());
+            //System.out.println(ex.getMessage());
         }
     }
-    public void goToPageWithChats(View view){
+    public void GetPermissionForLogAndDownload(){
         try {
-            SharedPreferences.Editor editor = pref.edit();
+            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                    Manifest.permission.INSTALL_PACKAGES,
+                    Manifest.permission.REQUEST_INSTALL_PACKAGES};
+            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
+                    PackageManager.PERMISSION_DENIED){
+                ActivityCompat.requestPermissions(
+                        this,
+                        permissions,
+                        1
+                );
+            }
+        }catch (Exception e){
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+    }
 
+    public void goToPageWithChats(View view){
+        try {
+            editor = pref.edit();
             email = ETemail.getText().toString();
             password = ETpassword.getText().toString();
             //Авторизация
+            Toast.makeText(this, "Connecting to server...", Toast.LENGTH_SHORT).show();
             boolean isLogin = XMPPClass.XMPP_Connection(email, password);
+
             //Переход и заупск сервера
             if (isLogin && XMPPClass.connection.getUser() != null){
                 editor.putString("email", email);
@@ -72,32 +95,54 @@ public class MainActivity extends AppCompatActivity {
                 startActivity(intent);
             }
             else {
-                System.out.println("Error connect!");
+                Toast.makeText(this, "Connection error!", Toast.LENGTH_LONG).show();
             }
         }catch (Exception ex){
-            System.out.println(ex.getMessage());
+            ErrorLogFile.WriterLogs(ex.getMessage());
+            //System.out.println(ex.getMessage());
         }
     }
 
     public void updateApp(View view){
         try {
-            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                    Manifest.permission.INSTALL_PACKAGES,
-                    Manifest.permission.REQUEST_INSTALL_PACKAGES};
-            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
-                    PackageManager.PERMISSION_GRANTED){
-                String BASEURL = "https://github.com/WorldOfPets/test_apk_file/raw/master/app-debug.apk";
-                DownloadApk downloadApk = new DownloadApk(MainActivity.this);
-                downloadApk.startDownloadingApk(BASEURL);
-            } else {
-                ActivityCompat.requestPermissions(
-                        this,
-                        permissions,
-                        1
-                );
-            }
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setMessage("Update app?")
+                    .setTitle("Information")
+                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialogInterface, int i) {
+                            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                                    Manifest.permission.INSTALL_PACKAGES,
+                                    Manifest.permission.REQUEST_INSTALL_PACKAGES};
+                            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
+                                    PackageManager.PERMISSION_GRANTED){
+                                    String BASEURL = "https://github.com/WorldOfPets/test_apk_file/raw/master/app-debug.apk";
+                                    DownloadApk downloadApk = new DownloadApk(MainActivity.this);
+                                    downloadApk.startDownloadingApk(BASEURL);
+                            } else {
+                                ActivityCompat.requestPermissions(
+                                        MainActivity.this,
+                                        permissions,
+                                        1
+                                );
+                                String BASEURL = "https://github.com/WorldOfPets/test_apk_file/raw/master/app-debug.apk";
+                                DownloadApk downloadApk = new DownloadApk(MainActivity.this);
+                                downloadApk.startDownloadingApk(BASEURL);
+                            }
+                        }
+                    })
+                    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialogInterface, int i) {
+
+                        }
+                    });
+            AlertDialog dialog = builder.create();
+            dialog.show();
+
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -110,40 +155,64 @@ public class MainActivity extends AppCompatActivity {
                 ETpassword.setTransformationMethod(new PasswordTransformationMethod());
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
     public void testMethod(View view) {
         try {
+            Toast.makeText(this, "Notifications are disabled.", Toast.LENGTH_SHORT).show();
             stopService(new Intent(this, NotificationService.class));
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
         }
     }
 
-    public void notifSound(View view) {
+    public void sendLogs(View view) {
+        try {
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setMessage("Send logs?")
+                    .setTitle("Information")
+                    .setPositiveButton("Ok", (dialogInterface, i) -> {
+                        ErrorLogFile errorLogFile = new ErrorLogFile();
+                        errorLogFile.SendLog(ETemail.getText().toString(), ETpassword.getText().toString());
+                    })
+                    .setNegativeButton("Cancel", (dialogInterface, i) -> {
+
+                    });
+            AlertDialog dialog = builder.create();
+            dialog.show();
+            //ErrorLogFile errorLogFile = new ErrorLogFile();
+            //errorLogFile.SendLog(ETemail.getText().toString(), ETpassword.getText().toString());
+        }catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
+        }
 
+    }
+
+    public void voiceChatActivity(View view) {
         try {
-            if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_WAP_PUSH) ==
-            PackageManager.PERMISSION_DENIED){
-                String[] permissions  = new String[]{
-                        Manifest.permission.BROADCAST_WAP_PUSH,
-                        Manifest.permission.RECEIVE_WAP_PUSH,
-                };
-                ActivityCompat.requestPermissions(
-                        this,
-                        permissions,
-                        4
-                );
+            editor = pref.edit();
+            email = ETemail.getText().toString();
+            password = ETpassword.getText().toString();
+            //Авторизация
+            Toast.makeText(this, "Connecting to server...", Toast.LENGTH_SHORT).show();
+            boolean isLogin = XMPPClass.XMPP_Connection(email, password);
+
+            //Переход и заупск сервера
+            if (isLogin && XMPPClass.connection.getUser() != null){
+                editor.putString("email", email);
+                editor.putString("pass", password);
+                editor.apply();
+                Intent intent = new Intent(this, VoiceActivityChat.class);
+                startActivity(intent);
             }
-            else{
-                imgBtn.setVisibility(View.GONE);
+            else {
+                Toast.makeText(this, "Connection error!", Toast.LENGTH_LONG).show();
             }
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
+        }catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
         }
     }
-
-
 }

+ 12 - 11
app/src/main/java/com/drinkertea/test2smack/NotificationService.java

@@ -9,21 +9,15 @@ import android.os.Build;
 import android.os.IBinder;
 
 import androidx.core.app.NotificationCompat;
-import androidx.core.app.NotificationManagerCompat;
 import androidx.core.app.TaskStackBuilder;
 
-import org.jivesoftware.smack.AbstractXMPPConnection;
 import org.jivesoftware.smack.MessageListener;
 import org.jivesoftware.smack.chat2.Chat;
-import org.jivesoftware.smack.chat2.ChatManager;
 import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
 import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smack.tcp.XMPPTCPConnection;
-import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
 import org.jivesoftware.smackx.muc.MultiUserChat;
 import org.jxmpp.jid.EntityBareJid;
 import org.jxmpp.jid.impl.JidCreate;
-import org.jxmpp.stringprep.XmppStringprepException;
 
 import java.util.Locale;
 
@@ -48,12 +42,13 @@ public class NotificationService extends Service {
                 }).start();
                 serverIsWorked = true;
                 builder = new NotificationCompat.Builder(this, "My channel")
-                        .setContentText("Notification server was running!")
+                        .setContentText("Notification server is running!")
                         .setContentTitle("Assist chat")
                         .setSmallIcon(R.mipmap.ic_launcher_round);
                 startForeground(1001, builder.build());
             }
         } catch (Exception e) {
+            //ErrorLogFile.WriterLogs(e.getMessage());
             System.out.println(e.getMessage());
         }
         return super.onStartCommand(intent, flags, startId);
@@ -70,7 +65,8 @@ public class NotificationService extends Service {
             }
             System.out.println("Server started!");
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -88,6 +84,7 @@ public class NotificationService extends Service {
                     try {
                         createNotificationChannel(from.asBareJid().toString(), message.getBody());
                     }catch (Exception ex){
+                        //ErrorLogFile.WriterLogs(ex.getMessage());
                         System.out.println(ex.getMessage());
                     }
                 }
@@ -102,13 +99,15 @@ public class NotificationService extends Service {
                             }
 
                         }catch (Exception ex){
+                            //ErrorLogFile.WriterLogs(ex.getMessage());
                             System.out.println(ex.getMessage());
                         }
                     }
                 });
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 
@@ -132,7 +131,8 @@ public class NotificationService extends Service {
 
             startForeground(1001, builder.build());
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
@@ -144,7 +144,8 @@ public class NotificationService extends Service {
             serverIsWorked = false;
             System.out.println("Server destroy!");
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }

+ 29 - 36
app/src/main/java/com/drinkertea/test2smack/Room.java

@@ -1,30 +1,21 @@
 package com.drinkertea.test2smack;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.recyclerview.widget.RecyclerView;
-
 import android.graphics.Color;
 import android.graphics.Typeface;
-import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
-import android.os.Handler;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import androidx.appcompat.app.AppCompatActivity;
+
 import org.jivesoftware.smack.MessageListener;
-import org.jivesoftware.smack.chat2.Chat;
-import org.jivesoftware.smack.chat2.ChatManager;
-import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
 import org.jivesoftware.smack.packet.Message;
 import org.jivesoftware.smackx.muc.MultiUserChat;
-import org.jxmpp.jid.EntityBareJid;
 
 import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
 
 public class Room extends AppCompatActivity {
 
@@ -33,6 +24,17 @@ public class Room extends AppCompatActivity {
     public MultiUserChat thisMuc = XMPPClass.activeMuc;
     private ScrollView mainScroll;
 
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mainScroll.post(new Runnable() {
+            @Override
+            public void run() {
+                mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
+            }
+        });
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -41,7 +43,7 @@ public class Room extends AppCompatActivity {
             roomMessageET = (EditText) findViewById(R.id.roomMessageView);
             roomLayout = (LinearLayout) findViewById(R.id.roomLayout);
             mainScroll = (ScrollView) findViewById(R.id.roomScroll);
-            List<Message> messages = XMPPClass.CreateRoomListMessage(10, thisMuc);
+            List<Message> messages = XMPPClass.CreateRoomListMessage(20, thisMuc);
             for(Message message : messages){
                 String from = message.getFrom().asBareJid().toString().trim();
                 if (from.equals(XMPPClass.myJid.asEntityBareJidString().trim())){
@@ -51,10 +53,10 @@ public class Room extends AppCompatActivity {
                     addMessage(message.getFrom().toString().split("/")[1], message.getBody(), true);
                 }
             }
-            mainScroll.fullScroll(View.FOCUS_DOWN);
             runMessageListener();
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
@@ -82,11 +84,14 @@ public class Room extends AppCompatActivity {
             linearLayout.addView(bodyView);
 
             roomLayout.addView(linearLayout);
+
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
+
     public void runMessageListener(){
         try {
             thisMuc.addMessageListener(new MessageListener() {
@@ -97,43 +102,31 @@ public class Room extends AppCompatActivity {
                         public void run() {
                             if (message.getBody() != null && message.getBody() != ""){
                                 addMessage(message.getFrom().toString().split("/")[1], message.getBody(), true);
-                                timer.schedule(timerTask, 1, 500);
+                                mainScroll.post(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
+                                    }
+                                });
                             }
                         }
                     });
                 }
             });
         } catch (Exception e) {
+            //ErrorLogFile.WriterLogs(e.getMessage());
             System.out.println(e.getMessage());
         }
     }
 
-    public void sendMessage(View view) {
+    public void sendRoomMessage(View view) {
         try {
             String text = roomMessageET.getText().toString();
             thisMuc.sendMessage(text);
-            addMessage(XMPPClass.myJid.asBareJid().toString(), text, false);
             roomMessageET.setText("");
-            mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
         }catch (Exception e){
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
         }
 
     }
-    final Handler handler = new Handler();
-    Timer timer = new Timer();
-    TimerTask timerTask = new TimerTask() {
-        @Override
-        public void run() {
-            handler.post(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
-                    }catch (Exception ex){
-                    }
-                }
-            });
-        }
-    };
 }

+ 377 - 0
app/src/main/java/com/drinkertea/test2smack/VoiceActivityChat.java

@@ -0,0 +1,377 @@
+package com.drinkertea.test2smack;
+
+import android.annotation.SuppressLint;
+import android.content.ContextWrapper;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.media.MediaPlayer;
+import android.media.MediaRecorder;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.speech.tts.TextToSpeech;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Base64;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.jivesoftware.smack.AbstractXMPPConnection;
+import org.jivesoftware.smack.chat2.Chat;
+import org.jivesoftware.smack.chat2.ChatManager;
+import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
+import org.jivesoftware.smack.packet.Message;
+import org.jxmpp.jid.EntityBareJid;
+import org.jxmpp.jid.impl.JidCreate;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+
+public class VoiceActivityChat extends AppCompatActivity {
+
+    EditText ET_voice;
+    TextView timerView;
+    LinearLayout LL_voice;
+    TextToSpeech textToSpeech;
+    AbstractXMPPConnection connect = XMPPClass.connection;;
+    ChatManager chatManager = XMPPClass.chatManager;;
+    EntityBareJid jid;
+    ScrollView mainScroll;
+    Button sendVoice;
+    ImageButton sendText;
+    private int seconds = 0;
+    private boolean running = false;
+    Handler handler;
+    String encode = "";
+    private MediaPlayer mPlayer;
+    private MediaRecorder mRecorder;
+    {
+        try {
+            //jid = XMPPClass.chatJid;
+            jid = JidCreate.entityBareFrom("test@msg.sharix-app.org");
+
+        } catch (Exception e) {
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+    }
+    Chat chat = chatManager.chatWith(jid);
+
+    @SuppressLint("ClickableViewAccessibility")
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_voice_chat);
+        ET_voice = (EditText) findViewById(R.id.voice_text_edit);
+        LL_voice = (LinearLayout) findViewById(R.id.voicesLayout);
+        mainScroll = (ScrollView) findViewById(R.id.voiceScroll);
+        sendText = (ImageButton) findViewById(R.id.btnSendMessage);
+        sendVoice = (Button) findViewById(R.id.btnSendVoice);
+        timerView = (TextView) findViewById(R.id.timerView);
+        StartTimer();
+        sendVoice.setOnTouchListener((view, motionEvent) -> sendVoiceMessage(motionEvent));
+        sendText.setOnClickListener(view -> sendChatMessage());
+        ET_voice.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+                changeVisibleSendVoice(charSequence);
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+
+            }
+        });
+        textToSpeech = new TextToSpeech(getApplicationContext(), i -> {
+            if (i != TextToSpeech.ERROR){
+                Locale locale = new Locale("ru");
+                int result = textToSpeech.setLanguage(locale);
+            }
+        });
+        createMessageForm();
+    }
+    public void StartRecord(){
+        try {
+            mRecorder = new MediaRecorder();
+            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+            mRecorder.setOutputFile(getFileName());
+            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+
+            mRecorder.prepare();
+            mRecorder.start();
+            System.out.println("Success all");
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+
+
+    }
+    public void StopRecord(){
+        mRecorder.stop();
+        mRecorder.release();
+        mRecorder = null;
+    }
+    public void changeVisibleForText(){
+        if (running){
+            timerView.setVisibility(View.VISIBLE);
+            ET_voice.setVisibility(View.GONE);
+        }
+        else {
+            timerView.setVisibility(View.GONE);
+            ET_voice.setVisibility(View.VISIBLE);
+        }
+
+    }
+    public void changeVisibleSendVoice(CharSequence charSequence){
+        try {
+            if (charSequence.length() != 0){
+                sendText.setVisibility(View.VISIBLE);
+                sendVoice.setVisibility(View.GONE);
+            }
+            else {
+                sendText.setVisibility(View.GONE);
+                sendVoice.setVisibility(View.VISIBLE);
+            }
+        } catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
+        }
+    }
+
+    public void sendChatMessage() {
+        try {
+            String text = ET_voice.getText().toString();
+            chat.send(text);
+            addMessage(connect.getUser().asBareJid().toString(), text, false);
+            ET_voice.setText("");
+            mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
+
+        } catch (Exception e) {
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+    }
+    public boolean sendVoiceMessage(MotionEvent motionEvent) {
+        try {
+            switch (motionEvent.getAction()){
+                case MotionEvent.ACTION_DOWN:
+                    StartRecord();
+                    //Toast.makeText(getApplicationContext(), "Start record", Toast.LENGTH_SHORT).show();
+                    running = true;
+                    //main_text.setText("Press");
+                    return true;
+                case MotionEvent.ACTION_UP:
+                    running = false;
+                    seconds = 0;
+                    StopRecord();
+                    //Toast.makeText(getApplicationContext(), "Stop record", Toast.LENGTH_SHORT).show();
+                    File file = new File(getFileName());
+                    InputStream inputStream = new FileInputStream(file);
+                    encode = "base64 ogg";
+                    encode += Base64.encodeToString(inputStreamToByteArray(inputStream), Base64.DEFAULT);
+                    chat.send(encode);
+                    addMessage(connect.getUser().asBareJid().toString(), encode, false);
+                    mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
+                    return true;
+                default:
+                    return false;
+            }
+        }catch (Exception ex){
+            System.out.println(ex.getMessage());
+            return false;
+        }
+    }
+    public void StartTimer(){
+        seconds = 0;
+        handler = new Handler();
+        handler.post(new Runnable() {
+            @SuppressLint("ClickableViewAccessibility")
+            @Override
+            public void run()
+            {
+                int minutes = (seconds % 3600) / 60;
+                int secs = seconds % 60;
+                String time = String.format(Locale.getDefault(), "%01d:%02d", minutes, secs);
+
+                timerView.setText("Recording goes " + time);
+                changeVisibleForText();
+                if (running) {
+                    seconds++;
+                }
+                if(seconds >= 10 && running){
+                    try {
+                        running = false;
+                        seconds = 0;
+                        sendVoice.setOnTouchListener(null);
+                        StopRecord();
+                        File file = new File(getFileName());
+                        InputStream inputStream = new FileInputStream(file);
+                        encode = "base64 ogg";
+                        encode += Base64.encodeToString(inputStreamToByteArray(inputStream), Base64.DEFAULT);
+                        chat.send(encode);
+                        addMessage(connect.getUser().asBareJid().toString(), encode, false);
+                        mainScroll.fullScroll(ScrollView.FOCUS_DOWN);
+                        sendVoice.setOnTouchListener((view, motionEvent) -> sendVoiceMessage(motionEvent));
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+                handler.postDelayed(this, 1000);
+            }
+        });
+
+    }
+    public void addMessage(String from, String body, boolean black){
+        try {
+            TextView fromName = new TextView(this);
+            TextView bodyView = new TextView(this);
+            TextView cash = new TextView(this);
+            cash.setVisibility(View.GONE);
+            cash.setText("NULL");
+            LinearLayout linearLayout = new LinearLayout(this);
+
+            fromName.setText(from.split("@")[0] + ": ");
+            fromName.setTextSize(16);
+            fromName.setTypeface(null, Typeface.BOLD);
+            if (black){
+                fromName.setTextColor(Color.parseColor("#000000"));
+            } else {
+                fromName.setTextColor(Color.parseColor("#006000"));
+            }
+            Button btn = new Button(this);
+            btn.setText("PLAY");
+            btn.setBackgroundColor(Color.parseColor("#0081ff"));
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
+                    LinearLayout.LayoutParams.WRAP_CONTENT);
+            btn.setLayoutParams(params);
+            btn.setTextColor(Color.parseColor("#ffffff"));
+            if (body.startsWith("base64 ogg") || body.length() >= 10000){
+                cash.setText(body);
+                bodyView.setText("Voice message...");
+            }
+            else{
+                bodyView.setText(body);
+            }
+            btn.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    if (cash.getText().toString() == "NULL"){
+                        textToSpeech.speak(bodyView.getText().toString(), TextToSpeech.QUEUE_ADD, null);
+                    } else if (cash.getText().toString().startsWith("base64 ogg")){
+                        String base_code = cash.getText().toString().replaceFirst("base64 ogg", "");
+                        mPlayer = new MediaPlayer();
+                        byte[] decode = Base64.decode(base_code, Base64.DEFAULT);
+                        File file = new File(getFileName());
+                        FileOutputStream fileOutputStream;
+                        BufferedOutputStream bufferedOutputStream;
+                        try {
+                            fileOutputStream = new FileOutputStream(file);
+                            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+                            bufferedOutputStream.write(decode);
+                            bufferedOutputStream.close();
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                        try {
+                            mPlayer.setDataSource(getFileName());
+                            mPlayer.prepare();
+                            mPlayer.start();
+                        } catch (Exception e) {
+                            System.out.println(e.getMessage());
+                        }
+                    }
+                }
+            });
+
+
+            bodyView.setTextSize(14);
+            bodyView.setTextColor(Color.parseColor("#000000"));
+            linearLayout.setOrientation(LinearLayout.VERTICAL);
+            linearLayout.addView(fromName);
+            linearLayout.addView(bodyView);
+            linearLayout.addView(btn);
+
+            LL_voice.addView(linearLayout);
+        } catch (Exception e) {
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+    }
+    public void createMessageForm() {
+        try {
+            XMPPClass.CreateChatListMessage(jid, 15);
+            for(Message message : XMPPClass.messages){
+                String from = message.getFrom().asBareJid().toString().trim();
+                if (from.equals(XMPPClass.myJid.asEntityBareJidString().trim())){
+                        addMessage(message.getFrom().asBareJid().toString(), message.getBody(), false);
+                }
+                else {
+                        addMessage(message.getFrom().asBareJid().toString(), message.getBody(), true);
+                }
+            }
+            runMessageListener();
+        }catch (Exception e){
+            ErrorLogFile.WriterLogs(e.getMessage());
+        }
+
+    }
+    public void runMessageListener(){
+        try {
+            chatManager.addIncomingListener(new IncomingChatMessageListener() {
+                @Override
+                public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                addMessage(from.asBareJid().toString(), message.getBody(), true);
+                                //System.out.println("New message from:" + from + ": " + message.toXML().toString());
+                            } catch (Exception e) {
+                                //ErrorLogFile.WriterLogs(e.getMessage());
+                                System.out.println(e.getMessage());
+                            }
+                        }
+                    });
+
+                }
+            });
+        } catch (Exception e) {
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
+        }
+    }
+    private String getFileName(){
+        ContextWrapper contextWrapper = new ContextWrapper(getApplicationContext());
+        File musicDir = contextWrapper.getExternalFilesDir(Environment.DIRECTORY_MUSIC);
+        File file = new File(musicDir, "TestAudioFile" + ".ogg");
+        return file.getPath();
+    }
+    public byte[] inputStreamToByteArray(InputStream inStream) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[8192];
+        int bytesRead;
+        while ((bytesRead = inStream.read(buffer)) > 0) {
+            baos.write(buffer, 0, bytesRead);
+        }
+        return baos.toByteArray();
+    }
+}

+ 26 - 13
app/src/main/java/com/drinkertea/test2smack/XMPPClass.java

@@ -1,7 +1,8 @@
 package com.drinkertea.test2smack;
 
+import android.os.StrictMode;
+
 import org.jivesoftware.smack.AbstractXMPPConnection;
-import org.jivesoftware.smack.MessageListener;
 import org.jivesoftware.smack.chat2.ChatManager;
 import org.jivesoftware.smack.packet.Message;
 import org.jivesoftware.smack.packet.Presence;
@@ -18,9 +19,9 @@ import org.jxmpp.jid.EntityBareJid;
 import org.jxmpp.jid.EntityFullJid;
 import org.jxmpp.jid.impl.JidCreate;
 import org.jxmpp.jid.parts.Resourcepart;
-import org.jxmpp.stringprep.XmppStringprepException;
-import org.minidns.record.A;
 
+import java.net.InetAddress;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -33,6 +34,7 @@ public class XMPPClass {
     public static Roster roster;
     public static EntityBareJid chatJid;
     public static EntityBareJid myJid;
+    public static String pass;
     public static ArrayList<ChatItem> chatItems = new ArrayList<>();
     public static List<Message> messages;
     public static MultiUserChatManager manager;
@@ -55,28 +57,35 @@ public class XMPPClass {
                 //System.out.println(jid1);
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
 
     }
 
     public static boolean XMPP_Connection(String login, String password){
         try {
-            myJid = JidCreate.entityBareFrom(login + "@msg.sharix-app.org");
-            nickname_local = login;
+            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+            StrictMode.setThreadPolicy(policy);
+            myJid = JidCreate.entityBareFrom(login);
+            URL urlIP = new URL("https://" + myJid.getDomain().toString());
+            InetAddress ip = InetAddress.getByName(urlIP.getHost());
+            nickname_local = login.split("@")[0];
+            pass = password;
             XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
-                    .setXmppDomain("msg.sharix-app.org")
-                    .setHost("46.138.247.90")
+                    .setXmppDomain(myJid.getDomain().toString())
+                    .setHost(ip.getHostAddress())
                     .build();
             connection = new XMPPTCPConnection(config);
             connection.connect();
-            connection.login(login, password);
+            connection.login(login.split("@")[0], password);
             chatManager = ChatManager.getInstanceFor(connection);
             roster = Roster.getInstanceFor(connection);
             manager = MultiUserChatManager.getInstanceFor(XMPPClass.connection);
             return true;
         }catch (Exception ex){
-            System.out.println(ex.getMessage());
+            ErrorLogFile.WriterLogs(ex.getMessage());
+            //System.out.println(ex.getMessage());
             return false;
         }
 
@@ -93,7 +102,8 @@ public class XMPPClass {
             MamManager.MamQuery mamQuery = mamManager.queryArchive(mamQueryArgs);
             messages = mamQuery.getMessages();
         }catch (Exception ex){
-            System.out.println(ex.getMessage());
+            ErrorLogFile.WriterLogs(ex.getMessage());
+            //System.out.println(ex.getMessage());
         }
     }
 
@@ -107,6 +117,7 @@ public class XMPPClass {
             MamManager.MamQuery mamQuery = mamManager.queryArchive(mamQueryArgs);
             return mamQuery.getMessages();
         }catch (Exception ex){
+            ErrorLogFile.WriterLogs(ex.getMessage());
             return null;
         }
 
@@ -135,7 +146,8 @@ public class XMPPClass {
                 }
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
         return listMuc;
     }
@@ -166,7 +178,8 @@ public class XMPPClass {
                 chatItems.add(chatItem);
             }
         } catch (Exception e) {
-            System.out.println(e.getMessage());
+            ErrorLogFile.WriterLogs(e.getMessage());
+            //System.out.println(e.getMessage());
         }
     }
 

+ 1 - 6
app/src/main/java/com/drinkertea/test2smack/ui/main/PageViewModel.java

@@ -9,12 +9,7 @@ import androidx.lifecycle.ViewModel;
 public class PageViewModel extends ViewModel {
 
     private MutableLiveData<Integer> mIndex = new MutableLiveData<>();
-    private LiveData<String> mText = Transformations.map(mIndex, new Function<Integer, String>() {
-        @Override
-        public String apply(Integer input) {
-            return "Hello world from section: " + input;
-        }
-    });
+    private LiveData<String> mText = Transformations.map(mIndex, input -> "Hello world from section: " + input);
 
     public void setIndex(int index) {
         mIndex.setValue(index);

+ 2 - 2
app/src/main/res/layout/activity_chat.xml

@@ -28,8 +28,8 @@
                 android:layout_width="wrap_content"
                 android:maxWidth="270dp"
                 android:minWidth="260dp"
-                android:layout_height="60dp"
-                android:text="hello world" />
+                android:hint="Enter your message..."
+                android:layout_height="60dp" />
 
             <ImageButton
                 android:id="@+id/btnSendMessage"

+ 32 - 15
app/src/main/res/layout/activity_main.xml

@@ -53,7 +53,7 @@
             android:textSize="10dp"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:text="without @msg.sharix-app.org"/>
+            android:text="with domain"/>
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent">
@@ -95,9 +95,17 @@
             android:layout_height="40dp"
             android:layout_marginBottom="40dp"
             android:onClick="goToPageWithChats"
-            android:text="Sign In"
-            app:layout_constraintBottom_toTopOf="@+id/test"
+            android:text="@string/sign_in"
+            app:layout_constraintBottom_toTopOf="@+id/voice_chat_btn"
             app:layout_constraintTop_toBottomOf="@+id/ETPassword" />
+        <Button
+            android:id="@+id/voice_chat_btn"
+            android:text="Voice chat"
+            android:onClick="voiceChatActivity"
+            android:layout_width="200dp"
+            android:layout_height="40dp"
+            app:layout_constraintBottom_toTopOf="@+id/BtnConnect"
+            app:layout_constraintTop_toBottomOf="@+id/UpdateButton"/>
 
         <Button
             android:id="@+id/UpdateButton"
@@ -109,7 +117,7 @@
             android:background="@android:color/transparent"
             app:layout_constraintTop_toBottomOf="@+id/test" />
         <Button
-            android:id="@+id/testButtttttton"
+            android:id="@+id/testButton"
             android:layout_width="200dp"
             android:layout_height="40dp"
             android:textSize="10dp"
@@ -120,19 +128,28 @@
             app:layout_constraintTop_toBottomOf="@+id/test" />
     </LinearLayout>
 
-    <ImageButton
-        android:id="@+id/notifButtonSound"
-        android:onClick="notifSound"
-        android:layout_width="50dp"
-        android:layout_margin="30dp"
-
-        android:layout_height="50dp"
+    <Button
+        android:id="@+id/BtnLogs"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:background="@android:color/transparent"
-        android:src="@android:drawable/stat_notify_chat"
+        android:text="Send logs"
+        android:onClick="sendLogs"
+        android:textColor="@android:color/holo_red_dark"
+        android:textSize="10dp"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:tint="#0081FF"
-        tools:ignore="MissingConstraints" />
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/version_app"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="10dp"
+        android:text="@string/version_app"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 3 - 3
app/src/main/res/layout/activity_room.xml

@@ -42,8 +42,8 @@
             android:maxWidth="270dp"
             android:minWidth="260dp"
             android:layout_height="60dp"
-            android:inputType="textMultiLine"
-            android:text="hello world" />
+            android:hint="Enter your message..."
+            android:inputType="textMultiLine"/>
 
         <ImageButton
             android:id="@+id/btnSendMessage"
@@ -51,6 +51,6 @@
             android:background="@drawable/cornerradius"
             android:layout_width="50dp"
             android:layout_height="50dp"
-            android:onClick="sendMessage" />
+            android:onClick="sendRoomMessage" />
     </LinearLayout>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 81 - 0
app/src/main/res/layout/activity_voice_chat.xml

@@ -0,0 +1,81 @@
+<?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=".VoiceActivityChat">
+    <ScrollView
+        android:id="@+id/voiceScroll"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toTopOf="@+id/linearLayout"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <LinearLayout
+            android:id="@+id/voicesLayout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="15dp"
+            android:orientation="vertical">
+        </LinearLayout>
+    </ScrollView>
+    <LinearLayout
+        android:id="@+id/linearLayout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/cornerchat"
+        android:layout_margin="5dp"
+        android:padding="15dp"
+        android:paddingBottom="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <LinearLayout
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+            <EditText
+                android:visibility="gone"
+                android:id="@+id/voice_text_edit"
+                android:inputType="textMultiLine"
+                android:layout_width="wrap_content"
+                android:maxWidth="270dp"
+                android:minWidth="260dp"
+                android:hint="Enter your message..."
+                android:layout_marginTop="-35dp"
+                android:layout_height="60dp" />
+            <TextView
+                android:visibility="visible"
+                android:id="@+id/timerView"
+                android:textColor="@color/black"
+                android:maxWidth="270dp"
+                android:minWidth="260dp"
+                android:text="Recording goes 2:10"
+                android:layout_width="wrap_content"
+                android:layout_marginTop="-35dp"
+                android:layout_height="wrap_content"/>
+            <Button
+                android:visibility="visible"
+                android:id="@+id/btnSendVoice"
+                android:background="@drawable/cornerradius"
+                android:drawableTop="@android:drawable/ic_btn_speak_now"
+                android:layout_marginLeft="10dp"
+                android:drawableTint="@color/white"
+                android:layout_width="50dp"
+                android:layout_height="50dp" />
+            <ImageButton
+                android:visibility="gone"
+                android:id="@+id/btnSendMessage"
+                android:src="@android:drawable/ic_menu_send"
+                android:background="@drawable/cornerradius"
+                android:layout_width="50dp"
+                android:layout_height="50dp"
+                app:tint="@color/white" />
+        </LinearLayout>
+    </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -10,4 +10,6 @@
     <string name="tab_text_2">Rooms</string>
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>
+    <string name="version_app">v.22.09.11</string>
+    <string name="sign_in">Sign In</string>
 </resources>