diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml index 321aa684881dcd2a94e1ec5e4a3d1c798d0c9dbd..999fbc01c47f3fd68c6470522a30fcf7cafe6ee9 100644 --- a/ring-android/app/src/main/AndroidManifest.xml +++ b/ring-android/app/src/main/AndroidManifest.xml @@ -158,7 +158,7 @@ as that of the covered work. android:label="@string/app_name" android:parentActivityName=".client.HomeActivity" android:screenOrientation="portrait" - android:theme="@style/AppThemeWithoutOverlay" + android:theme="@style/AppThemeWithoutOverlayCompat" android:windowSoftInputMode="adjustResize" > </activity> 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 23fcf437f647b85491248d58c01342f51048eeff..a493abdf6f2479b600adab2d7e24f516be1b9d86 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 @@ -1,6 +1,25 @@ +/* + * Copyright (C) 2015 Savoir-faire Linux Inc. + * + * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + package cx.ring.client; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -11,18 +30,23 @@ import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; +import android.support.v7.app.AppCompatActivity; import android.text.format.DateUtils; import android.util.Log; +import android.util.Pair; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; +import android.widget.Spinner; import android.widget.TextView; import java.text.DateFormat; @@ -38,11 +62,12 @@ import cx.ring.model.CallContact; import cx.ring.model.Conference; import cx.ring.model.Conversation; import cx.ring.model.SipCall; +import cx.ring.model.SipUri; import cx.ring.model.TextMessage; import cx.ring.model.account.Account; import cx.ring.service.LocalService; -public class ConversationActivity extends Activity { +public class ConversationActivity extends AppCompatActivity { private static final String TAG = ConversationActivity.class.getSimpleName(); public static final Uri CONTENT_URI = Uri.withAppendedPath(LocalService.AUTHORITY_URI, "conversations"); @@ -52,13 +77,14 @@ public class ConversationActivity extends Activity { private Conversation conversation = null; private String preferredNumber = null; - private ListView histList = null; private View msgSendBtn = null; private EditText msgEditTxt = null; private ViewGroup bottomPane = null; + private Spinner numberSpinner = null; private ConversationAdapter adapter = null; + private NumberAdapter numberAdapter = null; private ServiceConnection mConnection = new ServiceConnection() { @Override @@ -98,7 +124,7 @@ public class ConversationActivity extends Activity { return; } - getActionBar().setTitle(conversation.getContact().getDisplayName()); + getSupportActionBar().setTitle(conversation.getContact().getDisplayName()); Conference conf = conversation.getCurrentCall(); bottomPane.setVisibility(conf == null ? View.GONE : View.VISIBLE); @@ -113,8 +139,27 @@ public class ConversationActivity extends Activity { } adapter.updateDataset(conversation.getHistory()); + + if (conversation.getContact().getPhones().size() > 1) { + numberAdapter = new NumberAdapter(ConversationActivity.this, conversation.getContact()); + numberSpinner.setAdapter(numberAdapter); + if (preferredNumber == null || preferredNumber.isEmpty()) { + preferredNumber = CallContact.canonicalNumber(conversation.getLastNumberUsed(conversation.getLastAccountUsed())); + } + numberSpinner.setSelection(getIndex(numberSpinner, preferredNumber)); + } else { + numberSpinner.setVisibility(View.GONE); + } + scrolltoBottom(); } + private int getIndex(Spinner spinner, String myString) + { + for (int i=0, n=spinner.getCount();i<n;i++) + if (((CallContact.Phone)spinner.getItemAtPosition(i)).getNumber().equalsIgnoreCase(myString)) + return i; + return 0; + } @Override public void onServiceDisconnected(ComponentName arg0) { @@ -142,6 +187,18 @@ public class ConversationActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.frag_conversation); msgEditTxt = (EditText) findViewById(R.id.msg_input_txt); + msgEditTxt.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + switch (actionId) { + case EditorInfo.IME_ACTION_SEND: + onSendTextMessage(msgEditTxt.getText().toString()); + msgEditTxt.setText(""); + return true; + } + return false; + } + }); msgSendBtn = findViewById(R.id.msg_send); msgSendBtn.setOnClickListener(new View.OnClickListener() { @Override @@ -159,6 +216,8 @@ public class ConversationActivity extends Activity { histList = (ListView) findViewById(R.id.hist_list); histList.setAdapter(adapter); + numberSpinner = (Spinner) findViewById(R.id.number_selector); + if (!mBound) { Log.i(TAG, "onCreate: Binding service..."); Intent intent = new Intent(this, LocalService.class); @@ -177,6 +236,67 @@ public class ConversationActivity extends Activity { }); } + private class NumberAdapter extends BaseAdapter { + final private Context context; + private ArrayList<CallContact.Phone> numbers; + + NumberAdapter(Context context, CallContact c) { + this.context = context; + numbers = c.getPhones(); + } + + public void updateDataset(CallContact c) { + numbers = c.getPhones(); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return numbers.size(); + } + + @Override + public Object getItem(int position) { + return numbers.get(position); + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) + convertView = LayoutInflater.from(context).inflate(R.layout.item_number_selected, null); + + CallContact.Phone number = numbers.get(position); + + ImageView numberIcon = (ImageView) convertView.findViewById(R.id.number_icon); + numberIcon.setImageResource(new SipUri(number.getNumber()).isRingId() ? R.drawable.ring_logo_24dp : R.drawable.ic_dialer_sip_black_24dp); + + return convertView; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + if (convertView == null) + convertView = LayoutInflater.from(context).inflate(R.layout.item_number, null); + + CallContact.Phone number = numbers.get(position); + + TextView numberTxt = (TextView) convertView.findViewById(R.id.number_txt); + TextView numberLabelTxt = (TextView) convertView.findViewById(R.id.number_label_txt); + ImageView numberIcon = (ImageView) convertView.findViewById(R.id.number_icon); + + numberTxt.setText(number.getNumber()); + numberLabelTxt.setText(number.getTypeString(context.getResources())); + numberIcon.setImageResource(new SipUri(number.getNumber()).isRingId() ? R.drawable.ring_logo_24dp : R.drawable.ic_dialer_sip_black_24dp); + + return convertView; + } + } + private class ConversationAdapter extends BaseAdapter { final private Context context; final private ArrayList<Conversation.ConversationElement> texts = new ArrayList<>(); @@ -334,20 +454,24 @@ public class ConversationActivity extends Activity { // overridePendingTransition(R.anim.slide_down, R.anim.slide_up); } - private void onSendTextMessage(String txt) { + private Pair<Account, String> guess() { + Account a = service.getAccount(conversation.getLastAccountUsed()); + String number = numberAdapter == null ? conversation.contact.getPhones().get(0).getNumber() : CallContact.canonicalNumber(((CallContact.Phone) numberSpinner.getSelectedItem()).getNumber()); + if (a == null) + a = service.guessAccount(conversation.getContact(), number); + if (number == null || number.isEmpty()) + number = conversation.getLastNumberUsed(a.getAccountID()); + if (number == null || number.isEmpty()) + number = conversation.contact.getPhones().get(0).getNumber(); + return new Pair<>(a, number); + } - Conference conf = conversation.getCurrentCall(); + private void onSendTextMessage(String txt) { + Conference conf = conversation == null ? null : conversation.getCurrentCall(); if (conf == null || !conf.isOnGoing()) { - String account = conversation.getLastAccountUsed(); - if (account == null || account.isEmpty()) - account = service.guessAccount(conversation.getContact(), conversation.contact.getPhones().get(0).getNumber()).getAccountID(); - String number = preferredNumber; - if (number == null || number.isEmpty()) - number = conversation.getLastNumberUsed(account); - if (number == null || number.isEmpty()) - number = conversation.contact.getPhones().get(0).getNumber(); + Pair<Account, String> g = guess(); try { - service.getRemoteService().sendAccountTextMessage(account, CallContact.canonicalNumber(number), txt); + service.getRemoteService().sendAccountTextMessage(g.first.getAccountID(), g.second, txt); } catch (RemoteException e) { e.printStackTrace(); } @@ -366,45 +490,10 @@ public class ConversationActivity extends Activity { startActivity(new Intent(ConversationActivity.this.getApplicationContext(), CallActivity.class).putExtra("conference", conversation.getCurrentCall())); return; } + CallContact contact = conversation.getContact(); + Pair<Account, String> g = guess(); - if (service.getAccounts().isEmpty()) { - //createNotRegisteredDialog().show(); - return; - } - - Account usedAccount = null; - CallContact contact = null; - if (conversation != null) { - String last_used = conversation.getLastAccountUsed(); - Account a = service.getAccount(last_used); - if (a != null/* && a.isEnabled()*/) - usedAccount = a; - else { - Set<String> acc_ids = conversation.getAccountsUsed(); - for (Account acc : service.getAccounts()) { - if (acc_ids.contains(acc.getAccountID())) { - usedAccount = acc; - break; - } - } - } - contact = conversation.getContact(); - } - - String number = preferredNumber; - if (usedAccount != null) { - if (number == null) - number = conversation.getLastNumberUsed(usedAccount.getAccountID()); - if (number == null && contact != null) - number = contact.getPhones().get(0).getNumber(); - } else { - if (number == null && contact != null) - number = contact.getPhones().get(0).getNumber(); - usedAccount = service.guessAccount(contact, number); - } - number = CallContact.canonicalNumber(number); - - SipCall call = new SipCall(null, usedAccount.getAccountID(), number, SipCall.Direction.OUTGOING); + SipCall call = new SipCall(null, g.first.getAccountID(), g.second, SipCall.Direction.OUTGOING); call.setContact(contact); try { diff --git a/ring-android/app/src/main/java/cx/ring/loaders/ContactsLoader.java b/ring-android/app/src/main/java/cx/ring/loaders/ContactsLoader.java index 961f4e5f02fe65409c0193c994d8d27ec6f48f12..0a08ba3da47ee29b52b66faf1b5f1cdd88702775 100644 --- a/ring-android/app/src/main/java/cx/ring/loaders/ContactsLoader.java +++ b/ring-android/app/src/main/java/cx/ring/loaders/ContactsLoader.java @@ -49,7 +49,7 @@ public class ContactsLoader extends AsyncTaskLoader<ContactsLoader.Result> static private final String[] CONTACTS_ID_PROJECTION = new String[] { Contacts._ID }; static private final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.STARRED}; - static private final String[] CONTACTS_SIP_PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.Data.MIMETYPE, SipAddress.SIP_ADDRESS, SipAddress.TYPE }; + static private final String[] CONTACTS_SIP_PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.Data.MIMETYPE, SipAddress.SIP_ADDRESS, SipAddress.TYPE, SipAddress.LABEL }; static private final String SELECT = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))"; private final Uri baseUri; @@ -130,6 +130,7 @@ public class ContactsLoader extends AsyncTaskLoader<ContactsLoader.Result> final int iMime = c.getColumnIndex(ContactsContract.Data.MIMETYPE); final int iNumber = c.getColumnIndex(SipAddress.SIP_ADDRESS); final int iType = c.getColumnIndex(SipAddress.TYPE); + final int iLabel = c.getColumnIndex(SipAddress.LABEL); while (c.moveToNext()) { long id = c.getLong(iID); CallContact contact = cache.get(id); @@ -145,7 +146,7 @@ public class ContactsLoader extends AsyncTaskLoader<ContactsLoader.Result> contact.addPhoneNumber(c.getString(iNumber), c.getInt(iType)); } else { //Log.w(TAG, "SIP Phone for " + id + " :" + cSip.getString(iNumber)); - contact.addNumber(c.getString(iNumber), c.getInt(iType), CallContact.NumberType.SIP); + contact.addNumber(c.getString(iNumber), c.getInt(iType), c.getString(iLabel), CallContact.NumberType.SIP); } } c.close(); diff --git a/ring-android/app/src/main/java/cx/ring/loaders/HistoryLoader.java b/ring-android/app/src/main/java/cx/ring/loaders/HistoryLoader.java index 7606f2f85e71ae5697504f72b53e0e09a8067a88..c33bc3651a9182a0acafa704aa9d17b5aef48397 100644 --- a/ring-android/app/src/main/java/cx/ring/loaders/HistoryLoader.java +++ b/ring-android/app/src/main/java/cx/ring/loaders/HistoryLoader.java @@ -83,7 +83,7 @@ public class HistoryLoader extends AsyncTaskLoader<ArrayList<HistoryEntry>> { if (result.moveToFirst()) { builder.startNewContact(result.getLong(iID), result.getString(iKey), result.getString(iName), result.getLong(iPhoto)); - builder.addPhoneNumber(call.getNumber(), 0); + builder.addPhoneNumber(call.getNumber(), 0, null); contact = builder.build(); } else { contact = CallContact.ContactBuilder.buildUnknownContact(call.getNumber()); diff --git a/ring-android/app/src/main/java/cx/ring/model/CallContact.java b/ring-android/app/src/main/java/cx/ring/model/CallContact.java index 90edf823e42f01201865d1da46c4c39984c09dff..396cf20fac647b6f46b983f1179faef4948a0871 100644 --- a/ring-android/app/src/main/java/cx/ring/model/CallContact.java +++ b/ring-android/app/src/main/java/cx/ring/model/CallContact.java @@ -36,11 +36,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; +import android.provider.ContactsContract; import android.provider.ContactsContract.Profile; +import android.provider.ContactsContract.CommonDataKinds.Phone; import android.support.annotation.NonNull; public class CallContact implements Parcelable { @@ -80,7 +84,9 @@ public class CallContact implements Parcelable { this.photo_id = photo_id; } - public static String canonicalNumber(@NonNull String number) { + public static String canonicalNumber(String number) { + if (number == null || number.isEmpty()) + return null; return new SipUri(number).getRawUriString(); } @@ -200,13 +206,13 @@ public class CallContact implements Parcelable { return this; } - public ContactBuilder addPhoneNumber(String num, int type) { - phones.add(new Phone(num, type)); + public ContactBuilder addPhoneNumber(String num, int type, String label) { + phones.add(new Phone(num, type, label)); return this; } - public ContactBuilder addSipNumber(String num, int type) { - phones.add(new Phone(num, type, NumberType.SIP)); + public ContactBuilder addSipNumber(String num, int type, String label) { + phones.add(new Phone(num, type, label, NumberType.SIP)); return this; } @@ -316,15 +322,22 @@ public class CallContact implements Parcelable { NumberType ntype; String number; int category; // Home, work, custom etc. + String label; public Phone(String num, int cat) { + this(num, cat, null); + } + + public Phone(String num, int cat, String label) { ntype = NumberType.UNKNOWN; category = cat; number = num; + this.label = label; } - public Phone(String num, int cat, NumberType nty) { + public Phone(String num, int cat, String label, NumberType nty) { ntype = nty; number = num; + this.label = label; category = cat; } @@ -378,14 +391,17 @@ public class CallContact implements Parcelable { this.number = number; } + public CharSequence getTypeString(Resources r) { + return ContactsContract.CommonDataKinds.Phone.getTypeLabel(r, category, label); + } } public void addPhoneNumber(String tel, int car) { phones.add(new Phone(tel, car)); } - public void addNumber(String tel, int cat, NumberType type) { - phones.add(new Phone(tel, cat, type)); + public void addNumber(String tel, int cat, String label, NumberType type) { + phones.add(new Phone(tel, cat, label, type)); } diff --git a/ring-android/app/src/main/java/cx/ring/service/LocalService.java b/ring-android/app/src/main/java/cx/ring/service/LocalService.java index 540cd5b7377121a9f68da0516df84dc21bec581c..fcce36791b48b4bbffc85819d736ec41a4839454 100644 --- a/ring-android/app/src/main/java/cx/ring/service/LocalService.java +++ b/ring-android/app/src/main/java/cx/ring/service/LocalService.java @@ -415,11 +415,13 @@ public class LocalService extends Service { private static final String[] CONTACTS_PHONES_PROJECTION = { ContactsContract.CommonDataKinds.Phone.NUMBER, - ContactsContract.CommonDataKinds.Phone.TYPE + ContactsContract.CommonDataKinds.Phone.TYPE, + ContactsContract.CommonDataKinds.Phone.LABEL }; private static final String[] CONTACTS_SIP_PROJECTION = { ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS, - ContactsContract.CommonDataKinds.SipAddress.TYPE + ContactsContract.CommonDataKinds.SipAddress.TYPE, + ContactsContract.CommonDataKinds.SipAddress.LABEL }; private static final String ID_SELECTION = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?"; @@ -434,8 +436,9 @@ public class LocalService extends Service { if (cPhones != null) { final int iNum = cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); final int iType = cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); + final int iLabel = cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL); while (cPhones.moveToNext()) { - c.addNumber(cPhones.getString(iNum), cPhones.getInt(iType), CallContact.NumberType.TEL); + c.addNumber(cPhones.getString(iNum), cPhones.getInt(iType), cPhones.getString(iLabel), CallContact.NumberType.TEL); Log.w(TAG,"Phone:"+cPhones.getString(cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); } cPhones.close(); @@ -450,8 +453,9 @@ public class LocalService extends Service { if (cSip != null) { final int iSip = cSip.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS); final int iType = cSip.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.TYPE); + final int iLabel = cSip.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.LABEL); while (cSip.moveToNext()) { - c.addNumber(cSip.getString(iSip), cSip.getInt(iType), CallContact.NumberType.SIP); + c.addNumber(cSip.getString(iSip), cSip.getInt(iType), cSip.getString(iLabel), CallContact.NumberType.SIP); Log.w(TAG, "SIP phone:" + cSip.getString(iSip)); } cSip.close(); diff --git a/ring-android/app/src/main/res/drawable-hdpi/ic_dialer_sip_black_24dp.png b/ring-android/app/src/main/res/drawable-hdpi/ic_dialer_sip_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6d9dce93bb37793f2a9ff6414c92b5ffafc036 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-hdpi/ic_dialer_sip_black_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-hdpi/ring_logo_24dp.png b/ring-android/app/src/main/res/drawable-hdpi/ring_logo_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1063e67f0fcb59c4bee85130231884584de0491e Binary files /dev/null and b/ring-android/app/src/main/res/drawable-hdpi/ring_logo_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-mdpi/ic_dialer_sip_black_24dp.png b/ring-android/app/src/main/res/drawable-mdpi/ic_dialer_sip_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b5a27d074870c11f892129fd553b76be6ae680 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-mdpi/ic_dialer_sip_black_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-mdpi/ring_logo_24dp.png b/ring-android/app/src/main/res/drawable-mdpi/ring_logo_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0d86cb5577a4b06325d04049e3f3a0bdfb0aecc5 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-mdpi/ring_logo_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xhdpi/ic_dialer_sip_black_24dp.png b/ring-android/app/src/main/res/drawable-xhdpi/ic_dialer_sip_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..44b147019545c72f7f51b0aab1a2d0cdde31df51 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xhdpi/ic_dialer_sip_black_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xhdpi/ring_logo_24dp.png b/ring-android/app/src/main/res/drawable-xhdpi/ring_logo_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d2ba6195e945c17bf6a0a408aa59f320b805ec Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xhdpi/ring_logo_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xxhdpi/ic_dialer_sip_black_24dp.png b/ring-android/app/src/main/res/drawable-xxhdpi/ic_dialer_sip_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d911ebd45fc28187891eb07bf35e1dd443f14d50 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xxhdpi/ic_dialer_sip_black_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xxhdpi/ring_logo_24dp.png b/ring-android/app/src/main/res/drawable-xxhdpi/ring_logo_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..699178539d3e7aa506af1c600db652b8d76e7bcd Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xxhdpi/ring_logo_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xxxhdpi/ic_dialer_sip_black_24dp.png b/ring-android/app/src/main/res/drawable-xxxhdpi/ic_dialer_sip_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d458d5d4b27d4dff907a86188208766534549d65 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xxxhdpi/ic_dialer_sip_black_24dp.png differ diff --git a/ring-android/app/src/main/res/drawable-xxxhdpi/ring_logo_24dp.png b/ring-android/app/src/main/res/drawable-xxxhdpi/ring_logo_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e90ea019e490c6edb5765508fb55dea6f006d3 Binary files /dev/null and b/ring-android/app/src/main/res/drawable-xxxhdpi/ring_logo_24dp.png differ diff --git a/ring-android/app/src/main/res/layout/frag_conversation.xml b/ring-android/app/src/main/res/layout/frag_conversation.xml index b2f8ee6a7a9fac796acce38d67289d5b57d4efb3..6b44ebb6687c959e5d7758b1e67dcaf92b01f93b 100644 --- a/ring-android/app/src/main/res/layout/frag_conversation.xml +++ b/ring-android/app/src/main/res/layout/frag_conversation.xml @@ -1,68 +1,83 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" - android:orientation="vertical" android:layout_width="match_parent" + android:layout_width="match_parent" android:layout_height="match_parent" + android:orientation="vertical" tools:context=".client.ConversationActivity"> <ListView - android:layout_width="match_parent" - android:layout_height="match_parent" android:id="@+id/hist_list" + android:layout_width="match_parent" + android:layout_height="0dp" android:layout_weight="1" - android:transcriptMode="alwaysScroll" - android:stackFromBottom="true" - android:divider="@null" android:background="#ebeff0" + android:clipToPadding="false" + android:divider="@null" android:listSelector="@android:color/transparent" + android:paddingBottom="8dp" + android:paddingTop="8dp" + android:stackFromBottom="true" + android:transcriptMode="alwaysScroll" tools:listitem="@layout/item_textmsg" /> <RelativeLayout + android:id="@+id/ongoingcall_pane" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:background="#e3c1c1" - android:id="@+id/ongoingcall_pane"> + android:background="#e3c1c1"> <TextView + android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="Ongoing call" - android:id="@+id/textView2" - android:layout_centerVertical="true" android:layout_centerHorizontal="true" - android:layout_margin="10dp" /> + android:layout_centerVertical="true" + android:layout_margin="10dp" + android:text="@string/ongoing_call" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/text_color_primary" /> </RelativeLayout> <ImageView + android:id="@+id/divider" android:layout_width="fill_parent" android:layout_height="1dp" - android:id="@+id/divider" android:layout_gravity="center_horizontal" android:background="#bdbdbd" /> <LinearLayout - android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="48dp" android:background="@android:color/white" - android:elevation="6dp"> + android:orientation="horizontal"> + + <Spinner + android:id="@+id/number_selector" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + tools:listitem="@layout/item_number_selected" + android:visibility="visible" /> <EditText - android:layout_width="match_parent" - android:layout_height="wrap_content" android:id="@+id/msg_input_txt" - android:layout_weight="1" /> + android:layout_width="0dp" + android:layout_height="fill_parent" + android:layout_weight="1" + android:hyphenationFrequency="normal" + android:imeOptions="actionSend" + android:inputType="textShortMessage" /> <ImageButton + android:id="@+id/msg_send" android:layout_width="wrap_content" android:layout_height="fill_parent" - android:id="@+id/msg_send" - android:src="@drawable/ic_send_black_24dp" - android:tint="@android:color/darker_gray" android:background="@android:color/transparent" - android:padding="8dp" /> + android:contentDescription="@string/send_message" + android:padding="8dp" + android:src="@drawable/ic_send_black_24dp" + android:tint="@android:color/darker_gray" /> </LinearLayout> </LinearLayout> \ No newline at end of file diff --git a/ring-android/app/src/main/res/layout/item_number.xml b/ring-android/app/src/main/res/layout/item_number.xml new file mode 100644 index 0000000000000000000000000000000000000000..755a4c0fcf8ff70cb31233a323530fcb05222881 --- /dev/null +++ b/ring-android/app/src/main/res/layout/item_number.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright (C) 2004-2015 Savoir-Faire Linux Inc. + +Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +--> + +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/call_entry" + android:layout_width="match_parent" + android:layout_height="56dp" + android:descendantFocusability="blocksDescendants" + android:padding="8dp"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/number_icon" + android:layout_alignParentLeft="true" + android:src="@drawable/ic_dialer_sip_black_24dp" + android:layout_alignParentStart="true" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:layout_alignParentTop="false" + android:layout_centerVertical="true" /> + + <TextView + android:id="@+id/number_txt" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:marqueeRepeatLimit="marquee_forever" + android:scrollHorizontally="true" + android:singleLine="true" + android:textSize="16sp" + android:textColor="@color/text_color_primary" + android:layout_marginTop="2dp" + android:layout_toRightOf="@+id/number_icon" + android:text="+15142792035" + android:layout_alignParentTop="true" /> + + <TextView + android:id="@+id/number_label_txt" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:textSize="12sp" + android:textColor="@color/text_color_secondary" + android:text="Inde" + android:layout_below="@+id/number_txt" + android:layout_toRightOf="@+id/number_icon" + android:layout_toEndOf="@+id/imageView4" /> + +</RelativeLayout> \ No newline at end of file diff --git a/ring-android/app/src/main/res/layout/item_number_selected.xml b/ring-android/app/src/main/res/layout/item_number_selected.xml new file mode 100644 index 0000000000000000000000000000000000000000..4314742fb5b7573311a6ead0cbb5c02db178c319 --- /dev/null +++ b/ring-android/app/src/main/res/layout/item_number_selected.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright (C) 2004-2015 Savoir-Faire Linux Inc. + +Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +--> + +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/call_entry" + android:layout_width="wrap_content" + android:layout_height="56dp" + android:descendantFocusability="blocksDescendants" + android:padding="8dp"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/number_icon" + android:layout_alignParentLeft="true" + android:src="@drawable/ic_dialer_sip_black_24dp" + android:layout_alignParentStart="true" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:layout_alignParentTop="false" + android:layout_centerVertical="true" /> + +</RelativeLayout> \ No newline at end of file diff --git a/ring-android/app/src/main/res/menu/conversation_actions.xml b/ring-android/app/src/main/res/menu/conversation_actions.xml index 601faf44d7e9779241922a3423d6e2fc93389f74..9d7f1c98a7e90848c209b7309f534f04f5e636a2 100644 --- a/ring-android/app/src/main/res/menu/conversation_actions.xml +++ b/ring-android/app/src/main/res/menu/conversation_actions.xml @@ -5,11 +5,11 @@ android:id="@+id/conv_action_videocall" android:icon="@drawable/ic_videocam_white_24dp" android:title="Video call" - android:showAsAction="always" + app:showAsAction="always" /> <item android:id="@+id/conv_action_audiocall" android:icon="@drawable/ic_call_white_24dp" android:title="Audio call" - android:showAsAction="always"/> + app:showAsAction="always"/> </menu> \ No newline at end of file diff --git a/ring-android/app/src/main/res/values/strings.xml b/ring-android/app/src/main/res/values/strings.xml index e727e9b39f08e6b02d42a8d0b00e390adcc88cf9..ce6280c63ed9f1eecc077006d7647c8bca3f56c2 100644 --- a/ring-android/app/src/main/res/values/strings.xml +++ b/ring-android/app/src/main/res/values/strings.xml @@ -117,6 +117,7 @@ as that of the covered work. <string name="copyright">Copyright \u00A9 2004–2015 Savoir-Faire Linux Inc.</string> <string name="web_site">Website</string> <string name="help_gestures"> This view will help users with different interactions during calls. Different actions will be described; Long press, fling, swype etc.</string> + <string name="ongoing_call">Ongoing call</string> <string name="hist_in_call">Incoming call of %1$s</string> <string name="hist_out_call">Outgoing call of %1$s</string>