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