From c8741e1bd447cfce9cac1943062d371602559feb Mon Sep 17 00:00:00 2001 From: Thibault Wittemberg <thibault.wittemberg@savoirfairelinux.com> Date: Mon, 21 Nov 2016 15:00:53 -0500 Subject: [PATCH] blockchain: fix send text messages to contacts found on blockchain We could not send text messages to users found via the blockchain. Only the registered username was given to the ConversationActivity. We now keep the CallContact (with its RingID) in a list in the StateService so we can find him whenever we want and contact him with its RingID. Change-Id: I16dc72c0a711989944a60cddc35fc8b72df7989a Tuleap: #1266 --- .../cx/ring/client/ConversationActivity.java | 20 ++++++++++++++++++ .../RingInjectionComponent.java | 5 ++++- .../cx/ring/fragments/SmartListFragment.java | 19 ++++++++++------- .../main/java/cx/ring/model/CallContact.java | 11 ++++++++++ .../java/cx/ring/services/StateService.java | 21 +++++++++++++++++++ 5 files changed, 67 insertions(+), 9 deletions(-) diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java index 685f3d723..b2e344e4e 100644 --- a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java +++ b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java @@ -55,10 +55,13 @@ import android.widget.TextView; import java.util.List; +import javax.inject.Inject; + import cx.ring.R; import cx.ring.adapters.ContactDetailsTask; import cx.ring.adapters.ConversationAdapter; import cx.ring.adapters.NumberAdapter; +import cx.ring.application.RingApplication; import cx.ring.model.Account; import cx.ring.model.CallContact; import cx.ring.model.Conference; @@ -66,6 +69,7 @@ import cx.ring.model.Conversation; import cx.ring.model.Phone; import cx.ring.model.Uri; import cx.ring.service.LocalService; +import cx.ring.services.StateService; import cx.ring.utils.ActionHelper; import cx.ring.utils.ClipboardHelper; import cx.ring.utils.ContentUriHandler; @@ -74,6 +78,10 @@ public class ConversationActivity extends AppCompatActivity implements Conversation.ConversationActionCallback, ClipboardHelper.ClipboardHelperCallback, ContactDetailsTask.DetailsLoadedCallback { + + @Inject + StateService mStateService; + private static final String TAG = ConversationActivity.class.getSimpleName(); private static final String CONVERSATION_DELETE = "CONVERSATION_DELETE"; @@ -106,6 +114,7 @@ public class ConversationActivity extends AppCompatActivity implements String conv_id = i.getData().getLastPathSegment(); Uri number = new Uri(i.getStringExtra("number")); + Log.d(TAG, "getConversation " + conv_id + " " + number); Conversation conv = s.getConversation(conv_id); if (conv == null) { @@ -154,6 +163,7 @@ public class ConversationActivity extends AppCompatActivity implements Pair<Conversation, Uri> conv = getConversation(mService, getIntent()); mConversation = conv.first; mPreferredNumber = conv.second; + if (mConversation == null) { finish(); return; @@ -161,6 +171,13 @@ public class ConversationActivity extends AppCompatActivity implements ActionBar ab = getSupportActionBar(); if (ab != null) { + if (!mConversation.getContact().getPhones().isEmpty()) { + CallContact contact = mStateService.getContact(mConversation.getContact().getPhones().get(0).getNumber()); + if (contact != null) { + mConversation.setContact(contact); + } + } + ab.setTitle(mConversation.getContact().getDisplayName()); } @@ -285,6 +302,9 @@ public class ConversationActivity extends AppCompatActivity implements getSupportActionBar().setDisplayHomeAsUpEnabled(true); + // Dependency injection + ((RingApplication) getApplication()).getRingInjectionComponent().inject(this); + mMsgEditTxt = (EditText) findViewById(R.id.msg_input_txt); mMsgEditTxt.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java index 679e0d808..7bdd4f687 100755 --- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java +++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java @@ -24,7 +24,9 @@ import javax.inject.Singleton; import cx.ring.about.AboutFragment; import cx.ring.about.AboutPresenter; import cx.ring.application.RingApplication; +import cx.ring.client.ConversationActivity; import cx.ring.fragments.SmartListFragment; +import cx.ring.navigation.RingNavigationFragment; import cx.ring.service.BootReceiver; import cx.ring.service.LocalService; import cx.ring.services.HistoryServiceImpl; @@ -33,7 +35,6 @@ import cx.ring.settings.SettingsFragment; import cx.ring.settings.SettingsPresenter; import cx.ring.share.ShareFragment; import cx.ring.share.SharePresenter; -import cx.ring.navigation.RingNavigationFragment; import dagger.Component; @Singleton @@ -43,6 +44,8 @@ public interface RingInjectionComponent { void inject(RingNavigationFragment view); + void inject(ConversationActivity activity); + void inject(AboutFragment fragment); void inject(SmartListFragment fragment); diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java index 5406aa97e..00becc8f2 100644 --- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java +++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java @@ -134,7 +134,6 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex @Inject StateService mStateService; - final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -313,12 +312,12 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex if (currentAccount.isSip()) { // sip search - displayNewContactRowWithName(query); + displayNewContactRowWithName(query, null); } else { Uri uri = new Uri(query); if (uri.isRingId()) { - displayNewContactRowWithName(query); + displayNewContactRowWithName(query, null); } else { mNewContact.setVisibility(View.GONE); } @@ -428,6 +427,10 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex mSearchMenuItem.collapseActionView(); } + // We add the contact to the current State so that we can + // get it from whatever part of the app as "an already used contact" + mStateService.addContact(c); + Intent intent = new Intent() .setClass(getActivity(), ConversationActivity.class) .setAction(Intent.ACTION_VIEW) @@ -721,12 +724,12 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex @Override public void onFound(String name, String address) { - displayNewContactRowWithName(name); + displayNewContactRowWithName(name, address); } - private void displayNewContactRowWithName(String name) { + private void displayNewContactRowWithName(String name, String address) { ((TextView) mNewContact.findViewById(R.id.display_name)).setText(name); - CallContact contact = CallContact.buildUnknown(name); + CallContact contact = CallContact.buildUnknown(name, address); mNewContact.setTag(contact); mNewContact.setVisibility(View.VISIBLE); } @@ -735,7 +738,7 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex public void onInvalidName(String name) { Uri uri = new Uri(name); if (uri.isRingId()) { - displayNewContactRowWithName(name); + displayNewContactRowWithName(name, null); } else { mNewContact.setVisibility(View.GONE); } @@ -745,7 +748,7 @@ public class SmartListFragment extends Fragment implements SearchView.OnQueryTex public void onError(String name, String address) { Uri uri = new Uri(address); if (uri.isRingId()) { - displayNewContactRowWithName(address); + displayNewContactRowWithName(name, address); } else { mNewContact.setVisibility(View.GONE); } diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/CallContact.java b/ring-android/libringclient/src/main/java/cx/ring/model/CallContact.java index 583280624..64a733070 100644 --- a/ring-android/libringclient/src/main/java/cx/ring/model/CallContact.java +++ b/ring-android/libringclient/src/main/java/cx/ring/model/CallContact.java @@ -69,6 +69,17 @@ public class CallContact { return new CallContact(UNKNOWN_ID, null, to, 0, phones, "", false); } + public static CallContact buildUnknown(String to, String address) { + ArrayList<Phone> phones = new ArrayList<>(); + if (address != null) { + phones.add(new Phone(address, 0)); + } else { + phones.add(new Phone(to, 0)); + } + + return new CallContact(UNKNOWN_ID, null, to, 0, phones, "", false); + } + public static CallContact buildUnknown(String to, int type) { ArrayList<Phone> phones = new ArrayList<>(); phones.add(new Phone(to, type)); diff --git a/ring-android/libringclient/src/main/java/cx/ring/services/StateService.java b/ring-android/libringclient/src/main/java/cx/ring/services/StateService.java index e19303413..0c0ea3ccb 100644 --- a/ring-android/libringclient/src/main/java/cx/ring/services/StateService.java +++ b/ring-android/libringclient/src/main/java/cx/ring/services/StateService.java @@ -19,15 +19,21 @@ */ package cx.ring.services; +import java.util.HashMap; +import java.util.Map; import java.util.Observable; import cx.ring.model.Account; +import cx.ring.model.CallContact; +import cx.ring.model.Uri; public class StateService extends Observable { private Account mCurrentAccount; + private Map<String, CallContact> mContacts; public StateService() { + mContacts = new HashMap<>(); } public Account getCurrentAccount() { @@ -39,4 +45,19 @@ public class StateService extends Observable { setChanged(); notifyObservers(); } + + public void addContact(CallContact contact) { + if (contact == null + || contact.getPhones().isEmpty() + || contact.getPhones().get(0) == null + || contact.getPhones().get(0).getNumber() == null) { + return; + } + mContacts.put(contact.getPhones().get(0).getNumber().toString(), contact); + } + + public CallContact getContact(Uri uri) { + return mContacts.get(uri.toString()); + } + } -- GitLab