1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.videoeditor;
18
19import android.content.Intent;
20import android.graphics.Bitmap;
21import android.graphics.BitmapFactory;
22import android.os.Bundle;
23import android.text.Editable;
24import android.text.TextWatcher;
25import android.util.Log;
26import android.view.View;
27import android.widget.Button;
28import android.widget.ImageView;
29import android.widget.TextView;
30
31import com.android.videoeditor.service.MovieOverlay;
32import com.android.videoeditor.util.ImageUtils;
33
34/**
35 * Activity that lets user add or edit title overlay of a media item.
36 */
37public class OverlayTitleEditor extends NoSearchActivity {
38    // Parameter names
39    public static final String PARAM_OVERLAY_ATTRIBUTES = "attributes";
40    public static final String PARAM_OVERLAY_ID = "overlay_id";
41    public static final String PARAM_MEDIA_ITEM_ID = "media_item_id";
42
43    private static final String LOG_TAG = "OverlayTitleEditor";
44    private static final int REQUEST_CODE_PICK_TITLE_TEMPLATE = 1;
45
46    private int mOverlayType;
47    private ImageView mOverlayImageView;
48    private Button mOverlayChangeTitleTemplateButton;
49    private TextView mTitleView, mSubtitleView;
50    private Bitmap mOverlayBitmap;
51    private int mPreviewWidth, mPreviewHeight;
52
53    private final TextWatcher mTextWatcher = new TextWatcher() {
54        @Override
55        public void onTextChanged(CharSequence s, int start, int before, int count) {
56            // no-op
57        }
58
59        @Override
60        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
61            // no-op
62        }
63
64        @Override
65        public void afterTextChanged(Editable s) {
66            // Update preview image as user types in the title or sub-title fields.
67            updatePreviewImage();
68            invalidateOptionsMenu();
69        }
70    };
71
72    @Override
73    public void onCreate(Bundle savedInstanceState) {
74        super.onCreate(savedInstanceState);
75        setContentView(R.layout.overlay_title_editor);
76        setFinishOnTouchOutside(true);
77
78        mOverlayImageView = (ImageView) findViewById(R.id.overlay_preview);
79
80        mOverlayChangeTitleTemplateButton = (Button) findViewById(
81                R.id.overlay_change_title_template);
82        mOverlayChangeTitleTemplateButton.setOnClickListener(new View.OnClickListener() {
83                @Override
84                public void onClick(View v) {
85                    launchOverlayTitleTemplatePicker();
86                }
87        });
88
89        mTitleView = (TextView) findViewById(R.id.overlay_title);
90        mTitleView.addTextChangedListener(mTextWatcher);
91
92        mSubtitleView = (TextView) findViewById(R.id.overlay_subtitle);
93        mSubtitleView.addTextChangedListener(mTextWatcher);
94
95        // Determine bitmap dimensions.
96        final BitmapFactory.Options dbo = new BitmapFactory.Options();
97        dbo.inJustDecodeBounds = true;
98        BitmapFactory.decodeResource(getResources(), R.drawable.effects_generic, dbo);
99        mPreviewWidth = dbo.outWidth;
100        mPreviewHeight = dbo.outHeight;
101
102        final Bundle attributes = getIntent().getBundleExtra(PARAM_OVERLAY_ATTRIBUTES);
103        if (attributes != null) {
104            // The media item already has a title overlay. Fill in the contents in the input fields
105            // and let user edit them.
106            mOverlayType = MovieOverlay.getType(attributes);
107            mTitleView.setText(MovieOverlay.getTitle(attributes));
108            mSubtitleView.setText(MovieOverlay.getSubtitle(attributes));
109        } else {
110            // Default overlay type that puts title at the bottom of the media item.
111            mOverlayType = MovieOverlay.OVERLAY_TYPE_BOTTOM_1;
112        }
113        updatePreviewImage();
114    }
115
116    private void launchOverlayTitleTemplatePicker() {
117        final Intent intent = new Intent(this, OverlayTitleTemplatePicker.class);
118        startActivityForResult(intent, REQUEST_CODE_PICK_TITLE_TEMPLATE);
119    }
120
121    private void updatePreviewImage() {
122        mOverlayBitmap = ImageUtils.buildOverlayBitmap(this, mOverlayBitmap, mOverlayType,
123                mTitleView.getText().toString(), mSubtitleView.getText().toString(),
124                mPreviewWidth, mPreviewHeight);
125        mOverlayImageView.setImageBitmap(mOverlayBitmap);
126    }
127
128    @Override
129    protected void onActivityResult(int requestCode, int resultCode, Intent extras) {
130        if (resultCode != RESULT_OK)
131            return;
132
133        switch (requestCode) {
134            case REQUEST_CODE_PICK_TITLE_TEMPLATE:
135                // Get chosen overlay type from extras and then update preview image.
136                final Bundle attributes = extras.getBundleExtra(
137                        OverlayTitleTemplatePicker.PARAM_OVERLAY_ATTRIBUTES);
138                mOverlayType = MovieOverlay.getType(attributes);
139                updatePreviewImage();
140                break;
141            default:
142                Log.w(LOG_TAG, "Invalid request code received: " + requestCode);
143                break;
144        }
145    }
146
147    /**
148     * Handler used to responds to "OK" and "Cancel" buttons.
149     * @param target "OK" or "Cancel" button
150     */
151    public void onClickHandler(View target) {
152        switch (target.getId()) {
153            case R.id.overlay_ok: {
154                // Extras to be returned to the caller of this activity.
155                final Intent extras = new Intent();
156                extras.putExtra(PARAM_MEDIA_ITEM_ID,
157                        getIntent().getStringExtra(PARAM_MEDIA_ITEM_ID));
158
159                String overlayId = getIntent().getStringExtra(PARAM_OVERLAY_ID);
160                if (overlayId != null) {
161                    extras.putExtra(PARAM_OVERLAY_ID, overlayId);
162                }
163
164                final TextView titleView = (TextView) findViewById(R.id.overlay_title);
165                final TextView subTitleView = (TextView) findViewById(R.id.overlay_subtitle);
166                final Bundle attributes = MovieOverlay.buildUserAttributes(mOverlayType,
167                        titleView.getText().toString(), subTitleView.getText().toString());
168                extras.putExtra(PARAM_OVERLAY_ATTRIBUTES, attributes);
169
170                setResult(RESULT_OK, extras);
171                finish();
172                break;
173            }
174
175            case R.id.overlay_cancel: {
176                finish();
177                break;
178            }
179        }
180    }
181}
182