1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.incallui.answer.impl;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.app.Dialog;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.DialogInterface;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.res.TypedArray;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.graphics.drawable.Drawable;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Bundle;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.design.widget.BottomSheetDialogFragment;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ContextThemeWrapper;
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.LayoutInflater;
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View;
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View.OnClickListener;
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewGroup;
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewGroup.LayoutParams;
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.WindowManager;
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.LinearLayout;
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.TextView;
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.DpUtil;
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.FragmentUtils;
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.common.LogUtil;
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList;
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.List;
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Shows options for rejecting call with SMS */
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class SmsBottomSheetFragment extends BottomSheetDialogFragment {
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final String ARG_OPTIONS = "options";
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static SmsBottomSheetFragment newInstance(@Nullable ArrayList<CharSequence> options) {
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    SmsBottomSheetFragment fragment = new SmsBottomSheetFragment();
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Bundle args = new Bundle();
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    args.putCharSequenceArrayList(ARG_OPTIONS, options);
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    fragment.setArguments(args);
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return fragment;
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Nullable
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public View onCreateView(
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LinearLayout layout = new LinearLayout(getContext());
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    layout.setOrientation(LinearLayout.VERTICAL);
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    List<CharSequence> items = getArguments().getCharSequenceArrayList(ARG_OPTIONS);
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (items != null) {
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      for (CharSequence item : items) {
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        layout.addView(newTextViewItem(item));
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      }
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    layout.addView(newTextViewItem(null));
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return layout;
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onAttach(Context context) {
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onAttach(context);
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    FragmentUtils.checkParent(this, SmsSheetHolder.class);
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public Dialog onCreateDialog(final Bundle savedInstanceState) {
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LogUtil.i("SmsBottomSheetFragment.onCreateDialog", null);
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Dialog dialog = super.onCreateDialog(savedInstanceState);
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return dialog;
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private TextView newTextViewItem(@Nullable final CharSequence text) {
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    int[] attrs = new int[] {android.R.attr.selectableItemBackground};
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Context context = new ContextThemeWrapper(getContext(), getTheme());
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    TypedArray typedArray = context.obtainStyledAttributes(attrs);
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    Drawable background = typedArray.getDrawable(0);
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    //noinspection ResourceType
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    typedArray.recycle();
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    TextView textView = new TextView(context);
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setText(text == null ? getString(R.string.call_incoming_message_custom) : text);
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    int padding = (int) DpUtil.dpToPx(context, 16);
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setPadding(padding, padding, padding, padding);
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setBackground(background);
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setTextColor(context.getColor(R.color.blue_grey_100));
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setTextAppearance(R.style.TextAppearance_AppCompat_Widget_PopupMenu_Large);
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    LayoutParams params =
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setLayoutParams(params);
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    textView.setOnClickListener(
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        new OnClickListener() {
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          @Override
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          public void onClick(View v) {
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            FragmentUtils.getParentUnsafe(SmsBottomSheetFragment.this, SmsSheetHolder.class)
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                .smsSelected(text);
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            dismiss();
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          }
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        });
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return textView;
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public int getTheme() {
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return R.style.Theme_Design_Light_BottomSheetDialog;
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void onDismiss(DialogInterface dialogInterface) {
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onDismiss(dialogInterface);
126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    FragmentUtils.getParentUnsafe(this, SmsSheetHolder.class).smsDismissed();
127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /** Callback interface for {@link SmsBottomSheetFragment} */
130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public interface SmsSheetHolder {
131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    void smsSelected(@Nullable CharSequence text);
133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    void smsDismissed();
135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
137