Skip to content

Commit

Permalink
callback for an Activity Result
Browse files Browse the repository at this point in the history
  • Loading branch information
Gowtham committed May 26, 2021
1 parent 5586742 commit 83d2302
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 93 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,5 @@ dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'com.cocosw:bottomsheet:1.5.0@aar'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}
102 changes: 57 additions & 45 deletions app/src/main/java/com/gowtham/videotrimmer/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gowtham.videotrimmer;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
Expand All @@ -12,6 +13,10 @@
import android.widget.Toast;
import android.widget.VideoView;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
Expand All @@ -24,18 +29,63 @@
import com.gowtham.library.utils.LogMessage;
import com.gowtham.library.utils.TrimType;
import com.gowtham.library.utils.TrimVideo;
import com.gowtham.library.utils.TrimmerUtils;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final int REQUEST_TAKE_VIDEO = 552;
private static final String TAG = "MainActivity";
private VideoView videoView;
private MediaController mediaController;
private EditText edtFixedGap, edtMinGap, edtMinFrom, edtMAxTo;
private int trimType;

ActivityResultLauncher<Intent> videoTrimResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK &&
result.getData() != null) {
Uri uri = Uri.parse(TrimVideo.getTrimmedVideoPath(result.getData()));
Log.d(TAG, "Trimmed path:: " + uri);
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();

videoView.setOnPreparedListener(mediaPlayer -> {
mediaController.setAnchorView(videoView);
});

String filepath = String.valueOf(uri);
File file = new File(filepath);
long length = file.length();
Log.d(TAG, "Video size:: " + (length / 1024));
} else
LogMessage.v("videoTrimResultLauncher data is null");
});

ActivityResultLauncher<Intent> takeOrSelectVideoResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK &&
result.getData() != null) {
Intent data = result.getData();
//check video duration if needed
/* if (TrimmerUtils.getDuration(this,data.getData())<=30){
Toast.makeText(this,"Video should be larger than 30 sec",Toast.LENGTH_SHORT).show();
return;
}*/
if (data.getData() != null) {
LogMessage.v("Video path:: " + data.getData());
openTrimActivity(String.valueOf(data.getData()));
} else {
Toast.makeText(this, "video uri is null", Toast.LENGTH_SHORT).show();
}
} else
LogMessage.v("takeVideoResultLauncher data is null");
});

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -54,67 +104,29 @@ protected void onCreate(Bundle savedInstanceState) {
findViewById(R.id.btn_min_max_gap).setOnClickListener(this);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (requestCode == TrimVideo.VIDEO_TRIMMER_REQ_CODE && data != null) {
Uri uri = Uri.parse(TrimVideo.getTrimmedVideoPath(data));
Log.d(TAG, "Trimmed path:: " + uri);
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();

videoView.setOnPreparedListener(mediaPlayer -> {
mediaController.setAnchorView(videoView);
});

String filepath = String.valueOf(uri);
File file = new File(filepath);
long length = file.length();
Log.d(TAG, "Video size:: " + (length / 1024));
} else if (requestCode == REQUEST_TAKE_VIDEO && resultCode == RESULT_OK) {
/* //check video duration if needed
if (TrimmerUtils.getVideoDuration(this,data.getData())<=30){
Toast.makeText(this,"Video should be larger than 30 sec",Toast.LENGTH_SHORT).show();
return;
}*/
if (data.getData() != null) {
LogMessage.v("Video path:: " + data.getData());
openTrimActivity(String.valueOf(data.getData()));
} else {
Toast.makeText(this, "video uri is null", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

private void openTrimActivity(String data) {
if (trimType == 0) {
TrimVideo.activity(data)
.setCompressOption(new CompressOption()) //pass empty constructor for default compress option
.start(this);
.start(this, videoTrimResultLauncher);
} else if (trimType == 1) {
TrimVideo.activity(data)
.setTrimType(TrimType.FIXED_DURATION)
.setFixedDuration(getEdtValueLong(edtFixedGap))
.setLocal("ar")
.start(this);
.start(this, videoTrimResultLauncher);
} else if (trimType == 2) {
TrimVideo.activity(data)
.setTrimType(TrimType.MIN_DURATION)
.setLocal("ar")
.setMinDuration(getEdtValueLong(edtMinGap))
.start(this);
.start(this, videoTrimResultLauncher);
} else {
TrimVideo.activity(data)
.setTrimType(TrimType.MIN_MAX_DURATION)
.setLocal("ar")
.setMinToMax(getEdtValueLong(edtMinFrom), getEdtValueLong(edtMAxTo))
.start(this);
.start(this, videoTrimResultLauncher);
}
}

Expand Down Expand Up @@ -194,7 +206,7 @@ public void captureVideo() {
try {
Intent intent = new Intent("android.media.action.VIDEO_CAPTURE");
intent.putExtra("android.intent.extra.durationLimit", 30);
startActivityForResult(intent, REQUEST_TAKE_VIDEO);
takeOrSelectVideoResultLauncher.launch(intent);
} catch (Exception e) {
e.printStackTrace();
}
Expand All @@ -205,7 +217,7 @@ public void openVideo() {
Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_VIDEO);
takeOrSelectVideoResultLauncher.launch(Intent.createChooser(intent, "Select Video"));
} catch (Exception e) {
e.printStackTrace();
}
Expand Down
49 changes: 49 additions & 0 deletions app/src/main/java/com/gowtham/videotrimmer/MainFragment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.gowtham.videotrimmer;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.gowtham.library.utils.CompressOption;
import com.gowtham.library.utils.TrimVideo;

public class MainFragment extends Fragment {

ActivityResultLauncher<Intent> launchSomeActivity = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
//handle trimmed video result
}
}
});

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}

private void callFragment(){
TrimVideo.activity("data")
.setCompressOption(new CompressOption()) //pass empty constructor for default compress option
.start(this,launchSomeActivity);
}
}
14 changes: 14 additions & 0 deletions app/src/main/res/layout/fragment_main.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />

</FrameLayout>
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@
<string name="txt_option">Options</string>
<string name="txt_max_duration_secs">Max duration(in secs)</string>
<string name="txt_enter_fixed_trim_duration_in_secs">Enter fixed trim duration(in secs)</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>

</resources>
6 changes: 3 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Sat Nov 21 15:32:28 IST 2020
#Wed May 26 23:38:29 IST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-rc-1-bin.zip
zipStoreBase=GRADLE_USER_HOME
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import android.os.Parcel;
import android.os.Parcelable;

public class CompressOption implements Parcelable {
public class CompressOption {

private int frameRate=30;

Expand Down Expand Up @@ -55,39 +55,4 @@ public String getBitRate() {
return bitRate;
}

public static Creator<CompressOption> getCREATOR() {
return CREATOR;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.frameRate);
dest.writeString(this.bitRate);
dest.writeInt(this.width);
dest.writeInt(this.height);
}

protected CompressOption(Parcel in) {
this.frameRate = in.readInt();
this.bitRate = in.readString();
this.width = in.readInt();
this.height = in.readInt();
}

public static final Creator<CompressOption> CREATOR = new Creator<CompressOption>() {
@Override
public CompressOption createFromParcel(Parcel source) {
return new CompressOption(source);
}

@Override
public CompressOption[] newArray(int size) {
return new CompressOption[size];
}
};
}
17 changes: 8 additions & 9 deletions library/src/main/java/com/gowtham/library/utils/TrimVideo.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.content.Intent;
import android.os.Bundle;

import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

Expand All @@ -12,11 +13,8 @@

public class TrimVideo {

public static final int VIDEO_TRIMMER_REQ_CODE = 324;

public static final String TRIM_VIDEO_OPTION = "trim_video_option",
TRIM_VIDEO_URI = "trim_video_uri",TRIMMED_VIDEO_PATH="trimmed_video_path",
BUNDLE = "bundle";
TRIM_VIDEO_URI = "trim_video_uri",TRIMMED_VIDEO_PATH="trimmed_video_path";

public static ActivityBuilder activity(String uri) {
return new ActivityBuilder(uri);
Expand Down Expand Up @@ -94,14 +92,15 @@ public ActivityBuilder setTitle(String title) {
return this;
}

public void start(Activity activity) {
public void start(Activity activity,
ActivityResultLauncher<Intent> launcher) {
validate();
activity.startActivityForResult(getIntent(activity), VIDEO_TRIMMER_REQ_CODE);
launcher.launch(getIntent(activity));
}

public void start(Fragment fragment) {
public void start(Fragment fragment,ActivityResultLauncher<Intent> launcher) {
validate();
fragment.startActivityForResult(getIntent(fragment.getActivity()), VIDEO_TRIMMER_REQ_CODE);
launcher.launch(getIntent(fragment.getActivity()));
}

private void validate() {
Expand Down Expand Up @@ -129,7 +128,7 @@ private void validate() {
}

private Intent getIntent(Activity activity) {
Intent intent = new Intent(activity, ActVideoTrimmer.class);
Intent intent = new Intent(activity, ActVideoTrimmer.class);
Gson gson = new Gson();
Bundle bundle=new Bundle();
bundle.putString(TRIM_VIDEO_URI, videoUri);
Expand Down

0 comments on commit 83d2302

Please sign in to comment.