Voicemail provider sample source code.
The app demostrates the how to use voicemail provider APIs to insert new voicemail records using a simple UI. Change-Id: I22610e06a8b80518b9f0d811f72afe245a4148c6
This commit is contained in:
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* 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 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 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 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)
|
||||
.setSource(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) {
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
outputStream = mVoicemailProviderHelper.setVoicemailContent(
|
||||
newVoicemailUri, getContentResolver().getType(recordingUri));
|
||||
copyStreamData(inputAudioStream, outputStream);
|
||||
} finally {
|
||||
CloseUtils.closeQuietly(outputStream);
|
||||
CloseUtils.closeQuietly(inputAudioStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Exception error) {
|
||||
if (error == null) {
|
||||
// No error - done.
|
||||
finish();
|
||||
} else {
|
||||
handleError(error);
|
||||
}
|
||||
}
|
||||
|
||||
private void copyStreamData(InputStream in, OutputStream out) throws IOException {
|
||||
// Copy 8K chunk at a time.
|
||||
byte[] data = new byte[8 * 1024];
|
||||
int numBytes;
|
||||
while ((numBytes = in.read(data)) > 0) {
|
||||
out.write(data, 0, numBytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user