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