166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/*
266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Copyright (C) 2010-2011 The Android Open Source Project
366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * you may not use this file except in compliance with the License.
666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * You may obtain a copy of the License at
766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
1066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Unless required by applicable law or agreed to in writing, software
1166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
1266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * See the License for the specific language governing permissions and
1466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * limitations under the License.
1566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
1666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
1766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpackage com.android.musicfx;
1866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
1966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.BroadcastReceiver;
2066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context;
2166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Intent;
2266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect;
2366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.os.Bundle;
2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.util.Log;
2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport java.util.HashMap;
2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ControlPanelReceiver extends BroadcastReceiver {
2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String TAG = "MusicFXControlPanelReceiver";
3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    @Override
3366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public void onReceive(final Context context, final Intent intent) {
3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "onReceive");
3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((context == null) || (intent == null)) {
3866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.w(TAG, "Context or intent is null. Do nothing.");
3966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
4066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
4166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
4266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final String action = intent.getAction();
4366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final String packageName = intent.getStringExtra(AudioEffect.EXTRA_PACKAGE_NAME);
4466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final int audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION,
4566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                AudioEffect.ERROR_BAD_VALUE);
4666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
4766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Action: " + action);
4866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Package name: " + packageName);
4966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "Audio session: " + audioSession);
5066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
5166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // check package name
5266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (packageName == null) {
5366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.w(TAG, "Null package name");
5466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
5566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
5666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
5766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // check audio session
5866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if ((audioSession == AudioEffect.ERROR_BAD_VALUE) || (audioSession < 0)) {
5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.w(TAG, "Invalid or missing audio session " + audioSession);
6066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
6166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
6266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // open audio session
6466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)) {
6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // retrieve the effect enabled state
6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isGlobalEnabled = context.getSharedPreferences(packageName,
6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE).getBoolean(
6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    ControlPanelEffect.Key.global_enabled.toString(),
7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    ControlPanelEffect.GLOBAL_ENABLED_DEFAULT);
7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ControlPanelEffect.openSession(context, packageName, audioSession);
7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // close audio session
7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) {
7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            ControlPanelEffect.closeSession(context, packageName, audioSession);
7966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
8066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
8166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // set params
8266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (action.equals("AudioEffect.ACTION_SET_PARAM")) {
8366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String param = intent.getStringExtra("AudioEffect.EXTRA_PARAM");
8466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
8566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (param.equals("GLOBAL_ENABLED")) {
8666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Boolean value = intent.getBooleanExtra("AudioEffect.EXTRA_VALUE", false);
8766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                ControlPanelEffect.setParameterBoolean(context, packageName, audioSession,
8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        ControlPanelEffect.Key.global_enabled, value);
8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
9166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // get params
9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (action.equals("AudioEffect.ACTION_GET_PARAM")) {
9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String param = intent.getStringExtra("AudioEffect.EXTRA_PARAM");
9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (param.equals("GLOBAL_ENABLED")) {
9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Boolean value = ControlPanelEffect.getParameterBoolean(context, packageName,
9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        audioSession, ControlPanelEffect.Key.global_enabled);
9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Bundle extras = new Bundle();
10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                extras.putBoolean("GLOBAL_ENABLED", value);
10166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                setResultExtras(extras);
10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
10466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
106