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