diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 102c1d5c3..9a8b01131 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -6,7 +6,7 @@ false sip.linphone.org stun.linphone.org - true + false https://www.linphone.org/wizard.php diff --git a/src/org/linphone/Contact.java b/src/org/linphone/Contact.java index 803799d9a..e1a0128a1 100644 --- a/src/org/linphone/Contact.java +++ b/src/org/linphone/Contact.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import org.linphone.compatibility.Compatibility; +import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneFriend; @@ -42,6 +43,7 @@ public class Contact implements Serializable { private transient Bitmap photo; private List numbersOrAddresses; private boolean hasFriends; + private LinphoneAddress address; public Contact(String id, String name) { super(); @@ -50,8 +52,19 @@ public class Contact implements Serializable { this.photoUri = null; this.thumbnailUri = null; this.hasFriends = false; + this.address = null; } - + + public Contact(String id, LinphoneAddress address) { + super(); + this.id = id; + this.name = LinphoneUtils.getAddressDisplayName(address); + this.photoUri = null; + this.thumbnailUri = null; + this.address = address; + + } + public Contact(String id, String name, Uri photo, Uri thumbnail) { super(); this.id = id; @@ -60,6 +73,7 @@ public class Contact implements Serializable { this.thumbnailUri = thumbnail; this.photo = null; this.hasFriends = false; + this.address = null; } public Contact(String id, String name, Uri photo, Uri thumbnail, Bitmap picture) { @@ -70,6 +84,7 @@ public class Contact implements Serializable { this.thumbnailUri = thumbnail; this.photo = picture; this.hasFriends = false; + this.address = null; } @@ -85,6 +100,10 @@ public class Contact implements Serializable { return name; } + public LinphoneAddress getLinphoneAddress() { + return address; + } + public Uri getPhotoUri() { return photoUri; } diff --git a/src/org/linphone/ContactEditorFragment.java b/src/org/linphone/ContactEditorFragment.java index 895bafab7..4b8fdaa41 100644 --- a/src/org/linphone/ContactEditorFragment.java +++ b/src/org/linphone/ContactEditorFragment.java @@ -18,20 +18,32 @@ package org.linphone; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; import java.io.InputStream; +import java.io.SyncFailedException; import java.util.ArrayList; import java.util.List; import org.linphone.compatibility.Compatibility; import org.linphone.core.LinphoneProxyConfig; +import org.linphone.mediastream.Log; import org.linphone.mediastream.Version; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentProviderOperation; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Shader; +import android.media.ExifInterface; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -58,7 +70,6 @@ public class ContactEditorFragment extends Fragment { private ImageView addNumber, addSipAddress, contactPicture; private EditText firstName, lastName; private LayoutInflater inflater; - private Uri imageToUploadUri; private static final int ADD_PHOTO = 1337; private boolean isNewContact = true; @@ -70,6 +81,11 @@ public class ContactEditorFragment extends Fragment { private LinearLayout sipAddresses, numbers; private String newSipOrNumberToAdd; private ContactsManager contactsManager; + private Uri imageToUploadUri; + private String fileToUploadPath; + private Bitmap imageToUpload; + private Bitmap bitmapUnknown; + byte[] photoToAdd; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.inflater = inflater; @@ -120,8 +136,10 @@ public class ContactEditorFragment extends Fragment { return; } contactsManager.createNewContact(ops, firstName.getText().toString(), lastName.getText().toString()); + setContactPhoto(); } else { contactsManager.updateExistingContact(ops, contact, firstName.getText().toString(), lastName.getText().toString()); + setContactPhoto(); } for (NewOrUpdatedNumberOrAddress numberOrAddress : numbersAndAddresses) { @@ -257,18 +275,26 @@ public class ContactEditorFragment extends Fragment { } private void pickImage() { - List cameraIntents = new ArrayList(); - Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name_with_date).replace("%s", String.valueOf(System.currentTimeMillis()))); + imageToUploadUri = null; + final List cameraIntents = new ArrayList(); + final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name)); imageToUploadUri = Uri.fromFile(file); + captureIntent.putExtra("crop", "true"); + captureIntent.putExtra("outputX",256); + captureIntent.putExtra("outputY", 256); + captureIntent.putExtra("aspectX", 0); + captureIntent.putExtra("aspectY", 0); + captureIntent.putExtra("scale", true); + captureIntent.putExtra("return-data", false); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri); cameraIntents.add(captureIntent); - Intent galleryIntent = new Intent(); + final Intent galleryIntent = new Intent(); galleryIntent.setType("image/*"); - galleryIntent.setAction(Intent.ACTION_PICK); + galleryIntent.setAction(Intent.ACTION_GET_CONTENT); - Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.image_picker_title)); + final Intent chooserIntent = Intent.createChooser(galleryIntent, getString(R.string.image_picker_title)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); startActivityForResult(chooserIntent, ADD_PHOTO); @@ -290,41 +316,151 @@ public class ContactEditorFragment extends Fragment { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ADD_PHOTO && resultCode == Activity.RESULT_OK) { - String filePicturePath = null; - - if (data != null && data.getData() != null) { - filePicturePath = getRealPathFromURI(data.getData()); - } else if (imageToUploadUri != null) { - filePicturePath = imageToUploadUri.getPath(); + if (data != null && data.getExtras() != null && data.getExtras().get("data") != null) { + Bitmap bm = (Bitmap) data.getExtras().get("data"); + showPopupMenuAskingImageSize(null, bm); } - - if (filePicturePath != null) { - int SIZE_SMALL = 256; - int COMPRESSOR_QUALITY = 100; - - /*Bitmap bm = null; - - int pixelsMax = SIZE_SMALL; - //Resize image - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = 1; - bm = BitmapFactory.decodeFile(filePicturePath,options); - if (bm != null) { - if (bm.getWidth() > bm.getHeight() && bm.getWidth() > pixelsMax) { - bm = Bitmap.createScaledBitmap(bm, 256, 256, false); - } - } - - ByteArrayOutputStream bstream = new ByteArrayOutputStream(); - bm.compress(Bitmap.CompressFormat.PNG , 100, bstream); - byte[] bArray = bstream.toByteArray(); - contactPicture.setImageBitmap(bm);*/ - contactsManager.updateExistingContactPicture(ops, contact, filePicturePath); + else if (data != null && data.getData() != null) { + Uri selectedImageUri = data.getData(); + try { + Bitmap selectedImage = MediaStore.Images.Media.getBitmap(LinphoneManager.getInstance().getContext().getContentResolver(), selectedImageUri); + selectedImage = Bitmap.createScaledBitmap(selectedImage, 256, 256, false); + showPopupMenuAskingImageSize(null, selectedImage); + } catch (IOException e) { e.printStackTrace(); } + } + else if (imageToUploadUri != null) { + String filePath = imageToUploadUri.getPath(); + showPopupMenuAskingImageSize(filePath, null); + } + else { + File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name)); + if (file.exists()) { + imageToUploadUri = Uri.fromFile(file); + String filePath = imageToUploadUri.getPath(); + showPopupMenuAskingImageSize(filePath, null); + } } } else { super.onActivityResult(requestCode, resultCode, data); } } + + private void showPopupMenuAskingImageSize(final String filePath, final Bitmap image) { + fileToUploadPath = filePath; + imageToUpload = image; + editContactPicture(fileToUploadPath,imageToUpload); + } + + private void editContactPicture(final String filePath, final Bitmap image) { + int SIZE_SMALL = 256; + int COMPRESSOR_QUALITY = 100; + Bitmap bitmapUnknown = BitmapFactory.decodeResource(getResources(), R.drawable.avatar); + Bitmap bm = null; + + if(filePath != null){ + int pixelsMax = SIZE_SMALL; + //Resize image + bm = BitmapFactory.decodeFile(filePath); + if (bm != null) { + if (bm.getWidth() > bm.getHeight() && bm.getWidth() > pixelsMax) { + bm = Bitmap.createScaledBitmap(bm, 256, 256, false); + } + } + } else if (image != null) { + bm = image; + } + + // Rotate the bitmap if possible/needed, using EXIF data + try { + if (imageToUploadUri != null && filePath != null) { + ExifInterface exif = new ExifInterface(filePath); + int pictureOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); + Matrix matrix = new Matrix(); + if (pictureOrientation == 6) { + matrix.postRotate(90); + } else if (pictureOrientation == 3) { + matrix.postRotate(180); + } else if (pictureOrientation == 8) { + matrix.postRotate(270); + } + bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); + } + } catch (Exception e) { + e.printStackTrace(); + } + + Bitmap bitmapRounded; + if(bm != null) + { + bitmapRounded = Bitmap.createScaledBitmap(bm,bitmapUnknown.getWidth(), bitmapUnknown.getWidth(), false); + + Canvas canvas = new Canvas(bitmapRounded); + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setShader(new BitmapShader(bitmapRounded, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); + canvas.drawCircle(bitmapRounded.getWidth() / 2+0.7f, bitmapRounded.getHeight() / 2+0.7f,bitmapRounded.getWidth() / 2+0.1f, paint); + contactPicture.setImageBitmap(bitmapRounded); + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + bm.compress(Bitmap.CompressFormat.PNG,COMPRESSOR_QUALITY, outStream); + photoToAdd = outStream.toByteArray(); + } + } + + + private void setContactPhoto(){ + ContentResolver cr = getActivity().getContentResolver(); + Uri updateUri = ContactsContract.Data.CONTENT_URI; + + if(photoToAdd != null){ + //New contact + if(isNewContact){ + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, contactID) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoToAdd) + .build() + ); + } else { //update contact picture + String w = ContactsContract.Data.CONTACT_ID + "='" + + contact.getID() + "' AND " + + ContactsContract.Data.MIMETYPE + " = '" + + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; + + Cursor queryCursor = cr.query(updateUri,new String[] { ContactsContract.Data._ID}, w, null, null); + if (queryCursor == null) { + try { + throw new SyncFailedException("EE"); + } catch (SyncFailedException e) { + e.printStackTrace(); + } + } else { + if(contact.getPhoto() == null) { + String rawContactId = ContactsManager.getInstance().findRawContactID(cr,String.valueOf(contactID)); + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoToAdd) + .build() + ); + } + + if (queryCursor.moveToFirst()) { // otherwise no photo + int colIdx = queryCursor.getColumnIndex(ContactsContract.Data._ID); + long id = queryCursor.getLong(colIdx); + + + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data._ID + "= ?",new String[] { String.valueOf(id) }) + .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoToAdd) + .build()); + } + queryCursor.close(); + } + } + } + } private LinearLayout initNumbersFields(final Contact contact) { LinearLayout controls = (LinearLayout) view.findViewById(R.id.controls_numbers); diff --git a/src/org/linphone/ContactsListFragment.java b/src/org/linphone/ContactsListFragment.java index 01579b08d..a19efcdb6 100644 --- a/src/org/linphone/ContactsListFragment.java +++ b/src/org/linphone/ContactsListFragment.java @@ -338,15 +338,24 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O if (searchCursor != null) { searchCursor.close(); } - - if (onlyDisplayLinphoneContacts) { - searchCursor = Compatibility.getSIPContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId()); - indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - contactsList.setAdapter(new ContactsListAdapter(null, searchCursor)); - } else { - searchCursor = Compatibility.getContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId()); - indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - contactsList.setAdapter(new ContactsListAdapter(null, searchCursor)); + + if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) { + //searchCursor = Compatibility.getSIPContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId()); + //indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + //contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + //contactsList.setAdapter(new ContactsListAdapter(null, searchCursor)); + } else{ + if (onlyDisplayLinphoneContacts) { + searchCursor = Compatibility.getSIPContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId()); + indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + contactsList.setAdapter(new ContactsListAdapter(null, searchCursor)); + } else { + searchCursor = Compatibility.getContactsCursor(getActivity().getContentResolver(), search, ContactsManager.getInstance().getContactsId()); + contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + indexer = new AlphabetIndexer(searchCursor, Compatibility.getCursorDisplayNameColumnIndex(searchCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + contactsList.setAdapter(new ContactsListAdapter(null, searchCursor)); + } } } @@ -363,24 +372,30 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O noSipContact.setVisibility(View.GONE); noContact.setVisibility(View.GONE); contactsList.setVisibility(View.VISIBLE); - - if (onlyDisplayLinphoneContacts) { - if (sipContactsCursor != null && sipContactsCursor.getCount() == 0) { - noSipContact.setVisibility(View.VISIBLE); - contactsList.setVisibility(View.GONE); - } else { - indexer = new AlphabetIndexer(sipContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(sipContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); - contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getSIPContacts(), sipContactsCursor)); - } + + if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) { + indexer = new AlphabetIndexer(allContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(allContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getAllContacts(), allContactsCursor)); } else { - if (allContactsCursor != null && allContactsCursor.getCount() == 0) { - noContact.setVisibility(View.VISIBLE); - contactsList.setVisibility(View.GONE); + if (onlyDisplayLinphoneContacts) { + if (sipContactsCursor != null && sipContactsCursor.getCount() == 0) { + noSipContact.setVisibility(View.VISIBLE); + contactsList.setVisibility(View.GONE); + } else { + indexer = new AlphabetIndexer(sipContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(sipContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getSIPContacts(), sipContactsCursor)); + } } else { - indexer = new AlphabetIndexer(allContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(allContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); - contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getAllContacts(), allContactsCursor)); + if (allContactsCursor != null && allContactsCursor.getCount() == 0) { + noContact.setVisibility(View.VISIBLE); + contactsList.setVisibility(View.GONE); + } else { + indexer = new AlphabetIndexer(allContactsCursor, Compatibility.getCursorDisplayNameColumnIndex(allContactsCursor), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + contactsList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); + contactsList.setAdapter(new ContactsListAdapter(ContactsManager.getInstance().getAllContacts(), allContactsCursor)); + } } } ContactsManager.getInstance().setLinphoneContactsPrefered(onlyDisplayLinphoneContacts); @@ -460,7 +475,11 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O } public int getCount() { - return cursor.getCount(); + if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)) { + return LinphoneManager.getLc().getFriendList().length; + } else { + return cursor.getCount(); + } } public Object getItem(int position) { diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index f3124e1d1..357eb3f9d 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -24,6 +24,7 @@ import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; +import android.database.MatrixCursor; import android.net.Uri; import android.provider.ContactsContract; @@ -37,7 +38,9 @@ import org.linphone.core.LinphoneProxyConfig; import org.linphone.mediastream.Log; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class ContactsManager { private static ContactsManager instance; @@ -103,7 +106,6 @@ public class ContactsManager { mAccount = null; } } else { - Log.w("Get Account"); mAccount = accounts[0]; } initializeContactManager(context,contentResolver); @@ -374,8 +376,6 @@ public class ContactsManager { for(Contact c: getAllContacts()){ for(String a: c.getNumbersOrAddresses()){ - Log.w(a); - Log.w(address.asStringUriOnly()); if(a.equals(sipUri)) return c; } @@ -563,6 +563,18 @@ public class ContactsManager { sipContactCursor.close(); } + if(LinphoneActivity.instance().getResources().getBoolean(R.bool.use_linphone_friend)){ + contactList = new ArrayList(); + for(LinphoneFriend friend : LinphoneManager.getLc().getFriendList()){ + Contact contact = new Contact(friend.getRefKey(),friend.getAddress()); + contactList.add(contact); + } + + contactCursor = getFriendListCursor(contactList,true); + Log.w(contactCursor.getCount()); + return; + } + if(mAccount == null) return; contactCursor = Compatibility.getContactsCursor(contentResolver, getContactsId()); @@ -667,4 +679,29 @@ public class ContactsManager { return false; } + public Cursor getFriendListCursor(List contacts, boolean shouldGroupBy){ + String[] columns = new String[] { ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME }; + + + if (!shouldGroupBy) { + return null; + } + + MatrixCursor result = new MatrixCursor(columns); + Set groupBy = new HashSet(); + for (Contact contact: contacts) { + String name = contact.getName(); + if (!groupBy.contains(name)) { + groupBy.add(name); + Object[] newRow = new Object[2]; + + newRow[0] = contact.getID(); + newRow[1] = contact.getName(); + + result.addRow(newRow); + } + } + return result; + } + } diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java deleted file mode 100644 index 9eb0868b4..000000000 --- a/src/org/linphone/IncomingCallActivity.java +++ /dev/null @@ -1,206 +0,0 @@ -/* -IncomingCallActivity.java -Copyright (C) 2011 Belledonne Communications, Grenoble, France - -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 2 -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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -package org.linphone; - -import java.util.List; - -import org.linphone.core.LinphoneAddress; -import org.linphone.core.LinphoneCall; -import org.linphone.core.LinphoneCall.State; -import org.linphone.core.LinphoneCallParams; -import org.linphone.core.LinphoneCore; -import org.linphone.core.LinphoneCoreListenerBase; -import org.linphone.mediastream.Log; -import org.linphone.ui.AvatarWithShadow; -import org.linphone.ui.LinphoneSliders; -import org.linphone.ui.LinphoneSliders.LinphoneSliderTriggered; - -import android.app.Activity; -import android.net.Uri; -import android.os.Bundle; -import android.view.KeyEvent; -import android.view.WindowManager; -import android.widget.TextView; -import android.widget.Toast; - -/** - * Activity displayed when a call comes in. - * It should bypass the screen lock mechanism. - * - * @author Guillaume Beraudo - */ -public class IncomingCallActivity extends Activity implements LinphoneSliderTriggered { - - private static IncomingCallActivity instance; - - private TextView mNameView; - private TextView mNumberView; - private AvatarWithShadow mPictureView; - private LinphoneCall mCall; - private LinphoneSliders mIncomingCallWidget; - private LinphoneCoreListenerBase mListener; - - public static IncomingCallActivity instance() { - return instance; - } - - public static boolean isInstanciated() { - return instance != null; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - setContentView(R.layout.incoming); - - mNameView = (TextView) findViewById(R.id.incoming_caller_name); - mNumberView = (TextView) findViewById(R.id.incoming_caller_number); - mPictureView = (AvatarWithShadow) findViewById(R.id.incoming_picture); - - // set this flag so this activity will stay in front of the keyguard - int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; - getWindow().addFlags(flags); - - // "Dial-to-answer" widget for incoming calls. - mIncomingCallWidget = (LinphoneSliders) findViewById(R.id.sliding_widget); - mIncomingCallWidget.setOnTriggerListener(this); - - mListener = new LinphoneCoreListenerBase(){ - @Override - public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) { - if (call == mCall && State.CallEnd == state) { - finish(); - } - if (state == State.StreamsRunning) { - // The following should not be needed except some devices need it (e.g. Galaxy S). - LinphoneManager.getLc().enableSpeaker(LinphoneManager.getLc().isSpeakerEnabled()); - } - } - }; - - super.onCreate(savedInstanceState); - instance = this; - } - - @Override - protected void onResume() { - super.onResume(); - instance = this; - LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - if (lc != null) { - lc.addListener(mListener); - } - - // Only one call ringing at a time is allowed - if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) { - List calls = LinphoneUtils.getLinphoneCalls(LinphoneManager.getLc()); - for (LinphoneCall call : calls) { - if (State.IncomingReceived == call.getState()) { - mCall = call; - break; - } - } - } - if (mCall == null) { - Log.e("Couldn't find incoming call"); - finish(); - return; - } - LinphoneAddress address = mCall.getRemoteAddress(); - // May be greatly sped up using a drawable cache - Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address); - LinphoneUtils.setImagePictureFromUri(this, mPictureView.getView(), contact != null ? contact.getPhotoUri() : null, - contact != null ? contact.getThumbnailUri() : null, R.drawable.unknown_small); - - // To be done after findUriPictureOfContactAndSetDisplayName called - mNameView.setText(contact != null ? contact.getName() : ""); - if (getResources().getBoolean(R.bool.only_display_username_if_unknown)) { - mNumberView.setText(address.getUserName()); - } else { - mNumberView.setText(address.asStringUriOnly()); - } - } - - @Override - protected void onPause() { - LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - if (lc != null) { - lc.removeListener(mListener); - } - super.onPause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - instance = null; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (LinphoneManager.isInstanciated() && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)) { - LinphoneManager.getLc().terminateCall(mCall); - finish(); - } - return super.onKeyDown(keyCode, event); - } - - - - private void decline() { - LinphoneManager.getLc().terminateCall(mCall); - } - - private void answer() { - LinphoneCallParams params = LinphoneManager.getLc().createCallParams(mCall); - - boolean isLowBandwidthConnection = !LinphoneUtils.isHighBandwidthConnection(this); - if (isLowBandwidthConnection) { - params.enableLowBandwidth(true); - Log.d("Low bandwidth enabled in call params"); - } - - if (!LinphoneManager.getInstance().acceptCallWithParams(mCall, params)) { - // the above method takes care of Samsung Galaxy S - Toast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG).show(); - } else { - if (!LinphoneActivity.isInstanciated()) { - return; - } - final LinphoneCallParams remoteParams = mCall.getRemoteParams(); - if (remoteParams != null && remoteParams.getVideoEnabled() && LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { - LinphoneActivity.instance().startVideoActivity(mCall); - } else { - LinphoneActivity.instance().startIncallActivity(mCall); - } - } - } - - @Override - public void onLeftHandleTriggered() { - answer(); - finish(); - } - - @Override - public void onRightHandleTriggered() { - decline(); - finish(); - } -}