15986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik/*
25986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * Copyright (C) 2011 The Android Open Source Project
35986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik *
45986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * Licensed under the Apache License, Version 2.0 (the "License");
55986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * you may not use this file except in compliance with the License.
65986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * You may obtain a copy of the License at
75986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik *
85986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik *      http://www.apache.org/licenses/LICENSE-2.0
95986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik *
105986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * Unless required by applicable law or agreed to in writing, software
115986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * distributed under the License is distributed on an "AS IS" BASIS,
125986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * See the License for the specific language governing permissions and
145986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * limitations under the License.
155986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik */
165986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
175986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurikpackage com.example.android.musicplayer;
185986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
195986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurikimport android.media.AudioManager;
205986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurikimport android.util.Log;
215986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
225986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurikimport java.lang.reflect.Method;
235986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
245986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik/**
255986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * Contains methods to handle registering/unregistering remote control clients.  These methods only
265986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik * run on ICS devices.  On previous devices, all methods are no-ops.
275986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik */
285986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik@SuppressWarnings({"unchecked", "rawtypes"})
295986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurikpublic class RemoteControlHelper {
305986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    private static final String TAG = "RemoteControlHelper";
315986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
325986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    private static boolean sHasRemoteControlAPIs = false;
335986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
345986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    private static Method sRegisterRemoteControlClientMethod;
355986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    private static Method sUnregisterRemoteControlClientMethod;
365986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
375986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    static {
385986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        try {
395986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            ClassLoader classLoader = RemoteControlHelper.class.getClassLoader();
405986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            Class sRemoteControlClientClass =
415986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik                    RemoteControlClientCompat.getActualRemoteControlClientClass(classLoader);
425986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            sRegisterRemoteControlClientMethod = AudioManager.class.getMethod(
435986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik                    "registerRemoteControlClient", new Class[]{sRemoteControlClientClass});
445986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            sUnregisterRemoteControlClientMethod = AudioManager.class.getMethod(
455986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik                    "unregisterRemoteControlClient", new Class[]{sRemoteControlClientClass});
465986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            sHasRemoteControlAPIs = true;
475986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (ClassNotFoundException e) {
485986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            // Silently fail when running on an OS before ICS.
495986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (NoSuchMethodException e) {
505986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            // Silently fail when running on an OS before ICS.
515986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (IllegalArgumentException e) {
525986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            // Silently fail when running on an OS before ICS.
535986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (SecurityException e) {
545986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            // Silently fail when running on an OS before ICS.
555986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        }
565986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    }
575986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
585986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    public static void registerRemoteControlClient(AudioManager audioManager,
595986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            RemoteControlClientCompat remoteControlClient) {
605986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        if (!sHasRemoteControlAPIs) {
615986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            return;
625986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        }
635986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
645986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        try {
655986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            sRegisterRemoteControlClientMethod.invoke(audioManager,
665986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik                    remoteControlClient.getActualRemoteControlClientObject());
675986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (Exception e) {
685986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            Log.e(TAG, e.getMessage(), e);
695986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        }
705986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    }
715986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
725986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
735986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    public static void unregisterRemoteControlClient(AudioManager audioManager,
745986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            RemoteControlClientCompat remoteControlClient) {
755986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        if (!sHasRemoteControlAPIs) {
765986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            return;
775986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        }
785986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
795986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        try {
805986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            sUnregisterRemoteControlClientMethod.invoke(audioManager,
815986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik                    remoteControlClient.getActualRemoteControlClientObject());
825986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        } catch (Exception e) {
835986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik            Log.e(TAG, e.getMessage(), e);
845986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik        }
855986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik    }
865986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik}
875986e12034e38fd165d2f100c7e404bbf61b2649Roman Nurik
88