1 /* 2 * Copyright (C) 2008 Esmertec AG. 3 * Copyright (C) 2008 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.android.mms.ui; 19 20 import com.android.mms.R; 21 import com.android.mms.data.WorkingMessage; 22 import com.android.mms.model.SlideModel; 23 import com.android.mms.model.SlideshowModel; 24 import com.android.mms.util.ItemLoadedCallback; 25 26 import android.content.Context; 27 import android.content.res.Configuration; 28 import android.os.Handler; 29 import android.os.Message; 30 import android.util.AttributeSet; 31 import android.util.Log; 32 import android.view.View; 33 import android.view.ViewStub; 34 import android.widget.Button; 35 import android.widget.ImageButton; 36 import android.widget.LinearLayout; 37 38 /** 39 * This is an embedded editor/view to add photos and sound/video clips 40 * into a multimedia message. 41 */ 42 public class AttachmentEditor extends LinearLayout { 43 private static final String TAG = "AttachmentEditor"; 44 45 static final int MSG_EDIT_SLIDESHOW = 1; 46 static final int MSG_SEND_SLIDESHOW = 2; 47 static final int MSG_PLAY_SLIDESHOW = 3; 48 static final int MSG_REPLACE_IMAGE = 4; 49 static final int MSG_REPLACE_VIDEO = 5; 50 static final int MSG_REPLACE_AUDIO = 6; 51 static final int MSG_PLAY_VIDEO = 7; 52 static final int MSG_PLAY_AUDIO = 8; 53 static final int MSG_VIEW_IMAGE = 9; 54 static final int MSG_REMOVE_ATTACHMENT = 10; 55 56 private final Context mContext; 57 private Handler mHandler; 58 59 private SlideViewInterface mView; 60 private SlideshowModel mSlideshow; 61 private Presenter mPresenter; 62 private boolean mCanSend; 63 private Button mSendButton; 64 AttachmentEditor(Context context, AttributeSet attr)65 public AttachmentEditor(Context context, AttributeSet attr) { 66 super(context, attr); 67 mContext = context; 68 } 69 70 /** 71 * Returns true if the attachment editor has an attachment to show. 72 */ update(WorkingMessage msg)73 public boolean update(WorkingMessage msg) { 74 hideView(); 75 mView = null; 76 77 // If there's no attachment, we have nothing to do. 78 if (!msg.hasAttachment()) { 79 return false; 80 } 81 82 // Get the slideshow from the message. 83 mSlideshow = msg.getSlideshow(); 84 85 mView = createView(); 86 87 if ((mPresenter == null) || !mSlideshow.equals(mPresenter.getModel())) { 88 mPresenter = PresenterFactory.getPresenter( 89 "MmsThumbnailPresenter", mContext, mView, mSlideshow); 90 } else { 91 mPresenter.setView(mView); 92 } 93 94 mPresenter.present(null); 95 return true; 96 } 97 setHandler(Handler handler)98 public void setHandler(Handler handler) { 99 mHandler = handler; 100 } 101 setCanSend(boolean enable)102 public void setCanSend(boolean enable) { 103 if (mCanSend != enable) { 104 mCanSend = enable; 105 updateSendButton(); 106 } 107 } 108 updateSendButton()109 private void updateSendButton() { 110 if (null != mSendButton) { 111 mSendButton.setEnabled(mCanSend); 112 mSendButton.setFocusable(mCanSend); 113 } 114 } 115 hideView()116 public void hideView() { 117 if (mView != null) { 118 ((View)mView).setVisibility(View.GONE); 119 } 120 } 121 getStubView(int stubId, int viewId)122 private View getStubView(int stubId, int viewId) { 123 View view = findViewById(viewId); 124 if (view == null) { 125 ViewStub stub = (ViewStub) findViewById(stubId); 126 view = stub.inflate(); 127 } 128 129 return view; 130 } 131 132 private class MessageOnClick implements OnClickListener { 133 private int mWhat; 134 MessageOnClick(int what)135 public MessageOnClick(int what) { 136 mWhat = what; 137 } 138 onClick(View v)139 public void onClick(View v) { 140 Message msg = Message.obtain(mHandler, mWhat); 141 msg.sendToTarget(); 142 } 143 } 144 createView()145 private SlideViewInterface createView() { 146 boolean inPortrait = inPortraitMode(); 147 if (mSlideshow.size() > 1) { 148 return createSlideshowView(inPortrait); 149 } 150 151 SlideModel slide = mSlideshow.get(0); 152 if (slide.hasImage()) { 153 return createMediaView( 154 R.id.image_attachment_view_stub, 155 R.id.image_attachment_view, 156 R.id.view_image_button, R.id.replace_image_button, R.id.remove_image_button, 157 MSG_VIEW_IMAGE, MSG_REPLACE_IMAGE, MSG_REMOVE_ATTACHMENT); 158 } else if (slide.hasVideo()) { 159 return createMediaView( 160 R.id.video_attachment_view_stub, 161 R.id.video_attachment_view, 162 R.id.view_video_button, R.id.replace_video_button, R.id.remove_video_button, 163 MSG_PLAY_VIDEO, MSG_REPLACE_VIDEO, MSG_REMOVE_ATTACHMENT); 164 } else if (slide.hasAudio()) { 165 return createMediaView( 166 R.id.audio_attachment_view_stub, 167 R.id.audio_attachment_view, 168 R.id.play_audio_button, R.id.replace_audio_button, R.id.remove_audio_button, 169 MSG_PLAY_AUDIO, MSG_REPLACE_AUDIO, MSG_REMOVE_ATTACHMENT); 170 } else { 171 throw new IllegalArgumentException(); 172 } 173 } 174 175 /** 176 * What is the current orientation? 177 */ inPortraitMode()178 private boolean inPortraitMode() { 179 final Configuration configuration = mContext.getResources().getConfiguration(); 180 return configuration.orientation == Configuration.ORIENTATION_PORTRAIT; 181 } 182 createMediaView( int stub_view_id, int real_view_id, int view_button_id, int replace_button_id, int remove_button_id, int view_message, int replace_message, int remove_message)183 private SlideViewInterface createMediaView( 184 int stub_view_id, int real_view_id, 185 int view_button_id, int replace_button_id, int remove_button_id, 186 int view_message, int replace_message, int remove_message) { 187 LinearLayout view = (LinearLayout)getStubView(stub_view_id, real_view_id); 188 view.setVisibility(View.VISIBLE); 189 190 Button viewButton = (Button) view.findViewById(view_button_id); 191 Button replaceButton = (Button) view.findViewById(replace_button_id); 192 Button removeButton = (Button) view.findViewById(remove_button_id); 193 194 viewButton.setOnClickListener(new MessageOnClick(view_message)); 195 replaceButton.setOnClickListener(new MessageOnClick(replace_message)); 196 removeButton.setOnClickListener(new MessageOnClick(remove_message)); 197 198 return (SlideViewInterface) view; 199 } 200 createSlideshowView(boolean inPortrait)201 private SlideViewInterface createSlideshowView(boolean inPortrait) { 202 LinearLayout view =(LinearLayout) getStubView( 203 R.id.slideshow_attachment_view_stub, 204 R.id.slideshow_attachment_view); 205 view.setVisibility(View.VISIBLE); 206 207 Button editBtn = (Button) view.findViewById(R.id.edit_slideshow_button); 208 mSendButton = (Button) view.findViewById(R.id.send_slideshow_button); 209 updateSendButton(); 210 final ImageButton playBtn = (ImageButton) view.findViewById( 211 R.id.play_slideshow_button); 212 213 editBtn.setOnClickListener(new MessageOnClick(MSG_EDIT_SLIDESHOW)); 214 mSendButton.setOnClickListener(new MessageOnClick(MSG_SEND_SLIDESHOW)); 215 playBtn.setOnClickListener(new MessageOnClick(MSG_PLAY_SLIDESHOW)); 216 217 Button removeButton = (Button) view.findViewById(R.id.remove_slideshow_button); 218 removeButton.setOnClickListener(new MessageOnClick(MSG_REMOVE_ATTACHMENT)); 219 220 return (SlideViewInterface) view; 221 } 222 } 223