/// <summary>
 /// @brief Check whether given item got the same package as the other item
 ///
 /// Might be used to check whether two references to <seealso cref="FcModelItem"/> classes represents
 /// the same application (but instance of the application might be different)
 /// </summary>
 /// <param name="other"> Other model item to check
 ///
 /// @return </param>
 public virtual bool samePackageName(FcModelItem other)
 {
     lock (this)
     {
         return(mPackageName.Equals(other.mPackageName));
     }
 }
Example #2
0
		//
		// FcAdapterModel interface
		//

		public virtual int getInstanceNumber(FcModelItem item)
		{
			// Ordered list could be used to access instanceId faster, but this method is
			// more readable and refactor-friendly.
			string instanceId = item.InstanceId;
			return char.digit(instanceId[instanceId.Length - 1], 10);
		}
		public override void prepareViewHolder(FcContext fcContext, FcAdapterModel model, FcModelItem item)
		{
			cleanLayouts();

			itemView.Visibility = View.VISIBLE;

			mDeviceLayout.LayoutDirection = item.Direction;

			mDeviceActions.LayoutDirection = item.Direction;
			mDeviceActions.Visibility = View.VISIBLE;
			mDeviceActions.Gravity = Gravity.CENTER;
			IList<FcActionItem> callActions = item.CallActions;
			prepareActionButtons(fcContext, callActions, mDeviceActions);

			mDeviceOpenActions.LayoutDirection = item.Direction;
			mDeviceOpenActions.Visibility = View.VISIBLE;
			mDeviceOpenActions.Gravity = Gravity.CENTER;
			IList<FcActionItem> returnActions = item.ReturnActions;
			prepareActionButtons(fcContext, returnActions, mDeviceOpenActions);

			if (item.hasVolumeActions())
			{
				mDeviceVolumes.LayoutDirection = item.Direction;
				mDeviceVolumes.Visibility = View.VISIBLE;
				mDeviceVolumes.Gravity = Gravity.CENTER;
				IList<FcActionItem> volumeActions = item.VolumeActions;
				prepareActionButtons(fcContext, volumeActions, mDeviceVolumes);
			}
		}
Example #4
0
        //
        // FcAdapterModel interface
        //

        public virtual int getInstanceNumber(FcModelItem item)
        {
            // Ordered list could be used to access instanceId faster, but this method is
            // more readable and refactor-friendly.
            string instanceId = item.InstanceId;

            return(char.digit(instanceId[instanceId.Length - 1], 10));
        }
Example #5
0
        public override long getItemId(int position)
        {
            if (position >= mModel.ItemCount)
            {
                int overflowPos = position - mModel.ItemCount;
                return(long.MaxValue - overflowPos);
            }

            FcModelItem item = mModel.getItem(position);

            return(item.InstanceId.GetHashCode());
        }
Example #6
0
 public override void onBindViewHolder(BaseViewHolder viewHolder, int position)
 {
     lock (mModel)
     {
         if (FcConstants.OPT_DETAILED_LOGS)
         {
             Log.d(TAG, "onBindViewHolder: position=" + position);
         }
         FcModelItem item = (mModel.ItemCount > position) ? mModel.getItem(position) : null;
         viewHolder.prepareViewHolder(mContext, mModel, item);
     }
 }
Example #7
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);
                }
            }
        }
Example #8
0
 /// <summary>
 /// @brief
 /// </summary>
 public virtual void hideExpanded()
 {
     lock (this)
     {
         lock (mModel)
         {
             Log.d(TAG, "hideExpanded");
             for (int i = 0; i < mModel.ItemCount; ++i)
             {
                 FcModelItem item = mModel.getItem(i);
                 item.Expanded = false;
                 // Do not notify
             }
         }
     }
 }
Example #9
0
 public virtual int getItemPosition(FcModelItem item)
 {
     lock (this)
     {
         int count = ItemCount;
         for (int i = 0; i < count; ++i)
         {
             FcModelItem otherItem = getItem(i);
             if (item.InstanceId.Equals(otherItem.InstanceId))
             {
                 return(i);
             }
         }
         return(-1);
     }
 }
Example #10
0
        public virtual bool isMultiInstance(FcModelItem srcItem)
        {
            lock (this)
            {
                int count = 0;
                // No reason to cache counters, there's only (at max) 25 items
                foreach (FcModelItem item in mApplicationMap.Values)
                {
                    if (item.samePackageName(srcItem))
                    {
                        ++count;
                    }
                }

                return(count > 1);
            }
        }
Example #11
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);
                }
            }
        }
Example #12
0
        /// <summary>
        /// @brief
        /// </summary>
        /// <param name="item"> </param>
        public virtual void notifyItemChanged(FcModelItem item)
        {
            lock (this)
            {
                lock (mModel)
                {
                    int position = mModel.getItemPosition(item);
                    Log.d(TAG, "notifyItemChanged(" + item + ") position = " + position);
                    if (position < 0)
                    {
                        Log.w(TAG, "The item " + item.InstanceId + " cannot be found in the model");
                        return;
                    }

                    notifyItemChanged(position);
                }
            }
        }
		/// <summary>
		/// @brief Check whether given item got the same package as the other item
		/// 
		/// Might be used to check whether two references to <seealso cref="FcModelItem"/> classes represents
		/// the same application (but instance of the application might be different)
		/// </summary>
		/// <param name="other"> Other model item to check
		/// 
		/// @return </param>
		public virtual bool samePackageName(FcModelItem other)
		{
			lock (this)
			{
				return mPackageName.Equals(other.mPackageName);
			}
		}
            public override void onClick(View v)
            {
                FcModelItem curItem = mItem;

                if (null == curItem)
                {
                    Log.w(TAG, "Clicked on an app without bound item");
                    return;
                }

                if (outerInstance.mIsFreeze)
                {
                    outerInstance.displayToast(v, [email protected]_app_text);
                    return;
                }

                Log.d(TAG, "onClick for app " + mItem.InstanceId);

                lock (curItem)
                {
                    if (curItem.Expanded)
                    {
                        curItem.Expanded = false;
                        mAdapter.notifyItemChanged(curItem);
                        return;
                    }
                }

                bool invalidateAll = false;
                int  previousIndex = -1;

                lock (curItem)
                {
                    FcModelItem expandedItem = mAdapter.ExpandedItem;
                    if (null != expandedItem)
                    {
                        expandedItem.Expanded = false;
                        invalidateAll         = true;
                        previousIndex         = mAdapter.getItemPosition(expandedItem);
                    }
                    curItem.Expanded    = true;
                    curItem.ScrollFocus = true;
                }

                if (invalidateAll)
                {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nextIndex = mAdapter.getItemPosition(curItem);
                    int nextIndex = mAdapter.getItemPosition(curItem);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int lowerIndex = Math.min(previousIndex, nextIndex);
                    int lowerIndex = Math.Min(previousIndex, nextIndex);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int higherIndex = Math.max(previousIndex, nextIndex);
                    int higherIndex = Math.Max(previousIndex, nextIndex);
                    mAdapter.notifyItemRangeChanged(lowerIndex, higherIndex - lowerIndex + 1);
                }
                else
                {
                    mAdapter.notifyItemChanged(curItem);
                }
            }
        public override void prepareViewHolder(FcContext fcContext, FcAdapterModel model, FcModelItem item)
        {
            if (FcConstants.OPT_DETAILED_LOGS)
            {
                Log.d(TAG, "prepareViewHolder(" + item + ")");
            }
            Context context = fcContext.Context;

            cleanLayouts();

            mFcModelItem = item;
            mExpandActionsButtonListener.Item = mFcModelItem;

            if (item.Expanded)
            {
                mDeviceRootLayout.Visibility         = View.VISIBLE;
                mDeviceRootLayout.LayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
            }
            else
            {
                mDeviceRootLayout.Visibility         = View.VISIBLE;
                mDeviceRootLayout.LayoutParams.width = 0;
            }
            mDeviceRootLayout.requestLayout();

            // Setting up device_app_button
            mDeviceAppButton.Background = getBackground(fcContext, item.Active);
            LinearLayout.LayoutParams @params = (LinearLayout.LayoutParams)mDeviceAppButton.LayoutParams;
            @params.gravity = Gravity.CENTER;

            int padding = context.Resources.getDimensionPixelSize(R.dimen.floating_controller_active_app_frame_stroke_width) + context.Resources.getDimensionPixelSize(R.dimen.floating_controller_ordinal_app_layout_distance_between_app_icon_and_active_indication_frame);

            Drawable deviceAppDrawable = mFcModelItem.Icon;

            if (model.isMultiInstance(item))
            {
                int number   = model.getInstanceNumber(item);
                int iconSize = context.Resources.getDimensionPixelSize(R.dimen.ord_app_expand_action_button_width);
                deviceAppDrawable = DrawableTool.getDrawableWithNumber(deviceAppDrawable, number, iconSize, context);
            }

            mIsFreeze = model.isAppFreeze(item.InstanceId);

            if (mIsFreeze)
            {
                deviceAppDrawable = getFreezeDrawable(fcContext.Context, deviceAppDrawable);
            }

            int actionCount = item.CallActions.Count;

            actionCount += item.VolumeActions.Count;
            actionCount += item.ReturnActions.Count;

            if (actionCount > 1)
            {
                mDeviceAppButton.OnClickListener = mExpandActionsButtonListener;
            }
            else
            {
                mDeviceAppButton.OnClickListener = mOpenAppDirectlyButtonListener;
            }

            mDeviceAppButton.setPadding(padding, padding, padding, padding);
            mDeviceAppButton.ImageDrawable = deviceAppDrawable;

            // Open Actions
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> returnActions = item.getReturnActions();
            IList <FcActionItem> returnActions = item.ReturnActions;
            int numberOfElements = returnActions.Count;

            for (int i = 0; i < numberOfElements; i++)
            {
                addActionButton(mDeviceOpenActions, returnActions[i], R.layout.fc_ordinal_open_app_button, i, numberOfElements, fcContext, false);
            }

            if (numberOfElements > 0)
            {
                mDeviceOpenActions.Visibility = View.VISIBLE;
            }
            else
            {
                mDeviceOpenActions.Visibility = View.GONE;
            }

            // Call Actions
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> callActions = item.getCallActions();
            IList <FcActionItem> callActions = item.CallActions;

            numberOfElements = callActions.Count;
            string bypassOn  = fcContext.Context.Resources.getString([email protected]_on);
            string bypassOff = fcContext.Context.Resources.getString([email protected]_off);

            for (int i = 0; i < numberOfElements; i++)
            {
                string itemId = callActions[i].Id;
                if (itemId.Equals(bypassOff))
                {
                    addBypassAction(fcContext, mDeviceActions, callActions[i], [email protected]_text_off);
                }
                else if (itemId.Equals(bypassOn))
                {
                    addBypassAction(fcContext, mDeviceActions, callActions[i], [email protected]_text_on);
                }
                else
                {
                    addActionButton(mDeviceActions, callActions[i], R.layout.fc_ordinal_action_button, i, numberOfElements, fcContext, true);
                }
            }

            if (numberOfElements > 0)
            {
                mDeviceActions.Visibility = View.VISIBLE;
            }
            else
            {
                mDeviceActions.Visibility = View.GONE;
            }

            // Volume Actions
            if (item.hasVolumeActions())
            {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> volumeActions = item.getVolumeActions();
                IList <FcActionItem> volumeActions = item.VolumeActions;
                numberOfElements = volumeActions.Count;

                // handle volume label anomaly
                if (item.Direction == LinearLayout.LAYOUT_DIRECTION_LTR)
                {
                    for (int i = 0; i < numberOfElements; i++)
                    {
                        addActionButton(mDeviceVolumes, volumeActions[i], R.layout.fc_ordinal_action_button, i, numberOfElements, fcContext, true);
                    }
                }
                else
                {
                    for (int i = numberOfElements - 1; i >= 0; i--)
                    {
                        addActionButton(mDeviceVolumes, volumeActions[i], R.layout.fc_ordinal_action_button, numberOfElements - 1 - i, numberOfElements, fcContext, true);
                    }
                }
                // this handles the requirement that volume label is always before volume actions in a layout
                float marginSize = fcContext.getDimensionPixelSize(R.dimen.ord_app_action_volume_layout_margin_ltr);
                if (item.Direction == LinearLayout.LAYOUT_DIRECTION_RTL)
                {
                    marginSize = fcContext.getDimensionPixelSize(R.dimen.ord_app_action_volume_layout_margin_rtl);
                }
                reverseLayoutWithMargins(mDeviceVolumeActions, item.Direction, marginSize);

                mDeviceVolumeActions.Visibility = View.VISIBLE;
            }
            else
            {
                mDeviceVolumeActions.Visibility = View.GONE;
            }
        }
Example #16
0
		public virtual bool isMultiInstance(FcModelItem srcItem)
		{
			lock (this)
			{
				int count = 0;
				// No reason to cache counters, there's only (at max) 25 items
				foreach (FcModelItem item in mApplicationMap.Values)
				{
					if (item.samePackageName(srcItem))
					{
						++count;
					}
				}
        
				return count > 1;
			}
		}
Example #17
0
		public virtual int getItemPosition(FcModelItem item)
		{
			lock (this)
			{
				int count = ItemCount;
				for (int i = 0; i < count; ++i)
				{
					FcModelItem otherItem = getItem(i);
					if (item.InstanceId.Equals(otherItem.InstanceId))
					{
						return i;
					}
				}
				return -1;
			}
		}
Example #18
0
        public override void prepareViewHolder(FcContext fcContext, FcAdapterModel model, FcModelItem item)
        {
            cleanLayouts();

            itemView.Visibility = View.VISIBLE;

            mDeviceLayout.LayoutDirection = item.Direction;

            mDeviceActions.LayoutDirection = item.Direction;
            mDeviceActions.Visibility      = View.VISIBLE;
            mDeviceActions.Gravity         = Gravity.CENTER;
            IList <FcActionItem> callActions = item.CallActions;

            prepareActionButtons(fcContext, callActions, mDeviceActions);

            mDeviceOpenActions.LayoutDirection = item.Direction;
            mDeviceOpenActions.Visibility      = View.VISIBLE;
            mDeviceOpenActions.Gravity         = Gravity.CENTER;
            IList <FcActionItem> returnActions = item.ReturnActions;

            prepareActionButtons(fcContext, returnActions, mDeviceOpenActions);

            if (item.hasVolumeActions())
            {
                mDeviceVolumes.LayoutDirection = item.Direction;
                mDeviceVolumes.Visibility      = View.VISIBLE;
                mDeviceVolumes.Gravity         = Gravity.CENTER;
                IList <FcActionItem> volumeActions = item.VolumeActions;
                prepareActionButtons(fcContext, volumeActions, mDeviceVolumes);
            }
        }
Example #19
0
 public override void prepareViewHolder(FcContext context, FcAdapterModel model, FcModelItem item)
 {
     // NOOP
 }
Example #20
0
 /// <summary>
 /// @brief TODO
 /// </summary>
 /// <param name="context"> Context </param>
 /// <param name="item"> FcModelItem </param>
 public abstract void prepareViewHolder(FcContext context, FcAdapterModel model, FcModelItem item);
		public override void prepareViewHolder(FcContext fcContext, FcAdapterModel model, FcModelItem item)
		{
			if (FcConstants.OPT_DETAILED_LOGS)
			{
				Log.d(TAG, "prepareViewHolder(" + item + ")");
			}
			Context context = fcContext.Context;
			cleanLayouts();

			mFcModelItem = item;
			mExpandActionsButtonListener.Item = mFcModelItem;

			if (item.Expanded)
			{
				mDeviceRootLayout.Visibility = View.VISIBLE;
				mDeviceRootLayout.LayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
			}
			else
			{
				mDeviceRootLayout.Visibility = View.VISIBLE;
				mDeviceRootLayout.LayoutParams.width = 0;
			}
			mDeviceRootLayout.requestLayout();

			// Setting up device_app_button
			mDeviceAppButton.Background = getBackground(fcContext, item.Active);
			LinearLayout.LayoutParams @params = (LinearLayout.LayoutParams) mDeviceAppButton.LayoutParams;
			@params.gravity = Gravity.CENTER;

			int padding = context.Resources.getDimensionPixelSize(R.dimen.floating_controller_active_app_frame_stroke_width) + context.Resources.getDimensionPixelSize(R.dimen.floating_controller_ordinal_app_layout_distance_between_app_icon_and_active_indication_frame);

			Drawable deviceAppDrawable = mFcModelItem.Icon;
			if (model.isMultiInstance(item))
			{
				int number = model.getInstanceNumber(item);
				int iconSize = context.Resources.getDimensionPixelSize(R.dimen.ord_app_expand_action_button_width);
				deviceAppDrawable = DrawableTool.getDrawableWithNumber(deviceAppDrawable, number, iconSize, context);
			}

			mIsFreeze = model.isAppFreeze(item.InstanceId);

			if (mIsFreeze)
			{
				deviceAppDrawable = getFreezeDrawable(fcContext.Context, deviceAppDrawable);
			}

			int actionCount = item.CallActions.Count;
			actionCount += item.VolumeActions.Count;
			actionCount += item.ReturnActions.Count;

			if (actionCount > 1)
			{
				mDeviceAppButton.OnClickListener = mExpandActionsButtonListener;
			}
			else
			{
				mDeviceAppButton.OnClickListener = mOpenAppDirectlyButtonListener;
			}

			mDeviceAppButton.setPadding(padding, padding, padding, padding);
			mDeviceAppButton.ImageDrawable = deviceAppDrawable;

			// Open Actions
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> returnActions = item.getReturnActions();
			IList<FcActionItem> returnActions = item.ReturnActions;
			int numberOfElements = returnActions.Count;

			for (int i = 0; i < numberOfElements; i++)
			{
				addActionButton(mDeviceOpenActions, returnActions[i], R.layout.fc_ordinal_open_app_button, i, numberOfElements, fcContext, false);
			}

			if (numberOfElements > 0)
			{
				mDeviceOpenActions.Visibility = View.VISIBLE;
			}
			else
			{
				mDeviceOpenActions.Visibility = View.GONE;
			}

			// Call Actions
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> callActions = item.getCallActions();
			IList<FcActionItem> callActions = item.CallActions;
			numberOfElements = callActions.Count;
			string bypassOn = fcContext.Context.Resources.getString([email protected]_on);
			string bypassOff = fcContext.Context.Resources.getString([email protected]_off);

			for (int i = 0; i < numberOfElements; i++)
			{
				string itemId = callActions[i].Id;
				if (itemId.Equals(bypassOff))
				{
					addBypassAction(fcContext, mDeviceActions, callActions[i], [email protected]_text_off);
				}
				else if (itemId.Equals(bypassOn))
				{
					addBypassAction(fcContext, mDeviceActions, callActions[i], [email protected]_text_on);
				}
				else
				{
					addActionButton(mDeviceActions, callActions[i], R.layout.fc_ordinal_action_button, i, numberOfElements, fcContext, true);
				}
			}

			if (numberOfElements > 0)
			{
				mDeviceActions.Visibility = View.VISIBLE;
			}
			else
			{
				mDeviceActions.Visibility = View.GONE;
			}

			// Volume Actions
			if (item.hasVolumeActions())
			{
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.List<FcActionItem> volumeActions = item.getVolumeActions();
				IList<FcActionItem> volumeActions = item.VolumeActions;
				numberOfElements = volumeActions.Count;

				// handle volume label anomaly
				if (item.Direction == LinearLayout.LAYOUT_DIRECTION_LTR)
				{
					for (int i = 0; i < numberOfElements; i++)
					{
						addActionButton(mDeviceVolumes, volumeActions[i], R.layout.fc_ordinal_action_button, i, numberOfElements, fcContext, true);
					}
				}
				else
				{
					for (int i = numberOfElements - 1; i >= 0; i--)
					{
						addActionButton(mDeviceVolumes, volumeActions[i], R.layout.fc_ordinal_action_button, numberOfElements - 1 - i, numberOfElements, fcContext, true);
					}
				}
				// this handles the requirement that volume label is always before volume actions in a layout
				float marginSize = fcContext.getDimensionPixelSize(R.dimen.ord_app_action_volume_layout_margin_ltr);
				if (item.Direction == LinearLayout.LAYOUT_DIRECTION_RTL)
				{
					marginSize = fcContext.getDimensionPixelSize(R.dimen.ord_app_action_volume_layout_margin_rtl);
				}
				reverseLayoutWithMargins(mDeviceVolumeActions, item.Direction, marginSize);

				mDeviceVolumeActions.Visibility = View.VISIBLE;
			}
			else
			{
				mDeviceVolumeActions.Visibility = View.GONE;
			}
		}
Example #22
0
 public virtual int getItemPosition(FcModelItem item)
 {
     return(mModel.getItemPosition(item));
 }