1a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa/* 2a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Copyright (C) 2014 The Android Open Source Project 3a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * 4a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Licensed under the Apache License, Version 2.0 (the "License"); 5a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * you may not use this file except in compliance with the License. 6a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * You may obtain a copy of the License at 7a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * 8a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * http://www.apache.org/licenses/LICENSE-2.0 9a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * 10a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Unless required by applicable law or agreed to in writing, software 11a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * distributed under the License is distributed on an "AS IS" BASIS, 12a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * See the License for the specific language governing permissions and 14a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * limitations under the License 15a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */ 16a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 17a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaapackage com.android.location.provider; 18a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 19a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.annotation.NonNull; 20a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.annotation.Nullable; 21a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.hardware.location.IActivityRecognitionHardware; 22a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.hardware.location.IActivityRecognitionHardwareWatcher; 23a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.Binder; 24a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.IBinder; 25a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.Process; 26a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.RemoteException; 27a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.util.Log; 28a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 29a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa/** 30a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * A watcher class for Activity-Recognition instances. 31a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */ 32a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaapublic class ActivityRecognitionProviderWatcher { 33a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private static final String TAG = "ActivityRecognitionProviderWatcher"; 34a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 35a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private static ActivityRecognitionProviderWatcher sWatcher; 36a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private static final Object sWatcherLock = new Object(); 37a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 38a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private ActivityRecognitionProvider mActivityRecognitionProvider; 39a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 40a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private ActivityRecognitionProviderWatcher() {} 41a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 42a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa public static ActivityRecognitionProviderWatcher getInstance() { 43a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa synchronized (sWatcherLock) { 44a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa if (sWatcher == null) { 45a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa sWatcher = new ActivityRecognitionProviderWatcher(); 46a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 47a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa return sWatcher; 48a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 49a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 50a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 51a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa private IActivityRecognitionHardwareWatcher.Stub mWatcherStub = 52a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa new IActivityRecognitionHardwareWatcher.Stub() { 53a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa @Override 54a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa public void onInstanceChanged(IActivityRecognitionHardware instance) { 55a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa int callingUid = Binder.getCallingUid(); 56a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa if (callingUid != Process.SYSTEM_UID) { 57a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa Log.d(TAG, "Ignoring calls from non-system server. Uid: " + callingUid); 58a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa return; 59a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 60a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 61a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa try { 62a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa mActivityRecognitionProvider = new ActivityRecognitionProvider(instance); 63a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } catch (RemoteException e) { 64a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa Log.e(TAG, "Error creating Hardware Activity-Recognition", e); 65a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 66a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 67a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa }; 68a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 69a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa /** 70a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Gets the binder needed to interact with proxy provider in the platform. 71a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */ 72a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa @NonNull 73a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa public IBinder getBinder() { 74a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa return mWatcherStub; 75a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 76a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa 77a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa /** 78a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Gets an object that supports the functionality of {@link ActivityRecognitionProvider}. 79a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * 80a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * @return Non-null value if the functionality is supported by the platform, false otherwise. 81a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */ 82a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa @Nullable 83a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa public ActivityRecognitionProvider getActivityRecognitionProvider() { 84a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa return mActivityRecognitionProvider; 85a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa } 86a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa} 87