private WPEditImageSpan createWPEditImageSpanRemote(Context context, MediaFile mediaFile) { int drawable = mediaFile.isVideo() ? R.drawable.media_movieclip : R.drawable.legacy_dashicon_format_image_big_grey; Uri uri = Uri.parse(mediaFile.getFileURL()); WPEditImageSpan imageSpan = new WPEditImageSpan(context, drawable, uri); imageSpan.setMediaFile(mediaFile); return imageSpan; }
@Override public boolean onTouch(View v, MotionEvent event) { float pos = event.getY(); if (event.getAction() == 0) mLastYPos = pos; if (event.getAction() > 1) { int scrollThreshold = DisplayUtils.dpToPx(getActivity(), 2); if (((mLastYPos - pos) > scrollThreshold) || ((pos - mLastYPos) > scrollThreshold)) mScrollDetected = true; } mLastYPos = pos; if (event.getAction() == MotionEvent.ACTION_UP) { ActionBar actionBar = getActionBar(); if (actionBar != null && actionBar.isShowing()) { setContentEditingModeVisible(true); return false; } } if (event.getAction() == MotionEvent.ACTION_UP && !mScrollDetected) { Layout layout = ((TextView) v).getLayout(); int x = (int) event.getX(); int y = (int) event.getY(); x += v.getScrollX(); y += v.getScrollY(); if (layout != null) { int line = layout.getLineForVertical(y); int charPosition = layout.getOffsetForHorizontal(line, x); Spannable spannable = mContentEditText.getText(); if (spannable == null) { return false; } // check if image span was tapped WPImageSpan[] imageSpans = spannable.getSpans(charPosition, charPosition, WPImageSpan.class); if (imageSpans.length != 0) { final WPImageSpan imageSpan = imageSpans[0]; MediaFile mediaFile = imageSpan.getMediaFile(); if (mediaFile == null) return false; if (!mediaFile.isVideo()) { LayoutInflater factory = LayoutInflater.from(getActivity()); final View alertView = factory.inflate(R.layout.alert_image_options, null); if (alertView == null) return false; final EditText imageWidthText = (EditText) alertView.findViewById(R.id.imageWidthText); final EditText titleText = (EditText) alertView.findViewById(R.id.title); final EditText caption = (EditText) alertView.findViewById(R.id.caption); final CheckBox featuredCheckBox = (CheckBox) alertView.findViewById(R.id.featuredImage); final CheckBox featuredInPostCheckBox = (CheckBox) alertView.findViewById(R.id.featuredInPost); // show featured image checkboxes if supported if (mFeaturedImageSupported) { featuredCheckBox.setVisibility(View.VISIBLE); featuredInPostCheckBox.setVisibility(View.VISIBLE); } featuredCheckBox.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { featuredInPostCheckBox.setVisibility(View.VISIBLE); } else { featuredInPostCheckBox.setVisibility(View.GONE); } } }); final SeekBar seekBar = (SeekBar) alertView.findViewById(R.id.imageWidth); final Spinner alignmentSpinner = (Spinner) alertView.findViewById(R.id.alignment_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( getActivity(), R.array.alignment_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); alignmentSpinner.setAdapter(adapter); imageWidthText.setText(String.valueOf(mediaFile.getWidth()) + "px"); seekBar.setProgress(mediaFile.getWidth()); titleText.setText(mediaFile.getTitle()); caption.setText(mediaFile.getCaption()); featuredCheckBox.setChecked(mediaFile.isFeatured()); if (mediaFile.isFeatured()) { featuredInPostCheckBox.setVisibility(View.VISIBLE); } else { featuredInPostCheckBox.setVisibility(View.GONE); } featuredInPostCheckBox.setChecked(mediaFile.isFeaturedInPost()); alignmentSpinner.setSelection(mediaFile.getHorizontalAlignment(), true); final int maxWidth = MediaUtils.getMinimumImageWidth( getActivity(), imageSpan.getImageSource(), mBlogSettingMaxImageWidth); seekBar.setMax(maxWidth / 10); if (mediaFile.getWidth() != 0) { seekBar.setProgress(mediaFile.getWidth() / 10); } seekBar.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) {} @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (progress == 0) { progress = 1; } imageWidthText.setText(progress * 10 + "px"); } }); imageWidthText.setOnFocusChangeListener( new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { imageWidthText.setText(""); } } }); imageWidthText.setOnEditorActionListener( new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { int width = getEditTextIntegerClamped(imageWidthText, 10, maxWidth); seekBar.setProgress(width / 10); imageWidthText.setSelection((String.valueOf(width).length())); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow( imageWidthText.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN); return true; } }); showImageSettings( alertView, titleText, caption, imageWidthText, featuredCheckBox, featuredInPostCheckBox, maxWidth, alignmentSpinner, imageSpan); mScrollDetected = false; return true; } } else { mContentEditText.setMovementMethod(ArrowKeyMovementMethod.getInstance()); int selectionStart = mContentEditText.getSelectionStart(); if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart) mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd()); } // get media gallery spans MediaGalleryImageSpan[] gallerySpans = spannable.getSpans(charPosition, charPosition, MediaGalleryImageSpan.class); if (gallerySpans.length > 0) { final MediaGalleryImageSpan gallerySpan = gallerySpans[0]; Intent intent = new Intent(ACTION_MEDIA_GALLERY_TOUCHED); intent.putExtra(EXTRA_MEDIA_GALLERY, gallerySpan.getMediaGallery()); getActivity().sendBroadcast(intent); } } } else if (event.getAction() == 1) { mScrollDetected = false; } return false; }
/** Finds media in post content, uploads them, and returns the HTML to insert in the post */ private String processPostMedia(String postContent) { String imageTagsPattern = "<img[^>]+android-uri\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>"; Pattern pattern = Pattern.compile(imageTagsPattern); Matcher matcher = pattern.matcher(postContent); int totalMediaItems = 0; List<String> imageTags = new ArrayList<String>(); while (matcher.find()) { imageTags.add(matcher.group()); totalMediaItems++; } mPostUploadNotifier.setTotalMediaItems(totalMediaItems); int mediaItemCount = 0; for (String tag : imageTags) { Pattern p = Pattern.compile("android-uri=\"([^\"]+)\""); Matcher m = p.matcher(tag); if (m.find()) { String imageUri = m.group(1); if (!imageUri.equals("")) { MediaFile mediaFile = WordPress.wpDB.getMediaFile(imageUri, mPost); if (mediaFile != null) { // Get image thumbnail for notification icon Bitmap imageIcon = ImageUtils.getWPImageSpanThumbnailFromFilePath( mContext, imageUri, DisplayUtils.dpToPx(mContext, 128)); // Crop the thumbnail to be squared in the center if (imageIcon != null) { int squaredSize = DisplayUtils.dpToPx(mContext, 64); imageIcon = ThumbnailUtils.extractThumbnail(imageIcon, squaredSize, squaredSize); mLatestIcon = imageIcon; } mediaItemCount++; mPostUploadNotifier.setCurrentMediaItem(mediaItemCount); mPostUploadNotifier.updateNotificationIcon(imageIcon); String mediaUploadOutput; if (mediaFile.isVideo()) { mHasVideo = true; mediaUploadOutput = uploadVideo(mediaFile); } else { mHasImage = true; mediaUploadOutput = uploadImage(mediaFile); } if (mediaUploadOutput != null) { postContent = postContent.replace(tag, mediaUploadOutput); } else { postContent = postContent.replace(tag, ""); mIsMediaError = true; } } } } } return postContent; }