private void prepareCallActions(FcContext fcContext, SapaAppInfo appInfo)
        {
            FcActionFactory factory = fcContext.ActionFactory;
            SparseArray <SapaActionInfo> actions = appInfo.Actions;

            for (int i = 0; i < actions.size(); ++i)
            {
                SapaActionInfo actionInfo = actions.get(i);
                FcActionItem   action     = factory.newAppItem(appInfo, actionInfo);
                string         actionName = actionInfo.Id;

                // Volume buttons needs to be separated from the rest of actions
                if (FcConstants.ACTION_VOLUME_UP.Equals(actionName))
                {
                    mVolumeActions[VOLUME_UP_INDEX] = action;
                }
                else if (FcConstants.ACTION_VOLUME_DOWN.Equals(actionName))
                {
                    mVolumeActions[VOLUME_DOWN_INDEX] = action;
                }
                else
                {
                    mCallActions.Add(action);
                }
            }
        }
示例#2
0
        /// <summary>
        /// @brief Get intent that started application of given instanceId
        ///
        /// TODO: Describe catched exceptions
        /// </summary>
        /// <param name="instanceId">    unique instance id
        /// </param>
        /// <returns> Intent object or null </returns>
        public virtual Intent getLaunchIntent(string instanceId)
        {
            SapaAppInfo appInfo = getAppInfo(instanceId);

            if (appInfo == null)
            {
                Log.w(TAG, "Cannot start activity for application: " + instanceId + ": app not active");
                return(null);
            }

            SapaAppService sapaAppService = SapaAppService;
            Intent         intent         = null;

            try
            {
                intent = sapaAppService.getLaunchIntent(appInfo.App);
            }
            catch (SapaConnectionNotSetException)
            {
                Log.w(TAG, "Cannot start activity for application " + instanceId + ": sapa connection has not been set");
            }
            catch (IllegalAccessException)
            {
                Log.w(TAG, "Cannot start activity for application " + instanceId + ": illegal access");
            }

            return(intent);
        }
示例#3
0
        public virtual void callAction(string instanceId, string actionId)
        {
            Log.d(TAG, "Calling remote action (id: " + actionId + ", instance: " + instanceId + ")");
            SapaAppInfo info = getAppInfo(instanceId);

            if (null != info)
            {
                try
                {
                    mSapaAppService.callAction(info.App, actionId);
                }
                catch (SapaConnectionNotSetException)
                {
                    Log.d(TAG, "Cannot call action (id: " + actionId + ") for instance " + instanceId + ": Sapa connection not set");
                }
                catch (SapaUndeclaredActionException)
                {
                    Log.d(TAG, "Cannot call action (id: " + actionId + ") for instance " + instanceId + ": action undeclared");
                }
            }
            else
            {
                Log.w(TAG, "Cannot call action (id: " + actionId + ") for instance " + instanceId + ": SapaApp not found");
            }
        }
        private void closeAnInstance(string instanceId)
        {
            // Native part of application is being deactivated.
            if (this.mSapaService != null && this.mProcessorList != null && this.mProcessorList.Count > 0)
            {
                SapaProcessor processor = this.mProcessorList[instanceId];
                if (processor != null)
                {
                    processor.deactivate();
                    mSapaService.unregister(processor);
                    mProcessorList.Remove(instanceId);
                }
            }

            if (this.mAppInfoList != null && this.mAppInfoList.Count > 0)
            {
                SapaAppInfo sapaAppInfo = this.mAppInfoList[instanceId];
                if (sapaAppInfo != null && sapaAppInfo.App != null)
                {
                    try
                    {
                        // Application needs to declare that its instance was
                        // successfully deactivated.
                        mSapaAppService.removeFromActiveApps(sapaAppInfo.App);
                        mAppInfoList.Remove(instanceId);
                    }
                    catch (SapaConnectionNotSetException e)
                    {
                        Log.e(TAG, "Instance could not be removed from active list because of connection exception.");
                    }
                }
            }
            mCallerPackageNameList.Remove(instanceId);
            mActionsList.Remove(instanceId);
        }
        private void prepareReturnActions(FcContext fcContext, SapaAppInfo info)
        {
            Bundle config = info.Configuration;

            if (null != config)
            {
                int[] retButtonsIds  = config.getIntArray(FcConstants.KEY_RETURN_BUTTONS);
                int[] retButtonsOpts = config.getIntArray(FcConstants.KEY_RETURN_BUTTONS_OPTS);

                if (retButtonsIds == null || retButtonsOpts == null)
                {
                    prepareDefaultReturnActions(fcContext, info);
                }
                else if (retButtonsIds.Length == retButtonsOpts.Length)
                {
                    prepareCustomReturnActions(fcContext, info, retButtonsIds, retButtonsOpts);
                }
                else
                {
                    Log.w(TAG, "Sizes of arrays: " + FcConstants.KEY_RETURN_BUTTONS + " and " + FcConstants.KEY_RETURN_BUTTONS_OPTS + " are not equal");
                    prepareDefaultReturnActions(fcContext, info);
                }
            }
            else
            {
                prepareDefaultReturnActions(fcContext, info);
            }
        }
 private void handleDeactivationIntent(Intent intent)
 {
     lock (this)
     {
         SapaApp sapaApp = SapaAppInfo.getApp(intent);
         this.mActionsList.Remove(sapaApp.InstanceId);
         foreach (KeyValuePair <string, SapaProcessor> entry in this.mProcessorList.SetOfKeyValuePairs())
         {
             Log.d(TAG, "kakakaka " + entry.Key + " -> " + entry.Value);
         }
         SapaProcessor processor = this.mProcessorList[sapaApp.InstanceId];
         Log.d(TAG, "kakakaka instanceId " + sapaApp.InstanceId + " processor " + processor);
         processor.deactivate();
         this.mSapaService.unregister(this.mProcessorList[sapaApp.InstanceId]);
         this.mProcessorList.Remove(sapaApp.InstanceId);
         try
         {
             this.mSapaAppService.removeFromActiveApps(sapaApp);
         }
         catch (SapaConnectionNotSetException e)
         {
             Log.e(TAG, "Instance could not be removed from active list because of connection exception.");
         }
         this.mAppInfoList.Remove(sapaApp.InstanceId);
     }
 }
 private void prepareActions(FcContext fcContext, SapaAppInfo info)
 {
     prepareReturnActions(fcContext, info);
     prepareCallActions(fcContext, info);
     if (mDirection == LinearLayout.LAYOUT_DIRECTION_RTL)
     {
         reverseActions();
     }
 }
 public virtual string getVolumeText(SapaAppInfo info)
 {
     // update the volume
     if (info == null)
     {
         return("N/A");
     }
     return("" + getCurrectVolume(info.App) + " dB");
 }
        /// <summary>
        /// This method saves current configuration in AppInfo of this application
        ///
        /// </summary>
        private void setConfiguration(SapaApp sapaApp, int volume)
        {
            Bundle bundle = new Bundle();

            bundle.putInt("CONFIG", volume);
            SapaAppInfo info = this.mAppInfoList[sapaApp.InstanceId];

            Log.d(TAG, "kaka volume[" + volume + "] was set in " + sapaApp.InstanceId);
            info.Configuration = bundle;
        }
        private void prepareCustomReturnActions(FcContext fcContext, SapaAppInfo info, int[] drawableIds, int[] activityIds)
        {
            FcActionFactory factory = fcContext.ActionFactory;

            for (int i = 0; i < drawableIds.Length; ++i)
            {
                int drawableId = drawableIds[i];
                int activityId = activityIds[i];

                mReturnActions.Add(factory.newCustomReturnItem(info, drawableId, activityId));
            }
        }
        public override void onServiceConnected()
        {
            Log.d(TAG, "onServiceConnected");
            try
            {
                if (this.mMyInfo == null)
                {
                    mMyInfo = mSapaAppService.getInstalledApp(this.PackageName);
                }
                if (mMyInfo != null)
                {
                    //Actions are being set in SapaAppInfo representing this application.
                    mActionArray = new SparseArray <SapaActionInfo>();
                    mActionArray.put(0, new SapaActionInfo(COMMAND_SHUSH, R.drawable.ctrl_btn_stop_default, PackageName));
                    mMyInfo.Actions = mActionArray;

                    //Native part is being initialised.
                    Sapa sapa = new Sapa();
                    sapa.initialize(this);
                    mSapaService   = new SapaService();
                    mSapaProcessor = new SapaProcessor(this, null, new SapaProcessorStateListener(this, mMyInfo.App));
                    mSapaService.register(mSapaProcessor);
                    mSapaProcessor.activate();

                    //Information about ports is being set in SapaAppInfo representing this app.
                    //It can not be done before activating SapaProcessor.
                    mMyInfo.PortFromSapaProcessor = mSapaProcessor;

                    //Application needs to declare that it was successfully activated.
                    if (mSapaAppService != null)
                    {
                        this.mSapaAppService.addActiveApp(this.mMyInfo);
                    }
                }
            }
            catch (SapaConnectionNotSetException e)
            {
                Log.e(TAG, "App could not be added to active as connection has not been made.");
            }
            catch (System.ArgumentException e)
            {
                Log.e(TAG, "Initialisation of Sapa is not possible due to invalid context of application");
            }
            catch (SsdkUnsupportedException e)
            {
                Log.e(TAG, "Initialisation of Sapa is not possible as Sapa is not available on the device");
            }
            catch (InstantiationException e)
            {
                Log.e(TAG, "SapaService can not be instantiate");
            }
        }
示例#12
0
        private void setSapaAppService(SapaAppService sapaAppService, string mainAppPackageName)
        {
            Log.d(TAG, "Setting sapa app service with main: " + mainAppPackageName);
            // unregister listeners from previous one
            removeSapaListeners();

            mSapaAppService     = sapaAppService;
            mMainAppPackageName = mainAppPackageName;
            mMainApp            = findMainApp(sapaAppService, mainAppPackageName);

            // register listeners for the new one
            addSapaListeners();
        }
        /// <summary>
        /// @brief TODO!
        /// </summary>
        /// <param name="sapaAppService"> </param>
        /// <param name="mainPackage"> </param>
        public virtual void setSapaAppService(SapaAppService sapaAppService, string mainPackage)
        {
            Log.d(TAG, "setSapaAppService(" + mainPackage + ")");
            mFcSapaConnector = new FcSapaServiceConnector(mModel, sapaAppService, mainPackage);
            mFcContext.SapaServiceConnector = mFcSapaConnector;
            MainApp = mFcSapaConnector.MainApp;
            SapaAppInfo sapaAppInfo = SapaAppInfo.getAppInfo(((Activity)Context).Intent);

            if (sapaAppInfo != null)
            {
                SelectedApp = sapaAppInfo;
            }
        }
示例#14
0
        public virtual void updateApp(SapaAppInfo appInfo, int mode)
        {
            lock (this)
            {
                string instanceId = appInfo.App.InstanceId;
                Log.d(TAG, "updateApp(" + instanceId + ", mode: " + mode + ")");

                FcModelItem item = getItemForInstanceId(appInfo.App.InstanceId);
                if (null == item)
                {
                    Log.w(TAG, "Cannot update app " + instanceId + ": unknown app");
                    return;
                }

                int position;
                if (mode == FcConstants.APP_TYPE_MAIN)
                {
                    position = 0;
                }
                else if (mode == FcConstants.APP_TYPE_ORDINAL)
                {
                    position = mOrderedApplications.IndexOf(instanceId);
                    if (position < 0)
                    {
                        Log.w(TAG, "Cannot update app " + instanceId + ": not found on ordered list");
                        return;
                    }
                    if (null != mMainApplication)
                    {
                        position += 1;
                    }
                }
                else
                {
                    throw new InvalidParameterException("Unsupported mode " + mode);
                }

                // This needs to be updated after all the logic guards
                if (FcConstants.OPT_DETAILED_LOGS)
                {
                    Log.d(TAG, "Updating application in a model: " + instanceId);
                }
                item.update(mFcContext, appInfo);

                if (null != mModelChangedListener)
                {
                    mModelChangedListener.onFcModelChanged(position);
                }
            }
        }
示例#15
0
        private Drawable getDrawableFromApp(SapaAppInfo appInfo, int openRe)
        {
            Context context = Context;

            try
            {
                return(context.PackageManager.getResourcesForApplication(appInfo.PackageName).getDrawable(openRe));
            }
            catch (NameNotFoundException e)
            {
                Log.e(TAG, "Exception:", e);
            }
            return(null);
        }
        /*
         * This method is responsible for handling received intent. It can only be called when
         * connection is set.
         */
        private void handleIntent(Intent intent)
        {
            int state = SapaAppInfo.getState(intent);

            switch (state)
            {
            case SapaAppInfo.STATE_ACTIVATING:
                this.handleActivationIntent(intent);
                break;

            case SapaAppInfo.STATE_DEACTIVATING:
                this.handleDeactivationIntent(intent);

                break;
            }
        }
示例#17
0
 private void modifyAction(SapaAppInfo info, string actionKey, int iconResId, bool isEnabled)
 {
     // In this example only one action can be active at the same time.
     // We need to change state of actions every time action is called.
     if (info != null && mSapaAppService != null)
     {
         // Obtaining current ActionInfo.
         SapaActionInfo action = info.getActionInfo(actionKey);
         if (action != null)
         {
             // Settling state.
             action.Visible = isEnabled;
             // Settling icon of action by setting id of the resource.
             action.Icon = iconResId;
         }
     }
 }
示例#18
0
        public virtual void insertApp(SapaAppInfo appInfo, int mode)
        {
            lock (this)
            {
                FcModelItem item       = null;
                string      instanceId = null;
                int         position   = -1;
                if (mode == FcConstants.APP_TYPE_ORDINAL)
                {
                    item       = FcModelItem.createOrdinal(mFcContext, appInfo);
                    instanceId = item.InstanceId;
                    mOrderedApplications.Add(instanceId);
                    position = mOrderedApplications.Count - 1;
                }
                else if (mode == FcConstants.APP_TYPE_MAIN)
                {
                    item             = FcModelItem.createMain(mFcContext, appInfo);
                    instanceId       = item.InstanceId;
                    mMainApplication = instanceId;
                    position         = 0;
                }
                else
                {
                    throw new InvalidParameterException("Invalid mode: " + mode);
                }

                if (null == instanceId)
                {
                    throw new System.InvalidOperationException("Model item not created: null reference!");
                }
                if (isActiveApp(instanceId))
                {
                    item.Active = true;
                }
                item.Direction = mCurrentDirection;

                mApplicationMap[instanceId] = item;

                Log.d(TAG, "Inserting application to the model: " + instanceId);
                if (null != mModelChangedListener && position >= 0)
                {
                    mModelChangedListener.onFcModelItemInserted(position);
                }
            }
        }
示例#19
0
		/// <summary>
		/// @brief Construct model item from SapaAppInfo structure
		/// </summary>
		/// <param name="info">  Data structure with information retrieved from SAPA </param>
		/// <param name="type">  Type of the item (main or ordinal) </param>
		internal FcModelItem(FcContext fcContext, SapaAppInfo info, int type)
		{
			SapaApp app = info.App;

			try
			{
				mIcon = info.getIcon(fcContext.Context);
			}
			catch (NameNotFoundException e)
			{
				LogUtils.throwable(TAG, "Drawable not set: name not found", e);
			}
			mInstanceId = app.InstanceId;
			mPackageName = app.PackageName;
			mType = type;

			prepareActions(fcContext, info);
		}
        /// <param name="appInfo"> </param>
        public virtual void update(FcContext context, SapaAppInfo appInfo)
        {
            lock (this)
            {
                Log.d(TAG, "Updating model for " + mInstanceId);
                try
                {
                    mIcon = appInfo.getIcon(context.Context);
                }
                catch (NameNotFoundException e)
                {
                    LogUtils.throwable(TAG, "Drawable not set: name not found", e);
                }

                clearActions();
                prepareActions(context, appInfo);
            }
        }
        /// <summary>
        /// @brief Construct model item from SapaAppInfo structure
        /// </summary>
        /// <param name="info">  Data structure with information retrieved from SAPA </param>
        /// <param name="type">  Type of the item (main or ordinal) </param>
        internal FcModelItem(FcContext fcContext, SapaAppInfo info, int type)
        {
            SapaApp app = info.App;

            try
            {
                mIcon = info.getIcon(fcContext.Context);
            }
            catch (NameNotFoundException e)
            {
                LogUtils.throwable(TAG, "Drawable not set: name not found", e);
            }
            mInstanceId  = app.InstanceId;
            mPackageName = app.PackageName;
            mType        = type;

            prepareActions(fcContext, info);
        }
        public virtual void reloadView()
        {
            Log.d(TAG, "reloadView()");

            Context context = Context;

            if (null == context || !(context is Activity))
            {
                Log.w(TAG, "Cannot reload view: context needs to be an instance of activity");
                return;
            }
            mBarAlignment = mBarInitialAlignment;
            SapaAppInfo sapaAppInfo = SapaAppInfo.getAppInfo(((Activity)context).Intent);

            Log.d(TAG, "    sapa app info:" + sapaAppInfo);
            if (sapaAppInfo != null)
            {
                hideNoAnimation();
                SelectedApp = sapaAppInfo;
            }
        }
示例#23
0
        internal virtual void play(SapaApp sapaApp)
        {
            SapaAppInfo info = this.mAppInfoList[sapaApp.InstanceId];

            // Play action is being deactivated.
            modifyAction(info, MainActivity.ACTION_PLAY, R.drawable.ctrl_btn_play_disabled, false);
            // Stop action is being activated.
            modifyAction(info, MainActivity.ACTION_STOP, R.drawable.ctrl_btn_stop_default, true);
            try
            {
                // Notification that AppInfo has been changed is sent.
                this.mSapaAppService.changeAppInfo(info);
            }
            catch (SapaConnectionNotSetException)
            {
                Log.w(TAG, "State of application cound not be changed due to connection exception");
            }

            this.mIsPlaying = true;
            // Play command is sent to native part.
            Logic.startPlaying(this.mProcessorList[sapaApp.InstanceId]);
        }
        public override void onDestroy()
        {
            Log.d(TAG, "onDestroy");

            //Native part of application is being deactivated.
            if (mSapaService != null && mSapaProcessor != null)
            {
                mSapaProcessor.deactivate();
                mSapaService.unregister(mSapaProcessor);
                this.mSapaProcessor = null;
            }

            if (this.mSapaAppService != null)
            {
                try
                {
                    if (this.mMyInfo != null && this.mMyInfo.App != null)
                    {
                        //Application needs to declare that it was successfully deactivated.
                        this.mSapaAppService.removeFromActiveApps(this.mMyInfo.App);
                    }

                    //Action definer is being removed.
                    this.mSapaAppService.removeActionDefiner();
                }
                catch (SapaConnectionNotSetException e)
                {
                    Log.e(TAG, "Instance could not be removed from active list because of connection exception.");
                }
                //Connection with remote service is finished.
                this.mSapaAppService.disconnect();
                this.mSapaAppService = null;
            }

            this.mMyInfo = null;


            base.onDestroy();
        }
示例#25
0
        /// <summary>
        /// @brief Find SapaAppInfo structure for a given instanceId from list of active apps
        /// </summary>
        /// <param name="instanceId">    unique instance identifier
        /// </param>
        /// <returns> SapaAppInfo of a given instanceId or null if not found </returns>
        private SapaAppInfo getAppInfo(string instanceId)
        {
            SapaAppInfo found = null;

            try
            {
                foreach (SapaAppInfo appInfo in mSapaAppService.AllActiveApp)
                {
                    if (appInfo.App.InstanceId.Equals(instanceId))
                    {
                        found = appInfo;
                        break;
                    }
                }
            }
            catch (SapaConnectionNotSetException e)
            {
                Log.e(TAG, "");
            }

            return(found);
        }
示例#26
0
		public override int onStartCommand(Intent intent, int flags, int startId)
		{
			if (intent != null)
			{
				//When application is activated from ProfessionalAudio system it receives SapaAppInfo object describing it.
				//To obtain this object static method getSapaAppInfo() is to be used.
				SapaAppInfo info = SapaAppInfo.getAppInfo(intent);
				mCallerPackageName = intent.getStringExtra("com.samsung.android.sdk.professionalaudio.key.callerpackagename");
				//Toast.makeText(this, mCallerPackageName, Toast.LENGTH_SHORT).show();
				if (info != null)
				{
					//Received SapaAppInfo is saved to class field.
					mMyInfo = info;
				}
			}

			//Connection to remote service of ProfessionalAudio system is set.
			if (mSapaAppService == null)
			{
				connectConnectionBridge();
			}

			return base.onStartCommand(intent, flags, startId);
		}
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: DeviceActionsLayoutData(com.samsung.android.sdk.professionalaudio.app.SapaAppInfo info, android.content.Context context, boolean isMultiInstance) throws android.content.pm.PackageManager.NameNotFoundException
		internal DeviceActionsLayoutData(SapaAppInfo info, Context context, bool isMultiInstance)
		{
			mAppInfo = info;
			this.mInstanceIcon = info.getIcon(context);
			this.mSapaApp = info.App;
			this.mInstancePackageName = info.PackageName;
			this.mActionList = info.Actions;
			if (this.mActionList == null)
			{
				this.mActionList = new SparseArray<SapaActionInfo>();
			}
			mActionMap = new Dictionary<string, SapaActionInfo>();
			loadActionMap();
			this.mIsMultiInstanceEnabled = info.MultiInstanceEnabled;
			if (this.mIsMultiInstanceEnabled && isMultiInstance)
			{
				char c = this.mSapaApp.InstanceId.charAt(this.mSapaApp.InstanceId.length() - 1);
				number = char.digit(c, 10);
				if (number > 0)
				{
					mInstanceIcon = DrawableTool.getDefaultDrawableWithNumber(mInstanceIcon, number, context);
				}
			}
		}
示例#28
0
 private void handleDeactivationIntent(Intent intent)
 {
     lock (this)
     {
         SapaApp sapaApp = SapaAppInfo.getApp(intent);
         this.mActionsList.Remove(sapaApp.InstanceId);
         SapaProcessor processor = this.mProcessorList[sapaApp.InstanceId];
         if (processor != null)
         {
             processor.deactivate();
             this.mSapaService.unregister(processor);
         }
         this.mProcessorList.Remove(sapaApp.InstanceId);
         try
         {
             this.mSapaAppService.removeFromActiveApps(sapaApp);
         }
         catch (SapaConnectionNotSetException e)
         {
             Log.e(TAG, "Instance could not be removed from active list because of connection exception.");
         }
         this.mAppInfoList.Remove(sapaApp.InstanceId);
     }
 }
        public override int onStartCommand(Intent intent, int flags, int startId)
        {
            if (intent != null)
            {
                //When application is activated from ProfessionalAudio system it receives SapaAppInfo object describing it.
                //To obtain this object static method getSapaAppInfo() is to be used.
                SapaAppInfo info = SapaAppInfo.getAppInfo(intent);
                mCallerPackageName = intent.getStringExtra("com.samsung.android.sdk.professionalaudio.key.callerpackagename");
                //Toast.makeText(this, mCallerPackageName, Toast.LENGTH_SHORT).show();
                if (info != null)
                {
                    //Received SapaAppInfo is saved to class field.
                    mMyInfo = info;
                }
            }

            //Connection to remote service of ProfessionalAudio system is set.
            if (mSapaAppService == null)
            {
                connectConnectionBridge();
            }

            return(base.onStartCommand(intent, flags, startId));
        }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: DeviceActionsLayoutData(com.samsung.android.sdk.professionalaudio.app.SapaAppInfo info, android.content.Context context, boolean isMultiInstance) throws android.content.pm.PackageManager.NameNotFoundException
        internal DeviceActionsLayoutData(SapaAppInfo info, Context context, bool isMultiInstance)
        {
            mAppInfo                  = info;
            this.mInstanceIcon        = info.getIcon(context);
            this.mSapaApp             = info.App;
            this.mInstancePackageName = info.PackageName;
            this.mActionList          = info.Actions;
            if (this.mActionList == null)
            {
                this.mActionList = new SparseArray <SapaActionInfo>();
            }
            mActionMap = new Dictionary <string, SapaActionInfo>();
            loadActionMap();
            this.mIsMultiInstanceEnabled = info.MultiInstanceEnabled;
            if (this.mIsMultiInstanceEnabled && isMultiInstance)
            {
                char c = this.mSapaApp.InstanceId.charAt(this.mSapaApp.InstanceId.length() - 1);
                number = char.digit(c, 10);
                if (number > 0)
                {
                    mInstanceIcon = DrawableTool.getDefaultDrawableWithNumber(mInstanceIcon, number, context);
                }
            }
        }
		private void setSapaAppService(SapaAppService sapaAppService, string mainAppPackageName)
		{
			Log.d(TAG, "Setting sapa app service with main: " + mainAppPackageName);
			// unregister listeners from previous one
			removeSapaListeners();

			mSapaAppService = sapaAppService;
			mMainAppPackageName = mainAppPackageName;
			mMainApp = findMainApp(sapaAppService, mainAppPackageName);

			// register listeners for the new one
			addSapaListeners();
		}
示例#32
0
		/// <param name="appInfo"> </param>
		public virtual void update(FcContext context, SapaAppInfo appInfo)
		{
			lock (this)
			{
				Log.d(TAG, "Updating model for " + mInstanceId);
				try
				{
					mIcon = appInfo.getIcon(context.Context);
				}
				catch (NameNotFoundException e)
				{
					LogUtils.throwable(TAG, "Drawable not set: name not found", e);
				}
        
				clearActions();
				prepareActions(context, appInfo);
			}
		}
 /// <summary>
 /// @brief Construct model item from SapaAppInfo structure
 /// </summary>
 /// <param name="info">  Data structure with information retrieved from SAPA
 /// </param>
 /// <returns> Model item representing main application </returns>
 public static FcModelItem createMain(FcContext fcContext, SapaAppInfo info)
 {
     return(new FcModelItem(fcContext, info, FcConstants.APP_TYPE_MAIN));
 }
示例#34
0
		private void prepareReturnActions(FcContext fcContext, SapaAppInfo info)
		{
			Bundle config = info.Configuration;
			if (null != config)
			{
				int[] retButtonsIds = config.getIntArray(FcConstants.KEY_RETURN_BUTTONS);
				int[] retButtonsOpts = config.getIntArray(FcConstants.KEY_RETURN_BUTTONS_OPTS);

				if (retButtonsIds == null || retButtonsOpts == null)
				{
					prepareDefaultReturnActions(fcContext, info);

				}
				else if (retButtonsIds.Length == retButtonsOpts.Length)
				{
					prepareCustomReturnActions(fcContext, info, retButtonsIds, retButtonsOpts);

				}
				else
				{
					Log.w(TAG, "Sizes of arrays: " + FcConstants.KEY_RETURN_BUTTONS + " and " + FcConstants.KEY_RETURN_BUTTONS_OPTS + " are not equal");
					prepareDefaultReturnActions(fcContext, info);
				}
			}
			else
			{
				prepareDefaultReturnActions(fcContext, info);
			}
		}
示例#35
0
		private void modifyAction(SapaAppInfo info, string actionKey, int iconResId, bool isEnabled)
		{
			// In this example only one action can be active at the same time.
			// We need to change state of actions every time action is called.
			if (info != null && mSapaAppService != null)
			{
				// Obtaining current ActionInfo.
				SapaActionInfo action = info.getActionInfo(actionKey);
				if (action != null)
				{
					// Settling state.
					action.Visible = isEnabled;
					// Settling icon of action by setting id of the resource.
					action.Icon = iconResId;
				}
			}
		}
示例#36
0
		private void prepareCustomReturnActions(FcContext fcContext, SapaAppInfo info, int[] drawableIds, int[] activityIds)
		{
			FcActionFactory factory = fcContext.ActionFactory;
			for (int i = 0; i < drawableIds.Length; ++i)
			{
				int drawableId = drawableIds[i];
				int activityId = activityIds[i];

				mReturnActions.Add(factory.newCustomReturnItem(info, drawableId, activityId));
			}
		}
示例#37
0
		public virtual void reloadView()
		{
			Log.d(TAG, "reloadView()");

			Context context = Context;
			if (null == context || !(context is Activity))
			{
				Log.w(TAG, "Cannot reload view: context needs to be an instance of activity");
				return;
			}
			mBarAlignment = mBarInitialAlignment;
			SapaAppInfo sapaAppInfo = SapaAppInfo.getAppInfo(((Activity) context).Intent);
			Log.d(TAG, "    sapa app info:" + sapaAppInfo);
			if (sapaAppInfo != null)
			{
				hideNoAnimation();
				SelectedApp = sapaAppInfo;
			}
		}
示例#38
0
		/// <summary>
		/// @brief Construct model item from SapaAppInfo structure
		/// </summary>
		/// <param name="info">  Data structure with information retrieved from SAPA
		/// </param>
		/// <returns> Model item representing ordinal application </returns>
		public static FcModelItem createOrdinal(FcContext fcContext, SapaAppInfo info)
		{
			return new FcModelItem(fcContext, info, FcConstants.APP_TYPE_ORDINAL);
		}
        private void handleActivationIntent(Intent intent)
        {
            // When application is activated from ProfessionalAudio system it
            // receives SapaAppInfo object describing it.
            // To obtain this object static method getSapaAppInfo() is to be used.
            SapaAppInfo info = SapaAppInfo.getAppInfo(intent);

            if (info != null)
            {
                string callerPackageName = intent.getStringExtra("com.samsung.android.sdk.professionalaudio.key.callerpackagename");
                if (callerPackageName == null)
                {
                    callerPackageName = "unknown";
                }
                mCallerPackageNameList[info.App.InstanceId] = callerPackageName;
                Log.d(TAG, "info.getApp.getInstanceId() " + info.App.InstanceId);
                if (!this.mAppInfoList.ContainsKey(info.App.InstanceId))
                {
                    this.mAppInfoList[info.App.InstanceId] = info;
                }
                try
                {
                    if (info.Configuration == null)
                    {
                        Log.d(TAG, "kaka, not exist configuration, volume[" + Logic.DEFAULT_VOLUME + "] will be set in " + info.App.InstanceId);
                        this.setConfiguration(info.App, Logic.DEFAULT_VOLUME);
                    }
                    else
                    {
                        Log.d(TAG, "kaka volume[" + info.Configuration.getInt("CONFIG") + "] was got from " + info.App.InstanceId);
                    }
                    // Actions are being set in SapaAppInfo representing this
                    // application.
                    mActionArray = new SparseArray <SapaActionInfo>();
                    mActionArray.put(0, new SapaActionInfo(MainActivity.VOLUME_DOWN, R.drawable.ctrl_btn_volume_down_default, this.PackageName));
                    mActionArray.put(1, new SapaActionInfo(MainActivity.VOLUME_UP, R.drawable.ctrl_btn_volume_up_default, this.PackageName));
                    info.Actions = mActionArray;

                    // Native part is being initialised.
                    SapaProcessor sapaProcessor = new SapaProcessor(this, null, new SapaProcessorStateListener(this, info.App));
                    this.mSapaService.register(sapaProcessor);
                    sapaProcessor.activate();
                    this.mProcessorList[info.App.InstanceId] = sapaProcessor;

                    Logic.sendVolume(sapaProcessor, this.getCurrectVolume(info.App));

                    // Information about ports is being set in SapaAppInfo
                    // representing this app.
                    // It can not be done before activating SapaProcessor.
                    info.PortFromSapaProcessor = sapaProcessor;

                    // Application needs to declare that it was successfully
                    // activated.
                    Log.d(TAG, "addactiveapp " + info.App.InstanceId);
                    this.mSapaAppService.addActiveApp(info);
                }
                catch (SapaConnectionNotSetException e)
                {
                    Log.e(TAG, "App could not be added to active as connection has not been made.");
                }
                catch (InstantiationException e)
                {
                    Log.e(TAG, "SapaService can not be instantiate");
                }
            }
            if (mActionsList != null && info != null && info.App != null)
            {
                this.mActionsList[info.App.InstanceId] = new ActionsPack(this, info.App);
            }
        }
示例#40
0
		public override void onDestroy()
		{
			Log.d(TAG, "onDestroy");

			//Native part of application is being deactivated.
			if (mSapaService != null && mSapaProcessor != null)
			{
				mSapaProcessor.deactivate();
				mSapaService.unregister(mSapaProcessor);
				this.mSapaProcessor = null;
			}

			if (this.mSapaAppService != null)
			{
				try
				{
					if (this.mMyInfo != null && this.mMyInfo.App != null)
					{
					//Application needs to declare that it was successfully deactivated.
					this.mSapaAppService.removeFromActiveApps(this.mMyInfo.App);
					}

					//Action definer is being removed.
					this.mSapaAppService.removeActionDefiner();
				}
				catch (SapaConnectionNotSetException e)
				{
					Log.e(TAG, "Instance could not be removed from active list because of connection exception.");
				}
				//Connection with remote service is finished.
				this.mSapaAppService.disconnect();
				this.mSapaAppService = null;
			}

			this.mMyInfo = null;


			base.onDestroy();
		}
示例#41
0
		/// <summary>
		/// @brief Construct model item from SapaAppInfo structure
		/// </summary>
		/// <param name="info">  Data structure with information retrieved from SAPA
		/// </param>
		/// <returns> Model item representing main application </returns>
		public static FcModelItem createMain(FcContext fcContext, SapaAppInfo info)
		{
			return new FcModelItem(fcContext, info, FcConstants.APP_TYPE_MAIN);
		}
示例#42
0
		private void prepareDefaultReturnActions(FcContext fcContext, SapaAppInfo info)
		{
			FcActionFactory factory = fcContext.ActionFactory;
			mReturnActions.Add(factory.newDefaultReturnItem(info));
		}
示例#43
0
        private void handleActivationIntent(Intent intent)
        {
            // When application is activated from ProfessionalAudio system it
            // receives SapaAppInfo object describing it.
            // To obtain this object static method getSapaAppInfo() is to be used.
            SapaAppInfo info = SapaAppInfo.getAppInfo(intent);

            if (info != null)
            {
                string callerPackageName = intent.getStringExtra("com.samsung.android.sdk.professionalaudio.key.callerpackagename");
                if (callerPackageName == null)
                {
                    callerPackageName = "unknown";
                }
                mCallerPackageNameList[info.App.InstanceId] = callerPackageName;
                Log.d(TAG, "info.getApp.getInstanceId() " + info.App.InstanceId);
                if (!this.mAppInfoList.ContainsKey(info.App.InstanceId))
                {
                    this.mAppInfoList[info.App.InstanceId] = info;
                }
                try
                {
                    // Actions are being set in SapaAppInfo representing this
                    // application.
                    mActionArray = new SparseArray <SapaActionInfo>();
                    mActionArray.put(0, new SapaActionInfo(MainActivity.ACTION_PLAY, R.drawable.ctrl_btn_play_default, this.PackageName));
                    mActionArray.put(1, new SapaActionInfo(MainActivity.ACTION_STOP, R.drawable.ctrl_btn_stop_default, this.PackageName, true, false));
                    info.Actions = mActionArray;

                    // Native part is being initialised.
                    SapaProcessor sapaProcessor = new SapaProcessor(this, null, new SapaProcessorStateListener(this, info.App));
                    this.mSapaService.register(sapaProcessor);
                    sapaProcessor.activate();
                    this.mProcessorList[info.App.InstanceId] = sapaProcessor;

                    // Information about ports is being set in SapaAppInfo
                    // representing this app.
                    // It can not be done before activating SapaProcessor.
                    info.PortFromSapaProcessor = sapaProcessor;

                    // Application needs to declare that it was successfully
                    // activated.
                    Log.d(TAG, "addactiveapp " + info.App.InstanceId);
                    this.mSapaAppService.addActiveApp(info);
                }
                catch (SapaConnectionNotSetException e)
                {
                    Log.e(TAG, "App could not be added to active as connection has not been made.");
                }
                catch (InstantiationException e)
                {
                    Log.e(TAG, "SapaService can not be instantiate...");
                    Console.WriteLine(e.ToString());
                    Console.Write(e.StackTrace);
                }
            }
            if (mActionsList != null && info != null && info.App != null)
            {
                this.mActionsList[info.App.InstanceId] = new ActionsPack(this, info.App);
            }
        }
示例#44
0
		public virtual void insertApp(SapaAppInfo appInfo, int mode)
		{
			lock (this)
			{
				FcModelItem item = null;
				string instanceId = null;
				int position = -1;
				if (mode == FcConstants.APP_TYPE_ORDINAL)
				{
					item = FcModelItem.createOrdinal(mFcContext, appInfo);
					instanceId = item.InstanceId;
					mOrderedApplications.Add(instanceId);
					position = mOrderedApplications.Count - 1;
        
				}
				else if (mode == FcConstants.APP_TYPE_MAIN)
				{
					item = FcModelItem.createMain(mFcContext, appInfo);
					instanceId = item.InstanceId;
					mMainApplication = instanceId;
					position = 0;
        
				}
				else
				{
					throw new InvalidParameterException("Invalid mode: " + mode);
				}
        
				if (null == instanceId)
				{
					throw new System.InvalidOperationException("Model item not created: null reference!");
				}
				if (isActiveApp(instanceId))
				{
					item.Active = true;
				}
				item.Direction = mCurrentDirection;
        
				mApplicationMap[instanceId] = item;
        
				Log.d(TAG, "Inserting application to the model: " + instanceId);
				if (null != mModelChangedListener && position >= 0)
				{
					mModelChangedListener.onFcModelItemInserted(position);
				}
			}
		}
示例#45
0
		private void prepareActions(FcContext fcContext, SapaAppInfo info)
		{
			prepareReturnActions(fcContext, info);
			prepareCallActions(fcContext, info);
			if (mDirection == LinearLayout.LAYOUT_DIRECTION_RTL)
			{
				reverseActions();
			}
		}
示例#46
0
		public virtual void updateApp(SapaAppInfo appInfo, int mode)
		{
			lock (this)
			{
				string instanceId = appInfo.App.InstanceId;
				Log.d(TAG, "updateApp(" + instanceId + ", mode: " + mode + ")");
        
				FcModelItem item = getItemForInstanceId(appInfo.App.InstanceId);
				if (null == item)
				{
					Log.w(TAG, "Cannot update app " + instanceId + ": unknown app");
					return;
				}
        
				int position;
				if (mode == FcConstants.APP_TYPE_MAIN)
				{
					position = 0;
        
				}
				else if (mode == FcConstants.APP_TYPE_ORDINAL)
				{
					position = mOrderedApplications.IndexOf(instanceId);
					if (position < 0)
					{
						Log.w(TAG, "Cannot update app " + instanceId + ": not found on ordered list");
						return;
					}
					if (null != mMainApplication)
					{
						position += 1;
					}
        
				}
				else
				{
					throw new InvalidParameterException("Unsupported mode " + mode);
				}
        
				// This needs to be updated after all the logic guards
				if (FcConstants.OPT_DETAILED_LOGS)
				{
					Log.d(TAG, "Updating application in a model: " + instanceId);
				}
				item.update(mFcContext, appInfo);
        
				if (null != mModelChangedListener)
				{
					mModelChangedListener.onFcModelChanged(position);
				}
			}
		}
示例#47
0
		private void prepareCallActions(FcContext fcContext, SapaAppInfo appInfo)
		{
			FcActionFactory factory = fcContext.ActionFactory;
			SparseArray<SapaActionInfo> actions = appInfo.Actions;
			for (int i = 0; i < actions.size(); ++i)
			{
				SapaActionInfo actionInfo = actions.get(i);
				FcActionItem action = factory.newAppItem(appInfo, actionInfo);
				string actionName = actionInfo.Id;

				// Volume buttons needs to be separated from the rest of actions
				if (FcConstants.ACTION_VOLUME_UP.Equals(actionName))
				{
					mVolumeActions[VOLUME_UP_INDEX] = action;
				}
				else if (FcConstants.ACTION_VOLUME_DOWN.Equals(actionName))
				{
					mVolumeActions[VOLUME_DOWN_INDEX] = action;
				}
				else
				{
					mCallActions.Add(action);
				}
			}
		}
示例#48
0
		public override void onServiceConnected()
		{
			Log.d(TAG, "onServiceConnected");
			try
			{
				if (this.mMyInfo == null)
				{
					mMyInfo = mSapaAppService.getInstalledApp(this.PackageName);
				}
				if (mMyInfo != null)
				{

					//Actions are being set in SapaAppInfo representing this application.
					mActionArray = new SparseArray<SapaActionInfo>();
					mActionArray.put(0, new SapaActionInfo(COMMAND_SHUSH, R.drawable.ctrl_btn_stop_default, PackageName));
					mMyInfo.Actions = mActionArray;

					//Native part is being initialised.
					Sapa sapa = new Sapa();
					sapa.initialize(this);
					mSapaService = new SapaService();
					mSapaProcessor = new SapaProcessor(this, null, new SapaProcessorStateListener(this, mMyInfo.App));
					mSapaService.register(mSapaProcessor);
					mSapaProcessor.activate();

					//Information about ports is being set in SapaAppInfo representing this app.
					//It can not be done before activating SapaProcessor.
					mMyInfo.PortFromSapaProcessor = mSapaProcessor;

					//Application needs to declare that it was successfully activated.
					if (mSapaAppService != null)
					{
						this.mSapaAppService.addActiveApp(this.mMyInfo);
					}
				}
			}
			catch (SapaConnectionNotSetException e)
			{
				Log.e(TAG, "App could not be added to active as connection has not been made.");
			}
			catch (System.ArgumentException e)
			{
				Log.e(TAG, "Initialisation of Sapa is not possible due to invalid context of application");
			}
			catch (SsdkUnsupportedException e)
			{
				Log.e(TAG, "Initialisation of Sapa is not possible as Sapa is not available on the device");
			}
			catch (InstantiationException e)
			{
				Log.e(TAG, "SapaService can not be instantiate");
			}
		}