• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
25 import android.content.Context;
26 import android.content.res.Configuration;
27 import android.os.Handler;
28 import android.os.Message;
29 import android.util.AttributeSet;
30 import android.util.Log;
31 import android.view.View;
32 import android.view.ViewStub;
33 import android.widget.Button;
34 import android.widget.ImageButton;
35 import android.widget.LinearLayout;
36 
37 /**
38  * This is an embedded editor/view to add photos and sound/video clips
39  * into a multimedia message.
40  */
41 public class AttachmentEditor extends LinearLayout {
42     private static final String TAG = "AttachmentEditor";
43 
44     static final int MSG_EDIT_SLIDESHOW   = 1;
45     static final int MSG_SEND_SLIDESHOW   = 2;
46     static final int MSG_PLAY_SLIDESHOW   = 3;
47     static final int MSG_REPLACE_IMAGE    = 4;
48     static final int MSG_REPLACE_VIDEO    = 5;
49     static final int MSG_REPLACE_AUDIO    = 6;
50     static final int MSG_PLAY_VIDEO       = 7;
51     static final int MSG_PLAY_AUDIO       = 8;
52     static final int MSG_VIEW_IMAGE       = 9;
53     static final int MSG_REMOVE_ATTACHMENT = 10;
54 
55     private final Context mContext;
56     private Handler mHandler;
57 
58     private SlideViewInterface mView;
59     private SlideshowModel mSlideshow;
60     private Presenter mPresenter;
61     private boolean mCanSend;
62     private Button mSendButton;
63 
AttachmentEditor(Context context, AttributeSet attr)64     public AttachmentEditor(Context context, AttributeSet attr) {
65         super(context, attr);
66         mContext = context;
67     }
68 
update(WorkingMessage msg)69     public void update(WorkingMessage msg) {
70         hideView();
71         mView = null;
72 
73         // If there's no attachment, we have nothing to do.
74         if (!msg.hasAttachment()) {
75             return;
76         }
77 
78         // Get the slideshow from the message.
79         mSlideshow = msg.getSlideshow();
80 
81         mView = createView();
82 
83         if ((mPresenter == null) || !mSlideshow.equals(mPresenter.getModel())) {
84             mPresenter = PresenterFactory.getPresenter(
85                     "MmsThumbnailPresenter", mContext, mView, mSlideshow);
86         } else {
87             mPresenter.setView(mView);
88         }
89 
90         mPresenter.present();
91     }
92 
setHandler(Handler handler)93     public void setHandler(Handler handler) {
94         mHandler = handler;
95     }
96 
setCanSend(boolean enable)97     public void setCanSend(boolean enable) {
98         if (mCanSend != enable) {
99             mCanSend = enable;
100             updateSendButton();
101         }
102     }
103 
updateSendButton()104     private void updateSendButton() {
105         if (null != mSendButton) {
106             mSendButton.setEnabled(mCanSend);
107             mSendButton.setFocusable(mCanSend);
108         }
109     }
110 
hideView()111     public void hideView() {
112         if (mView != null) {
113             ((View)mView).setVisibility(View.GONE);
114         }
115     }
116 
getStubView(int stubId, int viewId)117     private View getStubView(int stubId, int viewId) {
118         View view = findViewById(viewId);
119         if (view == null) {
120             ViewStub stub = (ViewStub) findViewById(stubId);
121             view = stub.inflate();
122         }
123 
124         return view;
125     }
126 
127     private class MessageOnClick implements OnClickListener {
128         private int mWhat;
129 
MessageOnClick(int what)130         public MessageOnClick(int what) {
131             mWhat = what;
132         }
133 
onClick(View v)134         public void onClick(View v) {
135             Message msg = Message.obtain(mHandler, mWhat);
136             msg.sendToTarget();
137         }
138     }
139 
createView()140     private SlideViewInterface createView() {
141         boolean inPortrait = inPortraitMode();
142         if (mSlideshow.size() > 1) {
143             return createSlideshowView(inPortrait);
144         }
145 
146         SlideModel slide = mSlideshow.get(0);
147         if (slide.hasImage()) {
148             return createMediaView(
149                     inPortrait ? R.id.image_attachment_view_portrait_stub :
150                         R.id.image_attachment_view_landscape_stub,
151                     inPortrait ? R.id.image_attachment_view_portrait :
152                         R.id.image_attachment_view_landscape,
153                     R.id.view_image_button, R.id.replace_image_button, R.id.remove_image_button,
154                     MSG_VIEW_IMAGE, MSG_REPLACE_IMAGE, MSG_REMOVE_ATTACHMENT);
155         } else if (slide.hasVideo()) {
156             return createMediaView(
157                     inPortrait ? R.id.video_attachment_view_portrait_stub :
158                         R.id.video_attachment_view_landscape_stub,
159                     inPortrait ? R.id.video_attachment_view_portrait :
160                         R.id.video_attachment_view_landscape,
161                     R.id.view_video_button, R.id.replace_video_button, R.id.remove_video_button,
162                     MSG_PLAY_VIDEO, MSG_REPLACE_VIDEO, MSG_REMOVE_ATTACHMENT);
163         } else if (slide.hasAudio()) {
164             return createMediaView(
165                     inPortrait ? R.id.audio_attachment_view_portrait_stub :
166                         R.id.audio_attachment_view_landscape_stub,
167                     inPortrait ? R.id.audio_attachment_view_portrait :
168                         R.id.audio_attachment_view_landscape,
169                     R.id.play_audio_button, R.id.replace_audio_button, R.id.remove_audio_button,
170                     MSG_PLAY_AUDIO, MSG_REPLACE_AUDIO, MSG_REMOVE_ATTACHMENT);
171         } else {
172             throw new IllegalArgumentException();
173         }
174     }
175 
176     /**
177      * What is the current orientation?
178      */
inPortraitMode()179     private boolean inPortraitMode() {
180         final Configuration configuration = mContext.getResources().getConfiguration();
181         return configuration.orientation == Configuration.ORIENTATION_PORTRAIT;
182     }
183 
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)184     private SlideViewInterface createMediaView(
185             int stub_view_id, int real_view_id,
186             int view_button_id, int replace_button_id, int remove_button_id,
187             int view_message, int replace_message, int remove_message) {
188         LinearLayout view = (LinearLayout)getStubView(stub_view_id, real_view_id);
189         view.setVisibility(View.VISIBLE);
190 
191         Button viewButton = (Button) view.findViewById(view_button_id);
192         Button replaceButton = (Button) view.findViewById(replace_button_id);
193         Button removeButton = (Button) view.findViewById(remove_button_id);
194 
195         viewButton.setOnClickListener(new MessageOnClick(view_message));
196         replaceButton.setOnClickListener(new MessageOnClick(replace_message));
197         removeButton.setOnClickListener(new MessageOnClick(remove_message));
198 
199         return (SlideViewInterface) view;
200     }
201 
createSlideshowView(boolean inPortrait)202     private SlideViewInterface createSlideshowView(boolean inPortrait) {
203         LinearLayout view =(LinearLayout) getStubView(inPortrait ?
204                 R.id.slideshow_attachment_view_portrait_stub :
205                 R.id.slideshow_attachment_view_landscape_stub,
206                 inPortrait ? R.id.slideshow_attachment_view_portrait :
207                     R.id.slideshow_attachment_view_landscape);
208         view.setVisibility(View.VISIBLE);
209 
210         Button editBtn = (Button) view.findViewById(R.id.edit_slideshow_button);
211         mSendButton = (Button) view.findViewById(R.id.send_slideshow_button);
212         updateSendButton();
213         final ImageButton playBtn = (ImageButton) view.findViewById(
214                 R.id.play_slideshow_button);
215 
216         editBtn.setOnClickListener(new MessageOnClick(MSG_EDIT_SLIDESHOW));
217         mSendButton.setOnClickListener(new MessageOnClick(MSG_SEND_SLIDESHOW));
218         playBtn.setOnClickListener(new MessageOnClick(MSG_PLAY_SLIDESHOW));
219 
220         return (SlideViewInterface) view;
221     }
222 }
223