blob: a6f08a4f20019faa44cbae2f15985b78b711ecc5 [file] [log] [blame]
/*
* Copyright (C) 2008 Esmertec AG.
* Copyright (C) 2008 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.android.mms.model;
import java.util.HashMap;
import java.util.Map;
import org.w3c.dom.events.Event;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
import android.provider.MediaStore.Audio;
import android.provider.Telephony.Mms.Part;
import android.text.TextUtils;
import android.util.Log;
import com.android.mms.ContentRestrictionException;
import com.android.mms.dom.events.EventImpl;
import com.android.mms.dom.smil.SmilMediaElementImpl;
import com.google.android.mms.MmsException;
public class AudioModel extends MediaModel {
private static final String TAG = MediaModel.TAG;
private static final boolean DEBUG = false;
private static final boolean LOCAL_LOGV = false;
private final HashMap<String, String> mExtras;
public AudioModel(Context context, Uri uri) throws MmsException {
this(context, null, null, uri);
initModelFromUri(uri);
checkContentRestriction();
}
public AudioModel(Context context, String contentType, String src, Uri uri) throws MmsException {
super(context, SmilHelper.ELEMENT_TAG_AUDIO, contentType, src, uri);
mExtras = new HashMap<String, String>();
}
private void initModelFromUri(Uri uri) throws MmsException {
ContentResolver cr = mContext.getContentResolver();
Cursor c = SqliteWrapper.query(mContext, cr, uri, null, null, null, null);
if (c != null) {
try {
if (c.moveToFirst()) {
String path;
boolean isFromMms = isMmsUri(uri);
// FIXME We suppose that there should be only two sources
// of the audio, one is the media store, the other is
// our MMS database.
if (isFromMms) {
path = c.getString(c.getColumnIndexOrThrow(Part._DATA));
mContentType = c.getString(c.getColumnIndexOrThrow(Part.CONTENT_TYPE));
} else {
path = c.getString(c.getColumnIndexOrThrow(Audio.Media.DATA));
mContentType = c.getString(c.getColumnIndexOrThrow(
Audio.Media.MIME_TYPE));
// Get more extras information which would be useful
// to the user.
String album = c.getString(c.getColumnIndexOrThrow("album"));
if (!TextUtils.isEmpty(album)) {
mExtras.put("album", album);
}
String artist = c.getString(c.getColumnIndexOrThrow("artist"));
if (!TextUtils.isEmpty(artist)) {
mExtras.put("artist", artist);
}
}
mSrc = path.substring(path.lastIndexOf('/') + 1);
if (TextUtils.isEmpty(mContentType)) {
throw new MmsException("Type of media is unknown.");
}
if (LOCAL_LOGV) {
Log.v(TAG, "New AudioModel created:"
+ " mSrc=" + mSrc
+ " mContentType=" + mContentType
+ " mUri=" + uri
+ " mExtras=" + mExtras);
}
} else {
throw new MmsException("Nothing found: " + uri);
}
} finally {
c.close();
}
} else {
throw new MmsException("Bad URI: " + uri);
}
initMediaDuration();
}
public void stop() {
appendAction(MediaAction.STOP);
notifyModelChanged(false);
}
public void handleEvent(Event evt) {
String evtType = evt.getType();
if (LOCAL_LOGV) {
Log.v(TAG, "Handling event: " + evtType + " on " + this);
}
MediaAction action = MediaAction.NO_ACTIVE_ACTION;
if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) {
action = MediaAction.START;
// if the Music player app is playing audio, we should pause that so it won't
// interfere with us playing audio here.
pauseMusicPlayer();
} else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_END_EVENT)) {
action = MediaAction.STOP;
} else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT)) {
action = MediaAction.PAUSE;
} else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT)) {
action = MediaAction.SEEK;
mSeekTo = ((EventImpl) evt).getSeekTo();
}
appendAction(action);
notifyModelChanged(false);
}
public Map<String, ?> getExtras() {
return mExtras;
}
protected void checkContentRestriction() throws ContentRestrictionException {
ContentRestriction cr = ContentRestrictionFactory.getContentRestriction();
cr.checkAudioContentType(mContentType);
}
@Override
protected boolean isPlayable() {
return true;
}
}