/* * Copyright 2015 Hippo Seven * * 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.hippo.nimingban.service; import android.app.Notification; import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v7.app.NotificationCompat; import com.hippo.nimingban.R; import com.hippo.yorozuya.SimpleHandler; import java.io.IOException; public class DaDiaoService extends Service { public static final String ACTION_DA_DIAO = "com.hippo.nimingban.service.DaDiaoService.ACTION_DA_DIAO"; public static final int NOTIFICATION_ID = 1; private int mOriginalVolume; private int mMaxVolume = -1; private int mPlaying = 0; // Keep volume when play sound private boolean mHasPostSetVolumeRunnable = false; private Runnable mSetVolumeRunnable = new Runnable() { @Override public void run() { if (mMaxVolume == -1) { mHasPostSetVolumeRunnable = false; return; } final AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mMaxVolume, 0); SimpleHandler.getInstance().postDelayed(this, 500); } }; @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent == null || !ACTION_DA_DIAO.equals(intent.getAction())) { // Remove notification ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).cancel(NOTIFICATION_ID); stopSelf(); return START_NOT_STICKY; } try { final AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); final MediaPlayer mp = new MediaPlayer(); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.tnnaii_h_island_c)); mp.prepare(); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mPlaying--; mp.release(); if (mPlaying == 0) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mOriginalVolume, 0); mMaxVolume = -1; // Remove notification ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).cancel(NOTIFICATION_ID); // Stop service stopSelf(); } } }); if (mPlaying == 0) { mOriginalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // startForeground Notification notification = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_notification_devil) .setContentTitle(getString(R.string.da_diao_service)) .setAutoCancel(false) .setOngoing(true) .setColor(getResources().getColor(R.color.colorPrimary)) .setPriority(NotificationCompat.PRIORITY_MIN) .setCategory(NotificationCompat.CATEGORY_SERVICE) .build(); startForeground(NOTIFICATION_ID, notification); } int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // Sometimes ear protection is off or disabled, make maxVolume to 1/3 if (mAudioManager.isWiredHeadsetOn()) { maxVolume = Math.max(maxVolume / 3, mOriginalVolume); } // For headset on, can't set max volume directly because of ear protection // Just try getting max volume for head set for (int i = maxVolume; i > 0; i--) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0); if (i == mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)) { mMaxVolume = i; break; } mMaxVolume = -1; } mPlaying++; mp.start(); if (!mHasPostSetVolumeRunnable) { mHasPostSetVolumeRunnable = SimpleHandler.getInstance().postDelayed(mSetVolumeRunnable, 500); } } catch (IOException e) { e.printStackTrace(); } return START_REDELIVER_INTENT; } @Nullable @Override public IBinder onBind(Intent intent) { throw new IllegalStateException("No bindService"); } }