| /* |
| * Copyright (C) 2011 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.example.android.voicemail; |
| |
| import com.example.android.voicemail.common.core.Voicemail; |
| import com.example.android.voicemail.common.core.VoicemailImpl; |
| import com.example.android.voicemail.common.core.VoicemailProviderHelper; |
| import com.example.android.voicemail.common.core.VoicemailProviderHelpers; |
| import com.example.android.voicemail.common.inject.InjectView; |
| import com.example.android.voicemail.common.inject.Injector; |
| import com.example.android.voicemail.common.logging.Logger; |
| import com.example.android.voicemail.common.ui.DialogHelperImpl; |
| import com.example.android.voicemail.common.utils.CloseUtils; |
| |
| import android.app.Activity; |
| import android.app.Dialog; |
| import android.content.Intent; |
| import android.net.Uri; |
| import android.os.AsyncTask; |
| import android.os.Bundle; |
| import android.provider.MediaStore; |
| import android.util.Pair; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.TextView; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.text.ParseException; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| |
| /** |
| * A simple activity that stores user entered voicemail data into voicemail content provider. To be |
| * used as a test voicemail source. |
| */ |
| public class AddVoicemailActivity extends Activity { |
| private static final Logger logger = Logger.getLogger(AddVoicemailActivity.class); |
| |
| private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("dd/MM/yyyy h:mm"); |
| |
| private static final int REQUEST_CODE_RECORDING = 100; |
| |
| private final DialogHelperImpl mDialogHelper = new DialogHelperImpl(this); |
| /** |
| * This is created in {@link #onCreate(Bundle)}, and needs to be released in |
| * {@link #onDestroy()}. |
| */ |
| private VoicemailProviderHelper mVoicemailProviderHelper; |
| private Uri mRecordingUri; |
| |
| // Mark the views as injectable. These objects are instantiated automatically during |
| // onCreate() by finding the appropriate view that matches the specified resource_id. |
| @InjectView(R.id.start_recording_btn) |
| private Button mStartRec; |
| @InjectView(R.id.save_btn) |
| private Button mSaveButton; |
| @InjectView(R.id.time) |
| private TextView mTime; |
| @InjectView(R.id.provider_package) |
| private TextView mProviderPackage; |
| @InjectView(R.id.mime_type) |
| private TextView mMimeType; |
| @InjectView(R.id.sender_number) |
| private TextView mSenderNumber; |
| @InjectView(R.id.duration) |
| private TextView mDuration; |
| |
| /** Called when the activity is first created. */ |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.add_voicemail); |
| // Inject all objects that are marked by @InjectView annotation. |
| Injector.get(this).inject(); |
| mVoicemailProviderHelper = VoicemailProviderHelpers.createPackageScopedVoicemailProvider(this); |
| |
| setDefaultValues(); |
| |
| // Record voice button. |
| mStartRec.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startRecording(); |
| } |
| }); |
| |
| // Save voicemail button. |
| mSaveButton.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| storeVoicemail(); |
| } |
| |
| }); |
| } |
| |
| private void storeVoicemail() { |
| try { |
| Pair<Voicemail, Uri> newVoicemail = new Pair<Voicemail, Uri>( |
| buildVoicemailObjectFromUiElements(), mRecordingUri); |
| new InsertVoicemailTask().execute(newVoicemail); |
| } catch (ParseException e) { |
| handleError(e); |
| } |
| } |
| |
| private Voicemail buildVoicemailObjectFromUiElements() throws ParseException { |
| String sender = mSenderNumber.getText().toString(); |
| String dateStr = mTime.getText().toString(); |
| String durationStr = mDuration.getText().toString(); |
| String mimeType = mMimeType.getText().toString(); |
| String sourcePackageName = mProviderPackage.getText().toString(); |
| long time = DATE_FORMATTER.parse(dateStr.trim()).getTime(); |
| long duration = durationStr.length() != 0 ? Long.parseLong(durationStr) : 0; |
| return VoicemailImpl.createForInsertion(time, sender) |
| .setDuration(duration) |
| .setSourcePackage(sourcePackageName) |
| .build(); |
| } |
| |
| @Override |
| protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| super.onActivityResult(requestCode, resultCode, data); |
| switch (requestCode) { |
| case REQUEST_CODE_RECORDING: |
| handleRecordingResult(resultCode, data); |
| break; |
| default: |
| logger.e("onActivityResult: Unexpected requestCode: " + requestCode); |
| } |
| } |
| |
| @Override |
| protected Dialog onCreateDialog(int id, Bundle bundle) { |
| return mDialogHelper.handleOnCreateDialog(id, bundle); |
| } |
| |
| /** Set default values in the display */ |
| private void setDefaultValues() { |
| // Set time to current time. |
| mTime.setText(DATE_FORMATTER.format(new Date())); |
| |
| // Set provider package to this app's package. |
| mProviderPackage.setText(getPackageName()); |
| } |
| |
| private void startRecording() { |
| Intent recordingIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); |
| startActivityForResult(recordingIntent, REQUEST_CODE_RECORDING); |
| } |
| |
| private void handleRecordingResult(int resultCode, Intent data) { |
| if (resultCode != RESULT_OK) { |
| handleError(new Exception("Failed to do recording. Error Code: " + resultCode)); |
| } |
| |
| Uri uri = data.getData(); |
| logger.d("Received recording URI: " + uri); |
| if (uri != null) { |
| mRecordingUri = uri; |
| mMimeType.setText(getContentResolver().getType(uri)); |
| } |
| } |
| |
| private void handleError(Exception e) { |
| mDialogHelper.showErrorMessageDialog(R.string.voicemail_store_error, e); |
| } |
| |
| /** |
| * An async task that inserts a new voicemail record using a background thread. |
| * The tasks accepts a pair of voicemail object and the recording Uri as the param. |
| * The result returned is the error exception, if any, encountered during the operation. |
| */ |
| private class InsertVoicemailTask extends AsyncTask<Pair<Voicemail, Uri>, Void, Exception> { |
| @Override |
| protected Exception doInBackground(Pair<Voicemail, Uri>... params) { |
| if (params.length > 0) { |
| try { |
| insertVoicemail(params[0].first, params[0].second); |
| } catch (IOException e) { |
| return e; |
| } |
| } |
| return null; |
| } |
| |
| private void insertVoicemail(Voicemail voicemail, Uri recordingUri) throws IOException { |
| InputStream inputAudioStream = recordingUri == null ? null : |
| getContentResolver().openInputStream(recordingUri); |
| Uri newVoicemailUri = mVoicemailProviderHelper.insert(voicemail); |
| logger.i("Inserted new voicemail URI: " + newVoicemailUri); |
| if (inputAudioStream != null) { |
| try { |
| mVoicemailProviderHelper.setVoicemailContent(newVoicemailUri, inputAudioStream, |
| getContentResolver().getType(recordingUri)); |
| } finally { |
| CloseUtils.closeQuietly(inputAudioStream); |
| } |
| } |
| } |
| |
| @Override |
| protected void onPostExecute(Exception error) { |
| if (error == null) { |
| // No error - done. |
| finish(); |
| } else { |
| handleError(error); |
| } |
| } |
| |
| } |
| } |