List of usage examples for android.media ExifInterface ExifInterface
public ExifInterface(InputStream inputStream) throws IOException
From source file:com.netcompss.ffmpeg4android_client.BaseWizard.java
@SuppressWarnings("unused") private String reporteds(String path) { ExifInterface exif = null;// w ww .ja v a 2s .c o m try { exif = new ExifInterface(path); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); Matrix matrix = new Matrix(); if (orientation == 6) { matrix.postRotate(90); } else if (orientation == 3) { matrix.postRotate(180); } else if (orientation == 8) { matrix.postRotate(270); } if (path != null) { if (path.contains("http")) { try { URL url = new URL(path); HttpGet httpRequest = null; httpRequest = new HttpGet(url.toURI()); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); InputStream input = bufHttpEntity.getContent(); Bitmap bitmap = BitmapFactory.decodeStream(input); input.close(); return getPath(bitmap); } catch (MalformedURLException e) { Log.e("ImageActivity", "bad url", e); } catch (Exception e) { Log.e("ImageActivity", "io error", e); } } else { Options options = new Options(); options.inSampleSize = 2; options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getApplicationContext().getResources(), srcBgId, options); options.inJustDecodeBounds = false; options.inSampleSize = calculateInSampleSize(options, w, h); Bitmap unbgbtmp = BitmapFactory.decodeResource(getApplicationContext().getResources(), srcBgId, options); Bitmap unrlbtmp = ScalingUtilities.decodeFile(path, w, h, ScalingLogic.FIT); unrlbtmp.recycle(); Bitmap rlbtmp = null; if (unrlbtmp != null) { rlbtmp = ScalingUtilities.createScaledBitmap(unrlbtmp, w, h, ScalingLogic.FIT); } if (unbgbtmp != null && rlbtmp != null) { Bitmap bgbtmp = ScalingUtilities.createScaledBitmap(unbgbtmp, w, h, ScalingLogic.FIT); Bitmap newscaledBitmap = ProcessingBitmapTwo(bgbtmp, rlbtmp); unbgbtmp.recycle(); return getPath(newscaledBitmap); } } } return path; }
From source file:org.appcelerator.titanium.view.TiDrawableReference.java
private int getOrientation() { String path = null;/*www . ja va2 s .co m*/ int orientation = 0; if (isTypeBlob() && blob != null) { path = blob.getNativePath(); } else if (isTypeFile() && file != null) { path = file.getNativeFile().getAbsolutePath(); } else { InputStream is = getInputStream(); if (is != null) { File file = TiFileHelper.getInstance().getTempFileFromInputStream(is, "EXIF-TMP", true); path = file.getAbsolutePath(); } } try { if (path == null) { Log.e(TAG, "Path of image file could not determined. Could not create an exifInterface from an invalid path."); return 0; } // Remove path prefix if (path.startsWith(FILE_PREFIX)) { path = path.replaceFirst(FILE_PREFIX, ""); } ExifInterface exifInterface = new ExifInterface(path); orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { orientation = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { orientation = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { orientation = 270; } else { orientation = 0; } } catch (IOException e) { Log.e(TAG, "Error creating exifInterface, could not determine orientation.", Log.DEBUG_MODE); } return orientation; }
From source file:com.sim2dial.dialer.ChatFragment.java
private void uploadAndSendImage(final String filePath, final Bitmap image, final ImageSize size) { uploadLayout.setVisibility(View.VISIBLE); textLayout.setVisibility(View.GONE); uploadThread = new Thread(new Runnable() { @Override//w w w .j a va 2 s . c o m public void run() { Bitmap bm = null; String url = null; if (!uploadThread.isInterrupted()) { if (filePath != null) { bm = BitmapFactory.decodeFile(filePath); if (bm != null && size != ImageSize.REAL) { int pixelsMax = size == ImageSize.SMALL ? SIZE_SMALL : size == ImageSize.MEDIUM ? SIZE_MEDIUM : SIZE_LARGE; if (bm.getWidth() > bm.getHeight() && bm.getWidth() > pixelsMax) { bm = Bitmap.createScaledBitmap(bm, pixelsMax, (pixelsMax * bm.getHeight()) / bm.getWidth(), false); } else if (bm.getHeight() > bm.getWidth() && bm.getHeight() > pixelsMax) { bm = Bitmap.createScaledBitmap(bm, (pixelsMax * bm.getWidth()) / bm.getHeight(), pixelsMax, false); } } } else if (image != null) { bm = image; } } // Rotate the bitmap if possible/needed, using EXIF data try { if (filePath != null) { ExifInterface exif = new ExifInterface(filePath); int pictureOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); Matrix matrix = new Matrix(); if (pictureOrientation == 6) { matrix.postRotate(90); } else if (pictureOrientation == 3) { matrix.postRotate(180); } else if (pictureOrientation == 8) { matrix.postRotate(270); } bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); } } catch (Exception e) { e.printStackTrace(); } ByteArrayOutputStream outStream = new ByteArrayOutputStream(); if (bm != null) { bm.compress(CompressFormat.JPEG, COMPRESSOR_QUALITY, outStream); } if (!uploadThread.isInterrupted() && bm != null) { url = uploadImage(filePath, bm, COMPRESSOR_QUALITY, outStream.size()); File file = new File(Environment.getExternalStorageDirectory(), getString(R.string.temp_photo_name)); file.delete(); } if (!uploadThread.isInterrupted()) { final Bitmap fbm = bm; final String furl = url; mHandler.post(new Runnable() { @Override public void run() { uploadLayout.setVisibility(View.GONE); textLayout.setVisibility(View.VISIBLE); progressBar.setProgress(0); if (furl != null) { sendImageMessage(furl, fbm); } else { Toast.makeText(getActivity(), getString(R.string.error), Toast.LENGTH_LONG).show(); } } }); } } }); uploadThread.start(); }
From source file:com.yk.notification.util.BitmapUtil.java
/** * ?//w w w . ja v a2 s . c o m * * @param path * ? * @return */ public static int getImageDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; }
From source file:com.klinker.android.twitter.activities.profile_viewer.ProfilePager.java
private Bitmap getBitmapToSend(Uri uri) throws FileNotFoundException, IOException { InputStream input = getContentResolver().openInputStream(uri); BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options(); onlyBoundsOptions.inJustDecodeBounds = true; onlyBoundsOptions.inDither = true;//optional onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional BitmapFactory.decodeStream(input, null, onlyBoundsOptions); input.close();/* w ww . j a v a 2 s.c o m*/ if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) return null; int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth; double ratio = (originalSize > 1000) ? (originalSize / 1000) : 1.0; BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio); bitmapOptions.inDither = true;//optional bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; input = this.getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions); ExifInterface exif = new ExifInterface(IOUtils.getPath(uri, context)); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); input.close(); return bitmap; }
From source file:com.klinker.android.twitter.ui.profile_viewer.ProfilePager.java
private Bitmap getBitmapToSend(Uri uri) throws FileNotFoundException, IOException { InputStream input = getContentResolver().openInputStream(uri); BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options(); onlyBoundsOptions.inJustDecodeBounds = true; onlyBoundsOptions.inDither = true;//optional onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional BitmapFactory.decodeStream(input, null, onlyBoundsOptions); input.close();/*from www. j a va 2s .c o m*/ if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) return null; int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth; double ratio = (originalSize > 500) ? (originalSize / 500) : 1.0; BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio); bitmapOptions.inDither = true;//optional bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; input = this.getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions); ExifInterface exif = new ExifInterface(IOUtils.getPath(uri, context)); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); input.close(); return rotateBitmap(bitmap, orientation); }
From source file:com.nextgis.ngm_clink_monitoring.fragments.CreateObjectFragment.java
protected void writePhotoAttach(File tempPhotoFile) throws IOException { GISApplication app = (GISApplication) getActivity().getApplication(); ContentResolver contentResolver = app.getContentResolver(); String photoFileName = getPhotoFileName(tempPhotoFile); Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), photoFileName: " + photoFileName); Uri allAttachesUri = Uri.parse("content://" + FoclSettingsConstantsUI.AUTHORITY + "/" + mObjectLayerName + "/" + mObjectId + "/attach"); Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), allAttachesUri: " + allAttachesUri); ContentValues values = new ContentValues(); values.put(VectorLayer.ATTACH_DISPLAY_NAME, photoFileName); values.put(VectorLayer.ATTACH_MIME_TYPE, "image/jpeg"); //values.put(VectorLayer.ATTACH_DESCRIPTION, photoFileName); Uri attachUri = null;/*from w ww .java2s. co m*/ String insertAttachError = null; try { attachUri = contentResolver.insert(allAttachesUri, values); Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), insert: " + attachUri.toString()); } catch (Exception e) { Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), Insert attach failed: " + e.getLocalizedMessage()); insertAttachError = "Insert attach failed: " + e.getLocalizedMessage(); } if (null != attachUri) { int exifOrientation = BitmapUtil.getOrientationFromExif(tempPhotoFile); // resize and rotate Bitmap sourceBitmap = BitmapFactory.decodeFile(tempPhotoFile.getPath()); Bitmap resizedBitmap = BitmapUtil.getResizedBitmap(sourceBitmap, FoclConstants.PHOTO_MAX_SIZE_PX, FoclConstants.PHOTO_MAX_SIZE_PX); Bitmap rotatedBitmap = BitmapUtil.rotateBitmap(resizedBitmap, exifOrientation); // jpeg compress File tempAttachFile = File.createTempFile("attach", null, app.getCacheDir()); OutputStream tempOutStream = new FileOutputStream(tempAttachFile); rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, FoclConstants.PHOTO_JPEG_COMPRESS_QUALITY, tempOutStream); tempOutStream.close(); int newHeight = rotatedBitmap.getHeight(); int newWidth = rotatedBitmap.getWidth(); rotatedBitmap.recycle(); // write EXIF to new file BitmapUtil.copyExifData(tempPhotoFile, tempAttachFile); BitmapUtil.writeLocationToExif(tempAttachFile, mAccurateLocation, app.getGpsTimeOffset()); ExifInterface attachExif = new ExifInterface(tempAttachFile.getCanonicalPath()); attachExif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + ExifInterface.ORIENTATION_NORMAL); attachExif.setAttribute(ExifInterface.TAG_IMAGE_LENGTH, "" + newHeight); attachExif.setAttribute(ExifInterface.TAG_IMAGE_WIDTH, "" + newWidth); attachExif.saveAttributes(); // attach data from tempAttachFile OutputStream attachOutStream = contentResolver.openOutputStream(attachUri); if (attachOutStream != null) { FoclFileUtil.copy(new FileInputStream(tempAttachFile), attachOutStream); attachOutStream.close(); } else { Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), attachOutStream == null, attachUri" + attachUri.toString()); } if (!tempAttachFile.delete()) { Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), tempAttachFile.delete() failed, tempAttachFile:" + tempAttachFile.getAbsolutePath()); } } if (app.isOriginalPhotoSaving()) { BitmapUtil.writeLocationToExif(tempPhotoFile, mAccurateLocation, app.getGpsTimeOffset()); File origPhotoFile = new File(getDailyPhotoFolder(), photoFileName); if (!com.nextgis.maplib.util.FileUtil.move(tempPhotoFile, origPhotoFile)) { Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), move original failed, tempPhotoFile:" + tempPhotoFile.getAbsolutePath() + ", origPhotoFile: " + origPhotoFile.getAbsolutePath()); throw new IOException( "Save original photo failed, tempPhotoFile: " + tempPhotoFile.getAbsolutePath()); } } else { if (!tempPhotoFile.delete()) { Log.d(TAG, "CreateObjectFragment, writePhotoAttach(), tempPhotoFile.delete() failed, tempPhotoFile:" + tempPhotoFile.getAbsolutePath()); } } if (null != insertAttachError) { throw new IOException(insertAttachError); } }
From source file:com.almalence.opencam.SavingService.java
protected File saveExifTags(File file, long sessionID, int i, int x, int y, int exif_orientation, boolean useGeoTaggingPrefExport, boolean enableExifTagOrientation) { addTimestamp(file, exif_orientation); // Set tag_model using ExifInterface. // If we try set tag_model using ExifDriver, then standard // gallery of android (Nexus 4) will crash on this file. // Can't figure out why, other Exif tools work fine. try {/*from w w w . java 2 s. c o m*/ ExifInterface ei = new ExifInterface(file.getAbsolutePath()); String tag_model = getFromSharedMem("exiftag_model" + Long.toString(sessionID)); String tag_make = getFromSharedMem("exiftag_make" + Long.toString(sessionID)); if (tag_model == null) tag_model = Build.MODEL; ei.setAttribute(ExifInterface.TAG_MODEL, tag_model); if (tag_make == null) tag_make = Build.MANUFACTURER; ei.setAttribute(ExifInterface.TAG_MAKE, tag_make); ei.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(exif_orientation)); ei.saveAttributes(); } catch (IOException e1) { e1.printStackTrace(); } // Open ExifDriver. ExifDriver exifDriver = ExifDriver.getInstance(file.getAbsolutePath()); ExifManager exifManager = null; if (exifDriver != null) { exifManager = new ExifManager(exifDriver, getApplicationContext()); } if (useGeoTaggingPrefExport) { Location l = MLocation.getLocation(getApplicationContext()); if (l != null) { double lat = l.getLatitude(); double lon = l.getLongitude(); boolean hasLatLon = (lat != 0.0d) || (lon != 0.0d); if (hasLatLon) { exifManager.setGPSLocation(l.getLatitude(), l.getLongitude(), l.getAltitude()); } String GPSDateString = new SimpleDateFormat("yyyy:MM:dd").format(new Date(l.getTime())); if (GPSDateString != null) { ValueByteArray value = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); value.setBytes(GPSDateString.getBytes()); exifDriver.getIfdGps().put(ExifDriver.TAG_GPS_DATE_STAMP, value); } } } String tag_exposure_time = getFromSharedMem("exiftag_exposure_time" + Long.toString(sessionID)); String tag_aperture = getFromSharedMem("exiftag_aperture" + Long.toString(sessionID)); String tag_flash = getFromSharedMem("exiftag_flash" + Long.toString(sessionID)); String tag_focal_length = getFromSharedMem("exiftag_focal_lenght" + Long.toString(sessionID)); String tag_iso = getFromSharedMem("exiftag_iso" + Long.toString(sessionID)); String tag_white_balance = getFromSharedMem("exiftag_white_balance" + Long.toString(sessionID)); String tag_spectral_sensitivity = getFromSharedMem( "exiftag_spectral_sensitivity" + Long.toString(sessionID)); String tag_version = getFromSharedMem("exiftag_version" + Long.toString(sessionID)); String tag_scene = getFromSharedMem("exiftag_scene_capture_type" + Long.toString(sessionID)); String tag_metering_mode = getFromSharedMem("exiftag_metering_mode" + Long.toString(sessionID)); if (exifDriver != null) { if (tag_exposure_time != null) { int[][] ratValue = ExifManager.stringToRational(tag_exposure_time); if (ratValue != null) { ValueRationals value = new ValueRationals(ExifDriver.FORMAT_UNSIGNED_RATIONAL); value.setRationals(ratValue); exifDriver.getIfdExif().put(ExifDriver.TAG_EXPOSURE_TIME, value); } } else { // hack for expo bracketing tag_exposure_time = getFromSharedMem( "exiftag_exposure_time" + Integer.toString(i) + Long.toString(sessionID)); if (tag_exposure_time != null) { int[][] ratValue = ExifManager.stringToRational(tag_exposure_time); if (ratValue != null) { ValueRationals value = new ValueRationals(ExifDriver.FORMAT_UNSIGNED_RATIONAL); value.setRationals(ratValue); exifDriver.getIfdExif().put(ExifDriver.TAG_EXPOSURE_TIME, value); } } } if (tag_aperture != null) { int[][] ratValue = ExifManager.stringToRational(tag_aperture); if (ratValue != null) { ValueRationals value = new ValueRationals(ExifDriver.FORMAT_UNSIGNED_RATIONAL); value.setRationals(ratValue); exifDriver.getIfdExif().put(ExifDriver.TAG_APERTURE_VALUE, value); } } if (tag_flash != null) { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, Integer.parseInt(tag_flash)); exifDriver.getIfdExif().put(ExifDriver.TAG_FLASH, value); } if (tag_focal_length != null) { int[][] ratValue = ExifManager.stringToRational(tag_focal_length); if (ratValue != null) { ValueRationals value = new ValueRationals(ExifDriver.FORMAT_UNSIGNED_RATIONAL); value.setRationals(ratValue); exifDriver.getIfdExif().put(ExifDriver.TAG_FOCAL_LENGTH, value); } } try { if (tag_iso != null) { if (tag_iso.indexOf("ISO") > 0) { tag_iso = tag_iso.substring(0, 2); } ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, Integer.parseInt(tag_iso)); exifDriver.getIfdExif().put(ExifDriver.TAG_ISO_SPEED_RATINGS, value); } } catch (Exception e) { e.printStackTrace(); } if (tag_scene != null) { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, Integer.parseInt(tag_scene)); exifDriver.getIfdExif().put(ExifDriver.TAG_SCENE_CAPTURE_TYPE, value); } else { int sceneMode = CameraController.getSceneMode(); int sceneModeVal = 0; if (sceneMode == CameraParameters.SCENE_MODE_LANDSCAPE) { sceneModeVal = 1; } else if (sceneMode == CameraParameters.SCENE_MODE_PORTRAIT) { sceneModeVal = 2; } else if (sceneMode == CameraParameters.SCENE_MODE_NIGHT) { sceneModeVal = 3; } ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, sceneModeVal); exifDriver.getIfdExif().put(ExifDriver.TAG_SCENE_CAPTURE_TYPE, value); } if (tag_white_balance != null) { exifDriver.getIfd0().remove(ExifDriver.TAG_LIGHT_SOURCE); ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, Integer.parseInt(tag_white_balance)); exifDriver.getIfdExif().put(ExifDriver.TAG_WHITE_BALANCE, value); exifDriver.getIfdExif().put(ExifDriver.TAG_LIGHT_SOURCE, value); } else { exifDriver.getIfd0().remove(ExifDriver.TAG_LIGHT_SOURCE); int whiteBalance = CameraController.getWBMode(); int whiteBalanceVal = 0; int lightSourceVal = 0; if (whiteBalance == CameraParameters.WB_MODE_AUTO) { whiteBalanceVal = 0; lightSourceVal = 0; } else { whiteBalanceVal = 1; lightSourceVal = 0; } if (whiteBalance == CameraParameters.WB_MODE_DAYLIGHT) { lightSourceVal = 1; } else if (whiteBalance == CameraParameters.WB_MODE_FLUORESCENT) { lightSourceVal = 2; } else if (whiteBalance == CameraParameters.WB_MODE_WARM_FLUORESCENT) { lightSourceVal = 2; } else if (whiteBalance == CameraParameters.WB_MODE_INCANDESCENT) { lightSourceVal = 3; } else if (whiteBalance == CameraParameters.WB_MODE_TWILIGHT) { lightSourceVal = 3; } else if (whiteBalance == CameraParameters.WB_MODE_CLOUDY_DAYLIGHT) { lightSourceVal = 10; } else if (whiteBalance == CameraParameters.WB_MODE_SHADE) { lightSourceVal = 11; } ValueNumber valueWB = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, whiteBalanceVal); exifDriver.getIfdExif().put(ExifDriver.TAG_WHITE_BALANCE, valueWB); ValueNumber valueLS = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, lightSourceVal); exifDriver.getIfdExif().put(ExifDriver.TAG_LIGHT_SOURCE, valueLS); } if (tag_spectral_sensitivity != null) { ValueByteArray value = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); value.setBytes(tag_spectral_sensitivity.getBytes()); exifDriver.getIfd0().put(ExifDriver.TAG_SPECTRAL_SENSITIVITY, value); } if (tag_version != null && !tag_version.equals("48 50 50 48")) { ValueByteArray value = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); value.setBytes(tag_version.getBytes()); exifDriver.getIfd0().put(ExifDriver.TAG_EXIF_VERSION, value); } else { ValueByteArray value = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); byte[] version = { (byte) 48, (byte) 50, (byte) 50, (byte) 48 }; value.setBytes(version); exifDriver.getIfd0().put(ExifDriver.TAG_EXIF_VERSION, value); } if (tag_metering_mode != null && !tag_metering_mode.equals("") && Integer.parseInt(tag_metering_mode) <= 255) { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, Integer.parseInt(tag_metering_mode)); exifDriver.getIfdExif().put(ExifDriver.TAG_METERING_MODE, value); exifDriver.getIfd0().put(ExifDriver.TAG_METERING_MODE, value); } else { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, 0); exifDriver.getIfdExif().put(ExifDriver.TAG_METERING_MODE, value); exifDriver.getIfd0().put(ExifDriver.TAG_METERING_MODE, value); } ValueNumber xValue = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_LONG, x); exifDriver.getIfdExif().put(ExifDriver.TAG_IMAGE_WIDTH, xValue); ValueNumber yValue = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_LONG, y); exifDriver.getIfdExif().put(ExifDriver.TAG_IMAGE_HEIGHT, yValue); String dateString = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(new Date()); if (dateString != null) { ValueByteArray value = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); // Date string length is 19 bytes. But exif tag // specification length is 20 bytes. // That's why we add "empty" byte (0x00) in the end. byte[] bytes = dateString.getBytes(); byte[] res = new byte[20]; for (int ii = 0; ii < bytes.length; ii++) { res[ii] = bytes[ii]; } res[19] = 0x00; value.setBytes(res); exifDriver.getIfd0().put(ExifDriver.TAG_DATETIME, value); exifDriver.getIfdExif().put(ExifDriver.TAG_DATETIME_DIGITIZED, value); exifDriver.getIfdExif().put(ExifDriver.TAG_DATETIME_ORIGINAL, value); } // extract mode name String tag_modename = getFromSharedMem("mode_name" + Long.toString(sessionID)); if (tag_modename == null) tag_modename = ""; String softwareString = getResources().getString(R.string.app_name) + ", " + tag_modename; ValueByteArray softwareValue = new ValueByteArray(ExifDriver.FORMAT_ASCII_STRINGS); softwareValue.setBytes(softwareString.getBytes()); exifDriver.getIfd0().put(ExifDriver.TAG_SOFTWARE, softwareValue); if (enableExifTagOrientation) { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, exif_orientation); exifDriver.getIfd0().put(ExifDriver.TAG_ORIENTATION, value); } else { ValueNumber value = new ValueNumber(ExifDriver.FORMAT_UNSIGNED_SHORT, ExifInterface.ORIENTATION_NORMAL); exifDriver.getIfd0().put(ExifDriver.TAG_ORIENTATION, value); } // Save exif info to new file, and replace old file with new // one. File modifiedFile = new File(file.getAbsolutePath() + ".tmp"); exifDriver.save(modifiedFile.getAbsolutePath()); return modifiedFile; } return null; }
From source file:org.telegram.ui.Components.ChatAttachAlert.java
public ChatAttachAlert(Context context, final ChatActivity parentFragment) { super(context, false); baseFragment = parentFragment;//from w ww. j av a 2s . c om setDelegate(this); setUseRevealAnimation(true); checkCamera(false); if (deviceHasGoodCamera) { CameraController.getInstance().initCamera(); } NotificationCenter.getInstance().addObserver(this, NotificationCenter.albumsDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.reloadInlineHints); NotificationCenter.getInstance().addObserver(this, NotificationCenter.cameraInitied); shadowDrawable = context.getResources().getDrawable(R.drawable.sheet_shadow); containerView = listView = new RecyclerListView(context) { private int lastWidth; private int lastHeight; @Override public void requestLayout() { if (ignoreLayout) { return; } super.requestLayout(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (cameraAnimationInProgress) { return true; } else if (cameraOpened) { return processTouchEvent(ev); } else if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY != 0 && ev.getY() < scrollOffsetY) { dismiss(); return true; } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { if (cameraAnimationInProgress) { return true; } else if (cameraOpened) { return processTouchEvent(event); } return !isDismissed() && super.onTouchEvent(event); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.getSize(heightMeasureSpec); if (Build.VERSION.SDK_INT >= 21) { height -= AndroidUtilities.statusBarHeight; } int contentSize = backgroundPaddingTop + AndroidUtilities.dp(294) + (SearchQuery.inlineBots.isEmpty() ? 0 : ((int) Math.ceil(SearchQuery.inlineBots.size() / 4.0f) * AndroidUtilities.dp(100) + AndroidUtilities.dp(12))); int padding = contentSize == AndroidUtilities.dp(294) ? 0 : Math.max(0, (height - AndroidUtilities.dp(294))); if (padding != 0 && contentSize < height) { padding -= (height - contentSize); } if (padding == 0) { padding = backgroundPaddingTop; } if (getPaddingTop() != padding) { ignoreLayout = true; setPadding(backgroundPaddingLeft, padding, backgroundPaddingLeft, 0); ignoreLayout = false; } super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Math.min(contentSize, height), MeasureSpec.EXACTLY)); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int width = right - left; int height = bottom - top; int newPosition = -1; int newTop = 0; int count = listView.getChildCount(); int lastVisibleItemPosition = -1; int lastVisibleItemPositionTop = 0; if (count > 0) { View child = listView.getChildAt(listView.getChildCount() - 1); Holder holder = (Holder) listView.findContainingViewHolder(child); if (holder != null) { lastVisibleItemPosition = holder.getAdapterPosition(); lastVisibleItemPositionTop = child.getTop(); } } if (lastVisibleItemPosition >= 0 && height - lastHeight != 0) { newPosition = lastVisibleItemPosition; newTop = lastVisibleItemPositionTop + height - lastHeight - getPaddingTop(); } super.onLayout(changed, left, top, right, bottom); if (newPosition != -1) { ignoreLayout = true; layoutManager.scrollToPositionWithOffset(newPosition, newTop); super.onLayout(false, left, top, right, bottom); ignoreLayout = false; } lastHeight = height; lastWidth = width; updateLayout(); checkCameraViewPosition(); } @Override public void onDraw(Canvas canvas) { if (useRevealAnimation && Build.VERSION.SDK_INT <= 19) { canvas.save(); canvas.clipRect(backgroundPaddingLeft, scrollOffsetY, getMeasuredWidth() - backgroundPaddingLeft, getMeasuredHeight()); if (revealAnimationInProgress) { canvas.drawCircle(revealX, revealY, revealRadius, ciclePaint); } else { canvas.drawRect(backgroundPaddingLeft, scrollOffsetY, getMeasuredWidth() - backgroundPaddingLeft, getMeasuredHeight(), ciclePaint); } canvas.restore(); } else { shadowDrawable.setBounds(0, scrollOffsetY - backgroundPaddingTop, getMeasuredWidth(), getMeasuredHeight()); shadowDrawable.draw(canvas); } } @Override public void setTranslationY(float translationY) { super.setTranslationY(translationY); checkCameraViewPosition(); } }; listView.setWillNotDraw(false); listView.setClipToPadding(false); listView.setLayoutManager(layoutManager = new LinearLayoutManager(getContext())); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); listView.setAdapter(adapter = new ListAdapter(context)); listView.setVerticalScrollBarEnabled(false); listView.setEnabled(true); listView.setGlowColor(0xfff5f6f7); listView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = 0; outRect.right = 0; outRect.top = 0; outRect.bottom = 0; } }); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (listView.getChildCount() <= 0) { return; } if (hintShowed) { if (layoutManager.findLastVisibleItemPosition() > 1) { hideHint(); hintShowed = false; ApplicationLoader.applicationContext .getSharedPreferences("mainconfig", Activity.MODE_PRIVATE).edit() .putBoolean("bothint", true).commit(); } } updateLayout(); checkCameraViewPosition(); } }); containerView.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); attachView = new FrameLayout(context) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(294), MeasureSpec.EXACTLY)); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int width = right - left; int height = bottom - top; int t = AndroidUtilities.dp(8); attachPhotoRecyclerView.layout(0, t, width, t + attachPhotoRecyclerView.getMeasuredHeight()); progressView.layout(0, t, width, t + progressView.getMeasuredHeight()); lineView.layout(0, AndroidUtilities.dp(96), width, AndroidUtilities.dp(96) + lineView.getMeasuredHeight()); hintTextView.layout(width - hintTextView.getMeasuredWidth() - AndroidUtilities.dp(5), height - hintTextView.getMeasuredHeight() - AndroidUtilities.dp(5), width - AndroidUtilities.dp(5), height - AndroidUtilities.dp(5)); int diff = (width - AndroidUtilities.dp(85 * 4 + 20)) / 3; for (int a = 0; a < 8; a++) { int y = AndroidUtilities.dp(105 + 95 * (a / 4)); int x = AndroidUtilities.dp(10) + (a % 4) * (AndroidUtilities.dp(85) + diff); views[a].layout(x, y, x + views[a].getMeasuredWidth(), y + views[a].getMeasuredHeight()); } } }; views[8] = attachPhotoRecyclerView = new RecyclerListView(context); attachPhotoRecyclerView.setVerticalScrollBarEnabled(true); attachPhotoRecyclerView.setAdapter(photoAttachAdapter = new PhotoAttachAdapter(context)); attachPhotoRecyclerView.setClipToPadding(false); attachPhotoRecyclerView.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); attachPhotoRecyclerView.setItemAnimator(null); attachPhotoRecyclerView.setLayoutAnimation(null); attachPhotoRecyclerView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); attachView.addView(attachPhotoRecyclerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 80)); attachPhotoLayoutManager = new LinearLayoutManager(context) { @Override public boolean supportsPredictiveItemAnimations() { return false; } }; attachPhotoLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); attachPhotoRecyclerView.setLayoutManager(attachPhotoLayoutManager); attachPhotoRecyclerView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() { @SuppressWarnings("unchecked") @Override public void onItemClick(View view, int position) { if (baseFragment == null || baseFragment.getParentActivity() == null) { return; } if (!deviceHasGoodCamera || position != 0) { if (deviceHasGoodCamera) { position--; } if (MediaController.allPhotosAlbumEntry == null) { return; } ArrayList<Object> arrayList = (ArrayList) MediaController.allPhotosAlbumEntry.photos; if (position < 0 || position >= arrayList.size()) { return; } PhotoViewer.getInstance().setParentActivity(baseFragment.getParentActivity()); PhotoViewer.getInstance().openPhotoForSelect(arrayList, position, 0, ChatAttachAlert.this, baseFragment); AndroidUtilities.hideKeyboard(baseFragment.getFragmentView().findFocus()); } else { openCamera(); } } }); attachPhotoRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { checkCameraViewPosition(); } }); views[9] = progressView = new EmptyTextProgressView(context); if (Build.VERSION.SDK_INT >= 23 && getContext().checkSelfPermission( Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { progressView.setText(LocaleController.getString("PermissionStorage", R.string.PermissionStorage)); progressView.setTextSize(16); } else { progressView.setText(LocaleController.getString("NoPhotos", R.string.NoPhotos)); progressView.setTextSize(20); } attachView.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 80)); attachPhotoRecyclerView.setEmptyView(progressView); views[10] = lineView = new View(getContext()) { @Override public boolean hasOverlappingRendering() { return false; } }; lineView.setBackgroundColor(ContextCompat.getColor(context, R.color.divider)); attachView.addView(lineView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1, Gravity.TOP | Gravity.LEFT)); CharSequence[] items = new CharSequence[] { LocaleController.getString("ChatCamera", R.string.ChatCamera), LocaleController.getString("ChatGallery", R.string.ChatGallery), LocaleController.getString("ChatVideo", R.string.ChatVideo), LocaleController.getString("AttachMusic", R.string.AttachMusic), LocaleController.getString("ChatDocument", R.string.ChatDocument), LocaleController.getString("AttachContact", R.string.AttachContact), LocaleController.getString("ChatLocation", R.string.ChatLocation), "" }; for (int a = 0; a < 8; a++) { AttachButton attachButton = new AttachButton(context); attachButton.setTextAndIcon(items[a], Theme.attachButtonDrawables[a]); attachView.addView(attachButton, LayoutHelper.createFrame(85, 90, Gravity.LEFT | Gravity.TOP)); attachButton.setTag(a); views[a] = attachButton; if (a == 7) { sendPhotosButton = attachButton; sendPhotosButton.imageView.setPadding(0, AndroidUtilities.dp(4), 0, 0); } attachButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { delegate.didPressedButton((Integer) v.getTag()); } }); } hintTextView = new TextView(context); hintTextView.setBackgroundResource(R.drawable.tooltip); hintTextView.setTextColor(Theme.CHAT_GIF_HINT_TEXT_COLOR); hintTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); hintTextView.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), 0); hintTextView.setText(LocaleController.getString("AttachBotsHelp", R.string.AttachBotsHelp)); hintTextView.setGravity(Gravity.CENTER_VERTICAL); hintTextView.setVisibility(View.INVISIBLE); hintTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.scroll_tip, 0, 0, 0); hintTextView.setCompoundDrawablePadding(AndroidUtilities.dp(8)); attachView.addView(hintTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 32, Gravity.RIGHT | Gravity.BOTTOM, 5, 0, 5, 5)); for (int a = 0; a < 8; a++) { viewsCache.add(photoAttachAdapter.createHolder()); } if (loading) { progressView.showProgress(); } else { progressView.showTextView(); } if (Build.VERSION.SDK_INT >= 16) { recordTime = new TextView(context); recordTime.setBackgroundResource(R.drawable.system); recordTime.getBackground() .setColorFilter(new PorterDuffColorFilter(0x66000000, PorterDuff.Mode.MULTIPLY)); recordTime.setText("00:00"); recordTime.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); recordTime.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); recordTime.setAlpha(0.0f); recordTime.setTextColor(0xffffffff); recordTime.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(5), AndroidUtilities.dp(10), AndroidUtilities.dp(5)); container.addView(recordTime, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 16, 0, 0)); cameraPanel = new FrameLayout(context) { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int cx = getMeasuredWidth() / 2; int cy = getMeasuredHeight() / 2; int cx2; int cy2; shutterButton.layout(cx - shutterButton.getMeasuredWidth() / 2, cy - shutterButton.getMeasuredHeight() / 2, cx + shutterButton.getMeasuredWidth() / 2, cy + shutterButton.getMeasuredHeight() / 2); if (getMeasuredWidth() == AndroidUtilities.dp(100)) { cx = cx2 = getMeasuredWidth() / 2; cy2 = cy + cy / 2 + AndroidUtilities.dp(17); cy = cy / 2 - AndroidUtilities.dp(17); } else { cx2 = cx + cx / 2 + AndroidUtilities.dp(17); cx = cx / 2 - AndroidUtilities.dp(17); cy = cy2 = getMeasuredHeight() / 2; } switchCameraButton.layout(cx2 - switchCameraButton.getMeasuredWidth() / 2, cy2 - switchCameraButton.getMeasuredHeight() / 2, cx2 + switchCameraButton.getMeasuredWidth() / 2, cy2 + switchCameraButton.getMeasuredHeight() / 2); for (int a = 0; a < 2; a++) { flashModeButton[a].layout(cx - flashModeButton[a].getMeasuredWidth() / 2, cy - flashModeButton[a].getMeasuredHeight() / 2, cx + flashModeButton[a].getMeasuredWidth() / 2, cy + flashModeButton[a].getMeasuredHeight() / 2); } } }; cameraPanel.setVisibility(View.GONE); cameraPanel.setAlpha(0.0f); container.addView(cameraPanel, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 100, Gravity.LEFT | Gravity.BOTTOM)); shutterButton = new ShutterButton(context); cameraPanel.addView(shutterButton, LayoutHelper.createFrame(84, 84, Gravity.CENTER)); shutterButton.setDelegate(new ShutterButton.ShutterButtonDelegate() { @Override public void shutterLongPressed() { if (takingPhoto || baseFragment == null || baseFragment.getParentActivity() == null) { return; } if (Build.VERSION.SDK_INT >= 23) { if (baseFragment.getParentActivity().checkSelfPermission( Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { baseFragment.getParentActivity() .requestPermissions(new String[] { Manifest.permission.RECORD_AUDIO }, 21); return; } } for (int a = 0; a < 2; a++) { flashModeButton[a].setAlpha(0.0f); } switchCameraButton.setAlpha(0.0f); cameraFile = AndroidUtilities.generateVideoPath(); recordTime.setAlpha(1.0f); recordTime.setText("00:00"); videoRecordTime = 0; videoRecordRunnable = new Runnable() { @Override public void run() { if (videoRecordRunnable == null) { return; } videoRecordTime++; recordTime.setText( String.format("%02d:%02d", videoRecordTime / 60, videoRecordTime % 60)); AndroidUtilities.runOnUIThread(videoRecordRunnable, 1000); } }; AndroidUtilities.lockOrientation(parentFragment.getParentActivity()); CameraController.getInstance().recordVideo(cameraView.getCameraSession(), cameraFile, new CameraController.VideoTakeCallback() { @Override public void onFinishVideoRecording(final Bitmap thumb) { if (cameraFile == null || baseFragment == null) { return; } PhotoViewer.getInstance().setParentActivity(baseFragment.getParentActivity()); cameraPhoto = new ArrayList<>(); cameraPhoto.add(new MediaController.PhotoEntry(0, 0, 0, cameraFile.getAbsolutePath(), 0, true)); PhotoViewer.getInstance().openPhotoForSelect(cameraPhoto, 0, 2, new PhotoViewer.EmptyPhotoViewerProvider() { @Override public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { return thumb; } @TargetApi(16) @Override public boolean cancelButtonPressed() { if (cameraOpened && cameraView != null && cameraFile != null) { cameraFile.delete(); AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { if (cameraView != null && !isDismissed() && Build.VERSION.SDK_INT >= 21) { cameraView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN); } } }, 1000); CameraController.getInstance() .startPreview(cameraView.getCameraSession()); cameraFile = null; } return true; } @Override public void sendButtonPressed(int index) { if (cameraFile == null) { return; } AndroidUtilities .addMediaToGallery(cameraFile.getAbsolutePath()); baseFragment.sendMedia( (MediaController.PhotoEntry) cameraPhoto.get(0), PhotoViewer.getInstance().isMuteVideo()); closeCamera(false); dismiss(); cameraFile = null; } }, baseFragment); } }); AndroidUtilities.runOnUIThread(videoRecordRunnable, 1000); shutterButton.setState(ShutterButton.State.RECORDING, true); } @Override public void shutterCancel() { cameraFile.delete(); resetRecordState(); CameraController.getInstance().stopVideoRecording(cameraView.getCameraSession(), true); } @Override public void shutterReleased() { if (takingPhoto) { return; } if (shutterButton.getState() == ShutterButton.State.RECORDING) { resetRecordState(); CameraController.getInstance().stopVideoRecording(cameraView.getCameraSession(), false); shutterButton.setState(ShutterButton.State.DEFAULT, true); return; } cameraFile = AndroidUtilities.generatePicturePath(); takingPhoto = CameraController.getInstance().takePicture(cameraFile, cameraView.getCameraSession(), new Runnable() { @Override public void run() { takingPhoto = false; if (cameraFile == null || baseFragment == null) { return; } PhotoViewer.getInstance().setParentActivity(baseFragment.getParentActivity()); cameraPhoto = new ArrayList<>(); int orientation = 0; try { ExifInterface ei = new ExifInterface(cameraFile.getAbsolutePath()); int exif = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exif) { case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; } } catch (Exception e) { FileLog.e("tmessages", e); } cameraPhoto.add(new MediaController.PhotoEntry(0, 0, 0, cameraFile.getAbsolutePath(), orientation, false)); PhotoViewer.getInstance().openPhotoForSelect(cameraPhoto, 0, 2, new PhotoViewer.EmptyPhotoViewerProvider() { @TargetApi(16) @Override public boolean cancelButtonPressed() { if (cameraOpened && cameraView != null && cameraFile != null) { cameraFile.delete(); AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { if (cameraView != null && !isDismissed() && Build.VERSION.SDK_INT >= 21) { cameraView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN); } } }, 1000); CameraController.getInstance() .startPreview(cameraView.getCameraSession()); cameraFile = null; } return true; } @Override public void sendButtonPressed(int index) { if (cameraFile == null) { return; } AndroidUtilities .addMediaToGallery(cameraFile.getAbsolutePath()); baseFragment.sendMedia( (MediaController.PhotoEntry) cameraPhoto.get(0), false); closeCamera(false); dismiss(); cameraFile = null; } @Override public boolean scaleToFill() { return true; } }, baseFragment); } }); } }); switchCameraButton = new ImageView(context); switchCameraButton.setScaleType(ImageView.ScaleType.CENTER); cameraPanel.addView(switchCameraButton, LayoutHelper.createFrame(48, 48, Gravity.RIGHT | Gravity.CENTER_VERTICAL)); switchCameraButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (takingPhoto || cameraView == null || !cameraView.isInitied()) { return; } cameraInitied = false; cameraView.switchCamera(); ObjectAnimator animator = ObjectAnimator.ofFloat(switchCameraButton, "scaleX", 0.0f) .setDuration(100); animator.addListener(new AnimatorListenerAdapterProxy() { @Override public void onAnimationEnd(Animator animator) { switchCameraButton.setImageResource(cameraView.isFrontface() ? R.drawable.camera_revert1 : R.drawable.camera_revert2); ObjectAnimator.ofFloat(switchCameraButton, "scaleX", 1.0f).setDuration(100).start(); } }); animator.start(); } }); for (int a = 0; a < 2; a++) { flashModeButton[a] = new ImageView(context); flashModeButton[a].setScaleType(ImageView.ScaleType.CENTER); flashModeButton[a].setVisibility(View.INVISIBLE); cameraPanel.addView(flashModeButton[a], LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP)); flashModeButton[a].setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View currentImage) { if (flashAnimationInProgress || cameraView == null || !cameraView.isInitied() || !cameraOpened) { return; } String current = cameraView.getCameraSession().getCurrentFlashMode(); String next = cameraView.getCameraSession().getNextFlashMode(); if (current.equals(next)) { return; } cameraView.getCameraSession().setCurrentFlashMode(next); flashAnimationInProgress = true; ImageView nextImage = flashModeButton[0] == currentImage ? flashModeButton[1] : flashModeButton[0]; nextImage.setVisibility(View.VISIBLE); setCameraFlashModeIcon(nextImage, next); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether( ObjectAnimator.ofFloat(currentImage, "translationY", 0, AndroidUtilities.dp(48)), ObjectAnimator.ofFloat(nextImage, "translationY", -AndroidUtilities.dp(48), 0), ObjectAnimator.ofFloat(currentImage, "alpha", 1.0f, 0.0f), ObjectAnimator.ofFloat(nextImage, "alpha", 0.0f, 1.0f)); animatorSet.setDuration(200); animatorSet.addListener(new AnimatorListenerAdapterProxy() { @Override public void onAnimationEnd(Animator animator) { flashAnimationInProgress = false; currentImage.setVisibility(View.INVISIBLE); } }); animatorSet.start(); } }); } } }