package com.afollestad.materialcamera.util;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.hardware.Camera;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.afollestad.materialcamera.internal.BaseCaptureActivity;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
* @author Aidan Follestad (afollestad)
*/
public class CameraUtil {
private CameraUtil() {
}
public static boolean isChromium() {
return Build.BRAND.equalsIgnoreCase("chromium") &&
Build.MANUFACTURER.equalsIgnoreCase("chromium");
}
public static String getDurationString(long durationMs) {
return String.format(Locale.getDefault(), "%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(durationMs),
TimeUnit.MILLISECONDS.toSeconds(durationMs) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(durationMs))
);
}
@SuppressWarnings({"ConstantConditions", "ResultOfMethodCallIgnored"})
public static File makeTempFile(@NonNull Context context, @Nullable String saveDir, String prefix, String extension) {
if (saveDir == null)
saveDir = context.getExternalCacheDir().getAbsolutePath();
final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
final File dir = new File(saveDir);
dir.mkdirs();
return new File(dir, prefix + timeStamp + extension);
}
public static boolean hasCamera(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
}
public static List<Integer> getSupportedFlashModes(Context context, Camera.Parameters parameters) {
//check has system feature for flash
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
List<String> modes = parameters.getSupportedFlashModes();
if (modes == null || (modes.size() == 1 && modes.get(0).equals(Camera.Parameters.FLASH_MODE_OFF))) {
return null; //not supported
} else {
ArrayList<Integer> flashModes = new ArrayList<>();
for (String mode : modes) {
switch (mode) {
case Camera.Parameters.FLASH_MODE_AUTO:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_AUTO))
flashModes.add(BaseCaptureActivity.FLASH_MODE_AUTO);
break;
case Camera.Parameters.FLASH_MODE_ON:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_ALWAYS_ON))
flashModes.add(BaseCaptureActivity.FLASH_MODE_ALWAYS_ON);
break;
case Camera.Parameters.FLASH_MODE_OFF:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_OFF))
flashModes.add(BaseCaptureActivity.FLASH_MODE_OFF);
break;
default:
break;
}
}
return flashModes;
}
} else {
return null; //not supported
}
}
// TODO: Take a hard look at how this works
// Camera2
public static List<Integer> getSupportedFlashModes(Context context, CameraCharacteristics characteristics) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return null; //doesn't support camera2
} else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
Boolean flashAvailable = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
if (flashAvailable == null || !flashAvailable)
return null;
int[] modes = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
if (modes == null || (modes.length == 1 && modes[0] == CameraCharacteristics.CONTROL_AE_MODE_OFF)) {
return null; //not supported
} else {
ArrayList<Integer> flashModes = new ArrayList<>(3);
for (int mode : modes) {
switch (mode) {
case CameraCharacteristics.CONTROL_AE_MODE_ON_AUTO_FLASH:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_AUTO))
flashModes.add(BaseCaptureActivity.FLASH_MODE_AUTO);
break;
case CameraCharacteristics.CONTROL_AE_MODE_ON_ALWAYS_FLASH:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_ALWAYS_ON))
flashModes.add(BaseCaptureActivity.FLASH_MODE_ALWAYS_ON);
break;
case CameraCharacteristics.CONTROL_AE_MODE_ON:
if (!flashModes.contains(BaseCaptureActivity.FLASH_MODE_OFF))
flashModes.add(BaseCaptureActivity.FLASH_MODE_OFF);
default:
break;
}
}
return flashModes;
}
}
return null; //not supported
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static boolean hasCamera2(Context context, boolean stillShot) {
// stillShot=false
if (context == null) return false;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return false;
if (stillShot && ManufacturerUtil.isSamsungDevice()) return false;
try {
CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
String[] idList = manager.getCameraIdList();
boolean notNull = true;
if (idList.length == 0) {
notNull = false;
} else {
for (final String str : idList) {
if (str == null || str.trim().isEmpty()) {
notNull = false;
break;
}
final CameraCharacteristics characteristics = manager.getCameraCharacteristics(str);
//noinspection ConstantConditions
final int supportLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if (supportLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
notNull = false;
break;
}
}
}
return notNull;
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
@ColorInt
public static int darkenColor(@ColorInt int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f; // value component
color = Color.HSVToColor(hsv);
return color;
}
public static boolean isColorDark(int color) {
double darkness = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255;
return darkness >= 0.5;
}
public static int adjustAlpha(int color, @SuppressWarnings("SameParameterValue") float factor) {
int alpha = Math.round(Color.alpha(color) * factor);
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
return Color.argb(alpha, red, green, blue);
}
}