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
18package com.android.mms.ui;
19
20import com.android.mms.R;
21import com.android.mms.data.WorkingMessage;
22import com.android.mms.model.SlideModel;
23import com.android.mms.model.SlideshowModel;
24
25import android.content.Context;
26import android.content.res.Configuration;
27import android.os.Handler;
28import android.os.Message;
29import android.util.AttributeSet;
30import android.util.Log;
31import android.view.View;
32import android.view.ViewStub;
33import android.widget.Button;
34import android.widget.ImageButton;
35import 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 */
41public 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
64    public AttachmentEditor(Context context, AttributeSet attr) {
65        super(context, attr);
66        mContext = context;
67    }
68
69    /**
70     * Returns true if the attachment editor has an attachment to show.
71     */
72    public boolean update(WorkingMessage msg) {
73        hideView();
74        mView = null;
75
76        // If there's no attachment, we have nothing to do.
77        if (!msg.hasAttachment()) {
78            return false;
79        }
80
81        // Get the slideshow from the message.
82        mSlideshow = msg.getSlideshow();
83
84        mView = createView();
85
86        if ((mPresenter == null) || !mSlideshow.equals(mPresenter.getModel())) {
87            mPresenter = PresenterFactory.getPresenter(
88                    "MmsThumbnailPresenter", mContext, mView, mSlideshow);
89        } else {
90            mPresenter.setView(mView);
91        }
92
93        mPresenter.present();
94        return true;
95    }
96
97    public void setHandler(Handler handler) {
98        mHandler = handler;
99    }
100
101    public void setCanSend(boolean enable) {
102        if (mCanSend != enable) {
103            mCanSend = enable;
104            updateSendButton();
105        }
106    }
107
108    private void updateSendButton() {
109        if (null != mSendButton) {
110            mSendButton.setEnabled(mCanSend);
111            mSendButton.setFocusable(mCanSend);
112        }
113    }
114
115    public void hideView() {
116        if (mView != null) {
117            ((View)mView).setVisibility(View.GONE);
118        }
119    }
120
121    private View getStubView(int stubId, int viewId) {
122        View view = findViewById(viewId);
123        if (view == null) {
124            ViewStub stub = (ViewStub) findViewById(stubId);
125            view = stub.inflate();
126        }
127
128        return view;
129    }
130
131    private class MessageOnClick implements OnClickListener {
132        private int mWhat;
133
134        public MessageOnClick(int what) {
135            mWhat = what;
136        }
137
138        public void onClick(View v) {
139            Message msg = Message.obtain(mHandler, mWhat);
140            msg.sendToTarget();
141        }
142    }
143
144    private SlideViewInterface createView() {
145        boolean inPortrait = inPortraitMode();
146        if (mSlideshow.size() > 1) {
147            return createSlideshowView(inPortrait);
148        }
149
150        SlideModel slide = mSlideshow.get(0);
151        if (slide.hasImage()) {
152            return createMediaView(
153                    R.id.image_attachment_view_stub,
154                    R.id.image_attachment_view,
155                    R.id.view_image_button, R.id.replace_image_button, R.id.remove_image_button,
156                    MSG_VIEW_IMAGE, MSG_REPLACE_IMAGE, MSG_REMOVE_ATTACHMENT);
157        } else if (slide.hasVideo()) {
158            return createMediaView(
159                    R.id.video_attachment_view_stub,
160                    R.id.video_attachment_view,
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                    R.id.audio_attachment_view_stub,
166                    R.id.audio_attachment_view,
167                    R.id.play_audio_button, R.id.replace_audio_button, R.id.remove_audio_button,
168                    MSG_PLAY_AUDIO, MSG_REPLACE_AUDIO, MSG_REMOVE_ATTACHMENT);
169        } else {
170            throw new IllegalArgumentException();
171        }
172    }
173
174    /**
175     * What is the current orientation?
176     */
177    private boolean inPortraitMode() {
178        final Configuration configuration = mContext.getResources().getConfiguration();
179        return configuration.orientation == Configuration.ORIENTATION_PORTRAIT;
180    }
181
182    private SlideViewInterface createMediaView(
183            int stub_view_id, int real_view_id,
184            int view_button_id, int replace_button_id, int remove_button_id,
185            int view_message, int replace_message, int remove_message) {
186        LinearLayout view = (LinearLayout)getStubView(stub_view_id, real_view_id);
187        view.setVisibility(View.VISIBLE);
188
189        Button viewButton = (Button) view.findViewById(view_button_id);
190        Button replaceButton = (Button) view.findViewById(replace_button_id);
191        Button removeButton = (Button) view.findViewById(remove_button_id);
192
193        viewButton.setOnClickListener(new MessageOnClick(view_message));
194        replaceButton.setOnClickListener(new MessageOnClick(replace_message));
195        removeButton.setOnClickListener(new MessageOnClick(remove_message));
196
197        return (SlideViewInterface) view;
198    }
199
200    private SlideViewInterface createSlideshowView(boolean inPortrait) {
201        LinearLayout view =(LinearLayout) getStubView(
202                R.id.slideshow_attachment_view_stub,
203                R.id.slideshow_attachment_view);
204        view.setVisibility(View.VISIBLE);
205
206        Button editBtn = (Button) view.findViewById(R.id.edit_slideshow_button);
207        mSendButton = (Button) view.findViewById(R.id.send_slideshow_button);
208        updateSendButton();
209        final ImageButton playBtn = (ImageButton) view.findViewById(
210                R.id.play_slideshow_button);
211
212        editBtn.setOnClickListener(new MessageOnClick(MSG_EDIT_SLIDESHOW));
213        mSendButton.setOnClickListener(new MessageOnClick(MSG_SEND_SLIDESHOW));
214        playBtn.setOnClickListener(new MessageOnClick(MSG_PLAY_SLIDESHOW));
215
216        Button removeButton = (Button) view.findViewById(R.id.remove_slideshow_button);
217        removeButton.setOnClickListener(new MessageOnClick(MSG_REMOVE_ATTACHMENT));
218
219        return (SlideViewInterface) view;
220    }
221}
222