title: Syncing Video View with SeekBar with onStopTrackingTouch
body: <p>I am making a custom Video Player, I successfully synced the progress of video to the seekbak. I wanted that the videoview should sync its progress with seekbar's progress when user moves the seekbar handler. I achieved this too, but it's not behaving as i want it too. Let me elaborate this proble, When i touch the seekbar handler and move it (forward or backward) i update the seekbar progress, but when i leave the seekbar, the seekbar handler goes a step forward/backward and then starts playing instead of starting at the same point where i left. </p>
  
  <p><strong>Here's my code:</strong></p>
  
  <pre><code>public class MainActivity extends Activity implements OnSeekBarChangeListener {
  
      private VideoView vvVideo;
      private SeekBar sbVideo;
      private Handler mHandler = new Handler();
      private Utilities utils;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.custom_video_player);
          initOnjects();
          playVideo();
      }
  
      private void initOnjects() {
          vvVideo = (VideoView) findViewById(R.id.vvVideo);
          sbVideo = (SeekBar) findViewById(R.id.sbVideo);
          sbVideo.setOnSeekBarChangeListener(this);
          utils = new Utilities();
      }
  
      private void playVideo() {
          Uri uri = Uri
                  .parse("android.resource://com.sunshine.handsonequation/raw/title_video");
          vvVideo.setVideoURI(uri);
          sbVideo.setProgress(0);
          sbVideo.setMax(100);
          vvVideo.start();
          // Updating progress bar
          updateProgressBar();
      }
  
      private void updateProgressBar() {
          mHandler.postDelayed(updateTimeTask, 100);
      }
  
      private Runnable updateTimeTask = new Runnable() {
  
          @Override
          public void run() {
              long totalDuration = vvVideo.getDuration();
              long currentDuration = vvVideo.getCurrentPosition();
  
              // update progress bar
              int progress = (int) (utils.getProgressPercentage(currentDuration,
                      totalDuration));
              sbVideo.setProgress(progress);
              mHandler.postDelayed(this, 100);
  
          }
      };
  
      @Override
      public void onProgressChanged(SeekBar seekbar, int progress,
              boolean fromTouch) {
          // TODO Auto-generated method stub
  
      }
  
      // when user starts moving the progress handler
      @Override
      public void onStartTrackingTouch(SeekBar seekbar) {
          // remove message Handler from updating progress bar
          mHandler.removeCallbacks(updateTimeTask);
      }
  
      // when user stops moving the progress handler
      @Override
      public void onStopTrackingTouch(SeekBar seekbar) {
          mHandler.removeCallbacks(updateTimeTask);
          int totalDuration = vvVideo.getDuration();
          int currentPosition = utils.progressToTimer(sbVideo.getProgress(),
                  totalDuration);
  
          // forward or backward to certain seconds
          vvVideo.seekTo(currentPosition);
  
          // update timer progress again
          updateProgressBar();
      }
  }
  </code></pre>
  
  <p><strong>Utility Class:</strong></p>
  
  <pre><code>public class Utilities {
  
      /**
       * Function to convert milliseconds time to
       * Timer Format
       * Hours:Minutes:Seconds
       * */
      public String milliSecondsToTimer(long milliseconds){
          String finalTimerString = "";
          String secondsString = "";
  
          // Convert total duration into time
             int hours = (int)( milliseconds / (1000*60*60));
             int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
             int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
             // Add hours if there
             if(hours &gt; 0){
                 finalTimerString = hours + ":";
             }
  
             // Prepending 0 to seconds if it is one digit
             if(seconds &lt; 10){
                 secondsString = "0" + seconds;
             }else{
                 secondsString = "" + seconds;}
  
             finalTimerString = finalTimerString + minutes + ":" + secondsString;
  
          // return timer string
          return finalTimerString;
      }
  
      /**
       * Function to get Progress percentage
       * @param currentDuration
       * @param totalDuration
       * */
      public int getProgressPercentage(long currentDuration, long totalDuration){
          Double percentage = (double) 0;
  
          long currentSeconds = (int) (currentDuration / 1000);
          long totalSeconds = (int) (totalDuration / 1000);
  
          // calculating percentage
          percentage =(((double)currentSeconds)/totalSeconds)*100;
  
          // return percentage
          return percentage.intValue();
      }
  
      /**
       * Function to change progress to timer
       * @param progress -
       * @param totalDuration
       * returns current duration in milliseconds
       * */
      public int progressToTimer(int progress, int totalDuration) {
          int currentDuration = 0;
          totalDuration = (int) (totalDuration / 1000);
          currentDuration = (int) ((((double)progress) / 100) * totalDuration);
  
          // return current duration in milliseconds
          return currentDuration * 1000;
      }
  }
  </code></pre>
  
  <p>I have no clue why it is happening, I hope you guys can give me a hint or solution around this.</p>