Change ringtone behavior based on version.

Bug: 12800232
Change-Id: I9e05d737a847392c277d50a353e4d65ecd70f9a2
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 22ee710..5b341a0 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -148,6 +148,8 @@
     protected static final int REQUEST_CODE_ACCOUNTS_CHANGED = 1;
     protected static final int REQUEST_CODE_PICK_RINGTONE = 2;
 
+    private static final int CURRENT_API_VERSION = android.os.Build.VERSION.SDK_INT;
+
     /**
      * An intent extra that forces the editor to add the edited contact
      * to the default group (e.g. "My Contacts").
@@ -678,13 +680,7 @@
     }
 
     private void onRingtonePicked(Uri pickedUri) {
-        if (pickedUri == null) {
-            mCustomRingtone = ""; // silent ringtone
-        } else if (RingtoneManager.isDefault(pickedUri)){
-            mCustomRingtone = null; // default ringtone
-        } else {
-            mCustomRingtone = pickedUri.toString();
-        }
+        mCustomRingtone = EditorUiUtils.getRingtoneStringFromUri(pickedUri, CURRENT_API_VERSION);
         Intent intent = ContactSaveService.createSetRingtone(
                 mContext, mLookupUri, mCustomRingtone);
         mContext.startService(intent);
@@ -879,17 +875,8 @@
         // Allow the user to pick a silent ringtone
         intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
 
-        final Uri ringtoneUri;
-        if (mCustomRingtone != null) {
-            if ("".equals(mCustomRingtone)) { // select silent ringtone in RingtonePickerActivity
-                ringtoneUri = null;
-            } else {
-                ringtoneUri = Uri.parse(mCustomRingtone);
-            }
-        } else {
-            // Otherwise pick default ringtone Uri so that something is selected.
-            ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
-        }
+        final Uri ringtoneUri = EditorUiUtils.getRingtoneUriFromString(mCustomRingtone,
+                CURRENT_API_VERSION);
 
         // Put checkmark next to the current ringtone for this contact
         intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 3da5ee9..106c5e3 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -32,6 +32,9 @@
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
 import android.text.TextUtils;
 import android.util.Pair;
 import com.android.contacts.R;
@@ -189,4 +192,31 @@
                 return null;
         }
     }
+
+    /**
+     * Returns a ringtone string based on the ringtone URI and version #.
+     */
+    public static String getRingtoneStringFromUri(Uri pickedUri, int currentVersion) {
+        if (isNewerThanM(currentVersion)) {
+            if (pickedUri == null) return ""; // silent ringtone
+            if (RingtoneManager.isDefault(pickedUri)) return null; // default ringtone
+        }
+        if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) return null;
+        return pickedUri.toString();
+    }
+
+    /**
+     * Returns a ringtone URI, based on the string and version #.
+     */
+    public static Uri getRingtoneUriFromString(String str, int currentVersion) {
+        if (str != null) {
+            if (isNewerThanM(currentVersion) && TextUtils.isEmpty(str)) return null;
+            return Uri.parse(str);
+        }
+        return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+    }
+
+    private static boolean isNewerThanM(int currentVersion) {
+        return currentVersion > Build.VERSION_CODES.M;
+    }
 }
diff --git a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
index 58e6f26..4a180ef 100644
--- a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
@@ -21,6 +21,10 @@
 import com.android.contacts.common.model.account.GoogleAccountType;
 
 import android.content.Context;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Pair;
@@ -37,6 +41,8 @@
     private static final String GOOGLE_ACCOUNT_NAME = "somebody@gmail.com";
     private static final String GOOGLE_DISPLAY_LABEL = "Google";
 
+    private static final String RINGTONE = "content://media/external/audio/media/31";
+
     private static final class MockAccountType extends AccountType {
 
         private final String mDisplayLabel;
@@ -140,4 +146,41 @@
                         getContext().getString(R.string.account_phone)),
                 pair.second); // "Phone-only, unsynced contact"
     }
+
+    public void testGetRingtongStrFromUri_lessThanOrEqualsToM() {
+        final int currentVersion = Build.VERSION_CODES.M;
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(Settings.System.DEFAULT_RINGTONE_URI,
+                currentVersion));
+        assertEquals(RINGTONE, EditorUiUtils.getRingtoneStringFromUri(Uri.parse(RINGTONE),
+                        currentVersion));
+    }
+
+    public void testGetRingtongStrFromUri_nOrGreater() {
+        final int currentVersion = Build.VERSION_CODES.M + 1;
+        assertEquals("", EditorUiUtils.getRingtoneStringFromUri(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneStringFromUri(Settings.System.DEFAULT_RINGTONE_URI,
+                currentVersion));
+        assertEquals(RINGTONE, EditorUiUtils.getRingtoneStringFromUri(Uri.parse(RINGTONE),
+                        currentVersion));
+    }
+
+    public void testGetRingtongUriFromStr_lessThanOrEqualsToM() {
+        final int currentVersion = Build.VERSION_CODES.M;
+        assertEquals(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), EditorUiUtils
+                        .getRingtoneUriFromString(null, currentVersion));
+        assertEquals(Uri.parse(""), EditorUiUtils.getRingtoneUriFromString("", currentVersion));
+        assertEquals(Uri.parse(RINGTONE), EditorUiUtils.getRingtoneUriFromString(RINGTONE,
+                currentVersion));
+    }
+
+    public void testGetRingtongUriFromStr_nOrGreater() {
+        final int currentVersion = Build.VERSION_CODES.M + 1;
+        assertEquals(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), EditorUiUtils
+                        .getRingtoneUriFromString(null, currentVersion));
+        assertNull(EditorUiUtils.getRingtoneUriFromString("", currentVersion));
+        assertEquals(Uri.parse(RINGTONE), EditorUiUtils.getRingtoneUriFromString(RINGTONE,
+                currentVersion));
+    }
+
 }