diff --git a/.gitignore b/.gitignore index 06c6024eb..2c6cd49a5 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ submodules/externals/build/openh264/x86 tests/*$py.class tests/build.xml tests/project.properties +ant_password.properties diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9b217e2de..e274eb7be 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="2400" android:installLocation="auto"> @@ -119,6 +119,7 @@ diff --git a/Makefile b/Makefile index 948f110d2..68175f4e8 100644 --- a/Makefile +++ b/Makefile @@ -99,6 +99,15 @@ ifneq ($(shell ls ./submodules/linphone/mediastreamer2/java/src/org/linphone/med $(error ./submodules/linphone/mediastreamer2/java/src/org/linphone/mediastream/MediastreamerActivity.java found: please either remove it or move it to MediastreamActivity.java.ignored before continuing.) endif +ifeq ($(BUILD_NON_FREE_CODECS), 0) +BUILD_OPENH264=0 +ENABLE_OPENH264_DECODER=0 +BUILD_AMRNB=0 +BUILD_AMRWB=0 +BUILD_G729=0 +BUILD_X264=0 +endif + all: update-project generate-apk ifeq ($(ENABLE_GPL_THIRD_PARTIES),1) @echo "***************************************************************************" @@ -164,8 +173,8 @@ $(FFMPEG_SRC_DIR)/non_versioned_soname_patch_applied.txt: $(FFMPEG_BUILD_DIR)/arm/config.h: mkdir -p $(FFMPEG_BUILD_DIR)/arm && \ - cd $(FFMPEG_BUILD_DIR)/arm && \ - $(FFMPEG_SRC_DIR)/configure $(FFMPEG_CONFIGURE_OPTIONS) $(FFMPEG_ARM_CONFIGURE_OPTIONS) + cd $(FFMPEG_BUILD_DIR)/arm && \ + $(FFMPEG_SRC_DIR)/configure $(FFMPEG_CONFIGURE_OPTIONS) $(FFMPEG_ARM_CONFIGURE_OPTIONS) sed -i.bak 's/#define HAVE_SYSCTL 1/#define HAVE_SYSCTL 0/g' $(FFMPEG_BUILD_DIR)/arm/config.h sed -i.bak 's/#define HAVE_GETHRTIME 1/#define HAVE_GETHRTIME 0/g' $(FFMPEG_BUILD_DIR)/arm/config.h @@ -181,8 +190,8 @@ $(FFMPEG_BUILD_DIR)/arm/libffmpeg-linphone-arm.so: $(FFMPEG_BUILD_DIR)/arm/libav $(FFMPEG_BUILD_DIR)/x86/config.h: mkdir -p $(FFMPEG_BUILD_DIR)/x86 && \ - cd $(FFMPEG_BUILD_DIR)/x86 && \ - $(FFMPEG_SRC_DIR)/configure $(FFMPEG_CONFIGURE_OPTIONS) $(FFMPEG_X86_CONFIGURE_OPTIONS) + cd $(FFMPEG_BUILD_DIR)/x86 && \ + $(FFMPEG_SRC_DIR)/configure $(FFMPEG_CONFIGURE_OPTIONS) $(FFMPEG_X86_CONFIGURE_OPTIONS) sed -i.bak 's/#define HAVE_SYSCTL 1/#define HAVE_SYSCTL 0/g' $(FFMPEG_BUILD_DIR)/x86/config.h sed -i.bak 's/#define HAVE_GETHRTIME 1/#define HAVE_GETHRTIME 0/g' $(FFMPEG_BUILD_DIR)/x86/config.h @@ -462,10 +471,8 @@ install-apk: release: update-project $(ANT) clean - echo "What is the version name for the release ?"; \ - read version; \ - echo "version.name=$$version" > default.properties patch -p1 < release.patch + cat ant.properties | grep version.name > default.properties $(ANT) release git checkout HEAD AndroidManifest.xml diff --git a/README b/README index b38f48131..1ceb2271b 100644 --- a/README +++ b/README @@ -25,9 +25,11 @@ To build liblinphone for Android, you must: $ make mediastreamer2-sdk 7) (Optional) To generate a signed apk to publish on the Google Play, run $ make release -It will ask you for the version number that will be displayed in the about page of the app. -Make sure you filled the ant.properties values for key.store and key.alias in order to correctly -sign the generated apk (it will ask you the password during the process) +Make sure you filled the ant.properties values for version.name, key.store and key.alias in order to correctly sign the generated apk. +You also may want to create a file name ant_password.properties with the following: +key.store.password=[your_password] +key.alias.password=[your_password] +If you don't, the passwords will be asked at the signing phase. To run the tutorials: -------------------- diff --git a/ant.properties b/ant.properties index 7f65258e5..d2cc146d1 100644 --- a/ant.properties +++ b/ant.properties @@ -1,3 +1,4 @@ source.dir=src:submodules/linphone/mediastreamer2/java/src:submodules/linphone/java/j2se:submodules/linphone/java/common:submodules/linphone/java/impl:submodules/linphone/coreapi/help/java:submodules/externals/axmlrpc/src/main/java key.store=bc-android.keystore key.alias=nw8000 +version.name=2.4.0 diff --git a/build.xml b/build.xml index cc1aeac67..4588f2c03 100644 --- a/build.xml +++ b/build.xml @@ -26,8 +26,9 @@ application and should be checked into Version Control Systems. --> - + + diff --git a/res/xml/authenticator.xml b/res/xml/authenticator.xml index 885948b88..d2516eac0 100644 --- a/res/xml/authenticator.xml +++ b/res/xml/authenticator.xml @@ -2,7 +2,7 @@ \ No newline at end of file diff --git a/src/org/linphone/ChatActivity.java b/src/org/linphone/ChatActivity.java index b486f4901..5b0884679 100644 --- a/src/org/linphone/ChatActivity.java +++ b/src/org/linphone/ChatActivity.java @@ -20,11 +20,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import android.os.Bundle; import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; /** * @author Margaux Clerc */ public class ChatActivity extends FragmentActivity { + private static final String CHAT_FRAGMENT = "chatFragment"; + private ChatFragment chatFragment; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -39,6 +43,17 @@ public class ChatActivity extends FragmentActivity { ChatFragment fragment = new ChatFragment(); fragment.setArguments(extras); getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, fragment, "ChatFragment").commit(); + + FragmentManager fm = getSupportFragmentManager(); + chatFragment = (ChatFragment) fm.findFragmentByTag(CHAT_FRAGMENT); + + // If the Fragment is non-null, then it is currently being + // retained across a configuration change. + if (chatFragment == null) { + chatFragment = new ChatFragment(); + chatFragment.setArguments(extras); + fm.beginTransaction().add(R.id.fragmentContainer, chatFragment, CHAT_FRAGMENT).commit(); + } } } diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index 10ef4ac92..fc43382fa 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -124,6 +124,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC super.onCreate(savedInstanceState); instance = this; View view = inflater.inflate(R.layout.chat, container, false); + + // Retain the fragment across configuration changes + setRetainInstance(true); //Retrieve parameter from intent sipUri = getArguments().getString("SipUri"); @@ -438,12 +441,16 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC LinphoneService.instance().removeMessageNotification(); + if (LinphoneActivity.isInstanciated()) { + LinphoneActivity.instance().updateChatFragment(null); + } + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (lc != null) { lc.removeListener(mListener); } - getActivity().getIntent().putExtra("messageDraft", message.getText().toString()); + onSaveInstanceState(getArguments()); super.onPause(); } @@ -462,6 +469,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC if (getResources().getBoolean(R.bool.show_statusbar_only_on_dialer)) { LinphoneActivity.instance().hideStatusBar(); } + LinphoneActivity.instance().updateChatFragment(this); } String draft = getArguments().getString("messageDraft"); @@ -557,7 +565,9 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC @Override protected void onPostExecute(byte[] result) { - progressDialog.dismiss(); + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } mUploadingImageStream = new ByteArrayInputStream(result); diff --git a/src/org/linphone/ChatStorage.java b/src/org/linphone/ChatStorage.java index 189678463..259aa05f9 100644 --- a/src/org/linphone/ChatStorage.java +++ b/src/org/linphone/ChatStorage.java @@ -47,7 +47,7 @@ public class ChatStorage { private static final int OUTGOING = 0; private static final int READ = 1; private static final int NOT_READ = 0; - + private static ChatStorage instance; private Context context; private SQLiteDatabase db; @@ -66,7 +66,7 @@ public class ChatStorage { instance.close(); instance = new ChatStorage(LinphoneService.instance().getApplicationContext()); } - + private boolean isVersionUsingNewChatStorage() { try { return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode >= 2200; @@ -75,7 +75,7 @@ public class ChatStorage { } return true; } - + private ChatStorage(Context c) { context = c; boolean useLinphoneStorage = c.getResources().getBoolean(R.bool.use_linphone_chat_storage); @@ -84,24 +84,24 @@ public class ChatStorage { updateNeeded = updateNeeded && !isVersionUsingNewChatStorage(); useNativeAPI = useLinphoneStorage && !updateNeeded; Log.d("Using native API: " + useNativeAPI); - + if (!useNativeAPI) { ChatHelper chatHelper = new ChatHelper(context); db = chatHelper.getWritableDatabase(); } } - + public void close() { if (!useNativeAPI) { db.close(); } } - + public void updateMessageStatus(String to, String message, int status) { if (useNativeAPI) { return; } - + String[] whereArgs = { String.valueOf(OUTGOING), to, message }; Cursor c = db.query(TABLE_NAME, null, "direction LIKE ? AND remoteContact LIKE ? AND message LIKE ?", whereArgs, null, null, "id DESC"); @@ -114,29 +114,29 @@ public class ChatStorage { } } c.close(); - + if (id != null && id.length() > 0) { int intID = Integer.parseInt(id); updateMessageStatus(to, intID, status); } } - + public void updateMessageStatus(String to, int id, int status) { if (useNativeAPI) { return; } - + ContentValues values = new ContentValues(); values.put("status", status); - + db.update(TABLE_NAME, values, "id LIKE " + id, null); } - + public int saveTextMessage(String from, String to, String message, long time) { if (useNativeAPI) { return -1; } - + ContentValues values = new ContentValues(); if (from.equals("")) { values.put("localContact", from); @@ -155,12 +155,12 @@ public class ChatStorage { values.put("time", time); return (int) db.insert(TABLE_NAME, null, values); } - + public int saveImageMessage(String from, String to, Bitmap image, String url, long time) { if (useNativeAPI) { return -1; } - + ContentValues values = new ContentValues(); if (from.equals("")) { values.put("localContact", from); @@ -176,73 +176,73 @@ public class ChatStorage { values.put("status", LinphoneChatMessage.State.Idle.toInt()); } values.put("url", url); - + if (image != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(CompressFormat.JPEG, 100, baos); values.put("image", baos.toByteArray()); } - + values.put("time", time); return (int) db.insert(TABLE_NAME, null, values); } - + public void saveImage(int id, Bitmap image) { if (useNativeAPI) { //Handled before this point return; } - + if (image == null) return; - + ContentValues values = new ContentValues(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(CompressFormat.JPEG, 100, baos); values.put("image", baos.toByteArray()); - + db.update(TABLE_NAME, values, "id LIKE " + id, null); } - + public int saveDraft(String to, String message) { if (useNativeAPI) { //TODO return -1; } - + ContentValues values = new ContentValues(); values.put("remoteContact", to); values.put("message", message); return (int) db.insert(DRAFT_TABLE_NAME, null, values); } - + public void updateDraft(String to, String message) { if (useNativeAPI) { //TODO return; } - + ContentValues values = new ContentValues(); values.put("message", message); - + db.update(DRAFT_TABLE_NAME, values, "remoteContact LIKE \"" + to + "\"", null); } - + public void deleteDraft(String to) { if (useNativeAPI) { //TODO return; } - + db.delete(DRAFT_TABLE_NAME, "remoteContact LIKE \"" + to + "\"", null); } - + public String getDraft(String to) { if (useNativeAPI) { //TODO return ""; } - + Cursor c = db.query(DRAFT_TABLE_NAME, null, "remoteContact LIKE \"" + to + "\"", null, null, null, "id ASC"); String message = null; @@ -254,13 +254,13 @@ public class ChatStorage { } } c.close(); - + return message; } - + public List getDrafts() { List drafts = new ArrayList(); - + if (useNativeAPI) { //TODO } else { @@ -276,16 +276,16 @@ public class ChatStorage { } c.close(); } - + return drafts; } - + public List getMessages(String correspondent) { List chatMessages = new ArrayList(); - + if (!useNativeAPI) { Cursor c = db.query(TABLE_NAME, null, "remoteContact LIKE \"" + correspondent + "\"", null, null, null, "id ASC"); - + while (c.moveToNext()) { try { String message, timestamp, url; @@ -297,7 +297,7 @@ public class ChatStorage { byte[] rawImage = c.getBlob(c.getColumnIndex("image")); int read = c.getInt(c.getColumnIndex("read")); url = c.getString(c.getColumnIndex("url")); - + ChatMessage chatMessage = new ChatMessage(id, message, rawImage, timestamp, direction == INCOMING, status, read == READ); chatMessage.setUrl(url); chatMessages.add(chatMessage); @@ -311,26 +311,26 @@ public class ChatStorage { LinphoneChatMessage[] history = room.getHistory(); for (int i = 0; i < history.length; i++) { LinphoneChatMessage message = history[i]; - + Bitmap bm = null; String url = message.getExternalBodyUrl(); if (url != null && !url.startsWith("http")) { bm = BitmapFactory.decodeFile(url); } - ChatMessage chatMessage = new ChatMessage(i+1, message.getText(), bm, - String.valueOf(message.getTime()), !message.isOutgoing(), + ChatMessage chatMessage = new ChatMessage(i+1, message.getText(), bm, + String.valueOf(message.getTime()), !message.isOutgoing(), message.getStatus().toInt(), message.isRead()); chatMessage.setUrl(url); chatMessages.add(chatMessage); } } - + return chatMessages; } public String getTextMessageForId(LinphoneChatRoom chatroom, int id) { String message = null; - + if (useNativeAPI) { LinphoneChatMessage[] history = chatroom.getHistory(); for (LinphoneChatMessage msg : history) { @@ -341,7 +341,7 @@ public class ChatStorage { } } else { Cursor c = db.query(TABLE_NAME, null, "id LIKE " + id, null, null, null, null); - + if (c.moveToFirst()) { try { message = c.getString(c.getColumnIndex("message")); @@ -351,10 +351,10 @@ public class ChatStorage { } c.close(); } - + return message; } - + public LinphoneChatMessage getMessage(LinphoneChatRoom chatroom, int id) { if (useNativeAPI) { LinphoneChatMessage[] history = chatroom.getHistory(); @@ -366,7 +366,7 @@ public class ChatStorage { } return null; } - + public void removeDiscussion(String correspondent) { if (useNativeAPI) { LinphoneChatRoom chatroom = LinphoneManager.getLc().getOrCreateChatRoom(correspondent); @@ -375,30 +375,29 @@ public class ChatStorage { db.delete(TABLE_NAME, "remoteContact LIKE \"" + correspondent + "\"", null); } } - + public ArrayList getChatList() { ArrayList chatList = new ArrayList(); - + if (useNativeAPI) { LinphoneChatRoom[] chats = LinphoneManager.getLc().getChatRooms(); List rooms = new ArrayList(); - + for (LinphoneChatRoom chatroom : chats) { if (chatroom.getHistory(1).length > 0) { rooms.add(chatroom); } } - + if (rooms.size() > 1) { Collections.sort(rooms, new Comparator() { @Override public int compare(LinphoneChatRoom a, LinphoneChatRoom b) { LinphoneChatMessage[] messagesA = a.getHistory(1); LinphoneChatMessage[] messagesB = b.getHistory(1); - long atime, btime; - // /!\ Warning: Have to take the second element because it returns two even when asking for only one... - atime = messagesA.length > 1 ? messagesA[1].getTime() : messagesA[0].getTime(); - btime = messagesA.length > 1 ? messagesB[1].getTime() : messagesB[0].getTime(); + long atime = messagesA[0].getTime(); + long btime = messagesB[0].getTime(); + if (atime > btime) return -1; else if (btime > atime) @@ -408,7 +407,7 @@ public class ChatStorage { } }); } - + for (LinphoneChatRoom chatroom : rooms) { chatList.add(chatroom.getPeerAddress().asStringUriOnly()); } @@ -423,7 +422,7 @@ public class ChatStorage { } c.close(); } - + return chatList; } @@ -440,7 +439,7 @@ public class ChatStorage { db.delete(TABLE_NAME, "id LIKE " + id, null); } } - + public void markMessageAsRead(int id) { if (!useNativeAPI) { ContentValues values = new ContentValues(); @@ -448,13 +447,13 @@ public class ChatStorage { db.update(TABLE_NAME, values, "id LIKE " + id, null); } } - + public void markConversationAsRead(LinphoneChatRoom chatroom) { if (useNativeAPI) { chatroom.markAsRead(); } } - + public int getUnreadMessageCount() { int count; if (!useNativeAPI) { @@ -489,10 +488,10 @@ public class ChatStorage { //Handled before this point return null; } - + String[] columns = { "image" }; Cursor c = db.query(TABLE_NAME, columns, "id LIKE " + id + "", null, null, null, null); - + if (c.moveToFirst()) { byte[] rawImage = c.getBlob(c.getColumnIndex("image")); c.close(); @@ -504,20 +503,20 @@ public class ChatStorage { } class ChatHelper extends SQLiteOpenHelper { - + private static final int DATABASE_VERSION = 15; private static final String DATABASE_NAME = "linphone-android"; - + ChatHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } - + @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, image BLOB, url TEXT, time NUMERIC, read INTEGER, status INTEGER);"); db.execSQL("CREATE TABLE " + DRAFT_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, remoteContact TEXT NOT NULL, message TEXT);"); } - + @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME + ";"); @@ -525,4 +524,4 @@ public class ChatStorage { onCreate(db); } } -} \ No newline at end of file +} diff --git a/src/org/linphone/Contact.java b/src/org/linphone/Contact.java index bbb4ebf13..ac9b04c4b 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.LinphoneCore; import org.linphone.core.LinphoneFriend; import android.content.ContentResolver; @@ -104,10 +105,13 @@ public class Contact implements Serializable { public void refresh(ContentResolver cr) { this.numbersOrAddresses = Compatibility.extractContactNumbersAndAddresses(id, cr); - for(LinphoneFriend friend : LinphoneManager.getLcIfManagerNotDestroyedOrNull().getFriendList()) { - if (friend.getRefKey().equals(id)) { - hasFriends = true; - this.numbersOrAddresses.add(friend.getAddress().asStringUriOnly()); + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + if(lc != null && lc.getFriendList() != null) { + for (LinphoneFriend friend :lc.getFriendList()){ + if (friend.getRefKey().equals(id)) { + hasFriends = true; + this.numbersOrAddresses.add(friend.getAddress().asStringUriOnly()); + } } } this.name = Compatibility.refreshContactName(cr, id); diff --git a/src/org/linphone/ContactFragment.java b/src/org/linphone/ContactFragment.java index 2f98e33e1..cc07822f8 100644 --- a/src/org/linphone/ContactFragment.java +++ b/src/org/linphone/ContactFragment.java @@ -79,8 +79,9 @@ public class ContactFragment extends Fragment implements OnClickListener { private OnClickListener chatListener = new OnClickListener() { @Override public void onClick(View v) { - if (LinphoneActivity.isInstanciated()) + if (LinphoneActivity.isInstanciated()) { LinphoneActivity.instance().displayChat(v.getTag().toString()); + } } }; @@ -147,6 +148,7 @@ public class ContactFragment extends Fragment implements OnClickListener { v.findViewById(R.id.start_chat).setOnClickListener(chatListener); LinphoneProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig(); if (lpc != null) { + displayednumberOrAddress = lpc.normalizePhoneNumber(displayednumberOrAddress); if (!displayednumberOrAddress.startsWith("sip:")) { numberOrAddress = "sip:" + displayednumberOrAddress; } diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 9fbc50d84..1e86f6958 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -593,9 +593,8 @@ public class ContactsManager { c.close(); return address; } + c.close(); } - - c.close(); return null; } diff --git a/src/org/linphone/DialerFragment.java b/src/org/linphone/DialerFragment.java index 07ed122c8..61319cc6e 100644 --- a/src/org/linphone/DialerFragment.java +++ b/src/org/linphone/DialerFragment.java @@ -199,7 +199,7 @@ public class DialerFragment extends Fragment { mAddress.setText(intent.getData().getSchemeSpecificPart()); } else { Uri contactUri = intent.getData(); - String address = ContactsManager.getInstance().queryAddressOrNumber(getActivity().getContentResolver(),contactUri); + String address = ContactsManager.getInstance().queryAddressOrNumber(LinphoneService.instance().getContentResolver(),contactUri); if(address != null) { mAddress.setText(address); } else { diff --git a/src/org/linphone/EditContactFragment.java b/src/org/linphone/EditContactFragment.java index b63bd5cad..4200ac548 100644 --- a/src/org/linphone/EditContactFragment.java +++ b/src/org/linphone/EditContactFragment.java @@ -53,8 +53,11 @@ public class EditContactFragment extends Fragment { isNewContact = false; contactID = Integer.parseInt(contact.getID()); contact.refresh(getActivity().getContentResolver()); - } - if (getArguments().getString("NewSipAdress") != null) { + if (getArguments().getString("NewSipAdress") != null) { + newSipOrNumberToAdd = getArguments().getString("NewSipAdress"); + } + + } else if (getArguments().getString("NewSipAdress") != null) { newSipOrNumberToAdd = getArguments().getString("NewSipAdress"); isNewContact = true; } @@ -257,7 +260,7 @@ public class EditContactFragment extends Fragment { if (forceAddNumber) { tempNounoa = new NewOrUpdatedNumberOrAddress(isSip); } else { - if(isNewContact) { + if(isNewContact || newSipOrNumberToAdd != null) { tempNounoa = new NewOrUpdatedNumberOrAddress(isSip, numberOrAddress); } else { tempNounoa = new NewOrUpdatedNumberOrAddress(numberOrAddress, isSip); diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index 181d1e677..31c474ff2 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -92,6 +92,7 @@ public class InCallActivity extends FragmentActivity implements OnClickListener private Animation slideOutLeftToRight, slideInRightToLeft, slideInBottomToTop, slideInTopToBottom, slideOutBottomToTop, slideOutTopToBottom; private CountDownTimer timer; private boolean isVideoCallPaused = false; + AcceptCallUpdateDialogFragment callUpdateDialog; private TableLayout callsList; private LayoutInflater inflater; @@ -192,6 +193,8 @@ public class InCallActivity extends FragmentActivity implements OnClickListener timer = new CountDownTimer(SECONDS_BEFORE_DENYING_CALL_UPDATE, 1000) { public void onTick(long millisUntilFinished) { } public void onFinish() { + if (callUpdateDialog != null) + callUpdateDialog.dismiss(); acceptCallUpdate(false); } }.start(); @@ -1140,7 +1143,7 @@ public class InCallActivity extends FragmentActivity implements OnClickListener private void showAcceptCallUpdateDialog() { FragmentManager fm = getSupportFragmentManager(); - AcceptCallUpdateDialogFragment callUpdateDialog = new AcceptCallUpdateDialogFragment(); + callUpdateDialog = new AcceptCallUpdateDialogFragment(); callUpdateDialog.show(fm, "Accept Call Update Dialog"); } diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 2b0e8bf18..f29081502 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -102,6 +102,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene private FragmentsAvailable currentFragment, nextFragment; private List fragmentsHistory; private Fragment dialerFragment, messageListFragment, friendStatusListenerFragment; + private ChatFragment chatFragment; private SavedState dialerSavedState; private boolean isAnimationDisabled = false, preferLinphoneContacts = false; private OrientationEventListener mOrientationHelper; @@ -177,6 +178,9 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene mListener = new LinphoneCoreListenerBase(){ @Override public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr, LinphoneChatMessage message) { + if(!displayChatMessageNotification(message.getFrom().asStringUriOnly())) { + cr.markAsRead(); + } displayMissedChats(getChatStorage().getUnreadMessageCount()); if (messageListFragment != null && messageListFragment.isVisible()) { ((ChatListFragment) messageListFragment).refresh(); @@ -597,6 +601,16 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene public void displayAbout() { changeCurrentFragment(FragmentsAvailable.ABOUT, null); + settings.setSelected(true); + } + + public boolean displayChatMessageNotification(String address){ + if(chatFragment != null) { + if(chatFragment.getSipUri().equals(address)){ + return false; + } + } + return true; } public void displayChat(String sipUri) { @@ -641,6 +655,9 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene changeCurrentFragment(FragmentsAvailable.CHATLIST, null); displayChat(sipUri); } + if (messageListFragment != null && messageListFragment.isVisible()) { + ((ChatListFragment) messageListFragment).refresh(); + } } else { Intent intent = new Intent(this, ChatActivity.class); intent.putExtra("SipUri", sipUri); @@ -744,6 +761,10 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } + public void updateChatFragment(ChatFragment fragment) { + chatFragment = fragment; + } + public void updateChatListFragment(ChatListFragment fragment) { messageListFragment = fragment; } diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 3ebd4d8c8..ea5ff88bc 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -717,10 +717,12 @@ public class LinphoneManager implements LinphoneCoreListener { try { Contact contact = ContactsManager.getInstance().findContactWithAddress(mServiceContext.getContentResolver(),from); if (!mServiceContext.getResources().getBoolean(R.bool.disable_chat__message_notification)) { - if(contact != null) { - LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), contact.getName(), textMessage); - } else { - LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), from.getUserName(), textMessage); + if(LinphoneActivity.isInstanciated() && LinphoneActivity.instance().displayChatMessageNotification(from.asStringUriOnly())) { + if (contact != null) { + LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), contact.getName(), textMessage); + } else { + LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), from.getUserName(), textMessage); + } } } } catch (Exception e) { diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index 1e2bc7216..6435929b5 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -965,8 +965,8 @@ public class LinphonePreferences { // Advanced settings public void setDebugEnabled(boolean enabled) { getConfig().setBool("app", "debug", enabled); - LinphoneCoreFactory.instance().setDebugMode(enabled, getString(R.string.app_name)); LinphoneCoreFactory.instance().enableLogCollection(enabled); + LinphoneCoreFactory.instance().setDebugMode(enabled, getString(R.string.app_name)); } public boolean isDebugEnabled() { diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 45284019d..8dbe2c88a 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -494,7 +494,7 @@ public final class LinphoneService extends Service { //MANUFACTURER doesn't exist in android 1.5. //sb.append("MANUFACTURER=").append(Build.MANUFACTURER).append("\n"); sb.append("SDK=").append(Build.VERSION.SDK_INT).append("\n"); - sb.append("EABI=").append(Build.CPU_ABI).append("\n"); + sb.append("EABI=").append(Version.getCpuAbis().get(0)).append("\n"); Log.i(sb.toString()); } diff --git a/src/org/linphone/compatibility/ApiTwentyOnePlus.java b/src/org/linphone/compatibility/ApiTwentyOnePlus.java index d02e5c3e5..e12b228b7 100644 --- a/src/org/linphone/compatibility/ApiTwentyOnePlus.java +++ b/src/org/linphone/compatibility/ApiTwentyOnePlus.java @@ -50,6 +50,7 @@ public class ApiTwentyOnePlus { .setSmallIcon(R.drawable.chat_icon_over) .setAutoCancel(true) .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_ALL) .setLargeIcon(contactIcon) .setCategory(Notification.CATEGORY_MESSAGE) .setVisibility(Notification.VISIBILITY_PRIVATE) diff --git a/src/org/linphone/setup/SetupActivity.java b/src/org/linphone/setup/SetupActivity.java index dacdf2642..6ae353d12 100644 --- a/src/org/linphone/setup/SetupActivity.java +++ b/src/org/linphone/setup/SetupActivity.java @@ -381,8 +381,9 @@ public class SetupActivity extends FragmentActivity implements OnClickListener { back.setVisibility(View.GONE); } - public void isAccountVerified() { + public void isAccountVerified(String username) { Toast.makeText(this, getString(R.string.setup_account_validated), Toast.LENGTH_LONG).show(); + LinphoneManager.getLcIfManagerNotDestroyedOrNull().refreshRegisters(); launchEchoCancellerCalibration(true); } diff --git a/src/org/linphone/setup/WizardConfirmFragment.java b/src/org/linphone/setup/WizardConfirmFragment.java index 0575afc83..0fbcbb482 100644 --- a/src/org/linphone/setup/WizardConfirmFragment.java +++ b/src/org/linphone/setup/WizardConfirmFragment.java @@ -59,7 +59,7 @@ public class WizardConfirmFragment extends Fragment { return view; } - private void isAccountVerified(String username) { + private void isAccountVerified(final String username) { final Runnable runNotReachable = new Runnable() { public void run() { Toast.makeText(getActivity(), getString(R.string.wizard_server_unavailable), Toast.LENGTH_LONG).show(); @@ -78,7 +78,7 @@ public class WizardConfirmFragment extends Fragment { Runnable runOk = new Runnable() { public void run() { - SetupActivity.instance().isAccountVerified(); + SetupActivity.instance().isAccountVerified(username); } }; diff --git a/src/org/linphone/setup/WizardFragment.java b/src/org/linphone/setup/WizardFragment.java index 571f56bdb..d9b642d16 100644 --- a/src/org/linphone/setup/WizardFragment.java +++ b/src/org/linphone/setup/WizardFragment.java @@ -157,7 +157,8 @@ public class WizardFragment extends Fragment { private boolean isUsernameCorrect(String username) { if (getResources().getBoolean(R.bool.allow_only_phone_numbers_in_wizard)) { - return username.matches("^(\\+)?(\\d-)?(\\d{3}-)?(\\d{3}-)?\\d{4,}$"); + LinphoneProxyConfig lpc = LinphoneManager.getLc().createProxyConfig(); + return lpc.isPhoneNumber(username); } else { return username.matches("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{2,}$"); } diff --git a/src/org/linphone/ui/Digit.java b/src/org/linphone/ui/Digit.java index bd5294cb7..191026039 100644 --- a/src/org/linphone/ui/Digit.java +++ b/src/org/linphone/ui/Digit.java @@ -155,8 +155,8 @@ public class Digit extends Button implements AddressAware { if(id == R.id.Digit1 && lc.getCalls().length == 0){ String voiceMail = LinphonePreferences.instance().getVoiceMailUri(); mAddress.getEditableText().clear(); - mAddress.getEditableText().append(voiceMail); if(voiceMail != null){ + mAddress.getEditableText().append(voiceMail); LinphoneManager.getInstance().newOutgoingCall(mAddress); } return true; diff --git a/submodules/belle-sip b/submodules/belle-sip index 7d27eb87c..6fd479005 160000 --- a/submodules/belle-sip +++ b/submodules/belle-sip @@ -1 +1 @@ -Subproject commit 7d27eb87c5dbd530e1c0a95cd0da2e233fb4d6b5 +Subproject commit 6fd479005cf9e9be15449cab34717fe17bda6dc5 diff --git a/submodules/bzrtp b/submodules/bzrtp index ebe07ed33..4a4f757f6 160000 --- a/submodules/bzrtp +++ b/submodules/bzrtp @@ -1 +1 @@ -Subproject commit ebe07ed33ef00f8ec133374977a5cadf42044fee +Subproject commit 4a4f757f66b02cf8834fd8d7a939bf54b245ad7e diff --git a/submodules/linphone b/submodules/linphone index 5a0c92bac..7a5f88122 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 5a0c92bac32d086e176e2b10d13c7fd5bb4c1032 +Subproject commit 7a5f881221815f2621e876d3a677840053969d54 diff --git a/tests/src/org/linphone/test/Contacts.java b/tests/src/org/linphone/test/Contacts.java index 7e009de35..e55bf44df 100644 --- a/tests/src/org/linphone/test/Contacts.java +++ b/tests/src/org/linphone/test/Contacts.java @@ -4,6 +4,7 @@ import junit.framework.Assert; import org.linphone.ContactsFragment; import org.linphone.LinphoneActivity; +import org.linphone.R; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; @@ -34,6 +35,8 @@ public class Contacts extends SampleTest { solo.clickOnText(iContext.getString(org.linphone.test.R.string.contact_name)); solo.clickOnText(aContext.getString(org.linphone.R.string.delete_contact)); + solo.sleep(1000); + solo.clickOnText(aContext.getString(R.string.button_ok)); Assert.assertFalse(solo.searchText(iContext.getString(org.linphone.test.R.string.contact_name))); } @@ -70,6 +73,7 @@ public class Contacts extends SampleTest { @LargeTest public void testDEditContactAddSipAddressAndRemoveNumber() { goToContacts(); + solo.clickOnText(aContext.getString(org.linphone.R.string.button_all_contacts)); solo.clickOnText(iContext.getString(org.linphone.test.R.string.contact_name)); solo.clickOnText(aContext.getString(org.linphone.R.string.button_edit)); @@ -110,6 +114,8 @@ public class Contacts extends SampleTest { solo.clickOnText(iContext.getString(org.linphone.test.R.string.contact_name)); solo.clickOnText(aContext.getString(org.linphone.R.string.delete_contact)); + solo.sleep(1000); + solo.clickOnText(aContext.getString(R.string.button_ok)); Assert.assertFalse(solo.searchText(iContext.getString(org.linphone.test.R.string.contact_name))); }