/// <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)); } }
// // 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); } }
// // 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 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()); }
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); } }
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); } } }
/// <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 } } } }
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); } }
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); } }
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); } } }
/// <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; } }
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; } }
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; } }
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); } }
public override void prepareViewHolder(FcContext context, FcAdapterModel model, FcModelItem item) { // NOOP }
/// <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; } }
public virtual int getItemPosition(FcModelItem item) { return(mModel.getItemPosition(item)); }