From 94717dd2fd26d9f20645462eca5231b606f818af Mon Sep 17 00:00:00 2001 From: guojin26 Date: Fri, 2 Jul 2021 09:32:32 +0800 Subject: [PATCH 1/2] fix the bug for DistributedScheduler Signed-off-by: guojin26 --- .../entry/src/main/config.json | 16 +++- .../distributedscheduler/IRemoteAgent.idl | 24 +++++ .../distributedscheduler/RemoteAbility.java | 5 +- .../slice/MainAbilitySlice.java | 94 +++++++++++++++---- .../base/layout/main_ability_slice.xml | 13 +++ 5 files changed, 131 insertions(+), 21 deletions(-) create mode 100644 ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl diff --git a/ability/DistributedScheduler/entry/src/main/config.json b/ability/DistributedScheduler/entry/src/main/config.json index 560cf9f025..8840323902 100644 --- a/ability/DistributedScheduler/entry/src/main/config.json +++ b/ability/DistributedScheduler/entry/src/main/config.json @@ -14,7 +14,8 @@ "video_support" ], "deviceType": [ - "default" + "default", + "tablet" ], "distro": { "deliveryWithInstall": true, @@ -46,7 +47,10 @@ { "name": ".RemoteAbility", "type": "service", - "visible": true + "visible": true, + "permissions": [ + "zidane.permission.MainAbility" + ] }, { "name": ".PageAbility", @@ -71,6 +75,14 @@ }, { "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" + }, + { + "name": "zidane.permission.MainAbility" + } + ], + "defPermissions": [ + { + "name": "zidane.permission.MainAbility" } ] } diff --git a/ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl b/ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl new file mode 100644 index 0000000000..b3952b3d6a --- /dev/null +++ b/ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ + +// IRemoteAgent.idl + +// Declare any non-default types here with sequenceable or interface statements +interface ohos.samples.distributedscheduler.IRemoteAgent { + /* + * Demo service method use some parameters + */ + void setRemoteObject([in] String param); +} \ No newline at end of file diff --git a/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/RemoteAbility.java b/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/RemoteAbility.java index f361d67db5..dad53609cd 100644 --- a/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/RemoteAbility.java +++ b/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/RemoteAbility.java @@ -19,6 +19,8 @@ import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.agp.window.dialog.ToastDialog; import ohos.app.Context; +import ohos.eventhandler.EventHandler; +import ohos.eventhandler.EventRunner; import ohos.hiviewdfx.HiLog; import ohos.hiviewdfx.HiLogLabel; import ohos.rpc.IRemoteObject; @@ -34,10 +36,11 @@ public class RemoteAbility extends Ability { private static final String DESCRIPTOR = "ohos.samples.distributedscheduler.RemoteAbility"; + RemoteAgentStub remoteAgentStub = new RemoteAgentStub(DESCRIPTOR) { @Override public void setRemoteObject(String param) throws RemoteException { - showTips(RemoteAbility.this, param); + new EventHandler(EventRunner.getMainEventRunner()).postTask(()->showTips(RemoteAbility.this, param)); } }; diff --git a/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/slice/MainAbilitySlice.java b/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/slice/MainAbilitySlice.java index bf3b1a9fdc..432c2c430e 100644 --- a/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/slice/MainAbilitySlice.java +++ b/ability/DistributedScheduler/entry/src/main/java/ohos/samples/distributedscheduler/slice/MainAbilitySlice.java @@ -15,6 +15,9 @@ package ohos.samples.distributedscheduler.slice; +import ohos.agp.window.dialog.IDialog; +import ohos.agp.window.dialog.ListDialog; +import ohos.distributedschedule.interwork.IInitCallback; import ohos.samples.distributedscheduler.MainAbility; import ohos.samples.distributedscheduler.RemoteAgentProxy; import ohos.samples.distributedscheduler.ResourceTable; @@ -40,13 +43,15 @@ import ohos.hiviewdfx.HiLogLabel; import ohos.rpc.IRemoteObject; import ohos.rpc.RemoteException; -import java.security.SecureRandom; import java.util.List; +import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT; + /** * MainAbilitySlice */ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation { + private static final int DIALOG_WIDTH = 900; private static final String TAG = MainAbility.class.getSimpleName(); private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG); @@ -57,14 +62,18 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati private static final String REMOTE_BUNDLE = "ohos.samples.distributedscheduler"; - private static final String REMOTE_SERVICE = "RemoteAbility"; + private static final String REMOTE_SERVICE = "ohos.samples.distributedscheduler.RemoteAbility"; - private static final String REMOTE_SERVICE_FA = "PageAbility"; + private static final String REMOTE_SERVICE_FA = "ohos.samples.distributedscheduler.PageAbility"; private Text text; private String param; + private String selectDeviceId; + + private RemoteAgentProxy remoteAgentProxy = null; + private EventHandler eventHandler = new EventHandler(EventRunner.current()) { @Override protected void processEvent(InnerEvent event) { @@ -85,11 +94,13 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ohos.samples.distributedscheduler.ResourceTable.Layout_main_ability_slice); - initComponents(); } private void initComponents() { + Component choiceDeviceButton = findComponentById(ResourceTable.Id_choice_device); + choiceDeviceButton.setClickedListener(component -> choiceDevice()); + Component startRemoteFAButton = findComponentById(ResourceTable.Id_start_fa_button); startRemoteFAButton.setClickedListener(component -> startRemoteFA()); @@ -102,16 +113,65 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati Component disconnectRemotePAButton = findComponentById(ResourceTable.Id_disconnect_pa_button); Component continueFAButton = findComponentById(ResourceTable.Id_continue_fa_button); connectRemotePAButton.setClickedListener(component -> connectService()); - disconnectRemotePAButton.setClickedListener(component -> disconnectAbility(connection)); - continueFAButton.setClickedListener(component -> continueAbility(getRemoteDeviceId())); + disconnectRemotePAButton.setClickedListener(component -> disConnectAbility()); + continueFAButton.setClickedListener(component -> continueAbility(selectDeviceId)); text = (Text) findComponentById(ResourceTable.Id_text); text.setText(param); + + } + + private void disConnectAbility() { + disconnectAbility(connection); + remoteAgentProxy = null; + } + + private void choiceDevice() { + List infoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ALL_DEVICE); + if ((infoList == null) || (infoList.size() == 0)) { + selectDeviceId = null; + } + String[] items = new String[infoList.size()]; + int i = 0; + for (DeviceInfo info:infoList) { + items[i] = info.getDeviceName(); + } + ListDialog listDialog = new ListDialog(getContext()); + listDialog.setItems(items); + listDialog.setTitleText("Choice a device"); + listDialog.setSize(DIALOG_WIDTH,MATCH_CONTENT); + listDialog.setAutoClosable(true); + listDialog.setOnSingleSelectListener((IDialog dailog, int position)->{ + selectDeviceId = infoList.get(position).getDeviceId(); + try { + HiLog.info(LABEL_LOG, "initDistributedEnvironmentClick begin "); + DeviceManager.initDistributedEnvironment(selectDeviceId,iInitCallback); + dailog.destroy(); + } catch (RemoteException e) { + HiLog.info(LABEL_LOG, "RemoteException happen"); + e.printStackTrace(); + } + }); + listDialog.show(); } + private IInitCallback iInitCallback = new IInitCallback() { + @Override + public void onInitSuccess(String deviceId) { + HiLog.info(LABEL_LOG, "device id success: " + deviceId); + eventHandler.postTask(()->showTips(getContext(), "device id onInitSuccess")); + } + + @Override + public void onInitFailure(String deviceId, int errorCode) { + HiLog.info(LABEL_LOG, "device id failed: " + deviceId + "errorCode: " + errorCode); + eventHandler.postTask(()->showTips(getContext(), "device id failed,errorCode="+errorCode)); + } + }; + private Intent getRemotePageIntent(String bundleName, String serviceName) { Operation operation = new Intent.OperationBuilder() - .withDeviceId(getRemoteDeviceId()) + .withDeviceId(selectDeviceId) .withBundleName(bundleName) .withAbilityName(serviceName) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) @@ -128,7 +188,7 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati private Intent getRemoteServiceIntent(String bundleName, String serviceName) { Operation operation = new Intent.OperationBuilder() - .withDeviceId(getRemoteDeviceId()) + .withDeviceId(selectDeviceId) .withBundleName(bundleName) .withAbilityName(serviceName) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) @@ -153,21 +213,12 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati connectAbility(intent, connection); } - private String getRemoteDeviceId() { - List infoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ALL_DEVICE); - if ((infoList == null) || (infoList.size() == 0)) { - return ""; - } - int random = new SecureRandom().nextInt(infoList.size()); - return infoList.get(random).getDeviceId(); - } - private IAbilityConnection connection = new IAbilityConnection() { @Override public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) { HiLog.info(LABEL_LOG, "%{public}s", "onAbilityConnectDone resultCode : " + resultCode); eventHandler.sendEvent(EVENT_ABILITY_CONNECT_DONE); - RemoteAgentProxy remoteAgentProxy = new RemoteAgentProxy(iRemoteObject); + remoteAgentProxy = new RemoteAgentProxy(iRemoteObject); try { remoteAgentProxy.setRemoteObject("This param from client"); } catch (RemoteException e) { @@ -179,6 +230,7 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati public void onAbilityDisconnectDone(ElementName elementName, int resultCode) { HiLog.info(LABEL_LOG, "%{public}s", "onAbilityDisconnectDone resultCode : " + resultCode); eventHandler.sendEvent(EVENT_ABILITY_DISCONNECT_DONE); + remoteAgentProxy = null; } }; @@ -212,4 +264,10 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati public void onCompleteContinuation(int code) { terminate(); } + + @Override + public void onStop() { + super.onStop(); + remoteAgentProxy = null; + } } diff --git a/ability/DistributedScheduler/entry/src/main/resources/base/layout/main_ability_slice.xml b/ability/DistributedScheduler/entry/src/main/resources/base/layout/main_ability_slice.xml index 09904c73be..03629dc06a 100644 --- a/ability/DistributedScheduler/entry/src/main/resources/base/layout/main_ability_slice.xml +++ b/ability/DistributedScheduler/entry/src/main/resources/base/layout/main_ability_slice.xml @@ -20,6 +20,19 @@ ohos:width="match_parent" ohos:orientation="vertical"> +