1 /*
2  * Copyright (C) 2015 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 package com.android.messaging.util;
17 
18 import android.content.Context;
19 import android.content.res.AssetFileDescriptor;
20 import android.media.AudioManager;
21 import android.media.MediaPlayer;
22 
23 /**
24  * Default implementation of MediaUtil
25  */
26 public class MediaUtilImpl extends MediaUtil {
27 
28     @Override
playSound(final Context context, final int resId, final OnCompletionListener completionListener)29     public void playSound(final Context context, final int resId,
30             final OnCompletionListener completionListener) {
31         // We want to play at the media volume and not the ringer volume, but we do want to
32         // avoid playing sound when the ringer/notifications are silenced. This is used for
33         // in app sounds that are not critical and should not impact running silent but also
34         // shouldn't play at full ring volume if you want to hear your ringer but don't want
35         // to be annoyed with in-app volume.
36         AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
37         try {
38             final MediaPlayer mediaPlayer = new MediaPlayer();
39             mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
40             final AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId);
41             mediaPlayer.setDataSource(
42                     afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
43             afd.close();
44             mediaPlayer.prepare();
45             mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
46                 @Override
47                 public void onCompletion(final MediaPlayer mp) {
48                     if (completionListener != null) {
49                         completionListener.onCompletion();
50                     }
51                     mp.stop();
52                     mp.release();
53                 }
54             });
55             mediaPlayer.seekTo(0);
56             mediaPlayer.start();
57            return;
58         } catch (final Exception e) {
59             LogUtil.w("MediaUtilImpl", "Error playing sound id: " + resId, e);
60         }
61         if (completionListener != null) {
62             // Call the completion handler to not block functionality if audio play fails
63             completionListener.onCompletion();
64         }
65     }
66 }