void computeMinMaxScroll(ArrayList<T> data,boolean launchedWithAltTab,boolean launchedFromHome){
  mTaskProgressMap.clear();
  if (data.isEmpty()) {
    mMinScrollP=mMaxScrollP=0;
    return;
  }
  int taskHeight=mTaskRect.height();
  float pAtBottomOfStackRect=screenYToCurveProgress(mStackVisibleRect.bottom);
  float pWithinAffiliateTop=screenYToCurveProgress(mStackVisibleRect.bottom - mWithinAffiliationOffset);
  float scale=curveProgressToScale(pWithinAffiliateTop);
  int scaleYOffset=(int)(((1f - scale) * taskHeight) / 2);
  pWithinAffiliateTop=screenYToCurveProgress(mStackVisibleRect.bottom - mWithinAffiliationOffset + scaleYOffset);
  float pWithinAffiliateOffset=pAtBottomOfStackRect - pWithinAffiliateTop;
  float pBetweenAffiliateOffset=pAtBottomOfStackRect - screenYToCurveProgress(mStackVisibleRect.bottom - mBetweenAffiliationOffset);
  float pTaskHeightOffset=pAtBottomOfStackRect - screenYToCurveProgress(mStackVisibleRect.bottom - taskHeight);
  float pNavBarOffset=pAtBottomOfStackRect - screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom));
  float pAtBackMostCardTop=0.5f;
  float pAtFrontMostCardTop=pAtBackMostCardTop;
  int taskCount=data.size();
  for (int i=0; i < taskCount; i++) {
    mTaskProgressMap.put(data.get(i),pAtFrontMostCardTop);
    if (i < (taskCount - 1)) {
      float pPeek=pBetweenAffiliateOffset;
      pAtFrontMostCardTop+=pPeek;
    }
  }
  mMaxScrollP=pAtFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
  mMinScrollP=data.size() == 1 ? Math.max(mMaxScrollP,0f) : 0f;
  if (launchedWithAltTab && launchedFromHome) {
    mInitialScrollP=mMaxScrollP;
  }
 else {
    mInitialScrollP=pAtFrontMostCardTop - 0.825f;
  }
  mInitialScrollP=Math.min(mMaxScrollP,Math.max(0,mInitialScrollP));
}

void computeMinMaxScroll ( ArrayList < T > data , boolean launchedWithAltTab , boolean launchedFromHome ) { mTaskProgressMap . clear ( ) ; if ( data . isEmpty ( ) ) { mMinScrollP = mMaxScrollP = 0 ; return ; } int taskHeight = mTaskRect . height ( ) ; float pAtBottomOfStackRect = screenYToCurveProgress ( mStackVisibleRect . bottom ) ; float pWithinAffiliateTop = screenYToCurveProgress ( mStackVisibleRect . bottom - mWithinAffiliationOffset ) ; float scale = curveProgressToScale ( pWithinAffiliateTop ) ; int scaleYOffset = ( int ) ( ( ( 1f - scale ) * taskHeight ) / 2 ) ; pWithinAffiliateTop = screenYToCurveProgress ( mStackVisibleRect . bottom - mWithinAffiliationOffset + scaleYOffset ) ; float pWithinAffiliateOffset = pAtBottomOfStackRect - pWithinAffiliateTop ; float pBetweenAffiliateOffset = pAtBottomOfStackRect - screenYToCurveProgress ( mStackVisibleRect . bottom - mBetweenAffiliationOffset ) ; float pTaskHeightOffset = pAtBottomOfStackRect - screenYToCurveProgress ( mStackVisibleRect . bottom - taskHeight ) ; float pNavBarOffset = pAtBottomOfStackRect - screenYToCurveProgress ( mStackVisibleRect . bottom - ( mStackVisibleRect . bottom - mStackRect . bottom ) ) ; float pAtBackMostCardTop = 0.5f ; float pAtFrontMostCardTop = pAtBackMostCardTop ; int taskCount = data . size ( ) ; for ( int i = 0 ; i < taskCount ; i ++ ) { mTaskProgressMap . put ( data . get ( i ) , pAtFrontMostCardTop ) ; if ( i < ( taskCount - 1 ) ) { float pPeek = pBetweenAffiliateOffset ; pAtFrontMostCardTop += pPeek ; } } mMaxScrollP = pAtFrontMostCardTop - ( ( 1f - pTaskHeightOffset - pNavBarOffset ) ) ; mMinScrollP = data . size ( ) == 1 ? Math . max ( mMaxScrollP , 0f ) : 0f ; if ( launchedWithAltTab && launchedFromHome ) { mInitialScrollP = mMaxScrollP ; } else { mInitialScrollP = pAtFrontMostCardTop - 0.825f ; } mInitialScrollP = Math . min ( mMaxScrollP , Math . max ( 0 , mInitialScrollP ) ) ; }
computes the minimum and maximum scroll progress values . this method may be called before the recentsconfiguration is set , so we need to pass in the alt - tab state .
