diff --git a/ability/DistributedScheduler/entry/src/main/config.json b/ability/DistributedScheduler/entry/src/main/config.json index 560cf9f0255857b7e50588a3d02d055621133e48..21563faa8500d19b010f49d6d9e3d0e7094d517b 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": [ + "ohos.permission.DISTRIBUTED_SCHEDULER_REMOTE_SERVICE" + ] }, { "name": ".PageAbility", @@ -71,6 +75,14 @@ }, { "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" + }, + { + "name": "ohos.permission.DISTRIBUTED_SCHEDULER_REMOTE_SERVICE" + } + ], + "defPermissions": [ + { + "name": "ohos.permission.DISTRIBUTED_SCHEDULER_REMOTE_SERVICE" } ] } diff --git a/ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributeddevices/IRemoteAgent.idl b/ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl similarity index 100% rename from ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributeddevices/IRemoteAgent.idl rename to ability/DistributedScheduler/entry/src/main/idl/ohos/samples/distributedscheduler/IRemoteAgent.idl 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 f361d67db533f438528ef7464716085c36baca89..b63b9dc65312e604de87cb3f0d3bb8708d76d3b6 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,13 +36,17 @@ 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); + if(isConnected) { + showTips(RemoteAbility.this, param); + } } }; + private boolean isConnected = false; @Override protected void onStart(Intent intent) { super.onStart(intent); @@ -57,12 +63,14 @@ public class RemoteAbility extends Ability { @Override protected IRemoteObject onConnect(Intent intent) { showTips(RemoteAbility.this, "RemoteService onConnect"); + isConnected = true; return remoteAgentStub; } @Override protected void onDisconnect(Intent intent) { super.onDisconnect(intent); + isConnected = false; showTips(RemoteAbility.this, "RemoteService onDisconnect"); } @@ -73,6 +81,8 @@ public class RemoteAbility extends Ability { } private void showTips(Context context, String msg) { - new ToastDialog(context).setText(msg).show(); + getUITaskDispatcher().asyncDispatch(()->{ + new ToastDialog(context).setText(msg).show(); + }); } } 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 bf3b1a9fdc6b17aff10412f3938bce7d8b66a674..abda5dcc5da95a5d8322ca43f129a3b1be07d60f 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 selectedDeviceId; + + 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 -> selectDevice()); + Component startRemoteFAButton = findComponentById(ResourceTable.Id_start_fa_button); startRemoteFAButton.setClickedListener(component -> startRemoteFA()); @@ -102,16 +113,78 @@ 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 -> continueFA()); text = (Text) findComponentById(ResourceTable.Id_text); text.setText(param); + + } + + private void continueFA() { + try { + continueAbility(selectedDeviceId); + } catch (IllegalArgumentException e) { + HiLog.info(LABEL_LOG, e.getMessage()); + } + } + + private void disConnectAbility() { + disconnectAbility(connection); + try { + DeviceManager.unInitDistributedEnvironment(selectedDeviceId, iInitCallback); + } catch (RemoteException | IllegalArgumentException e) { + HiLog.info(LABEL_LOG, e.getMessage()); + } + remoteAgentProxy = null; + } + + private void selectDevice() { + List infoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ALL_DEVICE); + if ((infoList == null) || (infoList.size() == 0)) { + selectedDeviceId = null; + } + String[] items = new String[infoList.size()]; + int i = 0; + for (DeviceInfo info : infoList) { + items[i] = info.getDeviceType() + ", " + info.getDeviceName(); + i++; + } + 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) -> { + selectedDeviceId = infoList.get(position).getDeviceId(); + try { + HiLog.info(LABEL_LOG, "initDistributedEnvironmentClick begin "); + DeviceManager.initDistributedEnvironment(selectedDeviceId, iInitCallback); + dailog.destroy(); + } catch (RemoteException e) { + HiLog.info(LABEL_LOG, "RemoteException happen"); + } + }); + listDialog.show(); } + private IInitCallback iInitCallback = new IInitCallback() { + @Override + public void onInitSuccess(String deviceId) { + HiLog.info(LABEL_LOG, "device id success: " + deviceId); + showTips(getContext(), "device id onInitSuccess"); + } + + @Override + public void onInitFailure(String deviceId, int errorCode) { + HiLog.info(LABEL_LOG, "device id failed: " + deviceId + "errorCode: " + errorCode); + showTips(getContext(), "device id failed,errorCode="+errorCode); + } + }; + private Intent getRemotePageIntent(String bundleName, String serviceName) { Operation operation = new Intent.OperationBuilder() - .withDeviceId(getRemoteDeviceId()) + .withDeviceId(selectedDeviceId) .withBundleName(bundleName) .withAbilityName(serviceName) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) @@ -128,7 +201,7 @@ public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuati private Intent getRemoteServiceIntent(String bundleName, String serviceName) { Operation operation = new Intent.OperationBuilder() - .withDeviceId(getRemoteDeviceId()) + .withDeviceId(selectedDeviceId) .withBundleName(bundleName) .withAbilityName(serviceName) .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) @@ -153,21 +226,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,11 +243,14 @@ 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; } }; - private void showTips(Context context, String msg) { - new ToastDialog(context).setText(msg).show(); + public void showTips(Context context, String msg) { + getUITaskDispatcher().asyncDispatch(()->{ + new ToastDialog(context).setText(msg).show(); + }); } @Override @@ -212,4 +279,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 09904c73bef0216ee65ae3ae027da55e8a1a8df8..3de0e860ec3319e35c1e634d732a1588070ad0b5 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"> +