// Called when "Share" is clicked.
  private static boolean onImageShareClicked(MenuInvoker onInvoke, final Activity activity) {
    onInvoke.run(
        new MenuCallback() {
          public void run(Uri u, IImage image) {
            if (image == null) return;

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_SEND);
            String mimeType = image.getMimeType();
            intent.setType(mimeType);
            intent.putExtra(Intent.EXTRA_STREAM, u);
            boolean isImage = ImageManager.isImage(image);
            try {
              activity.startActivity(
                  Intent.createChooser(
                      intent, activity.getText(isImage ? R.string.sendImage : R.string.sendVideo)));
            } catch (android.content.ActivityNotFoundException ex) {
              Toast.makeText(
                      activity,
                      isImage ? R.string.no_way_to_share_image : R.string.no_way_to_share_video,
                      Toast.LENGTH_SHORT)
                  .show();
            }
          }
        });
    return true;
  }
 public FormsetsEditor() {
   formsetsModel.addListener(this);
   languageEditor.formsetsEditor = this;
   formsEditor.setFormsetsModel(formsetsModel);
   bar.formsetsEditor = this;
   formsEditor.addListener(elementEditor);
   formsEditor.addListener(bar);
   menu.setBar(bar);
   formsEditor.registerMenu(menu);
 }
 // Called when "Delete" is clicked.
 private static boolean onDeleteClicked(
     MenuInvoker onInvoke, final Activity activity, final Runnable onDelete) {
   onInvoke.run(
       new MenuCallback() {
         public void run(Uri uri, IImage image) {
           if (image != null) {
             deleteImage(activity, onDelete, image);
           }
         }
       });
   return true;
 }
 // Called when "Play" is clicked.
 private static boolean onViewPlayClicked(MenuInvoker onInvoke, final Activity activity) {
   onInvoke.run(
       new MenuCallback() {
         public void run(Uri uri, IImage image) {
           if (image != null) {
             Intent intent = new Intent(Intent.ACTION_VIEW, image.fullSizeImageUri());
             activity.startActivity(intent);
           }
         }
       });
   return true;
 }
 // Called when "Rotate left" or "Rotate right" is clicked.
 private static boolean onRotateClicked(MenuInvoker onInvoke, final int degree) {
   onInvoke.run(
       new MenuCallback() {
         public void run(Uri u, IImage image) {
           if (image == null || image.isReadonly()) {
             return;
           }
           image.rotateImageBy(degree);
         }
       });
   return true;
 }
  // Called when "Set as" is clicked.
  private static boolean onSetAsClicked(MenuInvoker onInvoke, final Activity activity) {
    onInvoke.run(
        new MenuCallback() {
          public void run(Uri u, IImage image) {
            if (u == null || image == null) {
              return;
            }

            Intent intent = Util.createSetAsIntent(image);
            activity.startActivity(
                Intent.createChooser(intent, activity.getText(R.string.setImage)));
          }
        });
    return true;
  }
  // Called when "Crop" is clicked.
  private static boolean onCropClicked(MenuInvoker onInvoke, final Activity activity) {
    onInvoke.run(
        new MenuCallback() {
          public void run(Uri u, IImage image) {
            if (u == null) {
              return;
            }

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            cropIntent.setData(u);
            activity.startActivityForResult(cropIntent, RESULT_COMMON_MENU_CROP);
          }
        });
    return true;
  }
  // Called when "Show on Maps" is clicked.
  // Displays image location on Google Maps for further operations.
  private static boolean onShowMapClicked(
      MenuInvoker onInvoke, final Handler handler, final Activity activity) {
    onInvoke.run(
        new MenuCallback() {
          public void run(Uri u, IImage image) {
            if (image == null) {
              return;
            }

            boolean ok = false;
            ExifInterface exif = getExif(image);
            float latlng[] = null;
            if (exif != null) {
              latlng = new float[2];
              if (exif.getLatLong(latlng)) {
                ok = true;
              }
            }

            if (!ok) {
              handler.post(
                  new Runnable() {
                    public void run() {
                      Toast.makeText(activity, R.string.no_location_image, Toast.LENGTH_SHORT)
                          .show();
                    }
                  });
              return;
            }

            // Can't use geo:latitude,longitude because it only centers
            // the MapView to specified location, but we need a bubble
            // for further operations (routing to/from).
            // The q=(lat, lng) syntax is suggested by geo-team.
            String uri =
                "http://maps.google.com/maps?f=q&" + "q=(" + latlng[0] + "," + latlng[1] + ")";
            activity.startActivity(new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)));
          }
        });
    return true;
  }
  // Called when "Details" is clicked.
  // Displays detailed information about the image/video.
  private static boolean onDetailsClicked(
      MenuInvoker onInvoke, final Handler handler, final Activity activity) {
    onInvoke.run(
        new MenuCallback() {
          public void run(Uri u, IImage image) {
            if (image == null) {
              return;
            }

            final AlertDialog.Builder builder = new AlertDialog.Builder(activity);

            final View d = View.inflate(activity, R.layout.detailsview, null);

            ImageView imageView = (ImageView) d.findViewById(R.id.details_thumbnail_image);
            imageView.setImageBitmap(image.miniThumbBitmap());

            TextView textView = (TextView) d.findViewById(R.id.details_image_title);
            textView.setText(image.getTitle());

            long length = getImageFileSize(image);
            String lengthString =
                length < 0 ? EMPTY_STRING : Formatter.formatFileSize(activity, length);
            ((TextView) d.findViewById(R.id.details_file_size_value)).setText(lengthString);

            d.findViewById(R.id.details_frame_rate_row).setVisibility(View.GONE);
            d.findViewById(R.id.details_bit_rate_row).setVisibility(View.GONE);
            d.findViewById(R.id.details_format_row).setVisibility(View.GONE);
            d.findViewById(R.id.details_codec_row).setVisibility(View.GONE);

            int dimensionWidth = 0;
            int dimensionHeight = 0;
            if (ImageManager.isImage(image)) {
              // getWidth is much slower than reading from EXIF
              dimensionWidth = image.getWidth();
              dimensionHeight = image.getHeight();
              d.findViewById(R.id.details_duration_row).setVisibility(View.GONE);
            }

            String value = null;
            if (dimensionWidth > 0 && dimensionHeight > 0) {
              value =
                  String.format(
                      activity.getString(R.string.details_dimension_x),
                      dimensionWidth,
                      dimensionHeight);
            }

            if (value != null) {
              setDetailsValue(d, value, R.id.details_resolution_value);
            } else {
              hideDetailsRow(d, R.id.details_resolution_row);
            }

            value = EMPTY_STRING;
            long dateTaken = image.getDateTaken();
            if (dateTaken != 0) {
              Date date = new Date(image.getDateTaken());
              SimpleDateFormat dateFormat = new SimpleDateFormat();
              value = dateFormat.format(date);
            }
            if (value != EMPTY_STRING) {
              setDetailsValue(d, value, R.id.details_date_taken_value);
            } else {
              hideDetailsRow(d, R.id.details_date_taken_row);
            }

            // Show more EXIF header details for JPEG images.
            if (JPEG_MIME_TYPE.equals(image.getMimeType())) {
              showExifInformation(image, d, activity);
            } else {
              hideExifInformation(d);
            }

            builder.setNeutralButton(
                R.string.details_ok,
                new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                  }
                });

            handler.post(
                new Runnable() {
                  public void run() {
                    builder
                        .setIcon(android.R.drawable.ic_dialog_info)
                        .setTitle(R.string.details_panel_title)
                        .setView(d)
                        .show();
                  }
                });
          }
        });
    return true;
  }