Merge db24ac4621775848c9a66c74897b61f51f9527b8 on remote branch

Change-Id: Ifc7bdd9524c4794367491adc17a4edb87adbec7a
diff --git a/fmapp2/AndroidManifest.xml b/fmapp2/AndroidManifest.xml
index 729599d..bc5b790 100644
--- a/fmapp2/AndroidManifest.xml
+++ b/fmapp2/AndroidManifest.xml
@@ -29,7 +29,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.caf.fmradio" >
-    <uses-sdk android:minSdkVersion="29"  android:targetSdkVersion="29"/>
+    <uses-sdk android:minSdkVersion="31"  android:targetSdkVersion="31"/>
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
@@ -38,8 +38,10 @@
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
@@ -64,7 +66,8 @@
             android:allowTaskReparenting="true"
             android:launchMode="singleTask"
             android:configChanges="keyboardHidden|orientation|screenSize"
-            android:excludeFromRecents="false" >
+            android:excludeFromRecents="false"
+            android:exported="true" >
 
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -78,14 +81,16 @@
 
         </activity>
 
-        <receiver android:name="com.caf.fmradio.FMMediaButtonIntentReceiver">
+        <receiver android:name="com.caf.fmradio.FMMediaButtonIntentReceiver"
+                  android:exported="true" >
             <intent-filter>
                  <action android:name="android.media.AUDIO_BECOMING_NOISY" />
             </intent-filter>
         </receiver>
 
         <activity android:name=".Settings"
-            android:label="@string/settings_menu">
+                  android:exported="true"
+                  android:label="@string/settings_menu">
 
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -94,6 +99,7 @@
         </activity>
 
         <activity android:name=".FMStats"
+                  android:exported="true"
             android:label="@string/test_menu">
 
             <intent-filter>
@@ -103,6 +109,7 @@
         </activity>
 
         <activity android:name=".FmTags"
+                  android:exported="true"
             android:label="@string/rt_plus_tags">
 
             <intent-filter>
@@ -112,6 +119,7 @@
         </activity>
 
        <activity android:name=".StationListActivity"
+            android:exported="true"
             android:label="@string/app_label_all_channels"
             android:configChanges="orientation|keyboardHidden|screenSize|fontScale">
 
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index b86b0cd..619194c 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -70,7 +70,7 @@
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.os.RemoteException;
-import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.widget.RemoteViews;
@@ -234,6 +234,7 @@
    private boolean mEventReceived = false;
    private boolean isfmOffFromApplication = false;
    private AudioFocusRequest mGainFocusReq;
+   private PhoneStateCallback mPhoneStateCallback;
 
    public FMRadioService() {
    }
@@ -247,8 +248,10 @@
       mPrefs = new FmSharedPreferences(this);
       mCallbacks = null;
       TelephonyManager tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-      tmgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE |
-                                       PhoneStateListener.LISTEN_DATA_ACTIVITY);
+      if (mPhoneStateCallback == null) {
+         mPhoneStateCallback = new PhoneStateCallback();
+      }
+      tmgr.registerTelephonyCallback(getApplicationContext().getMainExecutor(), mPhoneStateCallback);
       PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());
       mWakeLock.setReferenceCounted(false);
@@ -362,7 +365,7 @@
       }
 
       TelephonyManager tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-      tmgr.listen(mPhoneStateListener, 0);
+      tmgr.unregisterTelephonyCallback(mPhoneStateCallback);
 
       Log.d(LOGTAG, "onDestroy: unbindFromService completed");
 
@@ -1346,13 +1349,12 @@
 
        // Lets label the recorded audio file as NON-MUSIC so that the file
        // won't be displayed automatically, except for in the playlist.
-       cv.put(MediaStore.Audio.Media.IS_MUSIC, "1");
        cv.put(MediaStore.Audio.Media.DURATION, mSampleLength);
        cv.put(MediaStore.Audio.Media.TITLE, title);
        cv.put(MediaStore.Audio.Media.DATA, file.getAbsolutePath());
        cv.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
        cv.put(MediaStore.Audio.Media.DATE_MODIFIED, (int) (modDate / 1000));
-       cv.put(MediaStore.Audio.Media.MIME_TYPE, "audio/aac_mp4");
+       cv.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg");
        cv.put(MediaStore.Audio.Media.ARTIST,
                res.getString(R.string.audio_db_artist_name));
        cv.put(MediaStore.Audio.Media.ALBUM,
@@ -1421,24 +1423,16 @@
    }
 
    private void addToPlaylist(ContentResolver resolver, int audioId, long playlistId) {
-       String[] cols = new String[] {
-               MediaStore.Audio.Media.ALBUM_ID
-       };
        Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
-       Cursor cur = resolver.query(uri, cols, null, null, null);
-       final int base;
-       if(cur != null && cur.getCount() != 0) {
-            cur.moveToFirst();
-            base = cur.getInt(0);
-            cur.close();
-       }
-       else {
-            base = 0;
-       }
+
        ContentValues values = new ContentValues();
-       values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base + audioId));
+       values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, audioId);
        values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audioId);
-       resolver.insert(uri, values);
+       try {
+           resolver.insert(uri, values);
+       } catch (Exception exception) {
+           exception.printStackTrace();
+       }
    }
 
     private void resumeAfterCall() {
@@ -1511,11 +1505,12 @@
    }
 
     /* Handle Phone Call + FM Concurrency */
-   private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+   private class PhoneStateCallback extends TelephonyCallback implements
+            TelephonyCallback.CallStateListener,
+            TelephonyCallback.DataActivityListener {
       @Override
-      public void onCallStateChanged(int state, String incomingNumber) {
+      public void onCallStateChanged(int state){
           Log.d(LOGTAG, "onCallStateChanged: State - " + state );
-          Log.d(LOGTAG, "onCallStateChanged: incomingNumber - " + incomingNumber );
           fmActionOnCallState(state );
       }