@Override
  protected void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);

    // play this selection.
    String movieurl = video_absolutepath[(int) position];
    Log.d(TAG, " operation on " + movieurl);

    pu.launchVideoPlayer(this, movieurl);
  }
  public boolean onContextItemSelected(MenuItem item) {

    AdapterView.AdapterContextMenuInfo info =
        (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    Log.d(TAG, " got " + item.getItemId() + " at position " + info.position);

    if (!videos_available) {
      return true;
    }

    movieurl = video_absolutepath[info.position];
    sdrecord_id = video_ids[info.position];
    moviefilename = video_filename[info.position];
    hosted_url = hosted_urls[info.position];
    Log.d(
        TAG,
        " operation on "
            + movieurl
            + " id "
            + sdrecord_id
            + " filename "
            + moviefilename
            + " hosted url "
            + hosted_url);

    switch (item.getItemId()) {
      case MENU_ITEM_1:
        // play
        pu.launchVideoPlayer(this, movieurl);
        break;

      case MENU_ITEM_2:
        // delete

        // ask if sure they want to delete ?
        AlertDialog delete_dialog =
            new AlertDialog.Builder(this)
                .setMessage(R.string.really_delete_video)
                .setPositiveButton(
                    R.string.yes,
                    new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog, int whichButton) {

                        // deleting files,
                        if (!pu.deleteVideo(movieurl)) {
                          Log.w(TAG, "Cant delete file " + movieurl);
                        }
                        // and removing DB records!
                        if (dbutils.deleteSDFileRecord(sdrecord_id) == -1) {
                          Log.w(TAG, "Cant delete record " + sdrecord_id);
                        }

                        reloadList();
                      }
                    })
                .setNegativeButton(
                    R.string.cancel,
                    new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog, int whichButton) {}
                    })
                .show();

        break;

      case MENU_ITEM_3:
        // publish to video bin
        String[] strs_vb =
            dbutils.getTitleAndDescriptionFromID(new String[] {Long.toString(sdrecord_id)});
        // grab thread
        thread_vb =
            pu.videoUploadToVideoBin(
                this,
                handler,
                movieurl,
                strs_vb[0],
                strs_vb[1] + "\n" + getString(R.string.uploaded_by_),
                emailPreference,
                sdrecord_id);
        break;

      case MENU_ITEM_4:
        // email
        pu.launchEmailIntentWithCurrentVideo(this, movieurl);
        break;

      case MENU_ITEM_6:
        // FTP server upload
        thread_ftp =
            pu.videoUploadToFTPserver(
                this, handler, moviefilename, movieurl, emailPreference, sdrecord_id);

        break;

      case MENU_ITEM_7:
        // youtube

        String possibleEmail = null;
        // We need a linked google account for youtube.
        Account[] accounts = AccountManager.get(this).getAccountsByType("com.google");

        /*
        for (Account account : accounts) {
        	// TODO: Check possibleEmail against an email regex or treat
        	// account.name as an email address only for certain
        	// account.type values.
        	possibleEmail = account.name;
        	Log.d(TAG, "Could use : " + possibleEmail);
        }*/

        possibleEmail = accounts[0].name;

        if (possibleEmail != null) {
          Log.d(TAG, "Using account name for youtube upload .. " + possibleEmail);
          // This launches the youtube upload process
          pu.getYouTubeAuthTokenWithPermissionAndUpload(
              this, possibleEmail, movieurl, handler, emailPreference, sdrecord_id);
        } else {

          // throw up dialog
          AlertDialog no_email =
              new AlertDialog.Builder(this)
                  .setMessage(R.string.no_email_account_for_youtube)
                  .setPositiveButton(
                      R.string.yes,
                      new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {}
                      })
                  .show();
        }
        break;

      case MENU_ITEM_8:
        // Title and Description of Video

        showTitleDescriptionDialog();

        break;

      case MENU_ITEM_9:
        // Email the HOSTED URL field of the currently selected video

        if (hosted_url != null && hosted_url.length() > 0) {
          Intent i = new Intent(Intent.ACTION_SEND);
          i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          i.setType("message/rfc822");
          i.putExtra(Intent.EXTRA_TEXT, hosted_url);
          this.startActivity(i);
        } else {
          Toast.makeText(
                  this,
                  R.string.video_is_not_uploaded_yet_no_hosted_url_available_,
                  Toast.LENGTH_LONG)
              .show();
        }

        break;

      case MENU_ITEM_12:
        // View the HOSTED URL field of the currently selected video in a
        // web browser.

        if (hosted_url != null && hosted_url.length() > 0) {
          Intent i2 = new Intent(Intent.ACTION_VIEW);
          i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          i2.setData(Uri.parse(hosted_url));
          this.startActivity(i2);
        } else {
          Toast.makeText(
                  this,
                  R.string.video_is_not_uploaded_yet_no_hosted_url_available_,
                  Toast.LENGTH_LONG)
              .show();
        }
        break;
    }

    return true;
  }