0
0
mirror of https://github.com/TrianguloY/UrlChecker.git synced 2024-09-19 20:02:16 +02:00

ActivityResultInjector renamed to ResultCodeInjector, can now be used for permissions

This commit is contained in:
TrianguloY 2024-02-02 20:17:23 +01:00
parent 2af18b34d7
commit e2a4776881
7 changed files with 124 additions and 83 deletions

View File

@ -10,7 +10,7 @@ import android.view.View;
import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.fragments.ActivityResultInjector;
import com.trianguloy.urlchecker.fragments.ResultCodeInjector;
import com.trianguloy.urlchecker.modules.companions.VersionManager;
import com.trianguloy.urlchecker.utilities.AndroidSettings;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
@ -21,7 +21,7 @@ import com.trianguloy.urlchecker.utilities.methods.PackageUtils;
*/
public class MainActivity extends Activity {
private final ActivityResultInjector activityResultInjector = new ActivityResultInjector();
private final ResultCodeInjector resultCodeInjector = new ResultCodeInjector();
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -57,7 +57,7 @@ public class MainActivity extends Activity {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!activityResultInjector.onActivityResult(requestCode, resultCode, data))
if (!resultCodeInjector.onActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}
@ -70,7 +70,7 @@ public class MainActivity extends Activity {
public void openSettings(View view) {
PackageUtils.startActivityForResult(
new Intent(this, SettingsActivity.class),
AndroidSettings.registerForReloading(activityResultInjector, this),
AndroidSettings.registerForReloading(resultCodeInjector, this),
R.string.toast_noApp,
this
);

View File

@ -10,8 +10,8 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.fragments.ActivityResultInjector;
import com.trianguloy.urlchecker.fragments.BrowserButtonsFragment;
import com.trianguloy.urlchecker.fragments.ResultCodeInjector;
import com.trianguloy.urlchecker.utilities.AndroidSettings;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import com.trianguloy.urlchecker.utilities.methods.PackageUtils;
@ -53,8 +53,8 @@ public class SettingsActivity extends Activity {
/* ------------------- configure browser ------------------- */
private final ActivityResultInjector activityResultInjector = new ActivityResultInjector();
private final BrowserButtonsFragment browserButtons = new BrowserButtonsFragment(this, activityResultInjector);
private final ResultCodeInjector resultCodeInjector = new ResultCodeInjector();
private final BrowserButtonsFragment browserButtons = new BrowserButtonsFragment(this, resultCodeInjector);
private void configureBrowserButtons() {
browserButtons.onInitialize(findViewById(browserButtons.getLayoutId()));
@ -62,7 +62,7 @@ public class SettingsActivity extends Activity {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!activityResultInjector.onActivityResult(requestCode, resultCode, data))
if (!resultCodeInjector.onActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}

View File

@ -10,8 +10,8 @@ import android.widget.TextView;
import android.widget.ViewFlipper;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.fragments.ActivityResultInjector;
import com.trianguloy.urlchecker.fragments.BrowserButtonsFragment;
import com.trianguloy.urlchecker.fragments.ResultCodeInjector;
import com.trianguloy.urlchecker.utilities.AndroidSettings;
import com.trianguloy.urlchecker.utilities.generics.GenericPref;
import com.trianguloy.urlchecker.utilities.methods.PackageUtils;
@ -55,8 +55,8 @@ public class TutorialActivity extends Activity {
/* ------------------- browser fragment ------------------- */
private final ActivityResultInjector activityResultInjector = new ActivityResultInjector();
private final BrowserButtonsFragment browserButtons = new BrowserButtonsFragment(this, activityResultInjector);
private final ResultCodeInjector resultCodeInjector = new ResultCodeInjector();
private final BrowserButtonsFragment browserButtons = new BrowserButtonsFragment(this, resultCodeInjector);
private void configureBrowserButtons() {
browserButtons.onInitialize(findViewById(browserButtons.getLayoutId()));
@ -64,7 +64,7 @@ public class TutorialActivity extends Activity {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!activityResultInjector.onActivityResult(requestCode, resultCode, data))
if (!resultCodeInjector.onActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}

View File

@ -1,64 +0,0 @@
package com.trianguloy.urlchecker.fragments;
import android.content.Intent;
import android.util.Log;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import java.util.ArrayList;
import java.util.List;
/**
* An injector to allow registering for activityResult.
* Alternative to using the deprecate android fragments (and without using the huge compatibility library)
*/
public class ActivityResultInjector {
private static final int RESERVED = 123; // just in case, registered listeners will have requestCode >= this
private final List<Listener> listeners = new ArrayList<>();
/* ------------------- client use ------------------- */
public interface Listener {
/**
* Called when the event fires for a particular registrar
*/
void onActivityResult(int resultCode, Intent data);
}
/**
* Call this to register an onActivityResult listener. Returns the requestCode you must use in the startActivityForResult call
*/
public int register(Listener listener) {
listeners.add(listener);
return RESERVED + listeners.size() - 1;
}
/* ------------------- activity use ------------------- */
/**
* An activity must use this as:
* <pre>
* @Override
* public void onActivityResult(int requestCode, int resultCode, Intent data) {
* if (!activityResultInjector.onActivityResult(requestCode, resultCode, data))
* super.onActivityResult(requestCode, resultCode, data);
* }
* </pre>
*/
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
var index = requestCode - RESERVED;
if (index < 0) {
// external
Log.d("ACTIVITY_RESULT", "External request code (" + requestCode + "), consider using ActivityResultInjector");
return false;
}
if (index >= listeners.size()) {
// external?
AndroidUtils.assertError("Invalid request code (" + requestCode + "), consider using ActivityResultInjector or a requestCode less than " + RESERVED);
return false;
}
listeners.get(index).onActivityResult(resultCode, data);
return true;
}
}

View File

@ -15,14 +15,14 @@ import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.methods.PackageUtils;
public class BrowserButtonsFragment implements Fragment, ActivityResultInjector.Listener {
public class BrowserButtonsFragment implements Fragment, ResultCodeInjector.ActivityResultListener {
private final Activity cntx;
private final int requestCode;
private RoleManager roleManager;
public BrowserButtonsFragment(Activity cntx, ActivityResultInjector activityResultInjector) {
public BrowserButtonsFragment(Activity cntx, ResultCodeInjector resultCodeInjector) {
this.cntx = cntx;
requestCode = activityResultInjector.register(this);
requestCode = resultCodeInjector.registerActivityResult(this);
}
@Override

View File

@ -0,0 +1,105 @@
package com.trianguloy.urlchecker.fragments;
import android.content.Intent;
import android.util.Log;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import java.util.ArrayList;
import java.util.List;
/**
* An injector to allow registering for activityResult and requestPermissionsResult.
* Alternative to using the deprecate android fragments (and without using the huge compatibility library)
*/
public class ResultCodeInjector {
private static final int RESERVED = 123; // just in case, registered listeners will have requestCode >= this
private final List<ActivityResultListener> activityResultListeners = new ArrayList<>();
private final List<RequestPermissionsResultListener> requestPermissionsResultListeners = new ArrayList<>();
/* ------------------- client use ------------------- */
public interface ActivityResultListener {
/**
* Called when the event fires for a particular registrar
*/
void onActivityResult(int resultCode, Intent data);
}
public interface RequestPermissionsResultListener {
/**
* Called when the event fires for a particular registrar
*/
void onRequestPermissionsResult(String[] permissions, int[] grantResults);
}
/**
* Call this to register an onActivityResult listener. Returns the requestCode you must use in the startActivityForResult call
*/
public int registerActivityResult(ActivityResultListener activityResultListener) {
activityResultListeners.add(activityResultListener);
return RESERVED + activityResultListeners.size() - 1;
}
/**
* Call this to register an onActivityResult listener. Returns the requestCode you must use in the startActivityForResult call
*/
public int registerPermissionsResult(RequestPermissionsResultListener requestPermissionsResultListener) {
requestPermissionsResultListeners.add(requestPermissionsResultListener);
return RESERVED + requestPermissionsResultListeners.size() - 1;
}
/* ------------------- activity use ------------------- */
/**
* An activity must use this as:
* <pre>
* @Override
* public void onActivityResult(int requestCode, int resultCode, Intent data) {
* if (!resultCodeInjector.onActivityResult(requestCode, resultCode, data))
* super.onActivityResult(requestCode, resultCode, data);
* }
* </pre>
*/
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
var index = requestCode - RESERVED;
if (index < 0) {
// external
Log.d("ACTIVITY_RESULT", "External request code (" + requestCode + "), consider using ResultCodeInjector");
return false;
}
if (index >= activityResultListeners.size()) {
// external?
AndroidUtils.assertError("Invalid request code (" + requestCode + "), consider using ResultCodeInjector or a requestCode less than " + RESERVED);
return false;
}
activityResultListeners.get(index).onActivityResult(resultCode, data);
return true;
}
/**
* An activity must use this as:
* <pre>
* @Override
* public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
* if (!resultCodeInjector.onRequestPermissionsResult(requestCode, permissions, grantResults))
* super.onRequestPermissionsResult(requestCode, permissions, grantResults);
* }
* </pre>
*/
public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
var index = requestCode - RESERVED;
if (index < 0) {
// external
Log.d("ACTIVITY_RESULT", "External request code (" + requestCode + "), consider using ResultCodeInjector");
return false;
}
if (index >= requestPermissionsResultListeners.size()) {
// external?
AndroidUtils.assertError("Invalid request code (" + requestCode + "), consider using ResultCodeInjector or a requestCode less than " + RESERVED);
return false;
}
requestPermissionsResultListeners.get(index).onRequestPermissionsResult(permissions, grantResults);
return true;
}
}

View File

@ -9,7 +9,7 @@ import android.util.Log;
import com.trianguloy.urlchecker.BuildConfig;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.fragments.ActivityResultInjector;
import com.trianguloy.urlchecker.fragments.ResultCodeInjector;
import com.trianguloy.urlchecker.utilities.generics.GenericPref;
import java.util.ArrayList;
@ -220,8 +220,8 @@ public interface AndroidSettings {
/**
* Registers an activity result to reload if the launched activity is marked as reloading using{@link AndroidSettings#markForReloading(Activity)}
*/
static int registerForReloading(ActivityResultInjector activityResultInjector, Activity cntx) {
return activityResultInjector.register((resultCode, data) -> {
static int registerForReloading(ResultCodeInjector resultCodeInjector, Activity cntx) {
return resultCodeInjector.registerActivityResult((resultCode, data) -> {
if (resultCode == RELOAD_RESULT_CODE) {
AndroidSettings.reload(cntx);
}
@ -229,7 +229,7 @@ public interface AndroidSettings {
}
/**
* Makes the activity that launched this one to reload, if registered with {@link AndroidSettings#registerForReloading(ActivityResultInjector, Activity)}
* Makes the activity that launched this one to reload, if registered with {@link AndroidSettings#registerForReloading(ResultCodeInjector, Activity)}
*/
static void markForReloading(Activity cntx) {
cntx.setResult(RELOAD_RESULT_CODE);