178 lines
7.2 KiB
Java
178 lines
7.2 KiB
Java
/*
|
|
* Copyright (C) 2015 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.messaging.ui;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.Resources;
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
import com.android.messaging.Factory;
|
|
import com.android.messaging.R;
|
|
import com.android.messaging.util.ImageUtils;
|
|
|
|
/**
|
|
* A singleton cache that holds tinted drawable resources for displaying messages, such as
|
|
* message bubbles, audio attachments etc.
|
|
*/
|
|
public class ConversationDrawables {
|
|
private static ConversationDrawables sInstance;
|
|
|
|
// Cache the color filtered bubble drawables so that we don't need to create a
|
|
// new one for each ConversationMessageView.
|
|
private Drawable mIncomingBubbleDrawable;
|
|
private Drawable mOutgoingBubbleDrawable;
|
|
private Drawable mIncomingErrorBubbleDrawable;
|
|
private Drawable mIncomingBubbleNoArrowDrawable;
|
|
private Drawable mOutgoingBubbleNoArrowDrawable;
|
|
private Drawable mAudioPlayButtonDrawable;
|
|
private Drawable mAudioPauseButtonDrawable;
|
|
private Drawable mIncomingAudioProgressBackgroundDrawable;
|
|
private Drawable mOutgoingAudioProgressBackgroundDrawable;
|
|
private Drawable mAudioProgressForegroundDrawable;
|
|
private Drawable mFastScrollThumbDrawable;
|
|
private Drawable mFastScrollThumbPressedDrawable;
|
|
private Drawable mFastScrollPreviewDrawableLeft;
|
|
private Drawable mFastScrollPreviewDrawableRight;
|
|
private final Context mContext;
|
|
private int mOutgoingBubbleColor;
|
|
private int mIncomingErrorBubbleColor;
|
|
private int mIncomingAudioButtonColor;
|
|
private int mSelectedBubbleColor;
|
|
private int mThemeColor;
|
|
|
|
public static ConversationDrawables get() {
|
|
if (sInstance == null) {
|
|
sInstance = new ConversationDrawables(Factory.get().getApplicationContext());
|
|
}
|
|
return sInstance;
|
|
}
|
|
|
|
private ConversationDrawables(final Context context) {
|
|
mContext = context;
|
|
// Pre-create all the drawables.
|
|
updateDrawables();
|
|
}
|
|
|
|
public int getConversationThemeColor() {
|
|
return mThemeColor;
|
|
}
|
|
|
|
public void updateDrawables() {
|
|
final Resources resources = mContext.getResources();
|
|
|
|
mIncomingBubbleDrawable = resources.getDrawable(R.drawable.msg_bubble_incoming);
|
|
mIncomingBubbleNoArrowDrawable =
|
|
resources.getDrawable(R.drawable.message_bubble_incoming_no_arrow);
|
|
mIncomingErrorBubbleDrawable = resources.getDrawable(R.drawable.msg_bubble_error);
|
|
mOutgoingBubbleDrawable = resources.getDrawable(R.drawable.msg_bubble_outgoing);
|
|
mOutgoingBubbleNoArrowDrawable =
|
|
resources.getDrawable(R.drawable.message_bubble_outgoing_no_arrow);
|
|
mAudioPlayButtonDrawable = resources.getDrawable(R.drawable.ic_audio_play);
|
|
mAudioPauseButtonDrawable = resources.getDrawable(R.drawable.ic_audio_pause);
|
|
mIncomingAudioProgressBackgroundDrawable =
|
|
resources.getDrawable(R.drawable.audio_progress_bar_background_incoming);
|
|
mOutgoingAudioProgressBackgroundDrawable =
|
|
resources.getDrawable(R.drawable.audio_progress_bar_background_outgoing);
|
|
mAudioProgressForegroundDrawable =
|
|
resources.getDrawable(R.drawable.audio_progress_bar_progress);
|
|
mFastScrollThumbDrawable = resources.getDrawable(R.drawable.fastscroll_thumb);
|
|
mFastScrollThumbPressedDrawable =
|
|
resources.getDrawable(R.drawable.fastscroll_thumb_pressed);
|
|
mFastScrollPreviewDrawableLeft =
|
|
resources.getDrawable(R.drawable.fastscroll_preview_left);
|
|
mFastScrollPreviewDrawableRight =
|
|
resources.getDrawable(R.drawable.fastscroll_preview_right);
|
|
mOutgoingBubbleColor = resources.getColor(R.color.message_bubble_color_outgoing);
|
|
mIncomingErrorBubbleColor =
|
|
resources.getColor(R.color.message_error_bubble_color_incoming);
|
|
mIncomingAudioButtonColor =
|
|
resources.getColor(R.color.message_audio_button_color_incoming);
|
|
mSelectedBubbleColor = resources.getColor(R.color.message_bubble_color_selected);
|
|
mThemeColor = resources.getColor(R.color.primary_color);
|
|
}
|
|
|
|
public Drawable getBubbleDrawable(final boolean selected, final boolean incoming,
|
|
final boolean needArrow, final boolean isError) {
|
|
final Drawable protoDrawable;
|
|
if (needArrow) {
|
|
if (incoming) {
|
|
protoDrawable = isError && !selected ?
|
|
mIncomingErrorBubbleDrawable : mIncomingBubbleDrawable;
|
|
} else {
|
|
protoDrawable = mOutgoingBubbleDrawable;
|
|
}
|
|
} else if (incoming) {
|
|
protoDrawable = mIncomingBubbleNoArrowDrawable;
|
|
} else {
|
|
protoDrawable = mOutgoingBubbleNoArrowDrawable;
|
|
}
|
|
|
|
int color;
|
|
if (selected) {
|
|
color = mSelectedBubbleColor;
|
|
} else if (incoming) {
|
|
if (isError) {
|
|
color = mIncomingErrorBubbleColor;
|
|
} else {
|
|
color = mThemeColor;
|
|
}
|
|
} else {
|
|
color = mOutgoingBubbleColor;
|
|
}
|
|
|
|
return ImageUtils.getTintedDrawable(mContext, protoDrawable, color);
|
|
}
|
|
|
|
private int getAudioButtonColor(final boolean incoming) {
|
|
return incoming ? mIncomingAudioButtonColor : mThemeColor;
|
|
}
|
|
|
|
public Drawable getPlayButtonDrawable(final boolean incoming) {
|
|
return ImageUtils.getTintedDrawable(
|
|
mContext, mAudioPlayButtonDrawable, getAudioButtonColor(incoming));
|
|
}
|
|
|
|
public Drawable getPauseButtonDrawable(final boolean incoming) {
|
|
return ImageUtils.getTintedDrawable(
|
|
mContext, mAudioPauseButtonDrawable, getAudioButtonColor(incoming));
|
|
}
|
|
|
|
public Drawable getAudioProgressDrawable(final boolean incoming) {
|
|
return ImageUtils.getTintedDrawable(
|
|
mContext, mAudioProgressForegroundDrawable, getAudioButtonColor(incoming));
|
|
}
|
|
|
|
public Drawable getAudioProgressBackgroundDrawable(final boolean incoming) {
|
|
return incoming ? mIncomingAudioProgressBackgroundDrawable :
|
|
mOutgoingAudioProgressBackgroundDrawable;
|
|
}
|
|
|
|
public Drawable getFastScrollThumbDrawable(final boolean pressed) {
|
|
if (pressed) {
|
|
return ImageUtils.getTintedDrawable(mContext, mFastScrollThumbPressedDrawable,
|
|
mThemeColor);
|
|
} else {
|
|
return mFastScrollThumbDrawable;
|
|
}
|
|
}
|
|
|
|
public Drawable getFastScrollPreviewDrawable(boolean positionRight) {
|
|
Drawable protoDrawable = positionRight ? mFastScrollPreviewDrawableRight :
|
|
mFastScrollPreviewDrawableLeft;
|
|
return ImageUtils.getTintedDrawable(mContext, protoDrawable, mThemeColor);
|
|
}
|
|
}
|