Home | History | Annotate | Download | only in historyitemactions
      1 /*
      2  * Copyright (C) 2017 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.dialer.historyitemactions;
     18 
     19 import android.content.Context;
     20 import android.os.Bundle;
     21 import android.support.design.widget.BottomSheetDialog;
     22 import android.text.TextUtils;
     23 import android.view.LayoutInflater;
     24 import android.view.View;
     25 import android.view.View.OnClickListener;
     26 import android.view.ViewGroup;
     27 import android.widget.ImageView;
     28 import android.widget.LinearLayout;
     29 import android.widget.TextView;
     30 import com.android.dialer.common.Assert;
     31 import com.android.dialer.glidephotomanager.GlidePhotoManager;
     32 import java.util.List;
     33 
     34 /**
     35  * {@link BottomSheetDialog} used to show a list of actions in a bottom sheet menu.
     36  *
     37  * <p>{@link #show(Context, HistoryItemPrimaryActionInfo, List, GlidePhotoManager)} should be used
     38  * to create and display the menu. Modules are built using {@link HistoryItemActionModule} and some
     39  * defaults are provided by {@link IntentModule} and {@link DividerModule}.
     40  */
     41 public class HistoryItemActionBottomSheet extends BottomSheetDialog implements OnClickListener {
     42 
     43   private final List<HistoryItemActionModule> modules;
     44   private final HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo;
     45   private final GlidePhotoManager glidePhotoManager;
     46 
     47   private HistoryItemActionBottomSheet(
     48       Context context,
     49       HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo,
     50       List<HistoryItemActionModule> modules,
     51       GlidePhotoManager glidePhotoManager) {
     52     super(context);
     53     this.modules = modules;
     54     this.historyItemPrimaryActionInfo = historyItemPrimaryActionInfo;
     55     this.glidePhotoManager = glidePhotoManager;
     56     setContentView(LayoutInflater.from(context).inflate(R.layout.sheet_layout, null));
     57   }
     58 
     59   public static HistoryItemActionBottomSheet show(
     60       Context context,
     61       HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo,
     62       List<HistoryItemActionModule> modules,
     63       GlidePhotoManager glidePhotoManager) {
     64     HistoryItemActionBottomSheet sheet =
     65         new HistoryItemActionBottomSheet(
     66             context, historyItemPrimaryActionInfo, modules, glidePhotoManager);
     67     sheet.show();
     68     return sheet;
     69   }
     70 
     71   @Override
     72   protected void onCreate(Bundle bundle) {
     73     super.onCreate(bundle);
     74     LinearLayout container = Assert.isNotNull(findViewById(R.id.action_container));
     75     container.addView(getContactView(container));
     76 
     77     for (HistoryItemActionModule module : modules) {
     78       if (module instanceof DividerModule) {
     79         container.addView(getDividerView(container));
     80       } else {
     81         container.addView(getModuleView(container, module));
     82       }
     83     }
     84   }
     85 
     86   private View getContactView(ViewGroup container) {
     87     LayoutInflater inflater = LayoutInflater.from(getContext());
     88     View contactView = inflater.inflate(R.layout.contact_layout, container, false);
     89 
     90     // TODO(zachh): The contact image should be badged with a video icon if it is for a video call.
     91     glidePhotoManager.loadQuickContactBadge(
     92         contactView.findViewById(R.id.quick_contact_photo),
     93         historyItemPrimaryActionInfo.photoInfo());
     94 
     95     TextView primaryTextView = contactView.findViewById(R.id.primary_text);
     96     TextView secondaryTextView = contactView.findViewById(R.id.secondary_text);
     97 
     98     primaryTextView.setText(historyItemPrimaryActionInfo.primaryText());
     99     if (!TextUtils.isEmpty(historyItemPrimaryActionInfo.secondaryText())) {
    100       secondaryTextView.setText(historyItemPrimaryActionInfo.secondaryText());
    101     } else {
    102       secondaryTextView.setVisibility(View.GONE);
    103       secondaryTextView.setText(null);
    104     }
    105     if (historyItemPrimaryActionInfo.intent() != null) {
    106       contactView.setOnClickListener(
    107           (view) -> {
    108             getContext().startActivity(historyItemPrimaryActionInfo.intent());
    109             dismiss();
    110           });
    111     }
    112     return contactView;
    113   }
    114 
    115   private View getDividerView(ViewGroup container) {
    116     LayoutInflater inflater = LayoutInflater.from(getContext());
    117     return inflater.inflate(R.layout.divider_layout, container, false);
    118   }
    119 
    120   private View getModuleView(ViewGroup container, HistoryItemActionModule module) {
    121     LayoutInflater inflater = LayoutInflater.from(getContext());
    122     View moduleView = inflater.inflate(R.layout.module_layout, container, false);
    123     ((TextView) moduleView.findViewById(R.id.module_text)).setText(module.getStringId());
    124     ((ImageView) moduleView.findViewById(R.id.module_image))
    125         .setImageResource(module.getDrawableId());
    126     moduleView.setOnClickListener(this);
    127     moduleView.setTag(module);
    128     return moduleView;
    129   }
    130 
    131   @Override
    132   public void onClick(View view) {
    133     if (((HistoryItemActionModule) view.getTag()).onClick()) {
    134       dismiss();
    135     }
    136   }
    137 }
    138