From edf8f7a084180f573f03e4343a72f663d5d34cd5 Mon Sep 17 00:00:00 2001 From: huiyueun <35286162+huiyueun@users.noreply.github.com> Date: Mon, 21 Sep 2020 14:26:12 +0900 Subject: [PATCH] [NUI] Add Transition Animation Effects (#2006) * [NUI] Add Seamless transition Add NUIFrameBroker & NUIFrameProvider Signed-off-by: huiyu.eun * fix commend Signed-off-by: huiyu.eun * modify to provider interface Signed-off-by: huiyu.eun * Delete iconify Signed-off-by: huiyu.eun * Modify FrameBroker error code type Signed-off-by: huiyu.eun * Update FrameBrokerBaseErrorFactory.cs * Update SafeFrameBrokerHandle.cs * Update FrameProviderErrorFactory.cs * Update Interop.FrameBroker.cs * Update Interop.FrameProvider.cs * Update Interop.Libraries.cs * Update SafeFrameProviderHandle.cs * Update and rename DefaultAnimationBroker.cs to DefaultFrameBroker.cs * Update TransitionOptions.cs * Update NUIApplication.cs * Update TransitionOptions.cs * Update TransitionOptions.cs Co-authored-by: dongsug-song <35130733+dongsug-song@users.noreply.github.com> --- .../src/internal/FrameBroker/DefaultFrameBroker.cs | 125 +++++++ .../src/internal/FrameBroker/FrameBrokerBase.cs | 265 ++++++++++++++ .../FrameBroker/FrameBrokerBaseErrorFactory.cs | 49 +++ .../internal/FrameBroker/FrameBrokerBaseResult.cs | 61 ++++ .../src/internal/FrameBroker/FrameData.cs | 382 +++++++++++++++++++++ .../src/internal/FrameBroker/FrameError.cs | 43 +++ .../internal/FrameBroker/SafeFrameBrokerHandle.cs | 56 +++ .../src/internal/FrameProvider/FrameProvider.cs | 134 ++++++++ .../FrameProvider/FrameProviderErrorFactory.cs | 42 +++ .../FrameProvider/SafeFrameProviderHandle.cs | 55 +++ .../src/internal/Interop/Interop.FrameBroker.cs | 137 ++++++++ .../src/internal/Interop/Interop.FrameProvider.cs | 62 ++++ .../src/internal/Interop/Interop.Libraries.cs | 27 ++ src/Tizen.NUI/src/public/NUIApplication.cs | 27 ++ .../TransitionAnimations/TransitionAnimations.cs | 94 +++++ .../public/TransitionOptions/TransitionOptions.cs | 209 +++++++++++ .../NUISimpleCallee/NUISimpleCallee.cs | 55 +++ .../NUISimpleCallee/NUISimpleCallee.csproj | 26 ++ .../NUISimpleCallee/shared/res/NUISimpleCallee.png | Bin 0 -> 10097 bytes .../NUISimpleCallee/tizen-manifest.xml | 15 + .../NUISimpleCaller/NUISimpleCaller.cs | 74 ++++ .../NUISimpleCaller/NUISimpleCaller.csproj | 26 ++ .../NUISimpleCaller/shared/res/NUISimpleCaller.png | Bin 0 -> 10097 bytes .../NUISimpleCaller/tizen-manifest.xml | 16 + 24 files changed, 1980 insertions(+) create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/DefaultFrameBroker.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBase.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseErrorFactory.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseResult.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/FrameData.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/FrameError.cs create mode 100755 src/Tizen.NUI/src/internal/FrameBroker/SafeFrameBrokerHandle.cs create mode 100755 src/Tizen.NUI/src/internal/FrameProvider/FrameProvider.cs create mode 100755 src/Tizen.NUI/src/internal/FrameProvider/FrameProviderErrorFactory.cs create mode 100755 src/Tizen.NUI/src/internal/FrameProvider/SafeFrameProviderHandle.cs create mode 100755 src/Tizen.NUI/src/internal/Interop/Interop.FrameBroker.cs create mode 100755 src/Tizen.NUI/src/internal/Interop/Interop.FrameProvider.cs create mode 100755 src/Tizen.NUI/src/internal/Interop/Interop.Libraries.cs create mode 100755 src/Tizen.NUI/src/public/TransitionAnimations/TransitionAnimations.cs create mode 100755 src/Tizen.NUI/src/public/TransitionOptions/TransitionOptions.cs create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.cs create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.csproj create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCallee/shared/res/NUISimpleCallee.png create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCallee/tizen-manifest.xml create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.cs create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.csproj create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCaller/shared/res/NUISimpleCaller.png create mode 100755 test/Tizen.NUI.Seamless/NUISimpleCaller/tizen-manifest.xml diff --git a/src/Tizen.NUI/src/internal/FrameBroker/DefaultFrameBroker.cs b/src/Tizen.NUI/src/internal/FrameBroker/DefaultFrameBroker.cs new file mode 100755 index 0000000..ff76b85 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/DefaultFrameBroker.cs @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI +{ + internal class DefaultFrameBroker : FrameBrokerBase + { + private Window window; + private ImageView providerImage; + + public delegate void AnimationEventHandler(); + internal event AnimationEventHandler AnimationInitialized; + internal event AnimationEventHandler AnimationFinished; + + internal DefaultFrameBroker(Window window) : base(window) + { + this.window = window; + } + + protected override void OnFrameResumed(FrameData frame) + { + base.OnFrameResumed(frame); + if (AnimationInitialized != null) + { + AnimationInitialized(); + } + + if (frame.DirectionForward) + { + PlayAnimateTo(frame, ForwardAnimation); + } + else + { + PlayAnimateTo(frame, BackwardAnimation); + } + + StartAnimation(); + } + + private void PlayAnimateTo(FrameData frame, TransitionAnimation animation) + { + if (animation) + { + providerImage = frame.Image; + providerImage.Size = window.Size; + window.Add(providerImage); + + if (animation is SlideIn) + { + SlideIn slideIn = animation as SlideIn; + providerImage.PositionX = slideIn.GetDefaultInitValue(); + } + + animation.PlayAnimateTo(providerImage); + } + else + { + FinishAnimation(); + } + } + + private TransitionAnimation forwardAnimation; + internal TransitionAnimation ForwardAnimation + { + get + { + return forwardAnimation; + } + set + { + forwardAnimation = value; + forwardAnimation.Finished += Ani_Finished; + } + } + + private TransitionAnimation backwardAnimation; + internal TransitionAnimation BackwardAnimation + { + get + { + return backwardAnimation; + } + set + { + backwardAnimation = value; + backwardAnimation.Finished += Ani_Finished; + } + } + + private void Ani_Finished(object sender, EventArgs e) + { + if (AnimationFinished != null) + { + AnimationFinished(); + } + + if (providerImage != null) + { + providerImage.Unparent(); + providerImage.Dispose(); + providerImage = null; + } + FinishAnimation(); + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBase.cs b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBase.cs new file mode 100755 index 0000000..7ae215d --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBase.cs @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Threading.Tasks; +using Tizen.Applications; +using Tizen.Applications.Exceptions; + +namespace Tizen.NUI +{ + /// + /// Represents the Frame Broker. + /// + internal abstract class FrameBrokerBase : IDisposable + { + private string LogTag = "NUI"; + private readonly SafeFrameBrokerHandle _handle; + private Dictionary _resultCallbackMaps = new Dictionary(); + private int _resultId = 0; + private Interop.FrameBroker.FrameContextLifecycleCallbacks _callbacks; + private IntPtr _context = IntPtr.Zero; + private bool _disposed = false; + + /// + /// Initializes the FrameBroker class. + /// + /// The window instance of Ecore_Wl2_Window pointer. + /// Thrown when failed because of an invalid parameter. + /// Thrown when the memory is insufficient. + /// Thrown when failed to create the frame broker handle. + /// This class is only avaliable for platform level signed applications. + internal FrameBrokerBase(Window window) + { + Interop.FrameBroker.ErrorCode err; + + if (window == null) + { + throw FrameBrokerBaseErrorFactory.GetException(Interop.FrameBroker.ErrorCode.InvalidParameter, "Invalid parameter"); + } + + _callbacks.OnCreate = new Interop.FrameBroker.FrameContextCreateCallback(OnCreateNative); + _callbacks.OnResume = new Interop.FrameBroker.FrameContextResumeCallback(OnResumeNavie); + _callbacks.OnPause = new Interop.FrameBroker.FrameContextPauseCallback(OnPauseNative); + _callbacks.OnDestroy = new Interop.FrameBroker.FrameContextDestroyCallback(OnDestroyNative); + _callbacks.OnError = new Interop.FrameBroker.FrameContextErrorCallback(OnErrorNative); + _callbacks.OnUpdate = new Interop.FrameBroker.FrameContextUpdateCallback(OnUpdateNative); + + err = Interop.FrameBroker.Create(window.GetNativeWindowHandler(), ref _callbacks, IntPtr.Zero, out _handle); + if (err != Interop.FrameBroker.ErrorCode.None) + { + throw FrameBrokerBaseErrorFactory.GetException(err, "Failed to create frame broker handle"); + } + } + + /// + /// Sends the launch request asynchronously. + /// + /// + /// The operation is mandatory information for the launch request. + /// If the operation is not specified, AppControlOperations.Default is used by default. + /// If the operation is AppControlOperations.Default, the application ID is mandatory to explicitly launch the application.
+ /// Since Tizen 2.4, the launch request of the service application over out of packages is restricted by the platform. + /// Also, implicit launch requests are NOT delivered to service applications since 2.4. + /// To launch a service application, an explicit launch request with the application ID given by property ApplicationId MUST be sent. + ///
+ /// The AppControl. + /// The flag, if it's true, the launch request is sent to the frame provider application. + /// A task with the result of the launch request. + /// Thrown when failed because of the argument is invalid. + /// Thrown when the application to run is not found. + /// Thrown when the launch request is rejected. + /// http://tizen.org/privilege/appmanager.launch + internal Task SendLaunchRequest(AppControl appControl, bool toProvider) + { + if (appControl == null) + { + throw FrameBrokerBaseErrorFactory.GetException(Interop.FrameBroker.ErrorCode.InvalidParameter, "Invalid parameter"); + } + + var task = new TaskCompletionSource(); + int requestId = 0; + + lock (_resultCallbackMaps) + { + requestId = _resultId++; + _resultCallbackMaps[requestId] = (handle, result, userData) => + { + task.SetResult((FrameBrokerBaseResult)result); + lock (_resultCallbackMaps) + { + _resultCallbackMaps.Remove((int)userData); + } + }; + } + + Interop.FrameBroker.ErrorCode err; + if (toProvider) + err = Interop.FrameBroker.SendLaunchRequestToProvider(_handle, appControl.SafeAppControlHandle, _resultCallbackMaps[requestId], null, (IntPtr)requestId); + else + err = Interop.FrameBroker.SendLaunchRequest(_handle, appControl.SafeAppControlHandle, _resultCallbackMaps[requestId], null, (IntPtr)requestId); + + if (err != Interop.FrameBroker.ErrorCode.None) + { + throw FrameBrokerBaseErrorFactory.GetException(err, "Failed to send launch request"); + } + + return task.Task; + } + + /// + /// Notifies that the animation is started. + /// + /// Thrown when failed because of the argument is invalid. + /// Thrown when failed because of system error. + internal void StartAnimation() + { + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.StartAnimation(_context); + if (err != Interop.FrameBroker.ErrorCode.None) + { + throw FrameBrokerBaseErrorFactory.GetException(err, "Failed to notify that the animation is started"); + } + } + + /// + /// Notifies that the animation is finished. + /// + /// Thrown when failed because of the argument is invalid. + /// Thrown when failed because of system error. + internal void FinishAnimation() + { + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.FinishAnimation(_context); + if (err != Interop.FrameBroker.ErrorCode.None) + { + throw FrameBrokerBaseErrorFactory.GetException(err, "Failed to notify that the animation is finished"); + } + } + + /// + /// Occurs whenever the frame is created. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFrameCreated() + { + Log.Warn(LogTag, "The OnFrameCreated() is not implemented"); + } + + /// + /// Occurs Whenever the frame is resumed. + /// + /// The frame data. + /// + /// When the frame has been prepared, this function is called. + /// The caller can start animations, To notify that the animation is started, the caller should call StartAnimation(). + /// After the animation is finished, the caller should call FinishAnimation() to notify. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFrameResumed(FrameData frame) + { + Log.Warn(LogTag, "The OnFrameResumed() is not implemented"); + } + + /// + /// Occurs Whenever the frame is updated. + /// + /// The frame data. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFrameUpdated(FrameData frame) + { + Log.Warn(LogTag, "The OnFrameUpdated() is not implemented"); + } + + /// + /// Occurs Whenever the frame is paused. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFramePaused() + { + Log.Warn(LogTag, "The OnFramePaused() is not implemented"); + } + + /// + /// Occurs Whenever the frame is destroyed. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFrameDestroyed() + { + Log.Warn(LogTag, "The OnFrameDestroyed() is not implemented"); + } + + /// + /// Occurs Whenever the system error is occurred. + /// + /// The frame error. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnFrameErred(FrameError error) + { + Log.Warn(LogTag, "The OnFrameErred() is not implemented"); + } + + private void OnCreateNative(IntPtr context, IntPtr userData) + { + _context = context; + OnFrameCreated(); + } + + private void OnResumeNavie(IntPtr context, IntPtr frame, IntPtr userData) + { + OnFrameResumed(new FrameData(frame)); + } + + private void OnPauseNative(IntPtr context, IntPtr userData) + { + OnFramePaused(); + } + + private void OnDestroyNative(IntPtr context, IntPtr userData) + { + _context = IntPtr.Zero; + OnFrameDestroyed(); + } + + private void OnErrorNative(IntPtr context, int error, IntPtr userData) + { + _context = IntPtr.Zero; + OnFrameErred((FrameError)error); + } + + private void OnUpdateNative(IntPtr context, IntPtr frame, IntPtr userData) + { + OnFrameUpdated(new FrameData(frame)); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + _handle.Dispose(); + _disposed = true; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void Dispose() + { + Dispose(true); + + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseErrorFactory.cs b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseErrorFactory.cs new file mode 100755 index 0000000..d343120 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseErrorFactory.cs @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Runtime.CompilerServices; +using Tizen.Applications.Exceptions; + +namespace Tizen.NUI +{ + internal static class FrameBrokerBaseErrorFactory + { + private static string LogTag = "Tizen.NUI"; + + internal static Exception GetException(Interop.FrameBroker.ErrorCode err, string message, [CallerMemberName] string memberName = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0) + { + Log.Error(LogTag, memberName + "(" + lineNumber + ") " + message); + switch (err) + { + case Interop.FrameBroker.ErrorCode.InvalidParameter: + return new ArgumentException("Invalid Parameter"); + case Interop.FrameBroker.ErrorCode.OutOfMemory: + return new Applications.Exceptions.OutOfMemoryException("Out Of Memory"); + case Interop.FrameBroker.ErrorCode.AppNotFound: + return new AppNotFoundException("App Not Found"); + case Interop.FrameBroker.ErrorCode.LaunchRejected: + return new LaunchRejectedException("Launch Rejected"); + case Interop.FrameBroker.ErrorCode.IoError: + return new InvalidOperationException("IO Error"); + case Interop.FrameBroker.ErrorCode.PermissionDenied: + return new PermissionDeniedException("Permission Denied"); + default: + return new InvalidOperationException(message); + } + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseResult.cs b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseResult.cs new file mode 100755 index 0000000..464e076 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/FrameBrokerBaseResult.cs @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// Enumeration for the frame broker result. + /// + internal enum FrameBrokerBaseResult + { + /// + /// Successful. + /// + None = Interop.FrameBroker.ErrorCode.None, + + /// + /// Invalid parameter. + /// + InvalidParameter = Interop.FrameBroker.ErrorCode.InvalidParameter, + + /// + /// The memory is insufficient. + /// + OutOfMemory = Interop.FrameBroker.ErrorCode.OutOfMemory, + + /// + /// The application to run the given launch request is not found. + /// + AppNotFound = Interop.FrameBroker.ErrorCode.AppNotFound, + + /// + /// The application cannot be launched in current context. + /// + LaunchRejected = Interop.FrameBroker.ErrorCode.LaunchRejected, + + /// + /// I/O error. + /// + IoError = Interop.FrameBroker.ErrorCode.IoError, + + /// + /// Permission denied. + /// + PermissionDenied = Interop.FrameBroker.ErrorCode.PermissionDenied, + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/FrameData.cs b/src/Tizen.NUI/src/internal/FrameBroker/FrameData.cs new file mode 100755 index 0000000..7dad750 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/FrameData.cs @@ -0,0 +1,382 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using Tizen.NUI.BaseComponents; +using Tizen.Applications; +using System.ComponentModel; +using System.Runtime.InteropServices; + +namespace Tizen.NUI +{ + /// + /// Represents the Frame Data. + /// + internal class FrameData + { + private const string LogTag = "NUI"; + private readonly IntPtr _frame; + private int _fd = -1; + private uint _size = 0; + private ImageView _image = null; + + private Renderer renderer; + private TextureSet textureSet; + + internal FrameData(IntPtr frame) + { + _frame = frame; + } + + private Shader CreateShader() + { + string vertex_shader = + "attribute mediump vec2 aPosition;\n" + + "varying mediump vec2 vTexCoord;\n" + + "uniform highp mat4 uMvpMatrix;\n" + + "uniform mediump vec3 uSize;\n" + + "varying mediump vec2 sTexCoordRect;\n" + + "void main()\n" + + "{\n" + + "gl_Position = uMvpMatrix * vec4(aPosition * uSize.xy, 0.0, 1.0);\n" + + "vTexCoord = aPosition + vec2(0.5);\n" + + "}\n"; + + string fragment_shader = + "#extension GL_OES_EGL_image_external:require\n" + + "uniform lowp vec4 uColor;\n" + + "varying mediump vec2 vTexCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "void main()\n" + + "{\n" + + "gl_FragColor = texture2D(sTexture, vTexCoord) * uColor;\n" + + "}\n"; + + return new Shader(vertex_shader, fragment_shader); + } + + [StructLayout(LayoutKind.Sequential)] + private struct Vec2 + { + float x; + float y; + public Vec2(float xIn, float yIn) + { + x = xIn; + y = yIn; + } + } + + private struct TexturedQuadVertex + { + public Vec2 position; + }; + + private IntPtr RectangleDataPtr() + { + TexturedQuadVertex vertex1 = new TexturedQuadVertex(); + TexturedQuadVertex vertex2 = new TexturedQuadVertex(); + TexturedQuadVertex vertex3 = new TexturedQuadVertex(); + TexturedQuadVertex vertex4 = new TexturedQuadVertex(); + vertex1.position = new Vec2(-0.5f, -0.5f); + vertex2.position = new Vec2(-0.5f, 0.5f); + vertex3.position = new Vec2(0.5f, -0.5f); + vertex4.position = new Vec2(0.5f, 0.5f); + + TexturedQuadVertex[] texturedQuadVertexData = new TexturedQuadVertex[4] { vertex1, vertex2, vertex3, vertex4 }; + + int lenght = Marshal.SizeOf(vertex1); + IntPtr pA = Marshal.AllocHGlobal(lenght * 4); + + for (int i = 0; i < 4; i++) + { + Marshal.StructureToPtr(texturedQuadVertexData[i], pA + i * lenght, true); + } + + return pA; + } + + private Geometry CreateQuadGeometry() + { + /* Create Property buffer */ + PropertyMap vertexFormat = new PropertyMap(); + vertexFormat.Add("aPosition", new PropertyValue((int)PropertyType.Vector2)); + + PropertyBuffer vertexBuffer = new PropertyBuffer(vertexFormat); + vertexBuffer.SetData(RectangleDataPtr(), 4); + + + Geometry geometry = new Geometry(); + geometry.AddVertexBuffer(vertexBuffer); + geometry.SetType(Geometry.Type.TRIANGLE_STRIP); + + return geometry; + } + + /// + /// Gets the image view. + /// + internal ImageView Image + { + get + { + if (_image == null) + { + _image = new ImageView(); + renderer = new Renderer(CreateQuadGeometry(), CreateShader()); + textureSet = new TextureSet(); + } + switch (Type) + { + case FrameType.RemoteSurfaceTbmSurface: + if (TbmSurface == null) + { + return null; + } + textureSet.SetTexture(0, new Texture(TbmSurface)); + renderer.SetTextures(textureSet); + _image.AddRenderer(renderer); + break; + default: + break; + } + + return _image; + } + } + + /// + /// Checks whether the direction of the frame is forward or not. + /// + internal bool DirectionForward + { + get + { + Interop.FrameBroker.FrameDirection direction = Interop.FrameBroker.FrameDirection.Backward + 1; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetDirection(_frame, out direction); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get direction"); + } + return (direction == Interop.FrameBroker.FrameDirection.Forward); + } + } + + /// + /// Gets the extra data. + /// + internal Bundle Extra + { + get + { + SafeBundleHandle safeBundle; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetExtraData(_frame, out safeBundle); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get extra data"); + return null; + } + return new Bundle(safeBundle); + } + } + + /// + /// Enumeration for the frame type. + /// + internal enum FrameType + { + /// + /// The tbm surface of the remote surface. + /// + RemoteSurfaceTbmSurface, + + /// + /// The image file of the remote surface. + /// + RemoteSurfaceImageFile, + + /// + /// The image of the splash screen. + /// + SplashScreenImage, + + /// + /// The edje of the splash screen. + /// + SPlashScreenEdje, + } + + /// + /// Enumeration for the direction of the frame. + /// + internal enum FrameDirection + { + /// + /// The direction that is from the caller to the other application. + /// + Forward, + + /// + /// The direction that is from the other application to the caller. + /// + Backward, + } + + /// + /// Gets the tbm surface of the remote surface. + /// + /// + /// The TbmSurface type is tbm_surface_h. + /// + internal IntPtr TbmSurface + { + get + { + IntPtr tbmSurface = IntPtr.Zero; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetTbmSurface(_frame, out tbmSurface); + + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get tbm surface"); + } + return tbmSurface; + } + } + + /// + /// Gets the file descriptor of the image file of the remote surface. + /// + internal int Fd + { + get + { + if (_fd != -1) + return _fd; + + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetImageFile(_frame, out _fd, out _size); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get fd of image file"); + } + return _fd; + } + } + + /// + /// Gets the size of the image file of the remote surface. + /// + internal uint Size + { + get + { + if (_size != 0) + return _size; + + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetImageFile(_frame, out _fd, out _size); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get size of image file"); + } + return _size; + } + } + + /// + /// Gets the file path. + /// + internal string FilePath + { + get + { + string filePath = string.Empty; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetFilePath(_frame, out filePath); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get file path"); + } + return filePath; + } + } + + /// + /// Gets the file group. + /// + internal string FileGroup + { + get + { + string fileGroup = string.Empty; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetFileGroup(_frame, out fileGroup); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get file group"); + } + return fileGroup; + } + } + + /// + /// Gets the type of the frame. + /// + internal FrameType Type + { + get + { + Interop.FrameBroker.FrameType type = Interop.FrameBroker.FrameType.SplashScreenImage + 1; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetType(_frame, out type); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get frame type"); + } + return (FrameType)type; + } + } + + /// + /// Gets the position X. + /// + internal int PositionX + { + get + { + int x = -1; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetPositionX(_frame, out x); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get position X"); + } + return x; + } + } + + /// + /// Gets the position Y. + /// + internal int PositionY + { + get + { + int y = -1; + Interop.FrameBroker.ErrorCode err = Interop.FrameBroker.GetPositionY(_frame, out y); + if (err != Interop.FrameBroker.ErrorCode.None) + { + Log.Error(LogTag, "Failed to get position Y"); + } + return y; + } + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/FrameError.cs b/src/Tizen.NUI/src/internal/FrameBroker/FrameError.cs new file mode 100755 index 0000000..330a106 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/FrameError.cs @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// Enumeration for the frame error. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public enum FrameError + { + /// + /// Succsssful. + /// + None = Interop.FrameBroker.FrameContextErrorCode.None, + + /// + /// Disqualified. + /// + /// After this error is occured, the FrameBroker instance has to be destroyed. + Disqualified = Interop.FrameBroker.FrameContextErrorCode.Disqualified, + + /// + /// Wrong Request. + /// + WrongRequest = Interop.FrameBroker.FrameContextErrorCode.WrongRequest, + } +} diff --git a/src/Tizen.NUI/src/internal/FrameBroker/SafeFrameBrokerHandle.cs b/src/Tizen.NUI/src/internal/FrameBroker/SafeFrameBrokerHandle.cs new file mode 100755 index 0000000..3b2f6e3 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameBroker/SafeFrameBrokerHandle.cs @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; + +namespace Tizen.NUI +{ + [EditorBrowsable(EditorBrowsableState.Never)] + public sealed class SafeFrameBrokerHandle : SafeHandle + { + [EditorBrowsable(EditorBrowsableState.Never)] + public SafeFrameBrokerHandle() : base(IntPtr.Zero, true) + { + } + + + [EditorBrowsable(EditorBrowsableState.Never)] + public SafeFrameBrokerHandle(IntPtr existingHandleValue, bool ownsHandle) : base(IntPtr.Zero, ownsHandle) + { + SetHandle(existingHandleValue); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool IsInvalid + { + get + { + return this.handle == IntPtr.Zero; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + protected override bool ReleaseHandle() + { + Interop.FrameBroker.DangerousDestroy(this.handle); + this.SetHandle(IntPtr.Zero); + return true; + } + + } +} diff --git a/src/Tizen.NUI/src/internal/FrameProvider/FrameProvider.cs b/src/Tizen.NUI/src/internal/FrameProvider/FrameProvider.cs new file mode 100755 index 0000000..40cc1f1 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameProvider/FrameProvider.cs @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.ComponentModel; +using Tizen.Applications; + +namespace Tizen.NUI +{ + /// + /// Represents the Frame Provider. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + internal class FrameProvider : IDisposable + { + private string LogTag = "NUI"; + private readonly SafeFrameProviderHandle _handle; + private Interop.FrameProvider.FrameProviderEventCallbacks _callbacks; + private bool _disposed = false; + + + /// + /// Initializes the FrameProvider class. + /// + /// The window instance of Ecore_Wl2_Window pointer. + /// Thrown when failed because of an invalid parameter. + /// Thrown when the memory is insufficient. + /// Thrown when failed to create the frame broker handle. + /// This class is only avaliable for platform level signed applications. + [EditorBrowsable(EditorBrowsableState.Never)] + internal FrameProvider(Window window) + { + Interop.FrameProvider.ErrorCode err; + + if (window == null) + { + throw FrameProviderErrorFactory.GetException(Interop.FrameProvider.ErrorCode.InvalidParameter, "Invalid parameter"); + } + + _callbacks.OnShow = new Interop.FrameProvider.ShowCallback(OnShowNative); + _callbacks.OnHide = new Interop.FrameProvider.HideCallback(OnHideNative); + + err = Interop.FrameProvider.Create(window.GetNativeWindowHandler(), ref _callbacks, IntPtr.Zero, out _handle); + if (err != Interop.FrameProvider.ErrorCode.None) + { + throw FrameProviderErrorFactory.GetException(err, "Failed to create frame provider handle"); + } + } + + /// + /// Occurs whenever the window is shown. + /// + /// You have to call NotifyShowStatus() to notify that the object is prepared to show. + [EditorBrowsable(EditorBrowsableState.Never)] + internal event EventHandler Shown; + + /// + /// Occurs whenever the window is hidden. + /// + /// You have to call NotifyHideStatus() to notify that the object is prepared to hide. + [EditorBrowsable(EditorBrowsableState.Never)] + internal event EventHandler Hidden; + + private void OnShowNative(IntPtr handle, IntPtr userData) + { + Log.Debug(LogTag, "OnShowNative()"); + Shown?.Invoke(this, EventArgs.Empty); + } + + private void OnHideNative(IntPtr handle, IntPtr userdata) + { + Log.Debug(LogTag, "OnHideNative()"); + Hidden?.Invoke(this, EventArgs.Empty); + } + + /// + /// Notifies that the object is prepared to show. + /// + /// The extra data. + [EditorBrowsable(EditorBrowsableState.Never)] + internal void NotifyShowStatus(Bundle extraData) + { + Interop.FrameProvider.ErrorCode err = Interop.FrameProvider.NotifyShowStatus(_handle, extraData.SafeBundleHandle); + if (err != Interop.FrameProvider.ErrorCode.None) + { + throw FrameProviderErrorFactory.GetException(err, "Failed to notify show status"); + } + } + + /// + /// Notifies that the object is prepared to hide. + /// + /// The extra data. + [EditorBrowsable(EditorBrowsableState.Never)] + internal void NotifyHideStatus(Bundle extraData) + { + Interop.FrameProvider.ErrorCode err = Interop.FrameProvider.NotifyHideStatus(_handle, extraData.SafeBundleHandle); + if (err != Interop.FrameProvider.ErrorCode.None) + { + throw FrameProviderErrorFactory.GetException(err, "Failed to notify hide status"); + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + _handle.Dispose(); + _disposed = true; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void Dispose() + { + Dispose(true); + + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameProvider/FrameProviderErrorFactory.cs b/src/Tizen.NUI/src/internal/FrameProvider/FrameProviderErrorFactory.cs new file mode 100755 index 0000000..a7adb1c --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameProvider/FrameProviderErrorFactory.cs @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Runtime.CompilerServices; + +namespace Tizen.NUI +{ + internal static class FrameProviderErrorFactory + { + private static string LogTag = "Tizen.NUI"; + + internal static Exception GetException(Interop.FrameProvider.ErrorCode err, string message, [CallerMemberName] string memberName = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0) + { + Log.Error(LogTag, memberName + "(" + lineNumber + ") " + message); + switch (err) + { + case Interop.FrameProvider.ErrorCode.InvalidParameter: + return new ArgumentException("Invalid Parameter"); + case Interop.FrameProvider.ErrorCode.OutOfMemory: + return new OutOfMemoryException("Out Of Memory"); + case Interop.FrameProvider.ErrorCode.IoError: + return new InvalidOperationException("IO Error"); + default: + return new InvalidOperationException(message); + } + } + } +} diff --git a/src/Tizen.NUI/src/internal/FrameProvider/SafeFrameProviderHandle.cs b/src/Tizen.NUI/src/internal/FrameProvider/SafeFrameProviderHandle.cs new file mode 100755 index 0000000..7def1b0 --- /dev/null +++ b/src/Tizen.NUI/src/internal/FrameProvider/SafeFrameProviderHandle.cs @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; + +namespace Tizen.NUI +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed class SafeFrameProviderHandle : SafeHandle + { + [EditorBrowsable(EditorBrowsableState.Never)] + internal SafeFrameProviderHandle() : base(IntPtr.Zero, true) + { + } + + [EditorBrowsable(EditorBrowsableState.Never)] + internal SafeFrameProviderHandle(IntPtr existingHandleValue, bool ownsHandle) : base(IntPtr.Zero, ownsHandle) + { + SetHandle(existingHandleValue); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool IsInvalid + { + get + { + return this.handle == IntPtr.Zero; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + protected override bool ReleaseHandle() + { + Interop.FrameProvider.DangerousDestroy(this.handle); + this.SetHandle(IntPtr.Zero); + return true; + } + + } +} diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.FrameBroker.cs b/src/Tizen.NUI/src/internal/Interop/Interop.FrameBroker.cs new file mode 100755 index 0000000..35e5797 --- /dev/null +++ b/src/Tizen.NUI/src/internal/Interop/Interop.FrameBroker.cs @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Runtime.InteropServices; +using Tizen.Applications; +using Tizen.NUI; + +namespace Tizen.NUI +{ + internal static partial class Interop + { + internal static partial class FrameBroker + { + internal enum ErrorCode + { + None = Tizen.Internals.Errors.ErrorCode.None, + InvalidParameter = Tizen.Internals.Errors.ErrorCode.InvalidParameter, + OutOfMemory = Tizen.Internals.Errors.ErrorCode.OutOfMemory, + AppNotFound = AppControlResult.AppNotFound, + LaunchRejected = AppControlResult.LaunchRejected, + IoError = Tizen.Internals.Errors.ErrorCode.IoError, + PermissionDenied = Tizen.Internals.Errors.ErrorCode.PermissionDenied, + } + + internal enum FrameContextErrorCode + { + None = 0, + Disqualified = 1, + WrongRequest = 2, + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + internal delegate void AppControlResultCallback(IntPtr request, int result, IntPtr userData); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + internal delegate void AppControlReplyCallback(IntPtr request, IntPtr reply, int result, IntPtr userData); + + internal delegate void FrameContextCreateCallback(IntPtr context, IntPtr userData); + + internal delegate void FrameContextResumeCallback(IntPtr context, IntPtr frame, IntPtr userData); + + internal delegate void FrameContextPauseCallback(IntPtr context, IntPtr userData); + + internal delegate void FrameContextDestroyCallback(IntPtr context, IntPtr userData); + + internal delegate void FrameContextErrorCallback(IntPtr context, int error, IntPtr userData); + + internal delegate void FrameContextUpdateCallback(IntPtr context, IntPtr frame, IntPtr userData); + + [StructLayout(LayoutKind.Sequential)] + internal struct FrameContextLifecycleCallbacks + { + public FrameContextCreateCallback OnCreate; + public FrameContextResumeCallback OnResume; + public FrameContextPauseCallback OnPause; + public FrameContextDestroyCallback OnDestroy; + public FrameContextUpdateCallback OnUpdate; + public FrameContextErrorCallback OnError; + } + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_context_start_animation")] + internal static extern ErrorCode StartAnimation(IntPtr handle); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_context_finish_animation")] + internal static extern ErrorCode FinishAnimation(IntPtr handle); + + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_broker_create")] + internal static extern ErrorCode Create(IntPtr wl2Win, ref FrameContextLifecycleCallbacks callbacks, IntPtr userData, out SafeFrameBrokerHandle handle); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_broker_destroy")] + internal static extern ErrorCode DangerousDestroy(IntPtr handle); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_broker_send_launch_request")] + internal static extern ErrorCode SendLaunchRequest(SafeFrameBrokerHandle handle, SafeAppControlHandle safeAppControlHandle, AppControlResultCallback resultCallback, AppControlReplyCallback replyCallback, IntPtr userData); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_broker_send_launch_request_to_provider")] + internal static extern ErrorCode SendLaunchRequestToProvider(SafeFrameBrokerHandle handle, SafeAppControlHandle safeAppControlHandle, AppControlResultCallback resultCallback, AppControlReplyCallback replyCallback, IntPtr userData); + + + internal enum FrameType + { + RemoteSurfaceTbmSurface = 0, + RemoteSurfaceImageFile = 1, + SplashScreenImage = 2, + SplashScreenEdje = 3, + } + + internal enum FrameDirection + { + Forward = 0, + Backward = 1, + } + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_tbm_surface")] + internal static extern ErrorCode GetTbmSurface(IntPtr handle, out IntPtr tbmSurface); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_image_file")] + internal static extern ErrorCode GetImageFile(IntPtr handle, out Int32 fd, out UInt32 size); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_file_path")] + internal static extern ErrorCode GetFilePath(IntPtr handle, out string filePath); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_file_group")] + internal static extern ErrorCode GetFileGroup(IntPtr handle, out string fileGroup); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_type")] + internal static extern ErrorCode GetType(IntPtr handle, out FrameType type); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_direction")] + internal static extern ErrorCode GetDirection(IntPtr handle, out FrameDirection direction); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_position_x")] + internal static extern ErrorCode GetPositionX(IntPtr handle, out Int32 x); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_position_y")] + internal static extern ErrorCode GetPositionY(IntPtr handle, out Int32 y); + + [DllImport(Libraries.FrameBroker, EntryPoint = "frame_get_extra_data")] + internal static extern ErrorCode GetExtraData(IntPtr handle, out SafeBundleHandle safeBundleHandle); + } + } +} diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.FrameProvider.cs b/src/Tizen.NUI/src/internal/Interop/Interop.FrameProvider.cs new file mode 100755 index 0000000..bcabb95 --- /dev/null +++ b/src/Tizen.NUI/src/internal/Interop/Interop.FrameProvider.cs @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Runtime.InteropServices; + +using Tizen.NUI; +using Tizen.Applications; + +namespace Tizen.NUI +{ + internal static partial class Interop + { + internal static partial class FrameProvider + { + internal enum ErrorCode + { + None = Tizen.Internals.Errors.ErrorCode.None, + InvalidOperation = Tizen.Internals.Errors.ErrorCode.InvalidOperation, + InvalidParameter = Tizen.Internals.Errors.ErrorCode.InvalidParameter, + IoError = Tizen.Internals.Errors.ErrorCode.IoError, + OutOfMemory = Tizen.Internals.Errors.ErrorCode.OutOfMemory, + } + + internal delegate void ShowCallback(IntPtr handle, IntPtr userData); + + internal delegate void HideCallback(IntPtr handle, IntPtr userData); + + [StructLayout(LayoutKind.Sequential)] + internal struct FrameProviderEventCallbacks + { + public ShowCallback OnShow; + public HideCallback OnHide; + } + + [DllImport(Libraries.FrameProvider, EntryPoint = "frame_provider_create")] + internal static extern ErrorCode Create(IntPtr wl2Win, ref FrameProviderEventCallbacks callbacks, IntPtr userData, out SafeFrameProviderHandle handle); + + [DllImport(Libraries.FrameProvider, EntryPoint = "frame_provider_destroy")] + internal static extern ErrorCode DangerousDestroy(IntPtr handle); + + [DllImport(Libraries.FrameProvider, EntryPoint = "frame_provider_notify_show_status")] + internal static extern ErrorCode NotifyShowStatus(SafeFrameProviderHandle handle, SafeBundleHandle safeBundleHandle); + + [DllImport(Libraries.FrameProvider, EntryPoint = "frame_provider_notify_hide_status")] + internal static extern ErrorCode NotifyHideStatus(SafeFrameProviderHandle handle, SafeBundleHandle safeBundleHandle); + } + } +} diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.Libraries.cs b/src/Tizen.NUI/src/internal/Interop/Interop.Libraries.cs new file mode 100755 index 0000000..ce48918 --- /dev/null +++ b/src/Tizen.NUI/src/internal/Interop/Interop.Libraries.cs @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +namespace Tizen.NUI +{ + internal static partial class Interop + { + internal static partial class Libraries + { + internal const string FrameBroker = "libframe-broker.so.1"; + internal const string FrameProvider = "libframe-provider.so.1"; + } + } +} diff --git a/src/Tizen.NUI/src/public/NUIApplication.cs b/src/Tizen.NUI/src/public/NUIApplication.cs index 2756690..8e5410a 100755 --- a/src/Tizen.NUI/src/public/NUIApplication.cs +++ b/src/Tizen.NUI/src/public/NUIApplication.cs @@ -39,6 +39,8 @@ namespace Tizen.NUI private static System.Resources.ResourceManager resourceManager = null; private Size2D _windowSize2D = null; private Position2D _windowPosition2D = null; + private TransitionOptions transitionOptions; + /// /// The default constructor. @@ -384,6 +386,31 @@ namespace Tizen.NUI Interop.Application.Application_PreInitialize(); Application.NewApplication("", Application.WindowMode.Opaque); } + + /// + /// This is used to improve application launch performance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public void SendLaunchRequest(AppControl appControl) + { + transitionOptions.SendLaunchRequest(appControl); + } + + /// + /// This is used to improve application launch performance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public TransitionOptions TransitionOptions + { + get + { + return transitionOptions; + } + set + { + transitionOptions = value; + } + } } /// diff --git a/src/Tizen.NUI/src/public/TransitionAnimations/TransitionAnimations.cs b/src/Tizen.NUI/src/public/TransitionAnimations/TransitionAnimations.cs new file mode 100755 index 0000000..678391b --- /dev/null +++ b/src/Tizen.NUI/src/public/TransitionAnimations/TransitionAnimations.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using Tizen.NUI; + +namespace Tizen.NUI +{ + /// + /// Transition animation effect + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class TransitionAnimation : Animation + { + /// + /// Create an instance of Transition. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public TransitionAnimation(int durationMilliSeconds) : base(durationMilliSeconds) + { + + } + } + + /// + /// Screen slides are transitions between one entire screen to another + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class SlideIn : TransitionAnimation + { + private int defaultInitValue = 0; + + /// + /// Create an instance of SlideIn. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SlideIn(int durationMilliSeconds) : base(durationMilliSeconds) + { + Properties = new string[1]; + DestValue = new string[1]; + StartTime = new int[1]; + EndTime = new int[1]; + + StartTime[0] = 0; + EndTime[0] = durationMilliSeconds; + + Properties[0] = "PositionX"; + DestValue[0] = "0"; + + defaultInitValue = -Window.Instance.GetWindowSize().Width; + } + + internal int GetDefaultInitValue() + { + return defaultInitValue; + } + } + + + /// + /// Screen slides are transitions between one entire screen to another + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class SlideOut : TransitionAnimation + { + private int defaultInitValue = 0; + + /// + /// Create an instance of SlideOut. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SlideOut(int durationMilliSeconds) : base(durationMilliSeconds) + { + Properties = new string[1]; + DestValue = new string[1]; + StartTime = new int[1]; + EndTime = new int[1]; + + StartTime[0] = 0; + EndTime[0] = durationMilliSeconds; + + Properties[0] = "PositionX"; + + DestValue[0] = Window.Instance.GetWindowSize().Width.ToString(); + + defaultInitValue = 0; + } + + internal int GetDefaultInitValue() + { + return defaultInitValue; + } + } +} diff --git a/src/Tizen.NUI/src/public/TransitionOptions/TransitionOptions.cs b/src/Tizen.NUI/src/public/TransitionOptions/TransitionOptions.cs new file mode 100755 index 0000000..ee5786f --- /dev/null +++ b/src/Tizen.NUI/src/public/TransitionOptions/TransitionOptions.cs @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using Tizen.Applications; + +namespace Tizen.NUI +{ + /// + /// Setting screen transition options. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class TransitionOptions : IDisposable + { + private FrameProvider frameProvider; + private DefaultFrameBroker frameBroker; + + private bool enableTransition = false; + private Window mainWindow; + private string sharedId; + + /// + /// Initializes the TransitionOptions class. + /// + /// The window instance of NUI Window + [EditorBrowsable(EditorBrowsableState.Never)] + public TransitionOptions(Window window) + { + mainWindow = window; + } + + /// + /// Gets or sets transition enable + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool EnableTransition + { + get + { + return enableTransition; + } + + set + { + if (value) + { + frameBroker = new DefaultFrameBroker(mainWindow); + frameBroker.AnimationInitialized += FrameBroker_TransitionAnimationInitialized; + frameBroker.AnimationFinished += FrameBroker_TransitionAnimationFinished; + EnableProvider(); + } + enableTransition = value; + } + } + + private void EnableProvider() + { + frameProvider = new FrameProvider(mainWindow); + frameProvider.Shown += FrameProvider_Shown; + frameProvider.Hidden += FrameProvider_Hidden; + } + + /// + /// Gets or sets the Shared object Id + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public String SharedId + { + set + { + sharedId = value; + } + get + { + return sharedId; + } + } + + /// + /// Gets or sets the forward animation of launching + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public TransitionAnimation ForwardAnimation + { + get + { + return frameBroker?.ForwardAnimation; + } + set + { + if (frameBroker != null) + { + frameBroker.ForwardAnimation = value; + } + } + } + + /// + /// Gets or sets the backward animation of launching + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public TransitionAnimation BackwardAnimation + + { + get + { + return frameBroker?.BackwardAnimation; + } + set + { + if (frameBroker != null) + { + frameBroker.BackwardAnimation = value; + } + } + } + + /// + /// Emits the event when the animation is started. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler AnimationInitialized; + + /// + /// Emits the event when the animation is finished. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler AnimationFinished; + + + /// + /// Dispose for IDisposable pattern + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public void Dispose() + { + if (frameBroker != null) + { + frameBroker.Dispose(); + } + + if (frameProvider != null) + { + frameProvider.Dispose(); + } + } + + private void FrameBroker_TransitionAnimationFinished() + { + AnimationFinished?.Invoke(this, EventArgs.Empty); + } + + private void FrameBroker_TransitionAnimationInitialized() + { + AnimationInitialized?.Invoke(this, EventArgs.Empty); + } + + /// + /// Occurs whenever the window is shown on caller application. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler CallerScreenShown; + + /// + /// Occurs whenever the window is hidden on caller application. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler CallerScreenHidden; + + private void FrameProvider_Shown(object sender, EventArgs e) + { + Bundle bundle = new Bundle(); + //Set information of shared object + frameProvider?.NotifyShowStatus(bundle); + + CallerScreenShown?.Invoke(this, e); + } + + private void FrameProvider_Hidden(object sender, EventArgs e) + { + Bundle bundle = new Bundle(); + //Set information of shared object + frameProvider?.NotifyHideStatus(bundle); + + CallerScreenHidden?.Invoke(this, e); + } + + internal void SendLaunchRequest(AppControl appControl) + { + this.frameBroker.SendLaunchRequest(appControl, false); + } + } +} diff --git a/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.cs b/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.cs new file mode 100755 index 0000000..d62e143 --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.cs @@ -0,0 +1,55 @@ +using System; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; + +namespace NUISimpleCallee +{ + class Program : NUIApplication + { + protected override void OnCreate() + { + base.OnCreate(); + Initialize(); + } + + void Initialize() + { + Window.Instance.KeyEvent += OnKeyEvent; + Window.Instance.TouchEvent += OnTouchEvent; + + TextLabel text = new TextLabel("Callee"); + text.HorizontalAlignment = HorizontalAlignment.Center; + text.VerticalAlignment = VerticalAlignment.Center; + text.TextColor = Color.Red; + text.PointSize = 12.0f; + text.HeightResizePolicy = ResizePolicyType.FillToParent; + text.WidthResizePolicy = ResizePolicyType.FillToParent; + Window.Instance.GetDefaultLayer().Add(text); + + TransitionOptions = new TransitionOptions(GetDefaultWindow()); + TransitionOptions.EnableTransition = true; + } + + private void OnTouchEvent(object sender, Window.TouchEventArgs e) + { + if (e.Touch.GetState(0) == PointStateType.Up) + { + Window.Instance.Iconify(true); + } + } + + public void OnKeyEvent(object sender, Window.KeyEventArgs e) + { + if (e.Key.State == Key.StateType.Down && (e.Key.KeyPressedName == "XF86Back" || e.Key.KeyPressedName == "Escape")) + { + Exit(); + } + } + + static void Main(string[] args) + { + var app = new Program(); + app.Run(args); + } + } +} diff --git a/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.csproj b/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.csproj new file mode 100755 index 0000000..91a27f7 --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCallee/NUISimpleCallee.csproj @@ -0,0 +1,26 @@ + + + + Exe + netcoreapp2.0 + + + + portable + + + None + + + + + + + + + + + + + + diff --git a/test/Tizen.NUI.Seamless/NUISimpleCallee/shared/res/NUISimpleCallee.png b/test/Tizen.NUI.Seamless/NUISimpleCallee/shared/res/NUISimpleCallee.png new file mode 100755 index 0000000000000000000000000000000000000000..9f3cb98608134e7b9eb4beb7394fec9f03e40f63 GIT binary patch literal 10097 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 TJbOA100000NkvXXu0mjf?x(Kf literal 0 HcmV?d00001 diff --git a/test/Tizen.NUI.Seamless/NUISimpleCallee/tizen-manifest.xml b/test/Tizen.NUI.Seamless/NUISimpleCallee/tizen-manifest.xml new file mode 100755 index 0000000..f6859ea --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCallee/tizen-manifest.xml @@ -0,0 +1,15 @@ + + + + + + NUISimpleCallee.png + + + diff --git a/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.cs b/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.cs new file mode 100755 index 0000000..168eed1 --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.cs @@ -0,0 +1,74 @@ +using System; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.Applications; + +namespace NUISimpleCaller +{ + class Program : NUIApplication + { + protected override void OnCreate() + { + base.OnCreate(); + Initialize(); + } + + void Initialize() + { + Window.Instance.KeyEvent += OnKeyEvent; + Window.Instance.TouchEvent += OnTouchEvent; + + TextLabel text = new TextLabel("NUI Simple Caller Sample"); + text.HorizontalAlignment = HorizontalAlignment.Center; + text.VerticalAlignment = VerticalAlignment.Center; + text.TextColor = Color.Blue; + text.PointSize = 12.0f; + text.HeightResizePolicy = ResizePolicyType.FillToParent; + text.WidthResizePolicy = ResizePolicyType.FillToParent; + Window.Instance.GetDefaultLayer().Add(text); + + + TransitionOptions = new TransitionOptions(GetDefaultWindow()); + TransitionOptions.EnableTransition = true; + TransitionOptions.ForwardAnimation = new SlideIn(300); + TransitionOptions.BackwardAnimation = new SlideOut(300); + + ////TransitionOptions.AnimationStart += TransitionOptions_AnimationStart; + ////TransitionOptions.AnimationFinished += TransitionOptions_AnimationFinished; + } + + private void TransitionOptions_AnimationFinished() + { + Tizen.Log.Error("MYLOG", "Finish Animation"); + } + + private void TransitionOptions_AnimationStart() + { + Tizen.Log.Error("MYLOG", "Start Animation"); + } + + private void OnTouchEvent(object sender, Window.TouchEventArgs e) + { + if (e.Touch.GetState(0) == PointStateType.Up) + { + AppControl appControl = new AppControl(); + appControl.ApplicationId = "org.tizen.example.NUISimpleCallee"; + SendLaunchRequest(appControl, false); + } + } + + public void OnKeyEvent(object sender, Window.KeyEventArgs e) + { + if (e.Key.State == Key.StateType.Down && (e.Key.KeyPressedName == "XF86Back" || e.Key.KeyPressedName == "Escape")) + { + Exit(); + } + } + + static void Main(string[] args) + { + var app = new Program(); + app.Run(args); + } + } +} diff --git a/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.csproj b/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.csproj new file mode 100755 index 0000000..91a27f7 --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCaller/NUISimpleCaller.csproj @@ -0,0 +1,26 @@ + + + + Exe + netcoreapp2.0 + + + + portable + + + None + + + + + + + + + + + + + + diff --git a/test/Tizen.NUI.Seamless/NUISimpleCaller/shared/res/NUISimpleCaller.png b/test/Tizen.NUI.Seamless/NUISimpleCaller/shared/res/NUISimpleCaller.png new file mode 100755 index 0000000000000000000000000000000000000000..9f3cb98608134e7b9eb4beb7394fec9f03e40f63 GIT binary patch literal 10097 zcmV-%Cyv;OP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z9G*!;K~#9!?45adROR)@KX>k(nam`UjU_-Jvaf<7q7+#w0xcl2xgaWPU0Rp6YNfW; zpJHvRty^2f)(u1jtRN^Tn}`aihzKGe`@V%WnIyB{<@d*XLlVd`%gu!CJkLDDn7PaQ zeb0H%`JQv$S27HP^Ky2H?fej&eWH~9AU#`froT%Apc!xhkZt~V1HcV900~fm5KsUd z0=&RpU>~px(9YxmFvew71oaFPJ8%(jInc%Yv;-Q)dA%U81K13#2fhKm1M<&kO+C%U z1@tq)>kRY-npk-K6riK|8Dah|0;~X*16zTWz=rdnCN6z}G3G!wr~_-z+x(Qu=fF(h zJ>bZBP@|X2fC0d8;L_9V*?ww%o&lx-p8@Zl_kOFEUcel4J^RaP2xxgp1MUWG zxAPg`)fsrPlfREjqjPh+_+9ekW?&=G|7;3rh5=K6jHC^t1Q%x_nVGTMpCsiY`|fSi(A=Q{L73JfC6ZSQJ2yAO~8Dh z&6%pH3xR=2_Yewn2pQZzz|Dk#?o<9GRQHtq&w)({wru&CqN#bnlB5D!&fI3F+j!^p z^hyCe&G><3z@2A;rskSXfjgbkx)qz^bG>L-`tct?Vqm#Y3AcnKM}ah=`saIbAfh zJ@8f1W6xrPTds7m?%s?u9nezwJuv=s&{PFcA>d9Lpd|*B=u8;x;r?z;&N6udI0(E_ zmzugDX@E*V(14J^D`U?}KuhJnB*;D`0_w-WRY`kQ11Q${^EIj5-TABqv{XJp6woCV z)SH08Nqxb~vgrZ$~6K&Y59)-8!OeN;L%E z95TQ!SS`Fd9M{C>nE7wmK$6Vwg$)Rp-$~pZxBz%Inm>$&CVUyuYm!_s02zAaibuS> zvG{lKUX^<;j-Px`Y$ia(dRe%n85Jj!1W1yg*lp&|3SgITD3IomNOwwPIVBppZDgcK zbZ#KiAkD@%yCY0q9TEj@Su*J!iIT8^eoO;d0&|ka3G&0h1Yl1hpteHP7$skV2KM?g zgIWr!e`zBb8Y?W>nV6P+;heWDf!d5P3{$h883Cn{NMhqV7$(6x;Dgf z*L(O~cWbD|5HNgdF$=F-t9*FsJyNY!#{#PO2AJ!}b^z98{QXV|Q znu97|K9S-U1gw;XG7uaA7?jZPh?@jX%?Xz=8>p&Bn!5HYx8 zP6;=?U4+kXK(1WDCyG~wO)cgh(~5cKt_im9$YClIHHv~Y0=3I zv4Yw&W}{%Slhil2@|i!PjRUEJon>DK*;QQig0%6NMyH8hCVd)!44d#ewZs$1-Cr(b z&L@6mKAO!VJrfTKZtvn`!+jaFZmPguRfIv&J><2qg8Iw4jhy6;F!jU z4@xTc`#<&5`DHH$4{MO8fKujZCZecaCwf`6I>g-Z^%&L0IxeO~x{bB>X7bpuG*PNk z7?nBh3tSj2s0~PVuJq*iRDllls(!0GJ38pl*TwgX158>UKJoh_L4zUFig|vn4^20q zo-N+6;S~AFt6sie9c0my^|-pZ^)>Kr8$8v|#XC27kQGU^j8LP!{AIMD-chG28ZvO! zm$@>pdQJH605_ya+`q^Nz>+-?I=$>=-l`DfDv)X&pf}7aVa1XFlgDK-Ah&jVHg4+Z zV8d@S>3g9=02`{-9FM7t7^>{gZ>v*KOLTfSvy+`t{S@t!t1xhoo51!6o!%_ss<(?d zQlLSuoVcAW9|Eih^4^C&{`OENx3y1B!(O{g8=v2r&XdDag*grxRcUNCqG+L7P+I`) zVhTNKfnOieBD(cz=8#mHwR7;}nvkI2GHjMU&*D8QPrd5px{+!8@v`JIrH}V^@zV8a zqTsIT1XY)sKy4e<-DF7+)j?el+lMtM(glZ_h|jDVkY?j&Euu4V9=pVXThayPRtpLA z(eIZ)x{ZwoRX*4nsT0FBqP4vy%hSCkP#_iSrxgqDz3L$uaPqo(vPwkPsaB-%^VTk|xhY%lbjc_nu zq@hTWAk8N3RMUV24f-~To$-00kBcvNM_Bno7#hh5gZs>?5DPx@LkqjG02ww28BAE{ zRX zB674&QxVe5d)Hj>(Wfd$i%Tzdgc7qdhUNGT$9kdH2UKv$jOou}>A=twR!8nIl)Ipo~&_RAqiI ziuw{ZF?-(H5Uv!|Q|{PQp+{4N7Y4x0jbY|(i?H^X#@f9q9M{22ujS+_^vjE%skyg{ zlh3bmGh=xG;xLcb&G8XDq>4DVDw0?OQYCOH%=<1xmqMM1SEtga8bUv;!8iLo+9f8|$0hOcE;Xh*%M#qs(ZLNJ9Vce&|2BsC zU~`16Tf!VVu3=A*oPBR-DvnKIBF8nT7ybJBukS-F`Z@qPO3mLf%!!>NvwnAkzAqK> zP=7bi_pjJiv}~`++v`Gnyd%Pa!zPiSB&3m5NgmJvSbH+4tz){3Q=*_yV|$@atIYV2 z=+;=FTVsWP^n5eoFkY(R(A)81b4{#CJ}qY|wO3wQ#bm$k%va zW(j1-!pk(GoY;Y~+M^d1`}z8i#;-4Ovcsn{^@k7}_o)?q2@j{5bL*sSDX8VqXdcrg z>=G1e%-$NdCE35q4`tCx#MFWi{mU^8Q#jyQzOzuA(&BdvDsO0s@E}O zdXeyQQ>Cg0TSA!RVsn$NqZ*zx8)JLAn0t2yhn}d%;FfmAyyoSx86|Aoqk_vOG&0SW zjO~3+?0+nk9*iJ8TMz_dD+wsjxv;&Rbz{>ld$Q-g4KZ$#SGe(ZiMGuYZtUowcT*8%1o|9RW|dVz02lpmq+f>)@b$wv7p^Lrh;Dfco;OfR5^UM8^5pgiI3=>OWrnx0Gp3V+{!vhgvqq%S@x?;n+{os~Au)e-kon(- z%9yC~WQRn>(oPwgHnlUnm7VK5Iq2Q2dbaD?J}&034vF3RliT2)Ru%aWnEz&wCJNn~R<6M_wni#4 zTc!0t*`^k01~_e|X+=<;0RysZbk0-gnxinHt)0Pb95|u`s8fBJ-d&t5TN4!bNuIc@ z0o4FfB&Ke%4pe|!+BW88PF?W14VyY*EbZfPuXh{F%!eD_oIWZPly;6_a)JYCONnI_F?ObA|LA z1^m^ZYIep^U;-&Y>pX?AeO%PbwuwELs(VAT%J7bleJt6nQf#rtKG4-!wszOPsMa}3 zrP`WquMLr%Dbuxq%nh9cIgy!?n2HT;?Lew8WB82|NsC&PptYI` z;I^S1(|GzT>$G+J6)x-?IR!awnZoi#HYbd8PT;@ ztS7?+2P)IlFp2DMF98`ckIwh;!y%1-4s?-|8vmR*7BpD8CqhIwV7~@U?F{Lb!nN(~ z3}|jAH@)U-4{C1b=~7D~i|_@nPIfbe?u{KR+!hgQZ;Dwi;*vx^gaO`SGfes>NP4D? zt_>A#=;UBjJ39?yc(1?oaxrgBQW&O^%DCU%h!jp@ZdX_Y^BGNL#&mSjH&3B!Lz!HU zja2)o)72L-@Q2}0KxgAIjfFc^7Vn6#uS7=+8C;sHFsi+SQ5_t#$%<`~w0_0Q_Wi2x zh$G-q;K@EN?zq@Vc8bK~%L6<$vjmzbRclhIx%Y{M(OqAr-vxHA%u~3&gM+3~Os?+J zidnTTB$)J9LD2qs3B*3eamSv-7o}I0SHFg$hly>P#rO6N#20UXg7-N(iBt5Yj#^NbP}tPIv%+f-WG z5)=SC>dAzI1{XJwd8)sgt6Ntc=g!_5VdNw)WXZK@hOalqWz9I*{BE-hR6{r*9-v19 zna6vkP!u%yWOsxeg*rZyr*O#7z%9`-L#BPUP4K=JZ1ei|rmz4s+g9P3>Q~~d%o>?W z=Jqh*0v)odAuCEXOf_iH%FdQMGx%_8g!|`|F!YTgF1kSBxq)u_w>%Zxfz1`cFa=Fh zUpum;vNd(BrMIw491Ixzd6A!)8x-CcmdXoP*8Ya0$AboA-zyQh(ef0b1d&R}2$wAJ z&L|Jpzv>lBM@{j7-{6vl3W@}y+S(cQa2D$iYdo;P$ADM8w8@c~Jlew*jms{SYL^(< z&cUo@0dUod3El(zSef^`&eGc$h(XP?@#8_2pG+uZ)XWmR;o40yj{KlRWLrF^YF$-# zzOId(oBO%os9JqIU@F;_c@?e6g$-pEk4>iiJyLYAY#+nfBCy(>lUcm|UY@*P$W34evUsXjDmLLw* zvtD%5oo_6YU!d{$`z7?6QpC0b>!_9=3v?zd@Cj!m&PeLbYtn=!`73E3k$@tdfvxRi z)vzw!(AkOqPuUD^XQ$s^jx*kz#DD3TBAi3(8Ky6*<9-*^s%_K-^F&jHFE@s1Ke3R9 z7Wqju6>uzQ(0@viFmG-t?ltSmrV7vA=n>{ytK`}368Ch8zCdK=Xb+QqmBEt>{5-JG z&)}AJvhozsgJhi)Ri~+?Cb)K`bifc25z6hjk|SQ$!b2m7s1S zS)z-uhsFv!4yyE-T*OW9mvF!z8!E4D2=m#uL1?U4X4a++aii3iE4JzT3`WGcB|y6@ z8>`0GFmcPm%Ys19GyYlT&Q#R z|BA)ru#kdl>ap?eXpi8V!)0FYWeJqHbZa29>_!itd>jjXQ;RDek&TXaMw zB~PKit26S=VunmFX5G=M{eOSNp!b_a!twCfERX$0wX$_*m6yCcyQ1=}&m+qN9N7_xezOh<0x_Dr ziTzx-n<%g|LZ222O+ASxwI*EUCOy}(gL!AbseWc{JE(Az~U zDp#%l=obNAno%Oijbj=V)bKej`dDIx#BG;YGBzD&mdu!T*6jBn0k?H^3J*JRd8x8r zR%HZU2d<_rMMpFexn<4YOdE%57bocnyP1M>KxgBL&4Bot7##_-b<)UnF+zxI9PZ z+Wu~uWm=bdZeR`nyR1Al7!9b)D64CyPPJA7n#fS3^XA7s9=X}Wtl?=fU#jQ3#T<(> ze;)`LJh3FepxdpfI9z>5wPIx7tLlGLHT{kQZ*jVa1{CW&daH+L`ovc>zPC`1t1kJI zJu35m2=VR8An$LtrVMu3LCuPK;2E)k3h;jprQI(BmM*DK=h0?7C4G)ari zgic%&V&E%Zu`MG~uu?V$1Hb|E_c2K4NyTu8;((J7fQAH7dNTVV)aV8#6p@z+Z zYhA)X1g4Hnr)>g`%8nvkY&V-8-8F9hpoD+S@d?^7%~rP0ej|k+z7O$-FXJz+o4qX} z`c~st`2PU@L_pnvIDIksA_My)4DRk^Oxwg9l=Vk62pTj_t9~6j8Zx-#RWDPQ2E^_x zC->nbUvuc;~+rt{&|LbMVmWU`stE^MbEYm?U`1xDKSSH31l4}+@BqYh-t9M~S= zwgtYJo@4Tca9Ph!>~er8&n%Dj@~HGxY6Z z0apDeDMuY>qOkD05Hq6;a}N4+zS^aVd~*C}(qJX1ev)xMjSS?gT++?S6BZqQd&nnF zdm2;8wyqC+>SxR=UNOkAZusmF)XjBo7O}aY=Jj>*x-iBOHQxAi1u)%ePyrU3@loxW z-9jBtj>7!wJeFPd!|h>kN(^mPrl}zVezU;GzZUsL+AlSZg0Rvmj)1`pAJ%M!r)>(0 ztq5Y*(js7FtS(6`az9X9D}bs3)XAgLXlP+G(PPVkT-2(pu1Etef5Xd!d45sPOpQ`C0Iukpj=__8=ZizrM)5Fy*n2?z=f16Xnr&W~XEZwIoz}(Ug2}aH+slw|G ziK^V#MtdD_O}s-IkGuoSvBd294N&0CtE~m}fKTVgbs;8Q?_t5N2$%fFD;k{|)ey48 zYliE|6y>Yj^ijq2^=Lq6{+38QUhg%D=t;aX43VNsY%q#-Ub-=z9*wO%MWXLJ#q{l# zf^5K`SBo%I!;)&lYNejcw1s|N_%2i~WQw5XtFiXb3_#S2B^^`{J9&HK{&u0pH9b?f zuZy*(NZh;7&$ew5A~M|iVToXYJhcpHX~jmCjXy2%lW(>@PFWv{mFvCNj5OkwMAajR z*v)$-P%rjx8w|2=tDC(=I{&vcz?3hy`?~7Pod88 z{VI{8+KH0W6Q|ZDbK^&|p1H)UQ*zu8Tf#;s&jC+b5+RmrI!^Rjoq^902jE1{AeoF$ z+}>y@V6xeAku0sWR-OhPP1sP3%d$*U%e&y+5KUH@QGG)*O=F6MrBG)cpyRF5P^%oJ zlVumso|C$;&P$c@3#$RG4NyU(>Ush5&tq1l_<^f{$+dCu+S~+uFm-vR`ROZ55a;PF zsjVB-_Rj7T5yvd&pT|;g5vGRjtIeC(lJFw$0WE>4=P;PZf!>JoPHSCkNqVUOa5JLb zDR_G=BG2zA93J)m(vu;5b!pl^XxOq?KXBgh;kYZ*gEs`A|hXVBQTt3`Q+Mn zerB2;?f%o%bSRwOvdH{AfH)(xD{!S5^EIgDdmHAu|EUS)c9OXz(OC>?sdy1df-e#K z9Jqmt5hwh1HqCSkAS=%6tEQu~1+jVK3Sbqm_e}KIPUKV1%h@Bg^Fwg<$^Q=k6D;UR TJbOA100000NkvXXu0mjf?x(Kf literal 0 HcmV?d00001 diff --git a/test/Tizen.NUI.Seamless/NUISimpleCaller/tizen-manifest.xml b/test/Tizen.NUI.Seamless/NUISimpleCaller/tizen-manifest.xml new file mode 100755 index 0000000..153bcc0 --- /dev/null +++ b/test/Tizen.NUI.Seamless/NUISimpleCaller/tizen-manifest.xml @@ -0,0 +1,16 @@ + + + + + + NUISimpleCaller.png + + + + + + http://tizen.org/privilege/appmanager.launch + + + + -- 2.7.4