add app_review

This commit is contained in:
2026-01-14 21:48:38 -08:00
parent 9840f9082b
commit dad9b1207e
170 changed files with 61232 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin"/>
</classpath>
+8
View File
@@ -0,0 +1,8 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
+39
View File
@@ -0,0 +1,39 @@
group 'com.appleeducate.appreview'
version '1.0-SNAPSHOT'
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
rootProject.allprojects {
repositories {
google()
mavenCentral()
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
lintOptions {
disable 'InvalidPackage'
}
}
dependencies {
api 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.play:core:1.10.3'
}
@@ -0,0 +1,3 @@
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
@@ -0,0 +1 @@
rootProject.name = 'app_review'
@@ -0,0 +1,3 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.appleeducate.appreview">
</manifest>
@@ -0,0 +1,158 @@
package com.appleeducate.appreview;
import android.app.Activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.play.core.review.ReviewInfo;
import com.google.android.play.core.review.ReviewManager;
import com.google.android.play.core.review.ReviewManagerFactory;
import com.google.android.play.core.tasks.OnCompleteListener;
import com.google.android.play.core.tasks.Task;
import java.lang.ref.WeakReference;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
/** AppReviewPlugin */
public class AppReviewPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
private static final String CHANNEL_NAME = "app_review";
private WeakReference<Activity> currentActivity;
private MethodChannel channel;
@Nullable
private ReviewInfo reviewInfo;
public AppReviewPlugin() {
}
/** Plugin registration. */
public static void registerWith(Registrar registrar) {
AppReviewPlugin simplePermissionsPlugin = new AppReviewPlugin();
simplePermissionsPlugin.setupChannel(registrar.messenger());
// registrar.addRequestPermissionsResultListener(simplePermissionsPlugin);
}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
setupChannel(binding.getBinaryMessenger());
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
teardownChannel();
}
private void setupChannel(BinaryMessenger messenger) {
channel = new MethodChannel(messenger, CHANNEL_NAME);
channel.setMethodCallHandler(this);
}
private void teardownChannel() {
channel.setMethodCallHandler(null);
channel = null;
}
@Override
public void onMethodCall(MethodCall call, @NonNull Result result) {
String method = call.method;
switch (method) {
case "isRequestReviewAvailable":
isRequestReviewAvailable(result);
break;
case "requestReview":
requestReview(result);
break;
default:
result.notImplemented();
break;
}
}
private void isRequestReviewAvailable(final Result result) {
if (currentActivity == null || currentActivity.get() == null) {
result.error("error", "Android activity not available", null);
return;
}
ReviewManager manager = ReviewManagerFactory.create(currentActivity.get());
Task<ReviewInfo> request = manager.requestReviewFlow();
request.addOnCompleteListener(new OnCompleteListener<ReviewInfo>() {
@Override
public void onComplete(@NonNull Task<ReviewInfo> task) {
if (task.isSuccessful()) {
reviewInfo = task.getResult();
result.success("1");
} else {
result.success("0");
}
}
});
}
private void requestReview(final Result result) {
if (currentActivity == null || currentActivity.get() == null) {
result.error("error", "Android activity not available", null);
return;
}
if (reviewInfo == null) {
getReviewInfoAndRequestReview(result);
return;
}
ReviewManager manager = ReviewManagerFactory.create(currentActivity.get());
Task<Void> task = manager.launchReviewFlow(currentActivity.get(), reviewInfo);
task.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
result.success("Success: " + task.isSuccessful());
}
});
}
private void getReviewInfoAndRequestReview(final Result result) {
ReviewManager manager = ReviewManagerFactory.create(currentActivity.get());
Task<ReviewInfo> request = manager.requestReviewFlow();
request.addOnCompleteListener(new OnCompleteListener<ReviewInfo>() {
@Override
public void onComplete(@NonNull Task<ReviewInfo> task) {
if (task.isSuccessful()) {
reviewInfo = task.getResult();
requestReview(result);
} else {
result.error("Requesting review not possible", null, null);
}
}
});
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
currentActivity = new WeakReference<>(binding.getActivity());
}
@Override
public void onDetachedFromActivityForConfigChanges() {
onDetachedFromActivity();
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
onAttachedToActivity(binding);
}
@Override
public void onDetachedFromActivity() {
currentActivity = null;
}
}