| /* |
| * Copyright (C) 2016 Google Inc. |
| * |
| * 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.googlecode.android_scripting.facade; |
| |
| import android.app.Service; |
| import android.content.Intent; |
| |
| import com.googlecode.android_scripting.Log; |
| import com.googlecode.android_scripting.exception.Sl4aException; |
| import com.googlecode.android_scripting.jsonrpc.RpcReceiver; |
| import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager; |
| import com.googlecode.android_scripting.rpc.RpcDeprecated; |
| import com.googlecode.android_scripting.rpc.RpcMinSdk; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| import java.util.Collection; |
| |
| public class FacadeManager extends RpcReceiverManager { |
| |
| private final Service mService; |
| private final Intent mIntent; |
| private int mSdkLevel; |
| |
| public FacadeManager(int sdkLevel, Service service, Intent intent, |
| Collection<Class<? extends RpcReceiver>> classList) { |
| super(classList); |
| mSdkLevel = sdkLevel; |
| mService = service; |
| mIntent = intent; |
| } |
| |
| public int getSdkLevel() { |
| return mSdkLevel; |
| } |
| |
| public Service getService() { |
| return mService; |
| } |
| |
| public Intent getIntent() { |
| return mIntent; |
| } |
| |
| @Override |
| public Object invoke(Class<? extends RpcReceiver> clazz, Method method, Object[] args) |
| throws Exception { |
| try { |
| if (method.isAnnotationPresent(RpcDeprecated.class)) { |
| String replacedBy = method.getAnnotation(RpcDeprecated.class).value(); |
| String title = method.getName() + " is deprecated"; |
| Log.notify(mService, title, title, String.format("Please use %s instead.", replacedBy)); |
| } else if (method.isAnnotationPresent(RpcMinSdk.class)) { |
| int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value(); |
| if (mSdkLevel < requiredSdkLevel) { |
| throw new Sl4aException(String.format("%s requires API level %d, current level is %d", |
| method.getName(), requiredSdkLevel, mSdkLevel)); |
| } |
| } |
| return super.invoke(clazz, method, args); |
| } catch (InvocationTargetException e) { |
| if (e.getCause() instanceof SecurityException) { |
| Log.notify(mService, "RPC invoke failed...", mService.getPackageName(), e.getCause() |
| .getMessage()); |
| } |
| throw e; |
| } |
| } |
| |
| public AndroidFacade.Resources getAndroidFacadeResources() { |
| return new AndroidFacade.Resources() { |
| @Override |
| public int getLogo48() { |
| // TODO(Alexey): As an alternative, ask application for resource ids. |
| String packageName = mService.getApplication().getPackageName(); |
| return mService.getResources().getIdentifier("script_logo_48", "drawable", packageName); |
| } |
| }; |
| } |
| } |