diff options
Diffstat (limited to 'java/com/android/incallui/sessiondata/MultimediaFragment.java')
-rw-r--r-- | java/com/android/incallui/sessiondata/MultimediaFragment.java | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/java/com/android/incallui/sessiondata/MultimediaFragment.java b/java/com/android/incallui/sessiondata/MultimediaFragment.java new file mode 100644 index 000000000..85a60b6e3 --- /dev/null +++ b/java/com/android/incallui/sessiondata/MultimediaFragment.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.incallui.sessiondata; + +import android.graphics.drawable.Drawable; +import android.location.Location; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.support.v4.app.Fragment; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; +import com.android.dialer.common.FragmentUtils; +import com.android.dialer.common.LogUtil; +import com.android.dialer.multimedia.MultimediaData; +import com.android.incallui.maps.MapsComponent; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; + +/** + * Displays info from {@link MultimediaData MultimediaData}. + * + * <p>Currently displays image, location (as a map), and message that come bundled with + * MultimediaData when calling {@link #newInstance(MultimediaData, boolean, boolean, boolean)}. + */ +public class MultimediaFragment extends Fragment implements AvatarPresenter { + + private static final String ARG_SUBJECT = "subject"; + private static final String ARG_IMAGE = "image"; + private static final String ARG_LOCATION = "location"; + private static final String ARG_INTERACTIVE = "interactive"; + private static final String ARG_SHOW_AVATAR = "show_avatar"; + private static final String ARG_IS_SPAM = "is_spam"; + private ImageView avatarImageView; + + private boolean showAvatar; + private boolean isSpam; + + public static MultimediaFragment newInstance( + @NonNull MultimediaData multimediaData, + boolean isInteractive, + boolean showAvatar, + boolean isSpam) { + return newInstance( + multimediaData.getText(), + multimediaData.getImageUri(), + multimediaData.getLocation(), + isInteractive, + showAvatar, + isSpam); + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + public static MultimediaFragment newInstance( + @Nullable String subject, + @Nullable Uri imageUri, + @Nullable Location location, + boolean isInteractive, + boolean showAvatar, + boolean isSpam) { + Bundle args = new Bundle(); + args.putString(ARG_SUBJECT, subject); + args.putParcelable(ARG_IMAGE, imageUri); + args.putParcelable(ARG_LOCATION, location); + args.putBoolean(ARG_INTERACTIVE, isInteractive); + args.putBoolean(ARG_SHOW_AVATAR, showAvatar); + args.putBoolean(ARG_IS_SPAM, isSpam); + MultimediaFragment fragment = new MultimediaFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle bundle) { + super.onCreate(bundle); + showAvatar = getArguments().getBoolean(ARG_SHOW_AVATAR); + isSpam = getArguments().getBoolean(ARG_IS_SPAM); + } + + @Nullable + @Override + public View onCreateView( + LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) { + if (isSpam) { + return layoutInflater.inflate(R.layout.fragment_spam, viewGroup, false); + } + + boolean hasImage = getImageUri() != null; + boolean hasSubject = !TextUtils.isEmpty(getSubject()); + boolean hasMap = getLocation() != null; + if (hasMap && MapsComponent.get(getContext()).getMaps().isAvailable()) { + if (hasImage) { + if (hasSubject) { + return layoutInflater.inflate( + R.layout.fragment_composer_text_image_frag, viewGroup, false); + } else { + return layoutInflater.inflate(R.layout.fragment_composer_image_frag, viewGroup, false); + } + } else if (hasSubject) { + return layoutInflater.inflate(R.layout.fragment_composer_text_frag, viewGroup, false); + } else { + return layoutInflater.inflate(R.layout.fragment_composer_frag, viewGroup, false); + } + } else if (hasImage) { + if (hasSubject) { + return layoutInflater.inflate(R.layout.fragment_composer_text_image, viewGroup, false); + } else { + return layoutInflater.inflate(R.layout.fragment_composer_image, viewGroup, false); + } + } else { + return layoutInflater.inflate(R.layout.fragment_composer_text, viewGroup, false); + } + } + + @Override + public void onViewCreated(View view, @Nullable Bundle bundle) { + super.onViewCreated(view, bundle); + View container = view.findViewById(R.id.answer_message_container); + if (container != null) { + container.setClipToOutline(true); + } + + // If the call is spam and only has a subject, update the view to reflect that. + if (isSpam + && getLocation() == null + && getImageUri() == null + && !TextUtils.isEmpty(getSubject())) { + ((ImageView) view.findViewById(R.id.spam_image)) + .setImageResource(R.drawable.quantum_ic_message_white_24); + ((TextView) view.findViewById(R.id.spam_text)).setText(R.string.spam_message_text); + } + + TextView messageText = (TextView) view.findViewById(R.id.answer_message_text); + if (messageText != null) { + messageText.setText(getSubject()); + } + ImageView mainImage = (ImageView) view.findViewById(R.id.answer_message_image); + if (mainImage != null) { + Glide.with(this) + .load(getImageUri()) + .transition(DrawableTransitionOptions.withCrossFade()) + .listener( + new RequestListener<Drawable>() { + @Override + public boolean onLoadFailed( + @Nullable GlideException e, + Object model, + Target<Drawable> target, + boolean isFirstResource) { + view.findViewById(R.id.loading_spinner).setVisibility(View.GONE); + LogUtil.e("MultimediaFragment.onLoadFailed", null, e); + // TODO(b/34720074) handle error cases nicely + return false; // Let Glide handle the rest + } + + @Override + public boolean onResourceReady( + Drawable drawable, + Object model, + Target<Drawable> target, + DataSource dataSource, + boolean isFirstResource) { + view.findViewById(R.id.loading_spinner).setVisibility(View.GONE); + return false; + } + }) + .into(mainImage); + mainImage.setClipToOutline(true); + } + FrameLayout fragmentHolder = (FrameLayout) view.findViewById(R.id.answer_message_frag); + if (fragmentHolder != null) { + fragmentHolder.setClipToOutline(true); + Fragment mapFragment = + MapsComponent.get(getContext()).getMaps().createStaticMapFragment(getLocation()); + getChildFragmentManager() + .beginTransaction() + .replace(R.id.answer_message_frag, mapFragment) + .commitNow(); + } + avatarImageView = ((ImageView) view.findViewById(R.id.answer_message_avatar)); + if (avatarImageView != null) { + avatarImageView.setVisibility(showAvatar ? View.VISIBLE : View.GONE); + } + + Holder parent = FragmentUtils.getParent(this, Holder.class); + if (parent != null) { + parent.updateAvatar(this); + } + } + + @Nullable + @Override + public ImageView getAvatarImageView() { + return avatarImageView; + } + + @Override + public int getAvatarSize() { + return getResources().getDimensionPixelSize(R.dimen.answer_message_avatar_size); + } + + @Override + public boolean shouldShowAnonymousAvatar() { + return showAvatar; + } + + @Nullable + public String getSubject() { + return getArguments().getString(ARG_SUBJECT); + } + + @Nullable + public Uri getImageUri() { + return getArguments().getParcelable(ARG_IMAGE); + } + + @Nullable + public Location getLocation() { + return getArguments().getParcelable(ARG_LOCATION); + } + + /** Interface for notifying the fragment parent of changes. */ + public interface Holder { + void updateAvatar(AvatarPresenter sessionDataScreen); + } +} |