Fix memory leaks and corner cases in MMS app

The following problems will be fixed with these changes
1) IndexOutOfBounds exception when viewing a slide show. mCurrentElement should
   not exceed the size of all entries. This caused IndexOutOfBounds exception
2) Redundant call for registerSimChangeObserver causes OOM issues.
   SimChangeObserver is registered in onResume function. So the call in
   onQueryComplete can be removed.
3) Check for empty sender address before trying to get associated contact number
   when an SMS is received
4) Fix Cursor leak while receiving sms
diff --git a/src/com/android/mms/dom/smil/SmilPlayer.java b/src/com/android/mms/dom/smil/SmilPlayer.java
index 0fc7b07..356c6a0 100644
--- a/src/com/android/mms/dom/smil/SmilPlayer.java
+++ b/src/com/android/mms/dom/smil/SmilPlayer.java
@@ -510,7 +510,12 @@
     }
 
     private synchronized TimelineEntry reloadCurrentEntry() {
-        return mAllEntries.get(mCurrentElement);
+        // Check if the position is less than size of all entries
+        if (mCurrentElement < mAllEntries.size()) {
+            return mAllEntries.get(mCurrentElement);
+        } else {
+            return null;
+        }
     }
 
     private synchronized void actionPause() {
@@ -567,6 +572,8 @@
                     if (isReloadAction()) {
                         actionReload();
                         entry = reloadCurrentEntry();
+                        if (entry == null)
+                            return;
                         if (isPausedState()) {
                             mAction = SmilPlayerAction.PAUSE;
                         }
diff --git a/src/com/android/mms/transaction/SmsReceiverService.java b/src/com/android/mms/transaction/SmsReceiverService.java
old mode 100644
new mode 100755
index f3e094d..d2097b0
--- a/src/com/android/mms/transaction/SmsReceiverService.java
+++ b/src/com/android/mms/transaction/SmsReceiverService.java
@@ -52,6 +52,7 @@
 import android.telephony.ServiceState;
 import android.telephony.SmsManager;
 import android.telephony.SmsMessage;
+import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -411,9 +412,14 @@
         // excess messages.
         Long threadId = values.getAsLong(Sms.THREAD_ID);
         String address = values.getAsString(Sms.ADDRESS);
-        Contact cacheContact = Contact.get(address,true);
-        if (cacheContact != null) {
-            address = cacheContact.getNumber();
+        if (!TextUtils.isEmpty(address)) {
+            Contact cacheContact = Contact.get(address,true);
+            if (cacheContact != null) {
+                address = cacheContact.getNumber();
+            }
+        } else {
+            address = getString(R.string.unknown_sender);
+            values.put(Sms.ADDRESS, address);
         }
 
         if (((threadId == null) || (threadId == 0)) && (address != null)) {
diff --git a/src/com/android/mms/ui/ManageSimMessages.java b/src/com/android/mms/ui/ManageSimMessages.java
index 077e2d6..fa41291 100644
--- a/src/com/android/mms/ui/ManageSimMessages.java
+++ b/src/com/android/mms/ui/ManageSimMessages.java
@@ -139,7 +139,6 @@
                     updateState(SHOW_LIST);
                 }
                 startManagingCursor(mCursor);
-                registerSimChangeObserver();
             } else {
                 // Let user know the SIM is empty
                 updateState(SHOW_EMPTY);
diff --git a/src/com/android/mms/util/Recycler.java b/src/com/android/mms/util/Recycler.java
index 7c503a1..15a15e6 100644
--- a/src/com/android/mms/util/Recycler.java
+++ b/src/com/android/mms/util/Recycler.java
@@ -427,8 +427,10 @@
                             null, "date DESC");     // get in newest to oldest order
 
                     if (msgs.getCount() >= limit) {
+                        msgs.close();
                         return true;
                     }
+                    msgs.close();
                 }
             } finally {
                 cursor.close();