15c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez/* 25c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Copyright (C) 2017 The Android Open Source Project 35c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 45c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Licensed under the Apache License, Version 2.0 (the "License"); 55c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * you may not use this file except in compliance with the License. 65c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * You may obtain a copy of the License at 75c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 85c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * http://www.apache.org/licenses/LICENSE-2.0 95c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 105c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Unless required by applicable law or agreed to in writing, software 115c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * distributed under the License is distributed on an "AS IS" BASIS, 125c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * See the License for the specific language governing permissions and 145c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * limitations under the License. 155c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez */ 165c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 175c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezpackage com.android.layoutlib.bridge.remote.client; 185c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 195c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.Bridge; 205c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.DrawableParams; 215c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.LayoutLog; 225c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.RenderSession; 235c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.Result; 245c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.ide.common.rendering.api.SessionParams; 255c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layout.remote.api.RemoteBridge; 265c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layout.remote.api.RemoteDrawableParams; 275c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layout.remote.api.RemoteSessionParams; 285c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layoutlib.bridge.remote.client.adapters.RemoteDrawableParamsAdapter; 295c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layoutlib.bridge.remote.client.adapters.RemoteLayoutLogAdapter; 305c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layoutlib.bridge.remote.client.adapters.RemoteRenderSessionAdapter; 315c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layoutlib.bridge.remote.client.adapters.RemoteSessionParamsAdapter; 325c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.tools.layoutlib.annotations.NotNull; 335c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 345c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.io.File; 355c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.rmi.NotBoundException; 365c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.rmi.RemoteException; 375c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.rmi.registry.LocateRegistry; 385c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.rmi.registry.Registry; 395c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.util.Map; 405c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 415c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezpublic class RemoteBridgeClient extends Bridge { 425c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez private final RemoteBridge mDelegate; 435c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 445c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez private RemoteBridgeClient(@NotNull RemoteBridge delegate) { 455c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez mDelegate = delegate; 465c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 475c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 485c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @NotNull 495c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public static RemoteBridgeClient getRemoteBridge(int registryPort) throws RemoteException, 505c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez NotBoundException { 515c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez Registry registry = LocateRegistry.getRegistry(registryPort); 525c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez RemoteBridge remoteBridge = (RemoteBridge) registry.lookup(RemoteBridge.class.getName()); 535c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 545c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return new RemoteBridgeClient(remoteBridge); 555c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 565c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 575c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 585c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int getApiLevel() { 595c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 605c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.getApiLevel(); 615c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 625c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 635c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 645c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 655c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 665c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 675c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 685c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int getRevision() { 695c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 705c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.getRevision(); 715c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 725c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 735c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 745c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 755c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 765c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 775c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public boolean supports(int feature) { 785c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 795c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.supports(feature); 805c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 815c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 825c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 835c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 845c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 855c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 865c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public boolean init(Map<String, String> platformProperties, File fontLocation, 875c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez Map<String, Map<String, Integer>> enumValueMap, LayoutLog log) { 885c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 895c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.init(platformProperties, fontLocation, enumValueMap, 905c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez RemoteLayoutLogAdapter.create(log)); 915c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 925c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 935c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 945c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 955c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 965c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 975c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public boolean dispose() { 985c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 995c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.dispose(); 1005c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 1015c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 1025c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1035c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1045c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1055c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1065c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public RenderSession createSession(SessionParams params) { 1075c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 1085c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez RemoteSessionParams remoteParams = RemoteSessionParamsAdapter.create(params); 1095c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1105c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return new RemoteRenderSessionAdapter(mDelegate.createSession(remoteParams)); 1115c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 1125c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 1135c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1145c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1155c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1165c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1175c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public Result renderDrawable(DrawableParams params) { 1185c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 1195c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.renderDrawable(RemoteDrawableParamsAdapter.create(params)); 1205c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 1215c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 1225c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1235c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1245c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1255c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1265c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public void clearCaches(Object projectKey) { 1275c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new UnsupportedOperationException(); 1285c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1295c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1305c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1315c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public Result getViewParent(Object viewObject) { 1325c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new UnsupportedOperationException(); 1335c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1345c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1355c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1365c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public Result getViewIndex(Object viewObject) { 1375c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new UnsupportedOperationException(); 1385c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1395c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 1405c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 1415c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public boolean isRtl(String locale) { 1425c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 1435c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return mDelegate.isRtl(locale); 1445c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 1455c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 1465c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1475c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 1485c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez} 149