Skip to content

Commit 8029c6c

Browse files
committed
Improved messages GUI
1 parent 8a78d19 commit 8029c6c

File tree

12 files changed

+644
-26
lines changed

12 files changed

+644
-26
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@
8585
android:launchMode="singleTask"
8686
android:theme="@style/Theme.Speech" />
8787
<activity android:name="nie.translator.rtranslator.GeneralActivity" />
88+
<activity android:name="nie.translator.rtranslator.tools.ImageActivity"
89+
android:exported="true"
90+
android:launchMode="singleTask"
91+
android:theme="@style/Theme.Speech"/>
8892

8993
<service android:name="nie.translator.rtranslator.voice_translation._conversation_mode._conversation.ConversationService"
9094
android:foregroundServiceType="microphone"/>

app/src/main/java/nie/translator/rtranslator/LoadingActivity.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import nie.translator.rtranslator.access.AccessActivity;
3030
import nie.translator.rtranslator.tools.CustomLocale;
3131
import nie.translator.rtranslator.tools.ErrorCodes;
32+
import nie.translator.rtranslator.tools.ImageActivity;
3233
import nie.translator.rtranslator.voice_translation.VoiceTranslationActivity;
3334
import nie.translator.rtranslator.voice_translation.neural_networks.NeuralNetworkApi;
3435
import nie.translator.rtranslator.voice_translation.neural_networks.translation.Translator;
@@ -37,6 +38,7 @@
3738

3839

3940
public class LoadingActivity extends GeneralActivity {
41+
private final boolean START_IMAGE = false;
4042
private Handler mainHandler;
4143
private boolean isVisible = false;
4244
private Global global;
@@ -136,12 +138,26 @@ public void onFailure(int[] reasons, long value) {
136138
}
137139

138140
private void startVoiceTranslationActivity() {
141+
if(!START_IMAGE) {
142+
startingActivity = true;
143+
Intent intent = new Intent(LoadingActivity.this, VoiceTranslationActivity.class);
144+
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
145+
startActivity(intent);
146+
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
147+
finish();
148+
}else{
149+
startImageActivity();
150+
}
151+
}
152+
153+
private void startImageActivity() {
139154
startingActivity = true;
140-
Intent intent = new Intent(LoadingActivity.this, VoiceTranslationActivity.class);
155+
Intent intent = new Intent(LoadingActivity.this, ImageActivity.class);
141156
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
142157
startActivity(intent);
143158
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
144159
finish();
160+
145161
}
146162

147163
private void notifyGoogleTTSErrorDialog() {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package nie.translator.rtranslator.tools;
2+
3+
//This activity is used only to create the images of the conversation mode in the readme
4+
5+
import android.app.Activity;
6+
import android.content.Context;
7+
import android.os.Bundle;
8+
import android.util.AttributeSet;
9+
import android.view.View;
10+
11+
import androidx.annotation.NonNull;
12+
import androidx.annotation.Nullable;
13+
import androidx.fragment.app.FragmentActivity;
14+
import androidx.recyclerview.widget.LinearLayoutManager;
15+
import androidx.recyclerview.widget.RecyclerView;
16+
17+
import java.util.ArrayList;
18+
19+
import nie.translator.rtranslator.R;
20+
import nie.translator.rtranslator.bluetooth.Message;
21+
import nie.translator.rtranslator.bluetooth.Peer;
22+
import nie.translator.rtranslator.tools.gui.messages.GuiMessage;
23+
import nie.translator.rtranslator.tools.gui.messages.MessagesAdapter;
24+
25+
public class ImageActivity extends Activity {
26+
protected MessagesAdapter mAdapter;
27+
protected RecyclerView mRecyclerView;
28+
29+
@Override
30+
protected void onCreate(@Nullable Bundle savedInstanceState) {
31+
super.onCreate(savedInstanceState);
32+
setContentView(R.layout.image_conversation);
33+
34+
View decorView = getWindow().getDecorView();
35+
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
36+
}
37+
38+
@Override
39+
protected void onStart() {
40+
super.onStart();
41+
mRecyclerView = findViewById(R.id.recycler_view);
42+
43+
ArrayList<GuiMessage> messages = new ArrayList<>();
44+
/*messages.add(new GuiMessage(new Message(this, "m", "Hello, how are you?"), true, true));
45+
messages.add(new GuiMessage(new Message(this, new Peer(null, "Carlos11", true), "m", "I'm fine"), false, true));
46+
messages.add(new GuiMessage(new Message(this, new Peer(null, "Denise12", true), "m", "Me too"), false, true));*/
47+
48+
messages.add(new GuiMessage(new Message(this, new Peer(null, "Alice10", true), "m", "¿Hola, cómo estás?"), false, true));
49+
messages.add(new GuiMessage(new Message(this, "m", "Estoy bien"), true, true));
50+
messages.add(new GuiMessage(new Message(this, new Peer(null, "Denise12", true), "m", "Yo también"), false, true));
51+
52+
/*messages.add(new GuiMessage(new Message(this, new Peer(null, "Alice10", true), "m", "Bonjour comment allez-vous?"), false, true));
53+
messages.add(new GuiMessage(new Message(this, new Peer(null, "Carlos11", true), "m", "Je vais bien"), false, true));
54+
messages.add(new GuiMessage(new Message(this, "m", "Moi aussi"), true, true));*/
55+
56+
mAdapter = new MessagesAdapter(messages, new MessagesAdapter.Callback() {
57+
@Override
58+
public void onFirstItemAdded() {
59+
mRecyclerView.setVisibility(View.VISIBLE);
60+
}
61+
});
62+
mRecyclerView.setAdapter(mAdapter);
63+
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
64+
layoutManager.setStackFromEnd(true);
65+
mRecyclerView.setLayoutManager(layoutManager);
66+
}
67+
}

app/src/main/java/nie/translator/rtranslator/tools/gui/messages/MessagesAdapter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package nie.translator.rtranslator.tools.gui.messages;
1818

19+
import android.util.Log;
1920
import android.view.LayoutInflater;
2021
import android.view.View;
2122
import android.view.ViewGroup;
@@ -70,8 +71,10 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi
7071
((ReceivedHolder) holder).text.setVisibility(View.GONE);
7172
((ReceivedHolder) holder).containerSender.setVisibility(View.VISIBLE);
7273
((ReceivedHolder) holder).sender.setText(message.getMessage().getSender().getName());
74+
Log.d("recyclerview", "RecyclerView bind sender");
7375
}
7476
((MessageHolder) holder).setText(message.getMessage().getText());
77+
Log.d("recyclerview", "RecyclerView bind text");
7578
//holder.itemView.requestLayout();
7679
}
7780
}
@@ -103,7 +106,7 @@ public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
103106

104107
@Override
105108
public boolean onFailedToRecycleView(@NonNull RecyclerView.ViewHolder holder) {
106-
return true;
109+
return super.onFailedToRecycleView(holder);
107110
}
108111

109112
public void addMessage(GuiMessage message) {
@@ -116,7 +119,8 @@ public void addMessage(GuiMessage message) {
116119

117120
public void setMessage(int index, GuiMessage message) {
118121
mResults.set(index, message);
119-
notifyItemRangeChanged(0, getItemCount());
122+
//notifyItemRangeChanged(0, getItemCount());
123+
notifyItemChanged(index);
120124
}
121125

122126
public int getMessageIndex(long messageID){

app/src/main/java/nie/translator/rtranslator/voice_translation/VoiceTranslationFragment.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import androidx.annotation.Nullable;
3232
import androidx.appcompat.app.AlertDialog;
3333
import androidx.fragment.app.Fragment;
34+
import androidx.recyclerview.widget.DefaultItemAnimator;
3435
import androidx.recyclerview.widget.LinearLayoutManager;
3536
import androidx.recyclerview.widget.LinearSmoothScroller;
3637
import androidx.recyclerview.widget.RecyclerView;
@@ -48,11 +49,11 @@
4849

4950
public abstract class VoiceTranslationFragment extends Fragment implements MicrophoneComunicable {
5051
//gui
52+
public static final int TIME_FOR_SCROLLING = 50;
5153
protected VoiceTranslationActivity activity;
5254
protected Global global;
5355
protected MessagesAdapter mAdapter;
5456
protected RecyclerView mRecyclerView;
55-
protected RecyclerView.SmoothScroller smoothScroller;
5657
protected TextView description;
5758
protected View.OnClickListener micClickListener;
5859

@@ -76,13 +77,16 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
7677
LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
7778
layoutManager.setStackFromEnd(true);
7879
mRecyclerView.setLayoutManager(layoutManager);
79-
smoothScroller = new LinearSmoothScroller(activity) {
80+
mRecyclerView.setItemAnimator(new DefaultItemAnimator(){
8081
@Override
81-
protected int calculateTimeForScrolling(int dx) {
82-
return 100;
82+
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
83+
dispatchChangeFinished(oldHolder, true);
84+
dispatchChangeFinished(newHolder, false);
85+
return true;
8386
}
84-
};
85-
//smoothScroller = new LinearSmoothScroller(activity);
87+
});
88+
//mRecyclerView.setItemAnimator(null);
89+
mRecyclerView.setHasFixedSize(true);
8690
}
8791

8892
protected abstract void connectToService();

app/src/main/java/nie/translator/rtranslator/voice_translation/_conversation_mode/_conversation/ConversationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public void onSuccess(ArrayList<CustomLocale> ttsLanguages) {
184184
speak(conversationMessage.getPayload().getText(), conversationMessage.getPayload().getLanguage());
185185
}
186186
message.setText(conversationMessage.getPayload().getText()); // updating the text with the new translated text (and without the language code)
187-
GuiMessage guiMessage = new GuiMessage(message, messageID, false, true);
187+
GuiMessage guiMessage = new GuiMessage(message, messageID, false, isFinal);
188188
notifyMessage(guiMessage);
189189
// we save every new message in the exchanged messages so that the fragment can restore them
190190
addOrUpdateMessage(guiMessage);

app/src/main/java/nie/translator/rtranslator/voice_translation/_conversation_mode/_conversation/main/ConversationMainFragment.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
import androidx.annotation.NonNull;
3535
import androidx.annotation.Nullable;
3636
import androidx.constraintlayout.widget.ConstraintLayout;
37+
import androidx.recyclerview.widget.LinearLayoutManager;
38+
import androidx.recyclerview.widget.LinearSmoothScroller;
39+
import androidx.recyclerview.widget.RecyclerView;
3740

3841
import java.util.ArrayList;
3942

@@ -476,12 +479,23 @@ public void onMessage(GuiMessage message) {
476479
if (message != null) {
477480
int messageIndex = mAdapter.getMessageIndex(message.getMessageID());
478481
if(messageIndex != -1){
479-
mAdapter.setMessage(messageIndex, message);
482+
if((!mRecyclerView.isAnimating() && !mRecyclerView.getLayoutManager().isSmoothScrolling()) || message.isFinal()) {
483+
if (message.isFinal()) {
484+
if (mRecyclerView.getItemAnimator() != null) {
485+
mRecyclerView.getItemAnimator().endAnimations();
486+
}
487+
}
488+
mAdapter.setMessage(messageIndex, message);
489+
}
480490
}else{
491+
if(mRecyclerView.getItemAnimator() != null) {
492+
mRecyclerView.getItemAnimator().endAnimations();
493+
}
481494
mAdapter.addMessage(message);
482-
//smooth scroll
483-
smoothScroller.setTargetPosition(mAdapter.getItemCount() - 1);
484-
mRecyclerView.getLayoutManager().startSmoothScroll(smoothScroller);
495+
//we do an eventual automatic scroll (only if we are at the bottom of the recyclerview)
496+
if(((LinearLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition() == mAdapter.getItemCount()-2){
497+
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1);
498+
}
485499
}
486500
}
487501
}

app/src/main/java/nie/translator/rtranslator/voice_translation/_walkie_talkie_mode/_walkie_talkie/WalkieTalkieFragment.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
import androidx.appcompat.app.AlertDialog;
4040
import androidx.appcompat.widget.AppCompatImageButton;
4141
import androidx.constraintlayout.widget.ConstraintLayout;
42+
import androidx.recyclerview.widget.LinearLayoutManager;
43+
import androidx.recyclerview.widget.LinearSmoothScroller;
44+
import androidx.recyclerview.widget.RecyclerView;
4245

4346
import java.util.ArrayList;
4447
import nie.translator.rtranslator.Global;
@@ -759,13 +762,24 @@ public void onMessage(GuiMessage message) {
759762
super.onMessage(message);
760763
if (message != null) {
761764
int messageIndex = mAdapter.getMessageIndex(message.getMessageID());
762-
if(messageIndex != -1){
763-
mAdapter.setMessage(messageIndex, message);
765+
if(messageIndex != -1) {
766+
if((!mRecyclerView.isAnimating() && !mRecyclerView.getLayoutManager().isSmoothScrolling()) || message.isFinal()) {
767+
if(message.isFinal()){
768+
if(mRecyclerView.getItemAnimator() != null) {
769+
mRecyclerView.getItemAnimator().endAnimations();
770+
}
771+
}
772+
mAdapter.setMessage(messageIndex, message);
773+
}
764774
}else{
775+
if(mRecyclerView.getItemAnimator() != null) {
776+
mRecyclerView.getItemAnimator().endAnimations();
777+
}
765778
mAdapter.addMessage(message);
766-
//smooth scroll
767-
smoothScroller.setTargetPosition(mAdapter.getItemCount() - 1);
768-
mRecyclerView.getLayoutManager().startSmoothScroll(smoothScroller);
779+
//we do an eventual automatic scroll (only if we are at the bottom of the recyclerview)
780+
if(((LinearLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition() == mAdapter.getItemCount()-2){
781+
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1);
782+
}
769783
}
770784
}
771785
}

app/src/main/java/nie/translator/rtranslator/voice_translation/_walkie_talkie_mode/_walkie_talkie/WalkieTalkieService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ public void onSuccess(ArrayList<CustomLocale> ttsLanguages) {
301301
// we save every new message in the exchanged messages so that the fragment can restore them
302302
WalkieTalkieService.super.addOrUpdateMessage(message);
303303
//if the tts is not active we restart the mic here
304-
if(tts == null || !CustomLocale.containsLanguage(ttsLanguages, languageOfText) || !tts.isActive() || isAudioMute){
304+
if(isFinal && (tts == null || !CustomLocale.containsLanguage(ttsLanguages, languageOfText) || !tts.isActive() || isAudioMute)){
305305
startVoiceRecorder();
306306
notifyMicActivated();
307307
}
@@ -344,7 +344,7 @@ public void onSuccess(ArrayList<CustomLocale> ttsLanguages) {
344344
// we save every new message in the exchanged messages so that the fragment can restore them
345345
WalkieTalkieService.super.addOrUpdateMessage(message);
346346
//if the tts is not active we restart the mic here
347-
if(tts == null || !CustomLocale.containsLanguage(ttsLanguages, languageOfText) || !tts.isActive() || isAudioMute){
347+
if(isFinal && (tts == null || !CustomLocale.containsLanguage(ttsLanguages, languageOfText) || !tts.isActive() || isAudioMute)){
348348
startVoiceRecorder();
349349
notifyMicActivated();
350350
}

app/src/main/res/layout/component_message_received.xml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@
5757
app:layout_constraintHorizontal_bias="0"
5858
app:layout_constraintStart_toStartOf="parent"
5959
app:layout_constraintTop_toTopOf="parent"
60-
tool:text="Ciao, come stai?"/>
60+
tool:text="Ciao, come stai?"
61+
tool:visibility="gone"/>
6162

6263
<LinearLayout
6364
android:id="@+id/sender_container"
6465
android:layout_width="match_parent"
6566
android:layout_height="match_parent"
6667
android:orientation="vertical"
67-
android:visibility="gone">
68+
android:visibility="gone"
69+
tool:visibility="visible">
6870

6971
<TextView
7072
android:id="@+id/text_sender"
@@ -75,7 +77,7 @@
7577
android:layout_marginEnd="16dp"
7678
android:layout_marginBottom="4dp"
7779
android:fontFamily="@font/nunito_sans"
78-
android:textColor="@color/very_dark_gray"
80+
android:textColor="@color/primary"
7981
android:textSize="12sp"
8082
android:textStyle="bold"
8183
app:layout_constraintBottom_toBottomOf="parent"
@@ -84,7 +86,7 @@
8486
app:layout_constraintStart_toStartOf="parent"
8587
app:layout_constraintTop_toTopOf="parent"
8688
app:layout_constraintVertical_bias="0"
87-
tool:text="Alice"/>
89+
tool:text="Alice" />
8890

8991
<TextView
9092
android:id="@+id/text_content2"

app/src/main/res/layout/fragment_conversation.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@
266266
style="@style/CustomCardViewStyle"
267267
android:layout_width="match_parent"
268268
android:layout_height="0dp"
269-
app:cardBackgroundColor="@color/white"
269+
app:cardBackgroundColor="@color/accent_white"
270270
app:cardElevation="0dp"
271271
app:cardPreventCornerOverlap="false"
272272
app:layout_constraintBottom_toBottomOf="parent"

0 commit comments

Comments
 (0)