public void Show(int duration, ISnackbarManagerCallback callback)
 {
     lock (mLock)
     {
         if (IsCurrentSnackbar(callback))
         {
             // Means that the callback is already in the queue. We'll just update the duration
             mCurrentSnackbar.mDuration = duration;
             // If this is the TSnackbar currently being shown, call re-schedule it's
             // timeout
             mHandler.RemoveCallbacksAndMessages(mCurrentSnackbar);
             ScheduleTimeoutLocked(mCurrentSnackbar);
             return;
         }
         if (IsNextSnackbar(callback))
         {
             // We'll just update the duration
             mNextSnackbar.mDuration = duration;
         }
         else
         {
             // Else, we need to create a new record and queue it
             mNextSnackbar = new SnackbarRecord(duration, callback);
         }
         if (mCurrentSnackbar != null && CancelSnackbarLocked(mCurrentSnackbar,
             Callback.DISMISS_EVENT_CONSECUTIVE))
         {
             // If we currently have a TSnackbar, try and cancel it and wait in line
         }
         // Clear out the current snackbar
         mCurrentSnackbar = null;
         // Otherwise, just show it now
         ShowNextSnackbarLocked();
     }
 }
 public void HandleTimeout(SnackbarRecord record)
 {
     lock (mLock)
     {
         if (mCurrentSnackbar == record || mNextSnackbar == record)
         {
             CancelSnackbarLocked(record, Callback.DISMISS_EVENT_TIMEOUT);
         }
     }
 }
 public void OnDismissed(ISnackbarManagerCallback callback)
 {
     lock (mLock)
     {
         if (IsCurrentSnackbar(callback))
         {
             // If the callback is from a TSnackbar currently show, remove it and show a new one
             mCurrentSnackbar = null;
             if (mNextSnackbar != null)
             {
                 ShowNextSnackbarLocked();
             }
         }
     }
 }
        private void ScheduleTimeoutLocked(SnackbarRecord record)
        {
            if (record.mDuration == TSnackbar.LENGTH_INDEFINITE)
            {
                // If we're set to indefinite, we don't want to set a timeout
                return;
            }
            int durationMs = LONG_DURATION_MS;
            if (record.mDuration > 0)
            {
                durationMs = record.mDuration;
            }
            else if (record.mDuration == TSnackbar.LENGTH_SHORT)
            {
                durationMs = SHORT_DURATION_MS;
            }
            mHandler.RemoveCallbacksAndMessages(record);

            mHandler.PostDelayed(() => HandleTimeout(record), durationMs);
        }
 private bool CancelSnackbarLocked(SnackbarRecord record, int ev)
 {
     if (record.mCallback != null)
     {
         ISnackbarManagerCallback callbackResult;
         if (record.mCallback.TryGetTarget(out callbackResult))
         {
             callbackResult.Dismiss(ev);
             return true;
         }
     }
     return false;
 }
 private void ShowNextSnackbarLocked()
 {
     if (mNextSnackbar != null)
     {
         mCurrentSnackbar = mNextSnackbar;
         mNextSnackbar = null;
         if (mCurrentSnackbar.mCallback != null)
         {
             ISnackbarManagerCallback callbackResult;
             if (mCurrentSnackbar.mCallback.TryGetTarget(out callbackResult))
             {
                 callbackResult.Show();
             }
         }
         else
         {
             // The callback doesn't exist any more, clear out the TSnackbar
             mCurrentSnackbar = null;
         }
     }
 }