diff --git a/java/com/android/contacts/common/dialog/CallSubjectDialog.java b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
index 1e1ee0d..3ddf4da 100644
--- a/java/com/android/contacts/common/dialog/CallSubjectDialog.java
+++ b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
@@ -329,14 +329,15 @@
       return;
     }
     mPhotoID = arguments.getLong(ARG_PHOTO_ID);
-    mPhotoUri = arguments.getParcelable(ARG_PHOTO_URI);
-    mContactUri = arguments.getParcelable(ARG_CONTACT_URI);
+    mPhotoUri = arguments.getParcelable(ARG_PHOTO_URI, Uri.class);
+    mContactUri = arguments.getParcelable(ARG_CONTACT_URI, Uri.class);
     mNameOrNumber = arguments.getString(ARG_NAME_OR_NUMBER);
     mNumber = arguments.getString(ARG_NUMBER);
     mDisplayNumber = arguments.getString(ARG_DISPLAY_NUMBER);
     mNumberLabel = arguments.getString(ARG_NUMBER_LABEL);
     mContactType = arguments.getInt(ARG_CONTACT_TYPE, LetterTileDrawable.TYPE_DEFAULT);
-    mPhoneAccountHandle = arguments.getParcelable(ARG_PHONE_ACCOUNT_HANDLE);
+    mPhoneAccountHandle = arguments.getParcelable(ARG_PHONE_ACCOUNT_HANDLE,
+            PhoneAccountHandle.class);
   }
 
   /**
diff --git a/java/com/android/contacts/common/model/AccountTypeManager.java b/java/com/android/contacts/common/model/AccountTypeManager.java
index 070c9a7..283863e 100644
--- a/java/com/android/contacts/common/model/AccountTypeManager.java
+++ b/java/com/android/contacts/common/model/AccountTypeManager.java
@@ -696,8 +696,8 @@
         result.remove(accountTypeWithDataSet);
         continue;
       }
-      ResolveInfo resolveInfo =
-          packageManager.resolveActivity(invitableIntent, PackageManager.MATCH_DEFAULT_ONLY);
+      ResolveInfo resolveInfo = packageManager.resolveActivity(invitableIntent,
+              PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY));
       if (resolveInfo == null) {
         // If we can't find an activity to start for this intent, then there's no point in
         // showing this option to the user.
diff --git a/java/com/android/contacts/common/model/RawContact.java b/java/com/android/contacts/common/model/RawContact.java
index 9efc8a8..37c5634 100644
--- a/java/com/android/contacts/common/model/RawContact.java
+++ b/java/com/android/contacts/common/model/RawContact.java
@@ -78,7 +78,7 @@
    * @param parcel The parcel to de-serialize from.
    */
   private RawContact(Parcel parcel) {
-    mValues = parcel.readParcelable(ContentValues.class.getClassLoader());
+    mValues = parcel.readParcelable(ContentValues.class.getClassLoader(), ContentValues.class);
     mDataItems = new ArrayList<>();
     parcel.readTypedList(mDataItems, NamedDataItem.CREATOR);
   }
@@ -314,8 +314,9 @@
     }
 
     public NamedDataItem(Parcel parcel) {
-      this.mUri = parcel.readParcelable(Uri.class.getClassLoader());
-      this.mContentValues = parcel.readParcelable(ContentValues.class.getClassLoader());
+      this.mUri = parcel.readParcelable(Uri.class.getClassLoader(), Uri.class);
+      this.mContentValues = parcel.readParcelable(ContentValues.class.getClassLoader(),
+              ContentValues.class);
     }
 
     @Override
diff --git a/java/com/android/contacts/common/model/account/ExternalAccountType.java b/java/com/android/contacts/common/model/account/ExternalAccountType.java
index a38f8f2..24cd6ed 100644
--- a/java/com/android/contacts/common/model/account/ExternalAccountType.java
+++ b/java/com/android/contacts/common/model/account/ExternalAccountType.java
@@ -30,9 +30,11 @@
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Xml;
+
 import com.android.contacts.common.model.dataitem.DataKind;
+import com.android.dialer.R;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.contacts.resources.R;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -189,25 +191,23 @@
   public static XmlResourceParser loadContactsXml(Context context, String resPackageName) {
     final PackageManager pm = context.getPackageManager();
     final Intent intent = new Intent(SYNC_META_DATA).setPackage(resPackageName);
-    final List<ResolveInfo> intentServices =
-        pm.queryIntentServices(intent, PackageManager.GET_SERVICES | PackageManager.GET_META_DATA);
+    final List<ResolveInfo> intentServices = pm.queryIntentServices(intent,
+            PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA));
 
-    if (intentServices != null) {
-      for (final ResolveInfo resolveInfo : intentServices) {
-        final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
-        if (serviceInfo == null) {
-          continue;
-        }
-        for (String metadataName : METADATA_CONTACTS_NAMES) {
-          final XmlResourceParser parser = serviceInfo.loadXmlMetaData(pm, metadataName);
-          if (parser != null) {
-            LogUtil.d(
-                TAG,
-                String.format(
-                    "Metadata loaded from: %s, %s, %s",
-                    serviceInfo.packageName, serviceInfo.name, metadataName));
-            return parser;
-          }
+    for (final ResolveInfo resolveInfo : intentServices) {
+      final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+      if (serviceInfo == null) {
+        continue;
+      }
+      for (String metadataName : METADATA_CONTACTS_NAMES) {
+        final XmlResourceParser parser = serviceInfo.loadXmlMetaData(pm, metadataName);
+        if (parser != null) {
+          LogUtil.d(
+              TAG,
+              String.format(
+                  "Metadata loaded from: %s, %s, %s",
+                  serviceInfo.packageName, serviceInfo.name, metadataName));
+          return parser;
         }
       }
     }
diff --git a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
index 0b3575b..2bb5f6a 100644
--- a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
+++ b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogFragment.java
@@ -23,6 +23,7 @@
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.ResultReceiver;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
@@ -184,14 +185,14 @@
     static final String EXTRA_CALL_ID = "extra_call_id";
 
     protected SelectPhoneAccountListener() {
-      super(new Handler());
+      super(new Handler(Looper.getMainLooper()));
     }
 
     @Override
     protected void onReceiveResult(int resultCode, Bundle resultData) {
       if (resultCode == RESULT_SELECTED) {
         onPhoneAccountSelected(
-            resultData.getParcelable(EXTRA_SELECTED_ACCOUNT_HANDLE),
+            resultData.getParcelable(EXTRA_SELECTED_ACCOUNT_HANDLE, PhoneAccountHandle.class),
             resultData.getBoolean(EXTRA_SET_DEFAULT),
             resultData.getString(EXTRA_CALL_ID));
       } else if (resultCode == RESULT_DISMISSED) {
diff --git a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
index 1880d65..6106bc3 100644
--- a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
+++ b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,7 +40,7 @@
       byte[] marshalledUserHandle = entry.getUserHandle().toByteArray();
       parcel.unmarshall(marshalledUserHandle, 0, marshalledUserHandle.length);
       parcel.setDataPosition(0);
-      userHandle = parcel.readParcelable(UserHandle.class.getClassLoader());
+      userHandle = parcel.readParcelable(UserHandle.class.getClassLoader(), UserHandle.class);
     } catch (NullPointerException e) {
       userHandle = null;
     }
diff --git a/java/com/android/dialer/app/AccountSelectionActivity.java b/java/com/android/dialer/app/AccountSelectionActivity.java
index 3f037a8..b6ab6b7 100644
--- a/java/com/android/dialer/app/AccountSelectionActivity.java
+++ b/java/com/android/dialer/app/AccountSelectionActivity.java
@@ -88,7 +88,8 @@
     initiationType = CallInitiationType.Type.values()[getIntent().getIntExtra("type", 0)];
 
     if (getSupportFragmentManager().findFragmentByTag("dialog") == null) {
-      List<PhoneAccountHandle> handles = getIntent().getParcelableArrayListExtra("accountHandles");
+      List<PhoneAccountHandle> handles = getIntent().getParcelableArrayListExtra("accountHandles",
+              PhoneAccountHandle.class);
       SelectPhoneAccountDialogOptions options = SelectPhoneAccountDialogOptionsUtil
           .builderWithAccounts(handles)
           .setTitle(R.string.call_via_dialog_title)
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 3442d73..04adc6c 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -98,7 +98,7 @@
   private static final int EVENT_UPDATE_DISPLAY = 1;
 
   private static final long MILLIS_IN_MINUTE = 60 * 1000;
-  private final Handler handler = new Handler();
+  private final Handler handler = new Handler(Looper.getMainLooper());
   // See issue 6363009
   private final ContentObserver callLogObserver = new CustomContentObserver();
   private final ContentObserver contactsObserver = new CustomContentObserver();
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
index 947dd02..a9ab8c2 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
@@ -159,7 +159,9 @@
         break;
       case ACTION_LEGACY_VOICEMAIL_DISMISSED:
         LegacyVoicemailNotificationReceiver.setDismissed(
-            this, intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE), true);
+                this,
+                intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE, PhoneAccountHandle.class),
+                true);
         break;
       case ACTION_CANCEL_ALL_MISSED_CALLS:
         cancelAllMissedCalls(this);
diff --git a/java/com/android/dialer/app/calllog/GroupingListAdapter.java b/java/com/android/dialer/app/calllog/GroupingListAdapter.java
index e1a395e..01250ab 100644
--- a/java/com/android/dialer/app/calllog/GroupingListAdapter.java
+++ b/java/com/android/dialer/app/calllog/GroupingListAdapter.java
@@ -21,6 +21,7 @@
 import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.os.Handler;
+import android.os.Looper;
 import android.util.SparseIntArray;
 
 import androidx.recyclerview.widget.RecyclerView;
@@ -35,7 +36,7 @@
 abstract class GroupingListAdapter extends RecyclerView.Adapter {
 
   protected final ContentObserver changeObserver =
-      new ContentObserver(new Handler()) {
+      new ContentObserver(new Handler(Looper.getMainLooper())) {
         @Override
         public boolean deliverSelfNotifications() {
           return true;
diff --git a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
index c92177e..47d97aa 100644
--- a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
@@ -174,7 +174,7 @@
   @NonNull
   private static String getNotificationTag(
       @NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) {
-    if (context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1) {
+    if (context.getSystemService(TelephonyManager.class).getActiveModemCount() <= 1) {
       return NOTIFICATION_TAG;
     }
 
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index 0e75aee..d9c848a 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -210,7 +210,7 @@
     if (getActivity() != null) {
       getActivity().setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
       // onNotVisible will be called in the lock screen when the call ends
-      if (!getActivity().getSystemService(KeyguardManager.class).inKeyguardRestrictedInputMode()) {
+      if (!getActivity().getSystemService(KeyguardManager.class).isKeyguardLocked()) {
         LogUtil.i("VisualVoicemailCallLogFragment.onNotVisible", "clearing all new voicemails");
         CallLogNotificationsService.markAllNewVoicemailsAsOld(getActivity());
       }
diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
index 702bacb..0121eeb 100644
--- a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
+++ b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +18,7 @@
 package com.android.dialer.app.contactinfo;
 
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.SystemClock;
 import android.text.TextUtils;
@@ -66,6 +68,7 @@
     private final WeakReference<ContactInfoCache> contactInfoCacheWeakReference;
 
     public InnerHandler(WeakReference<ContactInfoCache> contactInfoCacheWeakReference) {
+      super(Looper.getMainLooper());
       this.contactInfoCacheWeakReference = contactInfoCacheWeakReference;
     }
 
diff --git a/java/com/android/dialer/app/settings/SoundSettingsFragment.java b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
index b274339..8e12149 100644
--- a/java/com/android/dialer/app/settings/SoundSettingsFragment.java
+++ b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
@@ -56,7 +56,7 @@
 
   private Preference ringtonePreference;
   private final Handler ringtoneLookupComplete =
-      new Handler() {
+      new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
           switch (msg.what) {
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
index 9f7c185..fb75ef1 100644
--- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
+++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
@@ -55,7 +55,8 @@
     LogUtil.i(
         "LegacyVoicemailNotificationReceiver.onReceive", "received legacy voicemail notification");
     PhoneAccountHandle phoneAccountHandle =
-        Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE));
+        Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+                PhoneAccountHandle.class));
     int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, -1);
 
     boolean isRefresh = intent.getBooleanExtra(TelephonyManagerCompat.EXTRA_IS_REFRESH, false);
@@ -98,9 +99,11 @@
 
     String voicemailNumber = intent.getStringExtra(TelephonyManager.EXTRA_VOICEMAIL_NUMBER);
     PendingIntent callVoicemailIntent =
-        intent.getParcelableExtra(TelephonyManager.EXTRA_CALL_VOICEMAIL_INTENT);
+        intent.getParcelableExtra(TelephonyManager.EXTRA_CALL_VOICEMAIL_INTENT,
+                PendingIntent.class);
     PendingIntent voicemailSettingIntent =
-        intent.getParcelableExtra(TelephonyManager.EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT);
+        intent.getParcelableExtra(TelephonyManager.EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT,
+                PendingIntent.class);
 
     LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "sending notification");
     LegacyVoicemailNotifier.showNotification(
diff --git a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
index c469d3c..40d9e7b 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailErrorManager.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +21,7 @@
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.os.Handler;
+import android.os.Looper;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
@@ -55,7 +57,7 @@
   private final Map<PhoneAccountHandle, ServiceStateListener> listeners = new ArrayMap<>();
 
   private final ContentObserver statusObserver =
-      new ContentObserver(new Handler()) {
+      new ContentObserver(new Handler(Looper.getMainLooper())) {
         @Override
         public void onChange(boolean selfChange) {
           super.onChange(selfChange);
diff --git a/java/com/android/dialer/callintent/CallIntent.java b/java/com/android/dialer/callintent/CallIntent.java
index ac722b3..dc875cc 100644
--- a/java/com/android/dialer/callintent/CallIntent.java
+++ b/java/com/android/dialer/callintent/CallIntent.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -210,7 +211,7 @@
         public CallIntent createFromParcel(Parcel source) {
           CallIntent.Builder callIntentBuilder = builder();
           ClassLoader classLoader = CallIntent.class.getClassLoader();
-          callIntentBuilder.setNumber(source.readParcelable(classLoader));
+          callIntentBuilder.setNumber(source.readParcelable(classLoader, Uri.class));
           CallSpecificAppData data;
           try {
             data = CallSpecificAppData.parseFrom(source.createByteArray());
@@ -219,7 +220,7 @@
           }
           callIntentBuilder
               .setCallSpecificAppData(data)
-              .setPhoneAccountHandle(source.readParcelable(classLoader))
+              .setPhoneAccountHandle(source.readParcelable(classLoader, PhoneAccountHandle.class))
               .setIsVideoCall(source.readInt() != 0)
               .setCallSubject(source.readString())
               .setAllowAssistedDial(source.readInt() != 0);
diff --git a/java/com/android/dialer/callintent/CallIntentBuilder.java b/java/com/android/dialer/callintent/CallIntentBuilder.java
index 4e93e30..8567cc3 100644
--- a/java/com/android/dialer/callintent/CallIntentBuilder.java
+++ b/java/com/android/dialer/callintent/CallIntentBuilder.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -75,7 +76,7 @@
 
   public CallIntentBuilder(@NonNull Parcel parcel) {
     ClassLoader classLoader = CallIntentBuilder.class.getClassLoader();
-    uri = parcel.readParcelable(classLoader);
+    uri = parcel.readParcelable(classLoader, Uri.class);
     CallSpecificAppData data;
     try {
       data = CallSpecificAppData.parseFrom(parcel.createByteArray());
@@ -83,7 +84,7 @@
       data = createCallSpecificAppData(Type.UNKNOWN_INITIATION);
     }
     callSpecificAppData = data;
-    phoneAccountHandle = parcel.readParcelable(classLoader);
+    phoneAccountHandle = parcel.readParcelable(classLoader, PhoneAccountHandle.class);
     isVideoCall = parcel.readInt() != 0;
     callSubject = parcel.readString();
     allowAssistedDial = parcel.readInt() != 0;
diff --git a/java/com/android/dialer/callrecord/impl/CallRecorderService.java b/java/com/android/dialer/callrecord/impl/CallRecorderService.java
index 5681925..9940956 100644
--- a/java/com/android/dialer/callrecord/impl/CallRecorderService.java
+++ b/java/com/android/dialer/callrecord/impl/CallRecorderService.java
@@ -123,7 +123,7 @@
 
     if (DBG) Log.d(TAG, "Starting recording");
 
-    mMediaRecorder = new MediaRecorder();
+    mMediaRecorder = new MediaRecorder(getApplicationContext());
     try {
       int audioSource = getAudioSource();
       int formatChoice = getAudioFormatChoice();
diff --git a/java/com/android/dialer/callstats/CallStatsDetailActivity.java b/java/com/android/dialer/callstats/CallStatsDetailActivity.java
index 4c36e81..5d18de8 100644
--- a/java/com/android/dialer/callstats/CallStatsDetailActivity.java
+++ b/java/com/android/dialer/callstats/CallStatsDetailActivity.java
@@ -167,8 +167,8 @@
         R.string.call_stats_outgoing, Calls.OUTGOING_TYPE);
 
     Intent launchIntent = getIntent();
-    mData = (CallStatsDetails) launchIntent.getParcelableExtra(EXTRA_DETAILS);
-    mTotalData = (CallStatsDetails) launchIntent.getParcelableExtra(EXTRA_TOTAL);
+    mData = launchIntent.getParcelableExtra(EXTRA_DETAILS, CallStatsDetails.class);
+    mTotalData = launchIntent.getParcelableExtra(EXTRA_TOTAL, CallStatsDetails.class);
     updateData();
 
     TextView dateFilterView = (TextView) findViewById(R.id.date_filter);
diff --git a/java/com/android/dialer/callstats/CallStatsFragment.java b/java/com/android/dialer/callstats/CallStatsFragment.java
index 4ce5f8f..95f7df4 100644
--- a/java/com/android/dialer/callstats/CallStatsFragment.java
+++ b/java/com/android/dialer/callstats/CallStatsFragment.java
@@ -26,6 +26,7 @@
 import android.database.ContentObserver;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.provider.CallLog;
 import android.provider.ContactsContract;
 import android.telecom.PhoneAccountHandle;
@@ -81,7 +82,8 @@
   private boolean mHasReadCallLogPermission = false;
 
   private boolean mRefreshDataRequired = true;
-  private final ContentObserver mObserver = new ContentObserver(new Handler()) {
+  private final ContentObserver mObserver = new ContentObserver(
+          new Handler(Looper.getMainLooper())) {
     @Override
     public void onChange(boolean selfChange) {
       mRefreshDataRequired = true;
diff --git a/java/com/android/dialer/common/PackageUtils.java b/java/com/android/dialer/common/PackageUtils.java
index 1944a85..fe32d36 100644
--- a/java/com/android/dialer/common/PackageUtils.java
+++ b/java/com/android/dialer/common/PackageUtils.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,8 +30,9 @@
     Assert.isNotNull(packageName);
     Assert.isNotNull(context);
     try {
-      PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
-      if (info != null && info.packageName != null) {
+      PackageInfo info = context.getPackageManager().getPackageInfo(packageName,
+              PackageManager.PackageInfoFlags.of(0));
+      if (info.packageName != null) {
         LogUtil.d("PackageUtils.isPackageInstalled", packageName + " is found");
         return true;
       }
diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
index 4519ba1..d50febf 100644
--- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
+++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
@@ -94,7 +94,7 @@
     if (telephonyManager == null) {
       return 1;
     }
-    return telephonyManager.getPhoneCount();
+    return telephonyManager.getActiveModemCount();
   }
 
   /**
diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
index eaf197d..7f2905e 100644
--- a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
+++ b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java
@@ -38,6 +38,7 @@
 import android.os.Handler;
 import android.os.Handler.Callback;
 import android.os.HandlerThread;
+import android.os.Looper;
 import android.os.Message;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
@@ -133,7 +134,7 @@
   private final ConcurrentHashMap<ImageView, Request> pendingRequests =
       new ConcurrentHashMap<ImageView, Request>();
   /** Handler for messages sent to the UI thread. */
-  private final Handler mainThreadHandler = new Handler(this);
+  private final Handler mainThreadHandler = new Handler(Looper.getMainLooper(), this);
   /** For debug: How many times we had to reload cached photo for a stale entry */
   private final AtomicInteger staleCacheOverwrite = new AtomicInteger();
   /** For debug: How many times we had to reload cached photo for a fresh entry. Should be 0. */
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 6fdbbdc..c3bd2bc 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -1071,10 +1071,8 @@
         } else if (getActivity() != null) {
           // Voicemail is unavailable maybe because Airplane mode is turned on.
           // Check the current status and show the most appropriate error message.
-          final boolean isAirplaneModeOn =
-              Settings.System.getInt(
-                      getActivity().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0)
-                  != 0;
+          final boolean isAirplaneModeOn = Settings.Global.getInt(
+                  getActivity().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
           if (isAirplaneModeOn) {
             DialogFragment dialogFragment =
                 ErrorDialogFragment.newInstance(R.string.dialog_voicemail_airplane_mode_message);
@@ -1389,7 +1387,8 @@
   public boolean onMenuItemClick(MenuItem item) {
     if (item.getGroupId() == Menu.FIRST) {
       Intent intent = item.getIntent();
-      selectedAccount = intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+      selectedAccount = intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+              PhoneAccountHandle.class);
       return true;
     }
     int resId = item.getItemId();
diff --git a/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
index f3442e6..aaa65d0 100644
--- a/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
+++ b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java
@@ -25,6 +25,7 @@
 import android.graphics.ColorFilter;
 import android.graphics.LightingColorFilter;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Vibrator;
 import android.view.View;
 
@@ -92,7 +93,7 @@
                   viewProvider.getFab().getBackground().clearColorFilter();
                 }
 
-                new Handler()
+                new Handler(Looper.getMainLooper())
                     .postDelayed(
                         () -> {
                           try {
diff --git a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
index 157b1cf..616df5a 100644
--- a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
+++ b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
@@ -178,7 +178,7 @@
     // accessed from the emergency dialer.
     KeyguardManager keyguardManager =
         (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
-    if (keyguardManager.inKeyguardRestrictedInputMode()) {
+    if (keyguardManager.isKeyguardLocked()) {
       return false;
     }
 
@@ -321,14 +321,18 @@
       ViewGroup holder = customView.findViewById(R.id.deviceids_holder);
 
       if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1) {
-        for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) {
-          String deviceId = telephonyManager.getDeviceId(slot);
+        for (int slot = 0; slot < telephonyManager.getActiveModemCount(); slot++) {
+          String deviceId = telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM
+                  ? telephonyManager.getImei(slot)
+                  : telephonyManager.getMeid(slot);
           if (!TextUtils.isEmpty(deviceId)) {
             addDeviceIdRow(holder, deviceId);
           }
         }
       } else {
-        addDeviceIdRow(holder, telephonyManager.getDeviceId());
+        addDeviceIdRow(holder, telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM
+                ? telephonyManager.getImei()
+                : telephonyManager.getMeid());
       }
 
       new AlertDialog.Builder(context)
diff --git a/java/com/android/dialer/interactions/PhoneNumberInteraction.java b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
index a38ba29..98c6864 100644
--- a/java/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -523,7 +523,7 @@
       final Activity activity = getActivity();
       Assert.checkState(activity instanceof DisambigDialogDismissedListener);
 
-      phoneList = getArguments().getParcelableArrayList(ARG_PHONE_LIST);
+      phoneList = getArguments().getParcelableArrayList(ARG_PHONE_LIST, PhoneItem.class);
       interactionType = getArguments().getInt(ARG_INTERACTION_TYPE);
       isVideoCall = getArguments().getBoolean(ARG_IS_VIDEO_CALL);
       callSpecificAppData = CallIntentParser.getCallSpecificAppData(getArguments());
diff --git a/java/com/android/dialer/location/CountryDetector.java b/java/com/android/dialer/location/CountryDetector.java
index e198030..a50e232 100644
--- a/java/com/android/dialer/location/CountryDetector.java
+++ b/java/com/android/dialer/location/CountryDetector.java
@@ -209,7 +209,7 @@
       }
 
       final Location location =
-          (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
+              intent.getParcelableExtra(LocationManager.KEY_LOCATION_CHANGED, Location.class);
 
       // TODO: rething how we access the gecoder here, right now we have to set the static instance
       // of CountryDetector to make this work for tests which is weird
diff --git a/java/com/android/dialer/lookup/LookupProvider.java b/java/com/android/dialer/lookup/LookupProvider.java
index 3061b55..ba8c2b6 100644
--- a/java/com/android/dialer/lookup/LookupProvider.java
+++ b/java/com/android/dialer/lookup/LookupProvider.java
@@ -18,25 +18,18 @@
 package com.android.dialer.lookup;
 
 import android.content.ContentProvider;
-import android.content.ContentResolver;
 import android.content.ContentValues;
-import android.content.Context;
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.MatrixCursor;
-import android.location.Criteria;
 import android.location.Location;
-import android.location.LocationListener;
 import android.location.LocationManager;
 import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
+import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.Contacts;
-import android.provider.Settings;
 import android.util.Log;
 
 import com.android.dialer.searchfragment.common.Projections;
@@ -55,6 +48,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.TimeUnit;
@@ -233,15 +227,8 @@
    * @return Whether location services are enabled
    */
   private boolean isLocationEnabled() {
-    try {
-      int mode = Settings.Secure.getInt(getContext().getContentResolver(),
-          Settings.Secure.LOCATION_MODE);
-
-      return mode != Settings.Secure.LOCATION_MODE_OFF;
-    } catch (Settings.SettingNotFoundException e) {
-      Log.e(TAG, "Failed to get location mode", e);
-      return false;
-    }
+      LocationManager locationManager = requireContext().getSystemService(LocationManager.class);
+      return locationManager.isLocationEnabled();
   }
 
   /**
@@ -250,26 +237,11 @@
    * @return The last location
    */
   private Location getLastLocation() {
-    LocationManager locationManager = getContext().getSystemService(LocationManager.class);
+    LocationManager locationManager = requireContext().getSystemService(LocationManager.class);
 
     try {
-      locationManager.requestSingleUpdate(new Criteria(), new LocationListener() {
-        @Override
-        public void onLocationChanged(Location location) {
-        }
-
-        @Override
-        public void onProviderDisabled(String provider) {
-        }
-
-        @Override
-        public void onProviderEnabled(String provider) {
-        }
-
-        @Override
-        public void onStatusChanged(String provider, int status, Bundle extras) {
-        }
-      }, Looper.getMainLooper());
+      locationManager.getCurrentLocation(LocationManager.FUSED_PROVIDER, new CancellationSignal(),
+              Executors.newSingleThreadExecutor(), location -> {});
 
       return locationManager.getLastKnownLocation(LocationManager.FUSED_PROVIDER);
     } catch (IllegalArgumentException e) {
diff --git a/java/com/android/dialer/lookup/LookupUtils.java b/java/com/android/dialer/lookup/LookupUtils.java
index b6e4533..47271c6 100644
--- a/java/com/android/dialer/lookup/LookupUtils.java
+++ b/java/com/android/dialer/lookup/LookupUtils.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014 The CyanogenMod Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -163,6 +164,6 @@
     if (input == null) {
       return null;
     }
-    return Html.fromHtml(input).toString().trim();
+    return Html.fromHtml(input, Html.FROM_HTML_MODE_LEGACY).toString().trim();
   }
 }
diff --git a/java/com/android/dialer/lookup/ReverseLookupService.java b/java/com/android/dialer/lookup/ReverseLookupService.java
index 02e873b..647ca5b 100644
--- a/java/com/android/dialer/lookup/ReverseLookupService.java
+++ b/java/com/android/dialer/lookup/ReverseLookupService.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014 Xiao-Long Chen <chillermillerlong@hotmail.com>
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +22,7 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.Looper;
 import android.os.Message;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
@@ -51,7 +53,7 @@
     backgroundThread.start();
 
     backgroundHandler = new Handler(backgroundThread.getLooper(), this);
-    handler = new Handler(this);
+    handler = new Handler(Looper.getMainLooper(), this);
   }
 
   @Override
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index fc068d1..d27c4eb 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -27,6 +27,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.VoicemailContract;
@@ -733,7 +734,7 @@
     private boolean activityIsAlive;
 
     private final ContentObserver voicemailStatusObserver =
-        new ContentObserver(new Handler()) {
+        new ContentObserver(new Handler(Looper.getMainLooper())) {
           @Override
           public void onChange(boolean selfChange) {
             LogUtil.i(
diff --git a/java/com/android/dialer/notification/VoicemailChannelUtils.java b/java/com/android/dialer/notification/VoicemailChannelUtils.java
index 763da0c..ac41cf6 100644
--- a/java/com/android/dialer/notification/VoicemailChannelUtils.java
+++ b/java/com/android/dialer/notification/VoicemailChannelUtils.java
@@ -225,7 +225,7 @@
     if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return true;
     }
-    return context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1;
+    return context.getSystemService(TelephonyManager.class).getActiveModemCount() <= 1;
   }
 
   private VoicemailChannelUtils() {}
diff --git a/java/com/android/dialer/oem/CequintPackageUtils.java b/java/com/android/dialer/oem/CequintPackageUtils.java
index 5ff501d..010d54d 100644
--- a/java/com/android/dialer/oem/CequintPackageUtils.java
+++ b/java/com/android/dialer/oem/CequintPackageUtils.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -241,7 +242,8 @@
     }
 
     ProviderInfo providerInfo =
-        packageManager.resolveContentProvider(authority, PackageManager.GET_META_DATA);
+        packageManager.resolveContentProvider(authority,
+                PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA));
     if (providerInfo == null) {
       LogUtil.d(
           "CequintPackageUtils.isCallerIdInstalled",
@@ -262,9 +264,10 @@
 
     try {
       PackageInfo packageInfo =
-          packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
+          packageManager.getPackageInfo(packageName,
+                  PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES));
 
-      Signature[] signatures = packageInfo.signatures;
+      Signature[] signatures = packageInfo.signingInfo.getSigningCertificateHistory();
       if (signatures.length > 1) {
         LogUtil.w(
             "CequintPackageUtils.isCallerIdInstalled", "package has more than one signature.");
diff --git a/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java b/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java
index 508ad3d..2453a76 100644
--- a/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java
+++ b/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java
@@ -21,6 +21,7 @@
 import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import com.android.dialer.common.LogUtil;
 import java.util.ArrayList;
@@ -157,7 +158,8 @@
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
       intent.putExtra(EXTRA_HIDDEN_MENU_CODE, input);
 
-      ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, 0);
+      ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent,
+              PackageManager.ResolveInfoFlags.of(0));
 
       if (resolveInfo != null
           && resolveInfo.activityInfo != null
diff --git a/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java b/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java
index b045d03..4426eb8 100644
--- a/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java
@@ -70,7 +70,7 @@
                   TelecomCallUtil.getNumber(call), GeoUtil.getCurrentCountryIso(appContext));
             });
     String callerDisplayName = call.getDetails().getCallerDisplayName();
-    boolean isIncomingCall = (call.getState() == Call.STATE_RINGING);
+    boolean isIncomingCall = (call.getDetails().getState() == Call.STATE_RINGING);
 
     return Futures.transformAsync(
         dialerPhoneNumberFuture,
diff --git a/java/com/android/dialer/postcall/PostCallActivity.java b/java/com/android/dialer/postcall/PostCallActivity.java
index 0b76caf..000ee54 100644
--- a/java/com/android/dialer/postcall/PostCallActivity.java
+++ b/java/com/android/dialer/postcall/PostCallActivity.java
@@ -97,7 +97,7 @@
       finish();
     } else if (PermissionsUtil.hasPermission(this, permission.SEND_SMS)) {
       LogUtil.i("PostCallActivity.sendMessage", "Sending post call SMS.");
-      SmsManager smsManager = SmsManager.getDefault();
+      SmsManager smsManager = getSystemService(SmsManager.class);
       smsManager.sendMultipartTextMessage(
           number, null, smsManager.divideMessage(message), null, null);
       PostCall.onMessageSent(this, number);
diff --git a/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java b/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
index 359bd81..4aed1a5 100644
--- a/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
+++ b/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
@@ -69,9 +69,11 @@
     Intent intent = getIntent();
     CallIntentBuilder builder = new CallIntentBuilder(intent.getData(), Type.EXTERNAL_INITIATION);
 
-    PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE);
+    PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE,
+            PhoneAccountHandle.class);
     if (phoneAccountHandle == null) {
-      phoneAccountHandle = intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+      phoneAccountHandle = intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+              PhoneAccountHandle.class);
     }
 
     builder
@@ -125,7 +127,8 @@
 
     if (intentExtras.containsKey(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE)) {
       builder.setPhoneAccountHandle(
-          intentExtras.getParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
+          intentExtras.getParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+                  PhoneAccountHandle.class));
     }
 
     if (intentExtras.containsKey(TelecomManager.EXTRA_CALL_SUBJECT)) {
diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
index 4fd8f33..46cac7f 100644
--- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java
+++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
@@ -22,7 +22,7 @@
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
-import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
 
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
@@ -69,16 +69,15 @@
     if (builder.getPhoneAccountHandle() != null) {
       return false;
     }
-    if (PhoneNumberUtils.isEmergencyNumber(builder.getUri().getSchemeSpecificPart())) {
+
+    TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+    if (telephonyManager.isEmergencyNumber(builder.getUri().getSchemeSpecificPart())) {
       return false;
     }
 
     TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
     List<PhoneAccountHandle> accounts = telecomManager.getCallCapablePhoneAccounts();
-    if (accounts.size() <= 1) {
-      return false;
-    }
-    return true;
+    return accounts.size() > 1;
   }
 
   @Override
diff --git a/java/com/android/dialer/precall/impl/PermissionCheckAction.java b/java/com/android/dialer/precall/impl/PermissionCheckAction.java
index 85e9ceb..9377c25 100644
--- a/java/com/android/dialer/precall/impl/PermissionCheckAction.java
+++ b/java/com/android/dialer/precall/impl/PermissionCheckAction.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,14 +22,14 @@
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.precall.PreCallAction;
 import com.android.dialer.precall.PreCallCoordinator;
-import com.android.dialer.telecom.TelecomUtil;
+import com.android.dialer.util.PermissionsUtil;
 
 /** Aborts call and show a toast if phone permissions are missing. */
 public class PermissionCheckAction implements PreCallAction {
 
   @Override
   public boolean requiresUi(Context context, CallIntentBuilder builder) {
-    return !TelecomUtil.hasCallPhonePermission(context);
+    return !PermissionsUtil.hasPhonePermissions(context);
   }
 
   @Override
diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
index 18ac29c..476202b 100644
--- a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
+++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java
@@ -69,9 +69,11 @@
     LogUtil.enterBlock("PreCallCoordinatorImpl.onCreate");
     if (savedInstanceState != null) {
       currentActionIndex = savedInstanceState.getInt(SAVED_STATE_CURRENT_ACTION);
-      builder = Assert.isNotNull(savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER));
+      builder = Assert.isNotNull(savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER,
+              CallIntentBuilder.class));
     } else {
-      builder = Assert.isNotNull(intent.getParcelableExtra(EXTRA_CALL_INTENT_BUILDER));
+      builder = Assert.isNotNull(intent.getParcelableExtra(EXTRA_CALL_INTENT_BUILDER,
+              CallIntentBuilder.class));
     }
     uiListener =
         DialerExecutorComponent.get(activity)
@@ -81,7 +83,7 @@
 
   void onRestoreInstanceState(Bundle savedInstanceState) {
     currentActionIndex = savedInstanceState.getInt(SAVED_STATE_CURRENT_ACTION);
-    builder = savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER);
+    builder = savedInstanceState.getParcelable(EXTRA_CALL_INTENT_BUILDER, CallIntentBuilder.class);
   }
 
   void onResume() {
diff --git a/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java b/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
index 527baa4..0302232 100644
--- a/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
+++ b/java/com/android/dialer/preferredsim/impl/PreferredAccountWorkerImpl.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -334,10 +335,9 @@
     Assert.isWorkerThread();
 
     Intent quickContactIntent = getQuickContactIntent();
-    ResolveInfo resolveInfo =
-        context
-            .getPackageManager()
-            .resolveActivity(quickContactIntent, PackageManager.GET_META_DATA);
+    ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(
+            quickContactIntent,
+            PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA));
     if (resolveInfo == null
         || resolveInfo.activityInfo == null
         || resolveInfo.activityInfo.applicationInfo == null
diff --git a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
index 6cc57b9..3a6c702 100644
--- a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
+++ b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
@@ -480,12 +480,12 @@
 
   @Override
   public void deactivate() {
-    cursor.deactivate();
+
   }
 
   @Override
   public boolean requery() {
-    return cursor.requery();
+    return false;
   }
 
   @Override
diff --git a/java/com/android/dialer/shortcuts/CallContactActivity.java b/java/com/android/dialer/shortcuts/CallContactActivity.java
index 0874752..87fe5e6 100644
--- a/java/com/android/dialer/shortcuts/CallContactActivity.java
+++ b/java/com/android/dialer/shortcuts/CallContactActivity.java
@@ -120,7 +120,7 @@
     if (savedInstanceState == null) {
       return;
     }
-    contactUri = savedInstanceState.getParcelable(CONTACT_URI_KEY);
+    contactUri = savedInstanceState.getParcelable(CONTACT_URI_KEY, Uri.class);
   }
 
   @Override
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnection.java b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
index 6c73447..d813373 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnection.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
@@ -50,7 +50,8 @@
         CAPABILITY_MUTE
             | CAPABILITY_SUPPORT_HOLD
             | CAPABILITY_HOLD
-            | CAPABILITY_CAN_UPGRADE_TO_VIDEO
+            | CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL
+            | CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL
             | CAPABILITY_DISCONNECT_FROM_CONFERENCE);
 
     if (request.getExtras() != null) {
diff --git a/java/com/android/dialer/simulator/impl/SimulatorRemoteVideo.java b/java/com/android/dialer/simulator/impl/SimulatorRemoteVideo.java
index 060e629..96a2826 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorRemoteVideo.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorRemoteVideo.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +22,7 @@
 import android.graphics.Paint;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.Looper;
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
@@ -78,7 +80,7 @@
     @WorkerThread
     void schedule() {
       Assert.isWorkerThread();
-      new Handler().postDelayed(this, FRAME_DELAY_MILLIS);
+      new Handler(Looper.getMainLooper()).postDelayed(this, FRAME_DELAY_MILLIS);
     }
 
     @WorkerThread
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index cb769b9..6e21860 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -18,7 +18,6 @@
 package com.android.dialer.telecom;
 
 import android.app.role.RoleManager;
-import android.Manifest;
 import android.Manifest.permission;
 import android.content.ComponentName;
 import android.content.Context;
@@ -41,6 +40,7 @@
 import androidx.core.content.ContextCompat;
 
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.util.PermissionsUtil;
 import com.google.common.base.Optional;
 
 import java.util.ArrayList;
@@ -70,7 +70,7 @@
       new ConcurrentHashMap<>();
 
   public static void showInCallScreen(Context context, boolean showDialpad) {
-    if (hasReadPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       try {
         getTelecomManager(context).showInCallScreen(showDialpad);
       } catch (SecurityException e) {
@@ -81,7 +81,7 @@
   }
 
   public static void silenceRinger(Context context) {
-    if (hasModifyPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasModifyPhoneStatePermissions(context)) {
       try {
         getTelecomManager(context).silenceRinger();
       } catch (SecurityException e) {
@@ -92,7 +92,7 @@
   }
 
   public static void cancelMissedCallsNotification(Context context) {
-    if (hasModifyPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasModifyPhoneStatePermissions(context)) {
       try {
         getTelecomManager(context).cancelMissedCallsNotification();
       } catch (SecurityException e) {
@@ -102,7 +102,7 @@
   }
 
   public static Uri getAdnUriForPhoneAccount(Context context, PhoneAccountHandle handle) {
-    if (hasModifyPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasModifyPhoneStatePermissions(context)) {
       try {
         return getTelecomManager(context).getAdnUriForPhoneAccount(handle);
       } catch (SecurityException e) {
@@ -114,7 +114,7 @@
 
   public static boolean handleMmi(
       Context context, String dialString, @Nullable PhoneAccountHandle handle) {
-    if (hasModifyPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasModifyPhoneStatePermissions(context)) {
       try {
         if (handle == null) {
           return getTelecomManager(context).handleMmi(dialString);
@@ -131,7 +131,7 @@
   @Nullable
   public static PhoneAccountHandle getDefaultOutgoingPhoneAccount(
       Context context, String uriScheme) {
-    if (hasReadPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return getTelecomManager(context).getDefaultOutgoingPhoneAccount(uriScheme);
     }
     return null;
@@ -142,7 +142,7 @@
   }
 
   public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(Context context) {
-    if (hasReadPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return Optional.fromNullable(getTelecomManager(context).getCallCapablePhoneAccounts())
           .or(new ArrayList<>());
     }
@@ -198,7 +198,7 @@
     if (TextUtils.isEmpty(phoneAccountHandle.getId())) {
       return Optional.absent();
     }
-    if (!hasPermission(context, permission.READ_PHONE_STATE)) {
+    if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return Optional.absent();
     }
     SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class);
@@ -242,7 +242,7 @@
       return isVoicemailNumberCache.get(cacheKey);
     }
     boolean result = false;
-    if (hasReadPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       result = getTelecomManager(context).isVoiceMailNumber(accountHandle, number);
     }
     isVoicemailNumberCache.put(cacheKey, result);
@@ -251,7 +251,7 @@
 
   @Nullable
   public static String getVoicemailNumber(Context context, PhoneAccountHandle accountHandle) {
-    if (hasReadPhoneStatePermission(context)) {
+    if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return getTelecomManager(context).getVoiceMailNumber(accountHandle);
     }
     return null;
@@ -266,7 +266,7 @@
    *     due to a permission check.
    */
   public static boolean placeCall(Context context, Intent intent) {
-    if (hasCallPhonePermission(context)) {
+    if (PermissionsUtil.hasPhonePermissions(context)) {
       getTelecomManager(context).placeCall(intent.getData(), intent.getExtras());
       return true;
     }
@@ -281,31 +281,8 @@
 
   public static boolean hasReadWriteVoicemailPermissions(Context context) {
     return isDefaultDialer(context)
-        || (hasPermission(context, Manifest.permission.READ_VOICEMAIL)
-            && hasPermission(context, Manifest.permission.WRITE_VOICEMAIL));
-  }
-
-  /** @deprecated use {@link com.android.dialer.util.PermissionsUtil} */
-  @Deprecated
-  public static boolean hasModifyPhoneStatePermission(Context context) {
-    return isDefaultDialer(context)
-        || hasPermission(context, Manifest.permission.MODIFY_PHONE_STATE);
-  }
-
-  /** @deprecated use {@link com.android.dialer.util.PermissionsUtil} */
-  @Deprecated
-  public static boolean hasReadPhoneStatePermission(Context context) {
-    return isDefaultDialer(context) || hasPermission(context, Manifest.permission.READ_PHONE_STATE);
-  }
-
-  /** @deprecated use {@link com.android.dialer.util.PermissionsUtil} */
-  @Deprecated
-  public static boolean hasCallPhonePermission(Context context) {
-    return isDefaultDialer(context) || hasPermission(context, Manifest.permission.CALL_PHONE);
-  }
-
-  private static boolean hasPermission(Context context, String permission) {
-    return instance.hasPermission(context, permission);
+        || (PermissionsUtil.hasReadVoicemailPermissions(context)
+            && PermissionsUtil.hasWriteVoicemailPermissions(context));
   }
 
   private static TelecomManager getTelecomManager(Context context) {
@@ -343,7 +320,7 @@
   private static class TelecomUtilImpl {
 
     public boolean isInManagedCall(Context context) {
-      if (hasReadPhoneStatePermission(context)) {
+      if (PermissionsUtil.hasReadPhoneStatePermissions(context)) {
         // The TelecomManager#isInCall method returns true anytime the user is in a call.
         // Starting in O, the APIs include support for self-managed ConnectionServices so that other
         // apps like Duo can tell Telecom about its calls.  So, if the user is in a Duo call,
@@ -358,7 +335,8 @@
     }
 
     public boolean isInCall(Context context) {
-      return hasReadPhoneStatePermission(context) && getTelecomManager(context).isInCall();
+      return PermissionsUtil.hasReadPhoneStatePermissions(context) &&
+              getTelecomManager(context).isInCall();
     }
 
     public boolean hasPermission(Context context, String permission) {
diff --git a/java/com/android/dialer/util/DialerUtils.java b/java/com/android/dialer/util/DialerUtils.java
index ff0ba4f..b877619 100644
--- a/java/com/android/dialer/util/DialerUtils.java
+++ b/java/com/android/dialer/util/DialerUtils.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,7 +81,8 @@
           Bundle extras;
           // Make sure to not accidentally clobber any existing extras
           if (intent.hasExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) {
-            extras = intent.getParcelableExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
+            extras = intent.getParcelableExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS,
+                    Bundle.class);
           } else {
             extras = new Bundle();
           }
@@ -127,11 +129,11 @@
   @SuppressLint("MissingPermission")
   private static boolean shouldWarnForOutgoingWps(Context context, String number) {
     if (number != null && number.startsWith(WPS_PREFIX)) {
+      TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
       TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
       boolean isOnVolte =
           telephonyManager.getVoiceNetworkType() == TelephonyManager.NETWORK_TYPE_LTE;
-      boolean hasCurrentActiveCall =
-          telephonyManager.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK;
+      boolean hasCurrentActiveCall = telecomManager.isInCall();
       return isOnVolte && hasCurrentActiveCall;
     }
     return false;
diff --git a/java/com/android/dialer/util/PermissionsUtil.java b/java/com/android/dialer/util/PermissionsUtil.java
index c526b6a..13fdbdd 100644
--- a/java/com/android/dialer/util/PermissionsUtil.java
+++ b/java/com/android/dialer/util/PermissionsUtil.java
@@ -90,6 +90,10 @@
     return hasPermission(context, permission.READ_PHONE_STATE);
   }
 
+  public static boolean hasModifyPhoneStatePermissions(Context context) {
+    return hasPermission(context, MODIFY_PHONE_STATE);
+  }
+
   public static boolean hasContactsReadPermissions(Context context) {
     return hasPermission(context, permission.READ_CONTACTS);
   }
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
index 45c5cc0..43b65e6 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
@@ -24,6 +24,7 @@
 import android.content.DialogInterface.OnDismissListener;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.telecom.PhoneAccountHandle;
 import android.text.Editable;
@@ -321,7 +322,8 @@
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
 
-    phoneAccountHandle = getIntent().getParcelableExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE);
+    phoneAccountHandle = getIntent().getParcelableExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE,
+            PhoneAccountHandle.class);
     pinChanger =
         VoicemailComponent.get(this)
             .getVoicemailClient()
@@ -561,6 +563,7 @@
     private final WeakReference<VoicemailChangePinActivity> activityWeakReference;
 
     private ChangePinHandler(WeakReference<VoicemailChangePinActivity> activityWeakReference) {
+      super(Looper.getMainLooper());
       this.activityWeakReference = activityWeakReference;
     }
 
diff --git a/java/com/android/incallui/AccelerometerListener.java b/java/com/android/incallui/AccelerometerListener.java
index 378971a..8bd1515 100644
--- a/java/com/android/incallui/AccelerometerListener.java
+++ b/java/com/android/incallui/AccelerometerListener.java
@@ -23,6 +23,7 @@
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import com.android.dialer.common.LogUtil;
 
@@ -52,30 +53,29 @@
   // mOrientation.
   private int pendingOrientation;
   private OrientationListener listener;
-  Handler handler =
-      new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-          switch (msg.what) {
-            case ORIENTATION_CHANGED:
-              synchronized (this) {
-                orientation = pendingOrientation;
-                if (DEBUG) {
-                  LogUtil.d(
-                      TAG,
-                      "orientation: "
-                          + (orientation == ORIENTATION_HORIZONTAL
-                              ? "horizontal"
-                              : (orientation == ORIENTATION_VERTICAL ? "vertical" : "unknown")));
-                }
-                if (listener != null) {
-                  listener.orientationChanged(orientation);
-                }
-              }
-              break;
+  final Handler handler = new Handler(Looper.getMainLooper()) {
+    @Override
+    public void handleMessage(Message msg) {
+      switch (msg.what) {
+        case ORIENTATION_CHANGED:
+          synchronized (this) {
+            orientation = pendingOrientation;
+            if (DEBUG) {
+              LogUtil.d(
+                  TAG,
+                  "orientation: "
+                      + (orientation == ORIENTATION_HORIZONTAL
+                          ? "horizontal"
+                          : (orientation == ORIENTATION_VERTICAL ? "vertical" : "unknown")));
+            }
+            if (listener != null) {
+              listener.orientationChanged(orientation);
+            }
           }
-        }
-      };
+          break;
+      }
+    }
+  };
   final SensorEventListener sensorListener =
       new SensorEventListener() {
         @Override
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 2cd111a..efcca39 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -27,6 +27,7 @@
 import android.graphics.drawable.Drawable;
 import android.hardware.display.DisplayManager;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Trace;
 import android.telecom.Call.Details;
 import android.telecom.StatusHints;
@@ -103,7 +104,7 @@
   private static final long CONFIG_MIN_BATTERY_PERCENT_FOR_EMERGENCY_LOCATION_DEFAULT = 10;
 
   private final Context context;
-  private final Handler handler = new Handler();
+  private final Handler handler = new Handler(Looper.getMainLooper());
 
   private DialerCall primary;
   private String primaryNumber;
@@ -783,8 +784,9 @@
       // Return the label for the gateway app on outgoing calls.
       final PackageManager pm = context.getPackageManager();
       try {
-        ApplicationInfo info =
-            pm.getApplicationInfo(primary.getGatewayInfo().getGatewayProviderPackageName(), 0);
+        ApplicationInfo info = pm.getApplicationInfo(
+                primary.getGatewayInfo().getGatewayProviderPackageName(),
+                PackageManager.ApplicationInfoFlags.of(0));
         return pm.getApplicationLabel(info).toString();
       } catch (PackageManager.NameNotFoundException e) {
         LogUtil.e("CallCardPresenter.getConnectionLabel", "gateway Application Not Found.", e);
diff --git a/java/com/android/incallui/ExternalCallNotifier.java b/java/com/android/incallui/ExternalCallNotifier.java
index 3be820d..62b1957 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -19,6 +19,7 @@
 
 import android.app.Notification;
 import android.app.PendingIntent;
+import android.app.Person;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
@@ -219,7 +220,7 @@
 
   /** Rebuild an existing or show a new notification given {@link NotificationInfo}. */
   private void postNotification(NotificationInfo info) {
-    Notification.Builder builder = new Notification.Builder(context);
+    Notification.Builder builder = new Notification.Builder(context, NotificationChannelId.DEFAULT);
     // Set notification as ongoing since calls are long-running versus a point-in-time notice.
     builder.setOngoing(true);
     // Make the notification prioritized over the other normal notifications.
@@ -237,8 +238,7 @@
     builder.setContentTitle(info.getContentTitle());
     builder.setLargeIcon(info.getLargeIcon());
     builder.setColor(ThemeComponent.get(context).theme().getColorCallNotificationBackground());
-    builder.addPerson(info.getPersonReference());
-    builder.setChannelId(NotificationChannelId.DEFAULT);
+    builder.addPerson(new Person.Builder().setUri(info.getPersonReference()).build());
 
     // Where the external call supports being transferred to the local device, add an action
     // to the notification to initiate the call pull process.
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 99e109c..8213678 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -33,6 +33,7 @@
 import android.telecom.Call;
 import android.telecom.CallAudioState;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.PhoneAccountSuggestion;
 import android.telephony.TelephonyManager;
 import android.view.KeyEvent;
 import android.view.MenuItem;
@@ -342,10 +343,17 @@
         PreferredSimComponent.get(this).preferredAccountWorker();
 
     Bundle extras = waitingForAccountCall.getIntentExtras();
-    List<PhoneAccountHandle> phoneAccountHandles =
+    List<PhoneAccountSuggestion> phoneAccountSuggestions =
         extras == null
             ? new ArrayList<>()
-            : extras.getParcelableArrayList(Call.AVAILABLE_PHONE_ACCOUNTS);
+            : extras.getParcelableArrayList(Call.EXTRA_SUGGESTED_PHONE_ACCOUNTS,
+                PhoneAccountSuggestion.class);
+    List<PhoneAccountHandle> phoneAccountHandles = new ArrayList<>();
+    if (phoneAccountSuggestions != null) {
+      for (PhoneAccountSuggestion suggestion : phoneAccountSuggestions) {
+        phoneAccountHandles.add(suggestion.getPhoneAccountHandle());
+      }
+    }
 
     ListenableFuture<PreferredAccountWorker.Result> preferredAccountFuture =
         preferredAccountWorker.selectAccount(
@@ -1028,7 +1036,7 @@
     List<AppTask> tasks = getSystemService(ActivityManager.class).getAppTasks();
     for (AppTask task : tasks) {
       try {
-        if (task.getTaskInfo().id == taskId) {
+        if (task.getTaskInfo().taskId == taskId) {
           task.setExcludeFromRecents(exclude);
         }
       } catch (RuntimeException e) {
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index ada3935..77bf562 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -23,14 +23,16 @@
 import android.os.Bundle;
 import android.os.Trace;
 import android.provider.BlockedNumberContract;
+import android.telecom.Call;
 import android.telecom.Call.Details;
 import android.telecom.CallAudioState;
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.PhoneAccountSuggestion;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
-import android.telephony.PhoneStateListener;
+import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.util.ArraySet;
 import android.view.Window;
@@ -183,23 +185,6 @@
 
   private boolean screenTimeoutEnabled = true;
 
-  private PhoneStateListener phoneStateListener =
-      new PhoneStateListener() {
-        @Override
-        public void onCallStateChanged(int state, String incomingNumber) {
-          if (state == TelephonyManager.CALL_STATE_RINGING) {
-            if (EmergencyCallUtil.hasRecentEmergencyCall(context)) {
-              return;
-            }
-            // Check if the number is blocked, to silence the ringer.
-            if (BlockedNumberContract.canCurrentUserBlockNumbers(context) &&
-                    BlockedNumberContract.isBlocked(context, incomingNumber)) {
-              TelecomUtil.silenceRinger(context);
-            }
-          }
-        }
-      };
-
   /** Whether or not InCallService is bound to Telecom. */
   private boolean serviceBound = false;
 
@@ -275,8 +260,9 @@
         extras = EMPTY_EXTRAS;
       }
 
-      final List<PhoneAccountHandle> phoneAccountHandles =
-          extras.getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+      final List<PhoneAccountSuggestion> phoneAccountHandles =
+          extras.getParcelableArrayList(android.telecom.Call.EXTRA_SUGGESTED_PHONE_ACCOUNTS,
+                  PhoneAccountSuggestion.class);
 
       if ((call.getAccountHandle() == null
           && (phoneAccountHandles == null || phoneAccountHandles.isEmpty()))) {
@@ -357,9 +343,6 @@
     this.callList.addListener(activeCallsListener);
 
     VideoPauseController.getInstance().setUp(this);
-    this.context
-        .getSystemService(TelephonyManager.class)
-        .listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
 
     AudioModeProvider.getInstance().addListener(this);
 
@@ -387,10 +370,6 @@
 
     serviceConnected = false;
 
-    context
-        .getSystemService(TelephonyManager.class)
-        .listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
-
     attemptCleanup();
     VideoPauseController.getInstance().tearDown();
     AudioModeProvider.getInstance().removeListener(this);
@@ -524,6 +503,24 @@
       callList.onCallAdded(context, call);
     }
 
+    if (call.getDetails().getState() == Call.STATE_RINGING) {
+      if (EmergencyCallUtil.hasRecentEmergencyCall(context)) {
+        return;
+      }
+
+      TelephonyManager tm = context.getSystemService(TelephonyManager.class);
+      String countryIso = tm.getSimCountryIso().toUpperCase();
+      String incomingNumber = call.getDetails().getHandle().getSchemeSpecificPart();
+
+      incomingNumber = PhoneNumberUtils.formatNumberToE164(incomingNumber, countryIso);
+
+      // Check if the number is blocked, to silence the ringer.
+      if (BlockedNumberContract.canCurrentUserBlockNumbers(context) &&
+              BlockedNumberContract.isBlocked(context, incomingNumber)) {
+        TelecomUtil.silenceRinger(context);
+      }
+    }
+
     // Since a call has been added we are no longer waiting for Telecom to send us a call.
     setBoundAndWaitingForOutgoingCall(false, null);
     call.registerCallback(callCallback);
@@ -1360,10 +1357,11 @@
       extras = new Bundle();
     }
 
-    final List<PhoneAccountHandle> phoneAccountHandles =
-        extras.getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+    final List<PhoneAccountSuggestion> phoneAccountSuggestions =
+        extras.getParcelableArrayList(Call.EXTRA_SUGGESTED_PHONE_ACCOUNTS,
+                PhoneAccountSuggestion.class);
 
-    if (phoneAccountHandles == null || phoneAccountHandles.isEmpty()) {
+    if (phoneAccountSuggestions == null || phoneAccountSuggestions.isEmpty()) {
       String scheme = call.getHandle().getScheme();
       final String errorMsg =
           PhoneAccount.SCHEME_TEL.equals(scheme)
@@ -1481,14 +1479,15 @@
       return;
     }
 
-    if (extras.containsKey(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS)) {
+    if (extras.containsKey(Call.EXTRA_SUGGESTED_PHONE_ACCOUNTS)) {
       // Account selection dialog will show up so don't show the animation.
       return;
     }
 
     final PhoneAccountHandle accountHandle =
-        intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
-    final Point touchPoint = extras.getParcelable(TouchPointManager.TOUCH_POINT);
+            intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+                    PhoneAccountHandle.class);
+    final Point touchPoint = extras.getParcelable(TouchPointManager.TOUCH_POINT, Point.class);
 
     setBoundAndWaitingForOutgoingCall(true, accountHandle);
 
diff --git a/java/com/android/incallui/InCallVibrationHandler.java b/java/com/android/incallui/InCallVibrationHandler.java
index 8ce8d0b..cde882a 100644
--- a/java/com/android/incallui/InCallVibrationHandler.java
+++ b/java/com/android/incallui/InCallVibrationHandler.java
@@ -20,8 +20,11 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
+import android.os.VibrationEffect;
 import android.os.Vibrator;
+import android.os.VibratorManager;
 import android.telecom.DisconnectCause;
 
 import androidx.preference.PreferenceManager;
@@ -46,10 +49,11 @@
   private DialerCall activeCall;
 
   public InCallVibrationHandler(Context context) {
+    super(Looper.getMainLooper());
     String name = context.getPackageName() + "_preferences";
     prefs = context.createDeviceProtectedStorageContext()
             .getSharedPreferences(name, Context.MODE_PRIVATE);
-    vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+    vibrator = context.getSystemService(VibratorManager.class).getDefaultVibrator();
   }
 
   @Override
@@ -142,6 +146,7 @@
     long[] pattern = new long[] {
       0, v1, p1, v2
     };
-    vibrator.vibrate(pattern, -1);
+    VibrationEffect effect = VibrationEffect.createWaveform(pattern, -1);
+    vibrator.vibrate(effect);
   }
 }
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 423e401..2a94cd4 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -336,8 +336,6 @@
         configureFullScreenIntent(builder, createLaunchPendingIntent(true /* isFullScreen */));
         // Set the notification category and bump the priority for incoming calls
         builder.setCategory(Notification.CATEGORY_CALL);
-        // This will be ignored on O+ and handled by the channel
-        builder.setPriority(Notification.PRIORITY_MAX);
         if (currentNotification != NOTIFICATION_INCOMING_CALL) {
           LogUtil.i(
               "StatusBarNotifier.buildAndSendNotification",
@@ -549,10 +547,14 @@
     // Query {@link Contacts#CONTENT_LOOKUP_URI} directly with work lookup key is not allowed.
     // So, do not pass {@link Contacts#CONTENT_LOOKUP_URI} to NotificationManager to avoid
     // NotificationManager using it.
+    String uri = null;
     if (contactInfo.lookupUri != null && contactInfo.userType != ContactsUtils.USER_TYPE_WORK) {
-      builder.addPerson(contactInfo.lookupUri.toString());
+      uri = contactInfo.lookupUri.toString();
     } else if (!TextUtils.isEmpty(call.getNumber())) {
-      builder.addPerson(Uri.fromParts(PhoneAccount.SCHEME_TEL, call.getNumber(), null).toString());
+      uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, call.getNumber(), null).toString();
+    }
+    if (uri != null) {
+      builder.addPerson(new Person.Builder().setUri(uri).build());
     }
   }
 
diff --git a/java/com/android/incallui/VideoCallPresenter.java b/java/com/android/incallui/VideoCallPresenter.java
index 3f92453..2402394 100644
--- a/java/com/android/incallui/VideoCallPresenter.java
+++ b/java/com/android/incallui/VideoCallPresenter.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.graphics.Point;
 import android.os.Handler;
+import android.os.Looper;
 import android.telecom.InCallService.VideoCall;
 import android.telecom.VideoProfile;
 import android.telecom.VideoProfile.CameraCapabilities;
@@ -88,7 +89,7 @@
 
   private static boolean isVideoMode = false;
 
-  private final Handler handler = new Handler();
+  private final Handler handler = new Handler(Looper.getMainLooper());
   private VideoCallScreen videoCallScreen;
 
   /** The current context. */
@@ -1115,7 +1116,7 @@
     Activity activity = videoCallScreen.getVideoCallScreenFragment().getActivity();
     if (activity != null) {
       Point screenSize = new Point();
-      activity.getWindowManager().getDefaultDisplay().getSize(screenSize);
+      activity.getDisplay().getSize(screenSize);
       getRemoteVideoSurfaceTexture().setSurfaceDimensions(screenSize);
     }
   }
diff --git a/java/com/android/incallui/answerproximitysensor/SystemProximityWakeLock.java b/java/com/android/incallui/answerproximitysensor/SystemProximityWakeLock.java
index da3917f..c30ffb5 100644
--- a/java/com/android/incallui/answerproximitysensor/SystemProximityWakeLock.java
+++ b/java/com/android/incallui/answerproximitysensor/SystemProximityWakeLock.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +30,7 @@
 /** The normal PROXIMITY_SCREEN_OFF_WAKE_LOCK provided by the OS. */
 public class SystemProximityWakeLock implements AnswerProximityWakeLock, DisplayListener {
 
-  private static final String TAG = "SystemProximityWakeLock";
+  private static final String TAG = "SystemProximity:WakeLock";
 
   private final Context context;
   private final PowerManager.WakeLock wakeLock;
diff --git a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
index ef28c64..c5836e3 100644
--- a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
+++ b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
@@ -95,7 +95,7 @@
   public View onCreateView(
       LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
     View view = layoutInflater.inflate(R.layout.audioroute_selector, viewGroup, false);
-    CallAudioState audioState = getArguments().getParcelable(ARG_AUDIO_STATE);
+    CallAudioState audioState = getArguments().getParcelable(ARG_AUDIO_STATE, CallAudioState.class);
 
     // Create items for all connected Bluetooth devices
     Collection<BluetoothDevice> bluetoothDeviceSet = audioState.getSupportedBluetoothDevices();
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index fb03a48..1ff6c47 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +19,7 @@
 
 import android.content.Context;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.Trace;
 import android.provider.BlockedNumberContract;
@@ -75,21 +77,20 @@
 
   private UiListener uiListeners;
   /** Handles the timeout for destroying disconnected calls. */
-  private final Handler handler =
-      new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-          switch (msg.what) {
-            case EVENT_DISCONNECTED_TIMEOUT:
-              LogUtil.d("CallList.handleMessage", "EVENT_DISCONNECTED_TIMEOUT ", msg.obj);
-              finishDisconnectedCall((DialerCall) msg.obj);
-              break;
-            default:
-              LogUtil.e("CallList.handleMessage", "Message not expected: " + msg.what);
-              break;
-          }
-        }
-      };
+  private final Handler handler = new Handler(Looper.getMainLooper()) {
+    @Override
+    public void handleMessage(Message msg) {
+      switch (msg.what) {
+        case EVENT_DISCONNECTED_TIMEOUT:
+          LogUtil.d("CallList.handleMessage", "EVENT_DISCONNECTED_TIMEOUT ", msg.obj);
+          finishDisconnectedCall((DialerCall) msg.obj);
+          break;
+        default:
+          LogUtil.e("CallList.handleMessage", "Message not expected: " + msg.what);
+          break;
+      }
+    }
+  };
 
   /**
    * USED ONLY FOR TESTING Testing-only constructor. Instance should only be acquired through
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 87aa087..485a6c7 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -543,9 +543,10 @@
     Trace.beginSection("DialerCall.updateFromTelecomCall");
     LogUtil.v("DialerCall.updateFromTelecomCall", telecomCall.toString());
 
-    videoTechManager.dispatchCallStateChanged(telecomCall.getState(), getAccountHandle());
+    videoTechManager.dispatchCallStateChanged(telecomCall.getDetails().getState(),
+            getAccountHandle());
 
-    final int translatedState = translateState(telecomCall.getState());
+    final int translatedState = translateState(telecomCall.getDetails().getState());
     if (state != DialerCallState.BLOCKED) {
       setState(translatedState);
       setDisconnectCause(telecomCall.getDetails().getDisconnectCause());
@@ -1097,7 +1098,8 @@
    * repeated calls to isEmergencyNumber.
    */
   private void updateEmergencyCallState() {
-    isEmergencyCall = TelecomCallUtil.isEmergencyCall(telecomCall);
+    TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+    isEmergencyCall = TelecomCallUtil.isEmergencyCall(telephonyManager, telecomCall);
   }
 
   public LogState getLogState() {
diff --git a/java/com/android/incallui/callpending/CallPendingActivity.java b/java/com/android/incallui/callpending/CallPendingActivity.java
index 38e0eeb..eb140a9 100644
--- a/java/com/android/incallui/callpending/CallPendingActivity.java
+++ b/java/com/android/incallui/callpending/CallPendingActivity.java
@@ -344,6 +344,6 @@
   }
 
   private Uri getPhotoUri() {
-    return getIntent().getParcelableExtra(EXTRA_PHOTO_URI);
+    return getIntent().getParcelableExtra(EXTRA_PHOTO_URI, Uri.class);
   }
 }
diff --git a/java/com/android/incallui/hold/OnHoldFragment.java b/java/com/android/incallui/hold/OnHoldFragment.java
index a94517a..0304185 100644
--- a/java/com/android/incallui/hold/OnHoldFragment.java
+++ b/java/com/android/incallui/hold/OnHoldFragment.java
@@ -26,6 +26,7 @@
 import android.view.View;
 import android.view.View.OnAttachStateChangeListener;
 import android.view.ViewGroup;
+import android.view.WindowInsets;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -58,7 +59,7 @@
       LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
     final View view = layoutInflater.inflate(R.layout.incall_on_hold_banner, viewGroup, false);
 
-    SecondaryInfo secondaryInfo = getArguments().getParcelable(ARG_INFO);
+    SecondaryInfo secondaryInfo = getArguments().getParcelable(ARG_INFO, SecondaryInfo.class);
     secondaryInfo = Assert.isNotNull(secondaryInfo);
 
     ((TextView) view.findViewById(R.id.hold_contact_name))
@@ -77,7 +78,7 @@
         new OnAttachStateChangeListener() {
           @Override
           public void onViewAttachedToWindow(View v) {
-            topInset = v.getRootWindowInsets().getSystemWindowInsetTop();
+            topInset = v.getRootWindowInsets().getInsets(WindowInsets.Type.systemBars()).top;
             applyInset();
           }
 
diff --git a/java/com/android/incallui/incall/impl/InCallFragment.java b/java/com/android/incallui/incall/impl/InCallFragment.java
index 12e1927..9ffb934 100644
--- a/java/com/android/incallui/incall/impl/InCallFragment.java
+++ b/java/com/android/incallui/incall/impl/InCallFragment.java
@@ -22,8 +22,10 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.graphics.Insets;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.telecom.CallAudioState;
 import android.telephony.TelephonyManager;
 import android.transition.TransitionManager;
@@ -33,6 +35,7 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.WindowInsets;
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.ImageView;
 import android.widget.Toast;
@@ -101,7 +104,7 @@
 
   // Add animation to educate users. If a call has enriched calling attachments then we'll
   // initially show the attachment page. After a delay seconds we'll animate to the button grid.
-  private final Handler handler = new Handler();
+  private final Handler handler = new Handler(Looper.getMainLooper());
   private final Runnable pagerRunnable =
       new Runnable() {
         @Override
@@ -192,8 +195,9 @@
           @Override
           public void onViewAttachedToWindow(View v) {
             View container = v.findViewById(R.id.incall_ui_container);
-            int topInset = v.getRootWindowInsets().getSystemWindowInsetTop();
-            int bottomInset = v.getRootWindowInsets().getSystemWindowInsetBottom();
+            Insets insets = v.getRootWindowInsets().getInsets(WindowInsets.Type.systemBars());
+            int topInset = insets.top;
+            int bottomInset = insets.bottom;
             if (topInset != container.getPaddingTop()) {
               TransitionManager.beginDelayedTransition(((ViewGroup) container.getParent()));
               container.setPadding(0, topInset, 0, bottomInset);
diff --git a/java/com/android/incallui/sessiondata/MultimediaFragment.java b/java/com/android/incallui/sessiondata/MultimediaFragment.java
index f374713..8e7ab8f 100644
--- a/java/com/android/incallui/sessiondata/MultimediaFragment.java
+++ b/java/com/android/incallui/sessiondata/MultimediaFragment.java
@@ -227,12 +227,12 @@
 
   @Nullable
   public Uri getImageUri() {
-    return getArguments().getParcelable(ARG_IMAGE);
+    return getArguments().getParcelable(ARG_IMAGE, Uri.class);
   }
 
   @Nullable
   public Location getLocation() {
-    return getArguments().getParcelable(ARG_LOCATION);
+    return getArguments().getParcelable(ARG_LOCATION, Location.class);
   }
 
   /** Interface for notifying the fragment parent of changes. */
diff --git a/java/com/android/incallui/video/impl/VideoCallFragment.java b/java/com/android/incallui/video/impl/VideoCallFragment.java
index 5408af2..1d8037f 100644
--- a/java/com/android/incallui/video/impl/VideoCallFragment.java
+++ b/java/com/android/incallui/video/impl/VideoCallFragment.java
@@ -22,6 +22,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Insets;
 import android.graphics.Outline;
 import android.graphics.Point;
 import android.graphics.drawable.Animatable;
@@ -43,6 +44,7 @@
 import android.view.ViewGroup;
 import android.view.ViewGroup.MarginLayoutParams;
 import android.view.ViewOutlineProvider;
+import android.view.WindowInsets;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.view.animation.Interpolator;
@@ -524,14 +526,15 @@
     if (getActivity().isInMultiWindowMode()) {
       return new Point();
     }
+    Insets insets = getView().getRootWindowInsets().getInsets(WindowInsets.Type.systemBars());
     if (isLandscape()) {
       int systemWindowInsetEnd =
           getView().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
-              ? getView().getRootWindowInsets().getSystemWindowInsetLeft()
-              : -getView().getRootWindowInsets().getSystemWindowInsetRight();
+              ? insets.left
+              : -insets.right;
       return new Point(systemWindowInsetEnd, 0);
     } else {
-      return new Point(0, -getView().getRootWindowInsets().getSystemWindowInsetBottom());
+      return new Point(0, -insets.bottom);
     }
   }
 
@@ -1041,7 +1044,7 @@
 
   private boolean isLandscape() {
     // Choose orientation based on display orientation, not window orientation
-    int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
+    int rotation = getActivity().getDisplay().getRotation();
     return rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270;
   }
 
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
index d41d497..9baef64 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +19,7 @@
 
 import android.content.Context;
 import android.os.Handler;
+import android.os.Looper;
 import android.telecom.Call;
 import android.telecom.Connection;
 import android.telecom.Connection.VideoProvider;
@@ -31,7 +33,7 @@
 /** Receives IMS video call state updates. */
 public class ImsVideoCallCallback extends VideoCall.Callback {
   private static final int CLEAR_FAILED_REQUEST_TIMEOUT_MILLIS = 4000;
-  private final Handler handler = new Handler();
+  private final Handler handler = new Handler(Looper.getMainLooper());
   private final Call call;
   private final ImsVideoTech videoTech;
   private final VideoTechListener listener;
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index 142f1e6..f71f2fd 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -238,7 +239,7 @@
 
   @Override
   public void pause() {
-    if (call.getState() != Call.STATE_ACTIVE) {
+    if (call.getDetails().getState() != Call.STATE_ACTIVE) {
       LogUtil.i("ImsVideoTech.pause", "not pausing because call is not active");
       return;
     }
@@ -272,7 +273,7 @@
 
   @Override
   public void unpause() {
-    if (call.getState() != Call.STATE_ACTIVE) {
+    if (call.getDetails().getState() != Call.STATE_ACTIVE) {
       LogUtil.i("ImsVideoTech.unpause", "not unpausing because call is not active");
       return;
     }
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index 8797006..895f406 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -102,7 +102,7 @@
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    messageData = extras.getParcelable(EXTRA_MESSAGE_DATA_BUNDLE);
+    messageData = extras.getParcelable(EXTRA_MESSAGE_DATA_BUNDLE, Bundle.class);
   }
 
   @Override
diff --git a/java/com/android/voicemail/impl/DeviceProvisionedJobService.java b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
index 379ee50..80b8b6c 100644
--- a/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
+++ b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -58,7 +59,7 @@
     VvmLog.i("DeviceProvisionedJobService.onStartJob", "device provisioned");
     for (JobWorkItem item = params.dequeueWork(); item != null; item = params.dequeueWork()) {
       PhoneAccountHandle phoneAccountHandle =
-          item.getIntent().getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE);
+          item.getIntent().getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE, PhoneAccountHandle.class);
       VvmLog.i(
           "DeviceProvisionedJobService.onStartJob",
           "restarting activation for " + phoneAccountHandle);
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index 9178bbe..c6110c9 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -19,6 +19,7 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
 import android.os.PersistableBundle;
@@ -483,7 +484,8 @@
     }
     for (String packageName : carrierPackages) {
       try {
-        ApplicationInfo info = getContext().getPackageManager().getApplicationInfo(packageName, 0);
+        ApplicationInfo info = getContext().getPackageManager().getApplicationInfo(packageName,
+                PackageManager.ApplicationInfoFlags.of(0));
         if (!info.enabled) {
           continue;
         }
diff --git a/java/com/android/voicemail/impl/imap/ImapHelper.java b/java/com/android/voicemail/impl/imap/ImapHelper.java
index f2c2e5f..4ebba33 100644
--- a/java/com/android/voicemail/impl/imap/ImapHelper.java
+++ b/java/com/android/voicemail/impl/imap/ImapHelper.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.Network;
-import android.net.NetworkInfo;
+import android.net.NetworkCapabilities;
 import android.telecom.PhoneAccountHandle;
 import android.util.Base64;
 
@@ -145,11 +145,11 @@
   public boolean isRoaming() {
     ConnectivityManager connectivityManager =
         (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-    NetworkInfo info = connectivityManager.getNetworkInfo(network);
-    if (info == null) {
+    NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
+    if (capabilities == null) {
       return false;
     }
-    return info.isRoaming();
+    return !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
   }
 
   public OmtpVvmCarrierConfigHelper getConfig() {
diff --git a/java/com/android/voicemail/impl/scheduling/BaseTask.java b/java/com/android/voicemail/impl/scheduling/BaseTask.java
index aaceefb..96ebc84 100644
--- a/java/com/android/voicemail/impl/scheduling/BaseTask.java
+++ b/java/com/android/voicemail/impl/scheduling/BaseTask.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -159,7 +160,7 @@
   public void onCreate(Context context, Bundle extras) {
     this.context = context;
     this.extras = extras;
-    phoneAccountHandle = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+    phoneAccountHandle = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE, PhoneAccountHandle.class);
     for (Policy policy : policies) {
       policy.onCreate(this, extras);
     }
diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
index e71dca0..0bab169 100644
--- a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
+++ b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -49,8 +50,9 @@
   @Override
   public void onReceive(Context context, Intent intent) {
     this.context = context;
-    VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS);
-    PhoneAccountHandle phone = sms.getPhoneAccountHandle();
+    VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS,
+            VisualVoicemailSms.class);
+    PhoneAccountHandle phone = sms != null ? sms.getPhoneAccountHandle() : null;
 
     if (phone == null) {
       // This should never happen
diff --git a/java/com/android/voicemail/impl/sync/SyncOneTask.java b/java/com/android/voicemail/impl/sync/SyncOneTask.java
index a11a3c1..95f4ceb 100644
--- a/java/com/android/voicemail/impl/sync/SyncOneTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncOneTask.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -57,8 +58,8 @@
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
-    voicemail = extras.getParcelable(EXTRA_VOICEMAIL);
+    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE, PhoneAccountHandle.class);
+    voicemail = extras.getParcelable(EXTRA_VOICEMAIL, Voicemail.class);
   }
 
   @Override
diff --git a/java/com/android/voicemail/impl/sync/SyncTask.java b/java/com/android/voicemail/impl/sync/SyncTask.java
index 89d3c0b..b04c434 100644
--- a/java/com/android/voicemail/impl/sync/SyncTask.java
+++ b/java/com/android/voicemail/impl/sync/SyncTask.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2023 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,7 +57,7 @@
   @Override
   public void onCreate(Context context, Bundle extras) {
     super.onCreate(context, extras);
-    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE);
+    phone = extras.getParcelable(EXTRA_PHONE_ACCOUNT_HANDLE, PhoneAccountHandle.class);
   }
 
   @Override
