Refactor view to remove references to Presenter

Bug: 291651937
Test: atest CarLauncherTests
Change-Id: I75be460e83a3a944a6638116630071f13ad7b52f
diff --git a/res/values/config.xml b/res/values/config.xml
index ab174f3..ff42c66 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -18,8 +18,8 @@
 <resources>
     <!-- A list of package names that provide the cards to display on the home screen -->
     <string-array name="config_homeCardModuleClasses" translatable="false">
-        <item>com.android.car.carlauncher.homescreen.assistive.AssistiveCard</item>
-        <item>com.android.car.carlauncher.homescreen.audio.AudioCard</item>
+        <item>com.android.car.carlauncher.homescreen.assistive.AssistiveCardModule</item>
+        <item>com.android.car.carlauncher.homescreen.audio.AudioCardModule</item>
     </string-array>
 
     <!--
diff --git a/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java b/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
index 6d6c113..72408c4 100644
--- a/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
+++ b/src/com/android/car/carlauncher/homescreen/HomeCardFragment.java
@@ -58,7 +58,6 @@
  */
 public class HomeCardFragment extends Fragment implements HomeCardInterface.View {
 
-    private HomeCardInterface.Presenter mPresenter;
     private Size mSize;
     private View mCardBackground;
     private CrossfadeImageView mCardBackgroundImage;
@@ -95,6 +94,10 @@
 
     private boolean mTrackingTouch;
     private PlaybackCallback mPlaybackCallback;
+
+    private OnViewLifecycleChangeListener mOnViewLifecycleChangeListener;
+
+    private OnViewClickListener mOnViewClickListener;
     private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener =
             new SeekBar.OnSeekBarChangeListener() {
                 @Override
@@ -115,9 +118,31 @@
                 }
             };
 
-    @Override
-    public void setPresenter(HomeCardInterface.Presenter presenter) {
-        mPresenter = presenter;
+    /**
+     * Interface definition for a callback to be invoked for a view lifecycle changes.
+     */
+    public interface OnViewLifecycleChangeListener {
+
+        /**
+         * Called when a view has been Created.
+         */
+        void onViewCreated();
+
+        /**
+         * Called when a view has been destroyed.
+         */
+        void onViewDestroyed();
+    }
+
+    /**
+     * Interface definition for a callback to be invoked when a view is clicked.
+     */
+    public interface OnViewClickListener {
+
+        /**
+         * Called when a view has been clicked.
+         */
+        void onViewClicked();
     }
 
     @Override
@@ -132,16 +157,14 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mPresenter.onViewCreated();
-        mRootView.setOnClickListener(v -> mPresenter.onViewClicked(v));
+        mOnViewLifecycleChangeListener.onViewCreated();
+        mRootView.setOnClickListener(v -> mOnViewClickListener.onViewClicked());
     }
 
     @Override
     public void onDestroy() {
         super.onDestroy();
-        if (mPresenter != null) {
-            mPresenter.onViewDestroyed();
-        }
+        mOnViewLifecycleChangeListener.onViewDestroyed();
         mSize = null;
     }
 
@@ -151,6 +174,25 @@
     }
 
     /**
+     * Register a callback to be invoked when this view lifecycle changes.
+     *
+     * @param onViewLifecycleChangeListener The callback that will run
+     */
+    public void setOnViewLifecycleChangeListener(
+            OnViewLifecycleChangeListener onViewLifecycleChangeListener) {
+        mOnViewLifecycleChangeListener = onViewLifecycleChangeListener;
+    }
+
+    /**
+     * Register a callback to be invoked when this view is clicked.
+     *
+     * @param onViewClickListener The callback that will run
+     */
+    public void setOnViewClickListener(OnViewClickListener onViewClickListener) {
+        mOnViewClickListener = onViewClickListener;
+    }
+
+    /**
      * Returns the size of the card or null if the view hasn't yet been laid out
      */
     protected Size getCardSize() {
diff --git a/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java b/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
index 06d8322..e32dd8b 100644
--- a/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
+++ b/src/com/android/car/carlauncher/homescreen/HomeCardInterface.java
@@ -46,11 +46,6 @@
     interface View {
 
         /**
-         * Sets the {@link Presenter} that will manage this View.
-         */
-        void setPresenter(Presenter presenter);
-
-        /**
          * Called by the Presenter to remove the entire card from view if there is no data to
          * display.
          */
@@ -97,23 +92,6 @@
         void setModels(List<Model> models);
 
         /**
-         * Called by the View when its view has been created.
-         * This signals the presenter to initialize the relevant models it will use as data sources
-         * and start listening for updates.
-         */
-        void onViewCreated();
-
-        /**
-         * Called by the View when it is destroyed to allow the presenter to clean up any models
-         */
-        void onViewDestroyed();
-
-        /**
-         * Called by the View when it is clicked
-         */
-        default void onViewClicked(android.view.View v) {}
-
-        /**
          * Called by one of the Presenter's models when it has updated information to display on
          * the card.
          */
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCard.java b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
similarity index 94%
rename from src/com/android/car/carlauncher/homescreen/assistive/AssistiveCard.java
rename to src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
index 1aa98ee..4243cfa 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCard.java
+++ b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardModule.java
@@ -30,7 +30,7 @@
  * Home screen card that displays general assistive content including projection status and
  * static weather data.
  */
-public class AssistiveCard implements HomeCardModule {
+public class AssistiveCardModule implements HomeCardModule {
 
     private ViewModelProvider mViewModelProvider;
     private AssistiveCardPresenter mAssistiveCardPresenter;
@@ -62,7 +62,6 @@
         if (mAssistiveCardView == null) {
             mAssistiveCardView = new HomeCardFragment();
             getCardPresenter().setView(mAssistiveCardView);
-            mAssistiveCardView.setPresenter(getCardPresenter());
         }
         return mAssistiveCardView;
     }
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
index 2d27c8c..8027b62 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
+++ b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenter.java
@@ -16,9 +16,13 @@
 
 package com.android.car.carlauncher.homescreen.assistive;
 
-import android.view.View;
+import android.content.Intent;
+import android.util.Log;
+import android.widget.Toast;
 
+import com.android.car.carlauncher.R;
 import com.android.car.carlauncher.homescreen.CardPresenter;
+import com.android.car.carlauncher.homescreen.HomeCardFragment;
 import com.android.car.carlauncher.homescreen.HomeCardInterface;
 
 import java.util.List;
@@ -28,43 +32,66 @@
  */
 public class AssistiveCardPresenter extends CardPresenter {
 
+    private static final String TAG = "AssistiveCardPresenter";
+    private HomeCardFragment mHomeCardFragment;
+
     private AssistiveModel mCurrentModel;
     private List<HomeCardInterface.Model> mModels;
 
+    private HomeCardFragment.OnViewClickListener mOnViewClickListener =
+            new HomeCardFragment.OnViewClickListener() {
+                @Override
+                public void onViewClicked() {
+                    Intent intent = mCurrentModel.getIntent();
+                    if (intent != null && intent.resolveActivity(
+                            mHomeCardFragment.getContext().getPackageManager()) != null) {
+                        mHomeCardFragment.getContext().startActivity(intent);
+                    } else {
+                        Log.e(TAG, "No activity component found to handle intent with action: "
+                                + intent.getAction());
+                        Toast.makeText(mHomeCardFragment.getContext(),
+                                mHomeCardFragment.getContext().getResources().getString(
+                                        R.string.projected_onclick_launch_error_toast_text),
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }
+            };
+
+    private HomeCardFragment.OnViewLifecycleChangeListener mOnViewLifecycleChangeListener =
+            new HomeCardFragment.OnViewLifecycleChangeListener() {
+                @Override
+                public void onViewCreated() {
+                    for (HomeCardInterface.Model model : mModels) {
+                        setPresenterInModel(model);
+                        model.onCreate(getFragment().requireContext());
+                    }
+                }
+
+                @Override
+                public void onViewDestroyed() {
+                    if (mModels != null) {
+                        for (HomeCardInterface.Model model : mModels) {
+                            model.onDestroy(getFragment().requireContext());
+                        }
+                    }
+                }
+            };
+
+    @Override
+    public void setView(HomeCardInterface.View view) {
+        super.setView(view);
+        mHomeCardFragment = (HomeCardFragment) view;
+        mHomeCardFragment.setOnViewClickListener(mOnViewClickListener);
+        mHomeCardFragment.setOnViewLifecycleChangeListener(mOnViewLifecycleChangeListener);
+    }
+
     @Override
     public void setModels(List<HomeCardInterface.Model> models) {
         mModels = models;
     }
 
-    /**
-     * Called when the View is created
-     */
-    @Override
-    public void onViewCreated() {
-        for (HomeCardInterface.Model model : mModels) {
-            model.setPresenter(this);
-            model.onCreate(getFragment().requireContext());
-        }
-    }
-
-    /**
-     * Called when the View is destroyed
-     */
-    @Override
-    public void onViewDestroyed() {
-        if (mModels != null) {
-            for (HomeCardInterface.Model model : mModels) {
-                model.onDestroy(getFragment().requireContext());
-            }
-        }
-    }
-
-    /**
-     * Called when the View is clicked
-     */
-    @Override
-    public void onViewClicked(View v) {
-        mCurrentModel.onClick(v);
+    private void setPresenterInModel(HomeCardInterface.Model model) {
+        model.setPresenter(this);
     }
 
     /**
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
index 1c9c219..7d3e886 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
+++ b/src/com/android/car/carlauncher/homescreen/assistive/AssistiveModel.java
@@ -16,6 +16,8 @@
 
 package com.android.car.carlauncher.homescreen.assistive;
 
+import android.content.Intent;
+
 import com.android.car.carlauncher.homescreen.HomeCardInterface;
 
 /**
@@ -23,7 +25,9 @@
  */
 public interface AssistiveModel extends HomeCardInterface.Model {
     /**
-     * Called by the Presenter to handle when the View is clicked
+     * Called by the Presenter to getIntent when the View is clicked
      */
-    default void onClick(android.view.View view) {}
+    default Intent getIntent() {
+        return null;
+    }
 }
diff --git a/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java b/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
index 7e3d6d7..aa925d3 100644
--- a/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
+++ b/src/com/android/car/carlauncher/homescreen/assistive/ProjectionModel.java
@@ -27,8 +27,6 @@
 import android.graphics.drawable.Drawable;
 import android.icu.text.MessageFormat;
 import android.util.Log;
-import android.view.View;
-import android.widget.Toast;
 
 import androidx.annotation.Nullable;
 
@@ -113,16 +111,8 @@
     }
 
     @Override
-    public void onClick(View v) {
-        if (mIntent.resolveActivity(v.getContext().getPackageManager()) != null) {
-            v.getContext().startActivity(mIntent);
-        } else {
-            Log.e(TAG, "No activity component found to handle intent with action: "
-                    + mIntent.getAction());
-            Toast.makeText(v.getContext(),
-                    mResources.getString(R.string.projected_onclick_launch_error_toast_text),
-                    Toast.LENGTH_SHORT).show();
-        }
+    public Intent getIntent() {
+        return mIntent;
     }
 
     @Override
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioCard.java b/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
similarity index 95%
rename from src/com/android/car/carlauncher/homescreen/audio/AudioCard.java
rename to src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
index 083f5b0..6ffb692 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioCard.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/AudioCardModule.java
@@ -32,7 +32,7 @@
 /**
  * Home screen card that displays audio related content
  */
-public class AudioCard implements HomeCardModule {
+public class AudioCardModule implements HomeCardModule {
 
     private static final String TAG = "HomeScreenAudioCard";
 
@@ -77,7 +77,6 @@
         if (mAudioCardView == null) {
             mAudioCardView = new AudioFragment();
             getCardPresenter().setView(mAudioCardView);
-            mAudioCardView.setPresenter(getCardPresenter());
         }
         return mAudioCardView;
     }
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java b/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
index 8124457..3b94b72 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/AudioFragment.java
@@ -29,9 +29,9 @@
 import com.android.car.apps.common.ImageUtils;
 import com.android.car.carlauncher.R;
 import com.android.car.carlauncher.homescreen.HomeCardFragment;
-import com.android.car.carlauncher.homescreen.HomeCardInterface;
 import com.android.car.carlauncher.homescreen.ui.CardContent;
 import com.android.car.carlauncher.homescreen.ui.DescriptiveTextWithControlsView;
+import com.android.car.media.common.PlaybackControlsActionBar;
 
 
 /**
@@ -40,7 +40,17 @@
  */
 public class AudioFragment extends HomeCardFragment {
 
-    private AudioPresenter mPresenter;
+    /**
+     * Interface definition for a callback to be invoked when a media layout is inflated.
+     */
+    public interface OnMediaViewInitializedListener {
+
+        /**
+         * Called when a media layout is inflated.
+         */
+        void onMediaViewInitialized();
+    }
+
     private Chronometer mChronometer;
     private View mChronometerSeparator;
     private float mBlurRadius;
@@ -48,16 +58,13 @@
 
     // Views from card_content_media.xml, which is used only for the media card
     private View mMediaLayoutView;
+    private View mMediaControlBarView;
     private TextView mMediaTitle;
     private TextView mMediaSubtitle;
 
     private boolean mShowSeekBar;
 
-    @Override
-    public void setPresenter(HomeCardInterface.Presenter presenter) {
-        super.setPresenter(presenter);
-        mPresenter = (AudioPresenter) presenter;
-    }
+    private OnMediaViewInitializedListener mOnMediaViewInitializedListener;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -113,13 +120,17 @@
             mMediaLayoutView = stub.inflate();
             mMediaTitle = mMediaLayoutView.findViewById(R.id.primary_text);
             mMediaSubtitle = mMediaLayoutView.findViewById(R.id.secondary_text);
-            View mediaControlBarView = mMediaLayoutView.findViewById(
+            mMediaControlBarView = mMediaLayoutView.findViewById(
                     R.id.media_playback_controls_bar);
-            mPresenter.initializeControlsActionBar(mediaControlBarView);
+            mOnMediaViewInitializedListener.onMediaViewInitialized();
         }
         return mMediaLayoutView;
     }
 
+    public PlaybackControlsActionBar getPlaybackControlsActionBar() {
+        return (PlaybackControlsActionBar) mMediaControlBarView;
+    }
+
     private void updateBackgroundImage(CardContent.CardBackgroundImage cardBackgroundImage) {
         if (getCardSize() != null) {
             if (cardBackgroundImage.getForeground() == null) {
@@ -168,4 +179,9 @@
             mChronometerSeparator.setVisibility(View.GONE);
         }
     }
+
+    public void setOnMediaViewInitializedListener(
+            OnMediaViewInitializedListener onMediaViewInitializedListener) {
+        mOnMediaViewInitializedListener = onMediaViewInitializedListener;
+    }
 }
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java b/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
index 2548ea2..db70005 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/AudioModel.java
@@ -16,6 +16,8 @@
 
 package com.android.car.carlauncher.homescreen.audio;
 
+import android.content.Intent;
+
 import com.android.car.carlauncher.homescreen.HomeCardInterface;
 
 /**
@@ -23,7 +25,7 @@
  */
 public interface AudioModel  extends HomeCardInterface.Model {
     /**
-     * Called by the Presenter to handle when the View is clicked
+     * Called by the Presenter to getIntent when the View is clicked
      */
-    default void onClick(android.view.View view) {}
+    Intent getIntent();
 }
diff --git a/src/com/android/car/carlauncher/homescreen/audio/AudioPresenter.java b/src/com/android/car/carlauncher/homescreen/audio/AudioPresenter.java
deleted file mode 100644
index c185a2d..0000000
--- a/src/com/android/car/carlauncher/homescreen/audio/AudioPresenter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.carlauncher.homescreen.audio;
-
-import android.view.View;
-
-import com.android.car.carlauncher.homescreen.HomeCardInterface;
-
-/**
- * An extension of {@link HomeCardInterface.Presenter} used to initialize controls action bar.
- */
-public interface AudioPresenter extends HomeCardInterface.Presenter {
-    /**
-     * Initialize action bar by setting its playback view model & lifecycle owner.
-     */
-    void initializeControlsActionBar(View actionBar);
-}
diff --git a/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java b/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
index ac52a95..8557aae 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenter.java
@@ -16,11 +16,13 @@
 
 package com.android.car.carlauncher.homescreen.audio;
 
-import android.view.View;
+import android.app.ActivityOptions;
+import android.content.Intent;
+import android.view.Display;
 
 import com.android.car.carlauncher.homescreen.CardPresenter;
+import com.android.car.carlauncher.homescreen.HomeCardFragment;
 import com.android.car.carlauncher.homescreen.HomeCardInterface;
-import com.android.car.media.common.PlaybackControlsActionBar;
 
 import java.util.List;
 
@@ -30,12 +32,70 @@
  * For the audio card, the {@link AudioFragment} implements the View and displays information on
  * media from a {@link MediaViewModel}.
  */
-public class HomeAudioCardPresenter extends CardPresenter implements AudioPresenter {
+public class HomeAudioCardPresenter extends CardPresenter {
+
+    private AudioFragment mAudioFragment;
 
     private AudioModel mCurrentModel;
     private List<HomeCardInterface.Model> mModelList;
     private MediaViewModel mMediaViewModel;
 
+    private HomeCardFragment.OnViewClickListener mOnViewClickListener =
+            new HomeCardFragment.OnViewClickListener() {
+                @Override
+                public void onViewClicked() {
+                    Intent intent = mCurrentModel.getIntent();
+                    if (intent != null) {
+                        ActivityOptions options = ActivityOptions.makeBasic();
+                        options.setLaunchDisplayId(Display.DEFAULT_DISPLAY);
+                        mAudioFragment.getContext().startActivity(intent, options.toBundle());
+                    }
+                }
+            };
+
+    private HomeCardFragment.OnViewLifecycleChangeListener mOnViewLifecycleChangeListener =
+            new HomeCardFragment.OnViewLifecycleChangeListener() {
+                @Override
+                public void onViewCreated() {
+                    for (HomeCardInterface.Model model : mModelList) {
+                        if (model.getClass() == MediaViewModel.class) {
+                            mMediaViewModel = (MediaViewModel) model;
+                        }
+                        model.setPresenter(HomeAudioCardPresenter.this);
+                        model.onCreate(getFragment().requireContext());
+                    }
+                }
+
+                @Override
+                public void onViewDestroyed() {
+                    if (mModelList != null) {
+                        for (HomeCardInterface.Model model : mModelList) {
+                            model.onDestroy(getFragment().requireContext());
+                        }
+                    }
+                }
+            };
+
+    private AudioFragment.OnMediaViewInitializedListener mOnMediaViewInitializedListener =
+            new AudioFragment.OnMediaViewInitializedListener() {
+                @Override
+                public void onMediaViewInitialized() {
+                    // set playbackviewmodel on playback control actions view
+                    mAudioFragment.getPlaybackControlsActionBar().setModel(
+                            mMediaViewModel.getPlaybackViewModel(),
+                            mAudioFragment.getViewLifecycleOwner());
+                }
+            };
+
+    @Override
+    public void setView(HomeCardInterface.View view) {
+        super.setView(view);
+        mAudioFragment = (AudioFragment) view;
+        mAudioFragment.setOnViewLifecycleChangeListener(mOnViewLifecycleChangeListener);
+        mAudioFragment.setOnViewClickListener(mOnViewClickListener);
+        mAudioFragment.setOnMediaViewInitializedListener(mOnMediaViewInitializedListener);
+    }
+
     @Override
     public void setModels(List<HomeCardInterface.Model> models) {
         mModelList = models;
@@ -50,40 +110,6 @@
     }
 
     /**
-     * Called when the View is created
-     */
-    @Override
-    public void onViewCreated() {
-        for (HomeCardInterface.Model model : mModelList) {
-            if (model.getClass() == MediaViewModel.class) {
-                mMediaViewModel = (MediaViewModel) model;
-            }
-            model.setPresenter(this);
-            model.onCreate(getFragment().requireContext());
-        }
-    }
-
-    /**
-     * Called when the View is destroyed
-     */
-    @Override
-    public void onViewDestroyed() {
-        if (mModelList != null) {
-            for (HomeCardInterface.Model model : mModelList) {
-                model.onDestroy(getFragment().requireContext());
-            }
-        }
-    }
-
-    /**
-     * Called when the View is clicked
-     */
-    @Override
-    public void onViewClicked(View v) {
-        mCurrentModel.onClick(v);
-    }
-
-    /**
      * Updates the View appropriately when a Model has new content.
      *
      * If the updated model has content, it is displayed, regardless of what is currently shown on
@@ -119,10 +145,4 @@
         mCurrentModel = (AudioModel) model;
         super.onModelUpdated(model);
     }
-
-    @Override
-    public void initializeControlsActionBar(View actionBar) {
-        ((PlaybackControlsActionBar) actionBar).setModel(mMediaViewModel.getPlaybackViewModel(),
-                getFragment().getViewLifecycleOwner());
-    }
 }
diff --git a/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java b/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
index 143e9f8..01aef08 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/InCallModel.java
@@ -175,7 +175,7 @@
      * display as one of the requirements to fill this role is to provide an ongoing call UI.
      */
     @Override
-    public void onClick(View view) {
+    public Intent getIntent() {
         Intent intent = null;
         if (isSelfManagedCall() && mSelfManagedCallUtil.canShowCalInCallView()) {
             Bundle extras = mCurrentCall.getDetails().getExtras();
@@ -194,7 +194,16 @@
             intent = mPackageManager.getLaunchIntentForPackage(
                     mTelecomManager.getDefaultDialerPackage());
         }
+        return intent;
+    }
 
+    /**
+     * Clicking the card opens the default dialer application that fills the role of {@link
+     * android.app.role.RoleManager#ROLE_DIALER}. This application will have an appropriate UI to
+     * display as one of the requirements to fill this role is to provide an ongoing call UI.
+     */
+    public void onClick(View view) {
+        Intent intent = getIntent();
         if (intent != null) {
             // Launch activity in the default app task container: the display area where
             // applications are launched by default.
diff --git a/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java b/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
index 47b0adc..803aadf 100644
--- a/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
+++ b/src/com/android/car/carlauncher/homescreen/audio/MediaViewModel.java
@@ -19,7 +19,6 @@
 import static android.car.media.CarMediaIntents.EXTRA_MEDIA_COMPONENT;
 import static android.car.media.CarMediaManager.MEDIA_SOURCE_MODE_PLAYBACK;
 
-import android.app.ActivityOptions;
 import android.app.Application;
 import android.car.media.CarMediaIntents;
 import android.content.ComponentName;
@@ -29,8 +28,6 @@
 import android.graphics.drawable.Drawable;
 import android.util.Log;
 import android.util.Size;
-import android.view.Display;
-import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.lifecycle.AndroidViewModel;
@@ -188,19 +185,14 @@
     }
 
     @Override
-    public void onClick(View v) {
-        // Launch activity in the default app task container: the display area where
-        // applications are launched by default.
-        // If not set, activity launches in the calling TDA.
-        ActivityOptions options = ActivityOptions.makeBasic();
-        options.setLaunchDisplayId(Display.DEFAULT_DISPLAY);
-        MediaSource mediaSource = mSourceViewModel.getPrimaryMediaSource().getValue();
+    public Intent getIntent() {
+        MediaSource mediaSource = getMediaSourceViewModel().getPrimaryMediaSource().getValue();
         Intent intent = new Intent(CarMediaIntents.ACTION_MEDIA_TEMPLATE);
         if (mediaSource != null) {
             intent.putExtra(EXTRA_MEDIA_COMPONENT,
                     mediaSource.getBrowseServiceComponentName().flattenToString());
         }
-        v.getContext().startActivity(intent, options.toBundle());
+        return intent;
     }
 
 
diff --git a/tests/src/com/android/car/carlauncher/homescreen/CardPresenterTest.java b/tests/src/com/android/car/carlauncher/homescreen/CardPresenterTest.java
index 43bea36..f5e754f 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/CardPresenterTest.java
+++ b/tests/src/com/android/car/carlauncher/homescreen/CardPresenterTest.java
@@ -55,14 +55,6 @@
             @Override
             public void setModels(List<HomeCardInterface.Model> models) {
             }
-
-            @Override
-            public void onViewCreated() {
-            }
-
-            @Override
-            public void onViewDestroyed() {
-            }
         };
         mPresenter.setView(mView);
     }
diff --git a/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java b/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
index 402f081..f8851e4 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
+++ b/tests/src/com/android/car/carlauncher/homescreen/assistive/AssistiveCardPresenterTest.java
@@ -24,7 +24,7 @@
 
 import android.view.View;
 
-import com.android.car.carlauncher.homescreen.HomeCardInterface;
+import com.android.car.carlauncher.homescreen.HomeCardFragment;
 import com.android.car.carlauncher.homescreen.ui.CardHeader;
 import com.android.car.carlauncher.homescreen.ui.DescriptiveTextView;
 
@@ -48,7 +48,7 @@
     @Mock
     private View mFragmentView;
     @Mock
-    private HomeCardInterface.View mView;
+    private HomeCardFragment mView;
     @Mock
     private AssistiveModel mModel;
     @Mock
@@ -66,11 +66,9 @@
     @Test
     public void onModelUpdated_updatesFragment() {
         mPresenter.onModelUpdated(mModel);
-        mPresenter.onViewClicked(mFragmentView);
 
         verify(mView).updateHeaderView(CARD_HEADER);
         verify(mView).updateContentView(CARD_CONTENT);
-        verify(mModel).onClick(mFragmentView);
     }
 
     @Test
@@ -80,13 +78,10 @@
         reset(mView);
 
         mPresenter.onModelUpdated(mOtherModel);
-        mPresenter.onViewClicked(mFragmentView);
 
         verify(mView, never()).hideCard();
         verify(mView, never()).updateHeaderView(any());
         verify(mView, never()).updateContentView(any());
-        verify(mModel).onClick(mFragmentView);
-        verify(mOtherModel, never()).onClick(any());
     }
 
     @Test
diff --git a/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java b/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
index 1a15d52..6836bd5 100644
--- a/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
+++ b/tests/src/com/android/car/carlauncher/homescreen/audio/HomeAudioCardPresenterTest.java
@@ -24,7 +24,6 @@
 
 import android.view.View;
 
-import com.android.car.carlauncher.homescreen.HomeCardInterface;
 import com.android.car.carlauncher.homescreen.ui.CardHeader;
 import com.android.car.carlauncher.homescreen.ui.DescriptiveTextView;
 import com.android.car.carlauncher.homescreen.ui.DescriptiveTextWithControlsView;
@@ -49,7 +48,7 @@
     @Mock
     private View mFragmentView;
     @Mock
-    private HomeCardInterface.View mView;
+    private AudioFragment mView;
     @Mock
     private AudioModel mModel;
     @Mock
@@ -67,11 +66,9 @@
     @Test
     public void onModelUpdated_updatesFragment() {
         mPresenter.onModelUpdated(mModel);
-        mPresenter.onViewClicked(mFragmentView);
 
         verify(mView).updateHeaderView(CARD_HEADER);
         verify(mView).updateContentView(CARD_CONTENT);
-        verify(mModel).onClick(mFragmentView);
     }
 
     @Test
@@ -81,13 +78,10 @@
         reset(mView);
 
         mPresenter.onModelUpdated(mOtherModel);
-        mPresenter.onViewClicked(mFragmentView);
 
         verify(mView, never()).hideCard();
         verify(mView, never()).updateHeaderView(any());
         verify(mView, never()).updateContentView(any());
-        verify(mModel).onClick(mFragmentView);
-        verify(mOtherModel, never()).onClick(any());
     }
 
     @Test