@ -1,7 +1,11 @@
package com.xypower.mpapp.video ;
import androidx.appcompat.app.AppCompatActivity ;
import androidx.localbroadcastmanager.content.LocalBroadcastManager ;
import android.content.Intent ;
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
import android.os.Looper ;
import android.os.Message ;
import android.os.SystemClock ;
@ -48,6 +52,7 @@ import android.view.Surface;
import android.view.TextureView ;
import android.widget.Toast ;
import com.xypower.mpapp.MicroPhotoService ;
import com.xypower.mpapp.R ;
import java.io.File ;
@ -71,6 +76,9 @@ import java.util.concurrent.atomic.AtomicInteger;
public class RawActivity extends AppCompatActivity {
public static final String ACTION_FINISH = "com.xypower.mvapp.ACT_FINISH" ;
public static final String ACTION_MP_VIDEO_FINISHED = "com.xypower.mpapp.ACT_V_FINISHED" ;
/ * *
* Conversion from screen rotation to JPEG orientation .
* /
@ -219,6 +227,14 @@ public class RawActivity extends AppCompatActivity {
* /
private String mCameraId ;
private boolean mActivityResult = false ;
private long mPhotoId = 0 ;
private int mOrientation = - 1 ;
/ * *
* A { @link CameraCaptureSession } for camera preview .
* /
@ -234,6 +250,8 @@ public class RawActivity extends AppCompatActivity {
* /
private Size mPreviewSize ;
private Size mImageSize ;
/ * *
* The { @link CameraCharacteristics } for the currently configured camera device .
* /
@ -339,6 +357,7 @@ public class RawActivity extends AppCompatActivity {
cameraDevice . close ( ) ;
mCameraDevice = null ;
}
broadcastPhotoFile ( false , "" ) ;
finish ( ) ;
}
@ -559,13 +578,17 @@ public class RawActivity extends AppCompatActivity {
}
} ;
/ *
mCameraId = intent . getIntExtra ( "cameraId" , 0 ) ;
mDuration = intent . getIntExtra ( "duration" , 0 ) ;
mVideoWidth = intent . getIntExtra ( "width" , 0 ) ;
mVideoHeight = intent . getIntExtra ( "height" , 0 ) ;
Intent intent = getIntent ( ) ;
mCameraId = Integer . toString ( intent . getIntExtra ( "cameraId" , 0 ) ) ;
mOrientation = intent . getIntExtra ( "orientation" , - 1 ) ;
* /
int width = intent . getIntExtra ( "width" , 0 ) ;
int height = intent . getIntExtra ( "height" , 0 ) ;
mImageSize = new Size ( width , height ) ;
mPhotoId = intent . getLongExtra ( "videoId" , 0 ) ;
mMessageHandler . postDelayed ( new Runnable ( ) {
@Override
@ -1197,6 +1220,8 @@ public class RawActivity extends AppCompatActivity {
* /
private final File mFile ;
private final long mPhotoId ;
/ * *
* The CaptureResult for this image capture .
* /
@ -1212,25 +1237,43 @@ public class RawActivity extends AppCompatActivity {
* /
private final Context mContext ;
private boolean mResult = false ;
private int mFormat ;
/ * *
* A reference counted wrapper for the ImageReader that owns the given image .
* /
private final RefCountedAutoCloseable < ImageReader > mReader ;
private ImageSaver ( Image image , File file , CaptureResult result ,
private ImageSaver ( Image image , File file , CaptureResult result , long photoId ,
CameraCharacteristics characteristics , Context context ,
RefCountedAutoCloseable < ImageReader > reader ) {
mImage = image ;
mFile = file ;
mPhotoId = photoId ;
mCaptureResult = result ;
mCharacteristics = characteristics ;
mContext = context ;
mReader = reader ;
mFormat = mImage . getFormat ( ) ;
}
public String getPath ( ) {
return mFile . getAbsolutePath ( ) ;
}
public boolean getResult ( ) {
return mResult ;
}
public int getFormat ( ) {
return mFormat ;
}
@Override
public void run ( ) {
boolean success = false ;
mResult = false ;
int format = mImage . getFormat ( ) ;
switch ( format ) {
case ImageFormat . JPEG : {
@ -1241,7 +1284,7 @@ public class RawActivity extends AppCompatActivity {
try {
output = new FileOutputStream ( mFile ) ;
output . write ( bytes ) ;
success = true ;
mResult = true ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
} finally {
@ -1256,7 +1299,8 @@ public class RawActivity extends AppCompatActivity {
try {
output = new FileOutputStream ( mFile ) ;
dngCreator . writeImage ( output , mImage ) ;
success = true ;
mResult = true ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
} finally {
@ -1275,21 +1319,7 @@ public class RawActivity extends AppCompatActivity {
mReader . close ( ) ;
// If saving the file succeeded, update MediaStore.
if ( success ) {
MediaScannerConnection . scanFile ( mContext , new String [ ] { mFile . getPath ( ) } ,
/*mimeTypes*/ null , new MediaScannerConnection . MediaScannerConnectionClient ( ) {
@Override
public void onMediaScannerConnected ( ) {
// Do nothing
}
@Override
public void onScanCompleted ( String path , Uri uri ) {
Log . i ( TAG , "Scanned " + path + ":" ) ;
Log . i ( TAG , "-> uri=" + uri ) ;
}
} ) ;
}
}
/ * *
@ -1300,6 +1330,7 @@ public class RawActivity extends AppCompatActivity {
public static class ImageSaverBuilder {
private Image mImage ;
private File mFile ;
private long mImageId ;
private CaptureResult mCaptureResult ;
private CameraCharacteristics mCharacteristics ;
private Context mContext ;
@ -1329,6 +1360,11 @@ public class RawActivity extends AppCompatActivity {
return this ;
}
public synchronized ImageSaverBuilder setImageId ( final long imageId ) {
mImageId = imageId ;
return this ;
}
public synchronized ImageSaverBuilder setFile ( final File file ) {
if ( file = = null ) throw new NullPointerException ( ) ;
mFile = file ;
@ -1352,7 +1388,7 @@ public class RawActivity extends AppCompatActivity {
if ( ! isComplete ( ) ) {
return null ;
}
return new ImageSaver ( mImage , mFile , mCaptureResult , m Characteristics, mContext ,
return new ImageSaver ( mImage , mFile , mCaptureResult , m ImageId, m Characteristics, mContext ,
mReader ) ;
}
@ -1590,10 +1626,25 @@ public class RawActivity extends AppCompatActivity {
private void handleCompletionLocked ( int requestId , ImageSaver . ImageSaverBuilder builder ,
TreeMap < Integer , ImageSaver . ImageSaverBuilder > queue ) {
if ( builder = = null ) return ;
ImageSaver saver = builder . buildIfComplete ( ) ;
final ImageSaver saver = builder . buildIfComplete ( ) ;
if ( saver ! = null ) {
queue . remove ( requestId ) ;
AsyncTask . THREAD_POOL_EXECUTOR . execute ( saver ) ;
AsyncTask . THREAD_POOL_EXECUTOR . execute ( new Runnable ( ) {
@Override
public void run ( ) {
saver . run ( ) ;
if ( saver . getFormat ( ) = = ImageFormat . RAW_SENSOR ) {
runOnUiThread ( new Runnable ( ) {
@Override
public void run ( ) {
broadcastPhotoFile ( saver . getResult ( ) , saver . getPath ( ) ) ;
finish ( ) ;
}
} ) ;
}
}
} ) ;
}
}
@ -1629,5 +1680,51 @@ public class RawActivity extends AppCompatActivity {
return ( SystemClock . elapsedRealtime ( ) - mCaptureTimer ) > PRECAPTURE_TIMEOUT_MS ;
}
private void broadcastPhotoFile ( boolean result , String path ) {
Context context = getApplicationContext ( ) ;
String receiverName = MicroPhotoService . AlarmReceiver . class . getName ( ) ;
String packageName = context . getPackageName ( ) ;
Intent intent = new Intent ( ACTION_MP_VIDEO_FINISHED ) ;
// intent.setPackage(packageName);
intent . putExtra ( "photoOrVideo" , true ) ;
intent . putExtra ( "result" , result ) ;
intent . putExtra ( "path" , path ) ;
intent . putExtra ( "videoId" , mPhotoId ) ;
// intent.setComponent(new ComponentName(packageName, receiverName));
if ( mActivityResult ) {
setResult ( RESULT_OK , intent ) ;
} else {
// Log.i(TAG, "Notify recording videoId=" + Long.toString(mVideoId) + " " + path);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager . getInstance ( getApplicationContext ( ) ) ;
localBroadcastManager . sendBroadcast ( intent ) ;
context . sendBroadcast ( intent ) ;
}
}
private static void broadcastPhotoFile ( Context context , boolean result , String path , long photoId ) {
String receiverName = MicroPhotoService . AlarmReceiver . class . getName ( ) ;
String packageName = context . getPackageName ( ) ;
Intent intent = new Intent ( ACTION_MP_VIDEO_FINISHED ) ;
// intent.setPackage(packageName);
intent . putExtra ( "photoOrVideo" , true ) ;
intent . putExtra ( "result" , result ) ;
intent . putExtra ( "path" , path ) ;
intent . putExtra ( "videoId" , photoId ) ;
// intent.setComponent(new ComponentName(packageName, receiverName));
// Log.i(TAG, "Notify recording videoId=" + Long.toString(mVideoId) + " " + path);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager . getInstance ( context ) ;
localBroadcastManager . sendBroadcast ( intent ) ;
context . sendBroadcast ( intent ) ;
}
}