1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.carlauncher.homescreen.assistive; 18 19 import android.content.Intent; 20 import android.util.Log; 21 import android.widget.Toast; 22 23 import com.android.car.carlauncher.R; 24 import com.android.car.carlauncher.homescreen.CardPresenter; 25 import com.android.car.carlauncher.homescreen.HomeCardFragment; 26 import com.android.car.carlauncher.homescreen.HomeCardInterface; 27 import com.android.internal.annotations.VisibleForTesting; 28 29 import java.util.List; 30 31 /** 32 * The {@link CardPresenter} for an assistive card. 33 */ 34 public class AssistiveCardPresenter extends CardPresenter { 35 36 private static final String TAG = "AssistiveCardPresenter"; 37 private HomeCardFragment mHomeCardFragment; 38 39 private AssistiveModel mCurrentModel; 40 private List<HomeCardInterface.Model> mModels; 41 42 private HomeCardFragment.OnViewClickListener mOnViewClickListener = 43 new HomeCardFragment.OnViewClickListener() { 44 @Override 45 public void onViewClicked() { 46 Intent intent = mCurrentModel.getIntent(); 47 if (intent == null) { 48 Log.e(TAG, "No intent to handle view click"); 49 return; 50 } 51 if (intent.resolveActivity( 52 mHomeCardFragment.getContext().getPackageManager()) != null) { 53 mHomeCardFragment.getContext().startActivity(intent); 54 } else { 55 Log.e(TAG, "No activity component found to handle intent with action: " 56 + intent.getAction()); 57 Toast.makeText(mHomeCardFragment.getContext(), 58 mHomeCardFragment.getContext().getResources().getString( 59 R.string.projected_onclick_launch_error_toast_text), 60 Toast.LENGTH_SHORT).show(); 61 } 62 } 63 }; 64 65 private HomeCardFragment.OnViewLifecycleChangeListener mOnViewLifecycleChangeListener = 66 new HomeCardFragment.OnViewLifecycleChangeListener() { 67 @Override 68 public void onViewCreated() { 69 for (HomeCardInterface.Model model : mModels) { 70 model.setOnModelUpdateListener(mOnModelUpdateListener); 71 model.onCreate(getFragment().requireContext()); 72 } 73 } 74 75 @Override 76 public void onViewDestroyed() { 77 if (mModels != null) { 78 for (HomeCardInterface.Model model : mModels) { 79 model.onDestroy(getFragment().requireContext()); 80 } 81 } 82 } 83 }; 84 85 @VisibleForTesting 86 HomeCardInterface.Model.OnModelUpdateListener mOnModelUpdateListener = 87 new HomeCardInterface.Model.OnModelUpdateListener() { 88 @Override 89 public void onModelUpdate(HomeCardInterface.Model model) { 90 AssistiveModel assistiveModel = (AssistiveModel) model; 91 if (assistiveModel.getCardHeader() == null) { 92 if (mCurrentModel != null 93 && assistiveModel.getClass() == mCurrentModel.getClass()) { 94 if (mModels != null) { 95 // Check if any other models have content to display 96 for (HomeCardInterface.Model candidate : mModels) { 97 if (((AssistiveModel) candidate).getCardHeader() != null) { 98 mCurrentModel = (AssistiveModel) candidate; 99 updateCurrentModelInFragment(); 100 return; 101 } 102 } 103 } 104 } else { 105 // Otherwise, another model is already on display, 106 return; 107 } 108 } 109 mCurrentModel = assistiveModel; 110 updateCurrentModelInFragment(); 111 } 112 }; 113 114 @Override setView(HomeCardInterface.View view)115 public void setView(HomeCardInterface.View view) { 116 super.setView(view); 117 mHomeCardFragment = (HomeCardFragment) view; 118 mHomeCardFragment.setOnViewClickListener(mOnViewClickListener); 119 mHomeCardFragment.setOnViewLifecycleChangeListener(mOnViewLifecycleChangeListener); 120 } 121 122 @Override setModels(List<HomeCardInterface.Model> models)123 public void setModels(List<HomeCardInterface.Model> models) { 124 mModels = models; 125 } 126 updateCurrentModelInFragment()127 private void updateCurrentModelInFragment() { 128 if (mCurrentModel != null && mCurrentModel.getCardHeader() != null) { 129 mHomeCardFragment.updateHeaderView(mCurrentModel.getCardHeader()); 130 if (mCurrentModel.getCardContent() != null) { 131 mHomeCardFragment.updateContentView(mCurrentModel.getCardContent()); 132 } 133 } else { 134 mHomeCardFragment.hideCard(); 135 } 136 } 137 } 138