/*
CapabilityUtil.java
Copyright (c) 2016 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.host.recorder.util;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import android.provider.Settings;
import org.deviceconnect.android.activity.IntentHandlerActivity;
import org.deviceconnect.android.activity.PermissionUtility;
public final class CapabilityUtil {
private CapabilityUtil() {
}
public static void requestPermissions(final Context context, final Handler handler, final PermissionUtility.PermissionRequestCallback callback) {
PermissionUtility.requestPermissions(context, handler, new String[]{Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, callback);
}
public static void requestPermissions(final Context context, final PermissionUtility.PermissionRequestCallback callback) {
requestPermissions(context, new Handler(Looper.getMainLooper()), callback);
}
public static void checkCapability(final Context context, final Handler handler, final Callback callback) {
final ResultReceiver cameraCapabilityCallback = new ResultReceiver(handler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
try {
if (resultCode == Activity.RESULT_OK) {
callback.onSuccess();
} else {
callback.onFail();
}
} catch (Throwable throwable) {
callback.onFail();
}
}
};
final ResultReceiver overlayDrawingCapabilityCallback = new ResultReceiver(handler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
try {
if (resultCode == Activity.RESULT_OK) {
CapabilityUtil.checkCameraCapability(context, cameraCapabilityCallback);
} else {
callback.onFail();
}
} catch (Throwable throwable) {
callback.onFail();
}
}
};
CapabilityUtil.checkOverlayDrawingCapability(context, handler, overlayDrawingCapabilityCallback);
}
/**
* オーバーレイ表示のパーミッションを確認します.
*
* @param context コンテキスト
* @param handler ハンドラー
* @param resultReceiver 確認を受けるレシーバ
*/
@TargetApi(23)
private static void checkOverlayDrawingCapability(final Context context, final Handler handler, final ResultReceiver resultReceiver) {
if (Settings.canDrawOverlays(context)) {
resultReceiver.send(Activity.RESULT_OK, null);
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + context.getPackageName()));
IntentHandlerActivity.startActivityForResult(context, intent, new ResultReceiver(handler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (Settings.canDrawOverlays(context)) {
resultReceiver.send(Activity.RESULT_OK, null);
} else {
resultReceiver.send(Activity.RESULT_CANCELED, null);
}
}
});
}
}
/**
* カメラのパーミッションを確認します.
*
* @param context コンテキスト
* @param resultReceiver 確認を受けるレシーバ
*/
private static void checkCameraCapability(final Context context, final ResultReceiver resultReceiver) {
PermissionUtility.requestPermissions(context, new Handler(), new String[]{Manifest.permission.CAMERA},
new PermissionUtility.PermissionRequestCallback() {
@Override
public void onSuccess() {
resultReceiver.send(Activity.RESULT_OK, null);
}
@Override
public void onFail(final String deniedPermission) {
resultReceiver.send(Activity.RESULT_CANCELED, null);
}
});
}
/**
* Overlayの表示結果を通知するコールバック.
*/
public interface Callback {
/**
* 表示できたことを通知します.
*/
void onSuccess();
/**
* 表示できなかったことを通知します.
*/
void onFail();
}
}