Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add request permission for screen capture #680

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
`android.permission.BIND_NOTIFICATION_LISTENER_SERVICE`
7. Request to modify system setting.
`android.permission.WRITE_SETTINGS`
8. Request to capture screen.

```java
AndPermission.with(this)
Expand Down
6 changes: 3 additions & 3 deletions config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ ext {
bintray : 'com.jfrog.bintray']

android = [applicationId : "com.yanzhenjie.permission.sample",
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
compileSdkVersion: 31,
buildToolsVersion: "31.0.0",
minSdkVersion : 14,
targetSdkVersion : 29,
targetSdkVersion : 31,
versionCode : 108,
versionName : "2.0.3"]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@ interface IBridge {
* Request for write system setting.
*/
void requestWriteSetting(in String suffix);

/**
* Request for media capture.
*/
void requestMediaCapture(in String suffix);
}
6 changes: 6 additions & 0 deletions permission/src/main/java/com/yanzhenjie/permission/Boot.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.yanzhenjie.permission.install.InstallRequest;
import com.yanzhenjie.permission.install.NRequestFactory;
import com.yanzhenjie.permission.install.ORequestFactory;
import com.yanzhenjie.permission.media.Media;
import com.yanzhenjie.permission.notify.Notify;
import com.yanzhenjie.permission.notify.option.NotifyOption;
import com.yanzhenjie.permission.option.Option;
Expand Down Expand Up @@ -99,4 +100,9 @@ public NotifyOption notification() {
public Setting setting() {
return new Setting(mSource);
}

@Override
public Media media() {
return new Media(mSource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
package com.yanzhenjie.permission.bridge;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.projection.MediaProjectionManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
Expand Down Expand Up @@ -123,6 +125,16 @@ static void requestWriteSetting(Source source, String suffix) {
source.startActivity(intent);
}

/**
* Request for media capture.
*/
static void requestMediaCapture(Source source, String suffix) {
Intent intent = new Intent(source.getContext(), BridgeActivity.class);
intent.putExtra(KEY_TYPE, BridgeRequest.TYPE_MEDIA_CAPTURE);
intent.putExtra(KEY_ACTION_SUFFIX, suffix);
source.startActivity(intent);
}

private String mActionSuffix;

@Override
Expand Down Expand Up @@ -180,6 +192,13 @@ protected void onCreate(Bundle savedInstanceState) {
startActivityForResult(settingIntent, BridgeRequest.TYPE_WRITE_SETTING);
break;
}
case BridgeRequest.TYPE_MEDIA_CAPTURE: {
MediaProjectionManager mpm = (MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent captureIntent = mpm.createScreenCaptureIntent();
captureIntent.setData(Uri.fromParts("package", getPackageName(), null));
startActivityForResult(captureIntent, BridgeRequest.TYPE_MEDIA_CAPTURE);
break;
}
}
}

Expand All @@ -197,7 +216,11 @@ public void startActivityForResult(Intent intent, int requestCode) {
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Messenger.send(this, mActionSuffix);
if (requestCode == BridgeRequest.TYPE_MEDIA_CAPTURE && resultCode == RESULT_OK) {
Messenger.send(this, mActionSuffix, data);
} else {
Messenger.send(this, mActionSuffix);
}
finish();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package com.yanzhenjie.permission.bridge;

import android.content.Intent;

import com.yanzhenjie.permission.source.Source;

import java.util.List;
Expand All @@ -32,6 +34,7 @@ public final class BridgeRequest {
public static final int TYPE_NOTIFY = 6;
public static final int TYPE_NOTIFY_LISTENER = 7;
public static final int TYPE_WRITE_SETTING = 8;
public static final int TYPE_MEDIA_CAPTURE = 9;

private final Source mSource;

Expand Down Expand Up @@ -73,6 +76,6 @@ public void setPermissions(List<String> permissions) {

public interface Callback {

void onCallback();
void onCallback(Intent intent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,10 @@ public void requestNotificationListener(String suffix) throws RemoteException {
public void requestWriteSetting(String suffix) throws RemoteException {
BridgeActivity.requestWriteSetting(mSource, suffix);
}

@Override
public void requestMediaCapture(String suffix) throws RemoteException {
BridgeActivity.requestMediaCapture(mSource, suffix);
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ public static void send(Context context, String suffix) {
context.sendBroadcast(broadcast);
}

public static void send(Context context, String suffix, Intent extraIntent) {
Intent broadcast = new Intent(AndPermission.bridgeAction(context, suffix));
broadcast.putExtra(Intent.EXTRA_INTENT, extraIntent);
context.sendBroadcast(broadcast);
}

private final Context mContext;
private final Callback mCallback;

Expand All @@ -51,11 +57,12 @@ public void unRegister() {

@Override
public void onReceive(Context context, Intent intent) {
mCallback.onCallback();
Intent extraIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT);
mCallback.onCallback(extraIntent);
}

public interface Callback {

void onCallback();
void onCallback(Intent intent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,19 @@ private void executeCurrent(IBridge iBridge) throws RemoteException {
iBridge.requestWriteSetting(getName());
break;
}
case BridgeRequest.TYPE_MEDIA_CAPTURE: {
iBridge.requestMediaCapture(getName());
break;
}
}
}


@Override
public void onCallback() {
public void onCallback(Intent intent) {
synchronized (this) {
mMessenger.unRegister();
mRequest.getCallback().onCallback();
mRequest.getCallback().onCallback(intent);
mRequest.getSource().getContext().unbindService(mConnection);
mMessenger = null;
mRequest = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package com.yanzhenjie.permission.install;

import android.content.Intent;

import com.yanzhenjie.permission.RequestExecutor;
import com.yanzhenjie.permission.bridge.BridgeRequest;
import com.yanzhenjie.permission.bridge.RequestManager;
Expand Down Expand Up @@ -56,7 +58,7 @@ public void cancel() {
}

@Override
public void onCallback() {
public void onCallback(Intent intent) {
if (mSource.canRequestPackageInstalls()) {
callbackSucceed();
install();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.yanzhenjie.permission.media;

import android.os.Build;

import com.yanzhenjie.permission.media.capture.LCaptureRequestFactory;
import com.yanzhenjie.permission.media.capture.KCaptureRequestFactory;
import com.yanzhenjie.permission.media.capture.CaptureRequest;
import com.yanzhenjie.permission.source.Source;

/**
* Created by Khanh Bui on 2022/2/22.
*/
public class Media {

private static final MediaRequestFactory MEDIA_CAPTURE_REQUEST_FACTORY;

static {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MEDIA_CAPTURE_REQUEST_FACTORY = new LCaptureRequestFactory();
} else {
MEDIA_CAPTURE_REQUEST_FACTORY = new KCaptureRequestFactory();
}
}

public interface MediaRequestFactory {

CaptureRequest create(Source source);
}

private Source mSource;

public Media(Source source) {
this.mSource = source;
}

/**
* Permission media capture.
*/
public CaptureRequest capture() {
return MEDIA_CAPTURE_REQUEST_FACTORY.create(mSource);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.yanzhenjie.permission.media.capture;

import android.content.Intent;

import androidx.annotation.NonNull;

import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.source.Source;

/**
* Created by Khanh Bui on 2022/2/22.
*/
abstract class BaseRequest implements CaptureRequest {

protected Source mSource;

private Action<Intent> mGranted;
private Action<Void> mDenied;

public BaseRequest(Source source) {
this.mSource = source;
}

@Override
public CaptureRequest onGranted(@NonNull Action<Intent> granted) {
this.mGranted = granted;
return this;
}

@Override
public CaptureRequest onDenied(@NonNull Action<Void> denied) {
this.mDenied = denied;
return this;
}

/**
* Callback acceptance status.
*/
final void callbackSucceed(Intent intent) {
if (mGranted != null) {
mGranted.onAction(intent);
}
}

/**
* Callback rejected state.
*/
final void callbackFailed() {
if (mDenied != null) {
mDenied.onAction(null);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.yanzhenjie.permission.media.capture;

import android.content.Intent;

import androidx.annotation.NonNull;

import com.yanzhenjie.permission.Action;

/**
* Created by Khanh Bui on 2022/2/22.
*/
public interface CaptureRequest {

/**
* Action to be taken when permission is granted.
*/
CaptureRequest onGranted(@NonNull Action<Intent> granted);

/**
* Action to be taken when permission is denied.
*/
CaptureRequest onDenied(@NonNull Action<Void> denied);

/**
* Request permission.
*/
void start();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.yanzhenjie.permission.media.capture;

import com.yanzhenjie.permission.source.Source;

/**
* Created by Khanh Bui on 2022/2/22.
*/
public class KCaptureRequest extends BaseRequest {

public KCaptureRequest(Source source) {
super(source);
}

@Override
public void start() {
callbackFailed();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.yanzhenjie.permission.media.capture;

import com.yanzhenjie.permission.media.Media;
import com.yanzhenjie.permission.source.Source;

/**
* Created by Khanh Bui on 2022/2/22.
*/
public class KCaptureRequestFactory implements Media.MediaRequestFactory {

@Override
public CaptureRequest create(Source source) {
return new KCaptureRequest(source);
}
}
Loading