• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.dialer.ui.common;
18 
19 import android.app.Activity;
20 import android.os.Bundle;
21 import android.view.View;
22 
23 import androidx.annotation.CallSuper;
24 import androidx.annotation.NonNull;
25 import androidx.annotation.Nullable;
26 import androidx.fragment.app.Fragment;
27 import androidx.lifecycle.LiveData;
28 import androidx.lifecycle.ViewModelProvider;
29 
30 import com.android.car.dialer.R;
31 import com.android.car.dialer.ui.TelecomActivityViewModel;
32 import com.android.car.ui.baselayout.Insets;
33 import com.android.car.ui.baselayout.InsetsChangedListener;
34 import com.android.car.ui.core.CarUi;
35 import com.android.car.ui.toolbar.Toolbar;
36 import com.android.car.ui.toolbar.ToolbarController;
37 
38 import dagger.hilt.android.AndroidEntryPoint;
39 
40 /**
41  * The base class for top level dialer content {@link Fragment}s.
42  */
43 @AndroidEntryPoint(Fragment.class)
44 public abstract class DialerBaseFragment extends Hilt_DialerBaseFragment implements
45         InsetsChangedListener {
46 
47     /**
48      * Interface for Dialer top level fragment's parent to implement.
49      */
50     public interface DialerFragmentParent {
51 
52         /**
53          * Push a fragment to the back stack. Update action bar accordingly.
54          */
pushContentFragment(Fragment fragment, String fragmentTag)55         void pushContentFragment(Fragment fragment, String fragmentTag);
56     }
57 
58     @CallSuper
59     @Override
onViewCreated(@onNull View view, @Nullable Bundle savedInstanceState)60     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
61         super.onViewCreated(view, savedInstanceState);
62         ToolbarController toolbar = CarUi.getToolbar(requireActivity());
63         // Null check for unit tests to pass
64         if (toolbar != null) {
65             setupToolbar(toolbar);
66         }
67 
68         Insets insets = CarUi.getInsets(requireActivity());
69         // Null check for unit tests to pass
70         if (insets != null) {
71             onCarUiInsetsChanged(insets);
72         }
73     }
74 
75     /**
76      * Customizes the tool bar. Can be overridden in subclasses.
77      */
setupToolbar(@onNull ToolbarController toolbar)78     protected void setupToolbar(@NonNull ToolbarController toolbar) {
79         TelecomActivityViewModel viewModel = new ViewModelProvider(requireActivity()).get(
80                 TelecomActivityViewModel.class);
81         LiveData<String> toolbarTitleLiveData = viewModel.getToolbarTitle();
82         toolbarTitleLiveData.observe(this, toolbar::setTitle);
83 
84         toolbar.setState(getToolbarState());
85         toolbar.setLogo(getToolbarState() == Toolbar.State.HOME
86                 ? requireActivity().getDrawable(R.drawable.ic_app_icon)
87                 : null);
88 
89         toolbar.setMenuItems(R.xml.menuitems);
90     }
91 
92     /**
93      * Push a fragment to the back stack. Update action bar accordingly.
94      */
pushContentFragment(@onNull Fragment fragment, String fragmentTag)95     public void pushContentFragment(@NonNull Fragment fragment, String fragmentTag) {
96         Activity parentActivity = getActivity();
97         if (parentActivity instanceof DialerFragmentParent) {
98             ((DialerFragmentParent) parentActivity).pushContentFragment(fragment, fragmentTag);
99         }
100     }
101 
getToolbarState()102     protected Toolbar.State getToolbarState() {
103         return Toolbar.State.HOME;
104     }
105 
106     @Override
onCarUiInsetsChanged(Insets insets)107     public void onCarUiInsetsChanged(Insets insets) {
108         requireView().setPadding(insets.getLeft(), insets.getTop(),
109                 insets.getRight(), insets.getBottom());
110     }
111 }
112