package de.devland.masterpassword.base.util;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import de.devland.esperandro.Esperandro;
import de.devland.masterpassword.base.BaseApp;
import de.devland.masterpassword.base.prefs.InternalPrefs;
/**
* Created by David Kunzler on 23.10.2014.
*/
public enum RequestCodeManager {
INSTANCE;
protected Map<Integer, RequestCodeCallback> callbacks;
protected Map<Integer, Bundle> callbackData;
protected InternalPrefs internalPrefs;
RequestCodeManager() {
callbackData = new HashMap<>();
callbacks = new HashMap<>();
internalPrefs = Esperandro.getPreferences(InternalPrefs.class, BaseApp.get());
}
private int getBaseSeed() {
int i = internalPrefs.requestCodeSeed();
Random random = new Random();
while (i == 0) {
i = random.nextInt();
internalPrefs.requestCodeSeed(i);
}
return i;
}
//@SneakyThrows(PackageManager.NameNotFoundException.class)
public int getRequestCode(Class clazz, int clientRequestCode) {
try {
int packageHash = BaseApp.get().getPackageManager().getApplicationInfo(BaseApp.get().getPackageName(), PackageManager.GET_META_DATA).uid;
int seed = getBaseSeed();
int classHash = clazz.getName().hashCode();
short toShort = (short) (clientRequestCode + classHash * seed * packageHash);
return Math.abs(toShort);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
}
public int addRequest(int internalRequestCode, Class clazz, RequestCodeCallback callback, Bundle data) {
int requestCode = getRequestCode(clazz, internalRequestCode);
callbacks.put(requestCode, callback);
callbackData.put(requestCode, data);
return requestCode;
}
public boolean execute(int requestCode, int resultCode, Intent intent) {
boolean handled = false;
if (callbacks.containsKey(requestCode) && callbackData.containsKey(requestCode)) {
callbacks.get(requestCode).run(resultCode, intent, callbackData.get(requestCode));
handled = true;
}
callbacks.remove(requestCode);
callbackData.remove(requestCode);
return handled;
}
public static interface RequestCodeCallback {
public void run(int resultCode, Intent intent, Bundle data);
}
}