[Xposed Framework Modules] MaaarZ:
You are missing the point that Snapprefs is NOT a successor of Keepchat/Snapshare, the first version was released even before Keepchat/Snapshare got shut down (4 months before that). People asked for the saving and sharing feature to be added. Also, my point was that the cores are WAY different from Keepchat/Snapshare. Let's see:

Keepchat's image/video hijacking method:

/**
* Method used to get the bitmap of a snap. We retrieve this return value and store it in a field for future saving.
*/
findAndHookMethod(Obfuscator.RECEIVEDSNAP_CLASS, lpparam.classLoader, Obfuscator.RECEIVEDSNAP_GETIMAGEBITMAP, Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// Return if this snap is a video, we only use this for saving images
boolean isVideo = (Boolean) callMethod(param.thisObject, Obfuscator.SNAP_ISVIDEO);
if (isVideo) return;

setAdditionalInstanceField(param.thisObject, "snap_bitmap", param.getResult());
setAdditionalInstanceField(param.thisObject, "snap_media_type", MediaType.IMAGE);
setAdditionalInstanceField(param.thisObject, "snap_type", SnapType.SNAP);
}
});

/**
* Method used to get the bitmap of a story. We retrieve this return value and store it in a field for future saving.
*/
findAndHookMethod(Obfuscator.STORYSNAP_CLASS, lpparam.classLoader, Obfuscator.STORYSNAP_GETIMAGEBITMAP, Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// Return if this snap is a video, we only use this for saving images
boolean isVideo = (Boolean) callMethod(param.thisObject, Obfuscator.SNAP_ISVIDEO);
if (isVideo) return;

setAdditionalInstanceField(param.thisObject, "snap_bitmap", param.getResult());
setAdditionalInstanceField(param.thisObject, "snap_media_type", MediaType.IMAGE);
setAdditionalInstanceField(param.thisObject, "snap_type", SnapType.STORY);
}
});

/**
* Method used to load resources for a video. We get this object from the parameters, get relevant info and store it in fields for future saving.
*/
final Class<?> videoSnapResourcesClass = findClass(Obfuscator.VIDEOSNAPRESOURCES_CLASS, lpparam.classLoader);
findAndHookMethod(Obfuscator.VIDEOSNAPRENDERER_CLASS, lpparam.classLoader, Obfuscator.VIDEOSNAPRENDERER_LOADRES, videoSnapResourcesClass, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Object receivedSnap = getObjectField(param.thisObject, Obfuscator.VIDEOSNAPRENDERER_RECEIVEDSNAP);
// Check if the video is a snap or a story
SnapType snapType = (storySnapClass.isInstance(receivedSnap) ? SnapType.STORY : SnapType.SNAP);

Object videoSnapResources = param.args[0];
setAdditionalInstanceField(receivedSnap, "snap_bitmap", callMethod(videoSnapResources, Obfuscator.VIDEOSNAPRESOURCES_GETBITMAP));
setAdditionalInstanceField(receivedSnap, "snap_video_uri", callMethod(videoSnapResources, Obfuscator.VIDEOSNAPRESOURCES_GETVIDEOURI));
setAdditionalInstanceField(receivedSnap, "snap_media_type", MediaType.VIDEO);
setAdditionalInstanceField(receivedSnap, "snap_type", snapType);
}
});

Snapprefs':

/**
* We hook this method to get the newly set VideoUri.
*/
findAndHookMethod(VideoView.class, "setVideoURI", Uri.class, Map.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//We have to store the file data before snapchat deletes it
try {
mVideo = new FileInputStream(param.args[0].toString());
Logger.log(param.args[0].toString(), true);

newSaveMethod(mVideo, null, false);

//Logger.log("It is a Video", true);
saveReceivedSnap(snapContext, receivedSnap, MediaType.VIDEO);
//mVideo = null;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});

/**
* We hook this method to get the BitmapDrawable currently displayed.
*/
findAndHookMethod(ImageView.class, "updateDrawable", Drawable.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (!mSCResources.getResourceName(((View) param.thisObject).getId()).equals(Common.basename + ":id/snap_image_view"))
return;

if (((BitmapDrawable) param.args[0]).getBitmap() == null) return;
mImage = ((BitmapDrawable) param.args[0]).getBitmap();

newSaveMethod(null, mImage, false);

//Logger.log("It is a Bitmap", true);
saveReceivedSnap(snapContext, receivedSnap, MediaType.IMAGE);
} catch (NullPointerException | Resources.NotFoundException ignore) {
//Sometimes getResourceName is going to return null that's okay
}
}
}); /**
* We hook this method to get the BitmapDrawable currently displayed.
*/
findAndHookMethod(ImageView.class, "updateDrawable", Drawable.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (!mSCResources.getResourceName(((View) param.thisObject).getId()).equals(Common.basename + ":id/snap_video_image_overlay"))
return;

if (((BitmapDrawable) param.args[0]).getBitmap() == null) return;
mImage = ((BitmapDrawable) param.args[0]).getBitmap();

newSaveMethod(null, mImage, true);

//Logger.log("It is a Bitmap", true);
saveReceivedSnap(snapContext, receivedSnap, MediaType.IMAGE_OVERLAY);
} catch (NullPointerException | Resources.NotFoundException ignore) {
//Sometimes getResourceName is going to return null that's okay
}
}
});

They are not even similar.

Sharing method of Snapshare:

/**
* We want to send our media once the camera is ready, that's why we hook the refreshFlashButton/onCameraStateEvent method.
* The media is injected by calling the eventbus to send a snapcapture event with our own media.
*/
XC_MethodHook cameraLoadedHook = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedUtils.refreshPreferences(); // Refresh preferences for captions
if (initializedUri == null) {
return; // We don't have an image to send, so don't try to send one
}

XposedUtils.log("Doing it's magic!");
Object snapCaptureEvent;

// Since 4.1.10 a new Class called Snapbryo stores all the data for snaps
// SnapCapturedEvent(Snapbryo(Builder(Media)))
if (snapchatVersion >= Obfuscator.FOUR_ONE_TEN) {
Object builder = newInstance(findClass("com.snapchat.android.model.Snapbryo.Builder", lpparam.classLoader));
builder = callMethod(builder, Obfuscator.BUILDER_CONSTRUCTOR.getValue(snapchatVersion), media.getContent());
Object snapbryo = callMethod(builder, Obfuscator.CREATE_SNAPBRYO.getValue(snapchatVersion));
snapCaptureEvent = newInstance(snapCapturedEventClass, snapbryo);
} else {
snapCaptureEvent = newInstance(snapCapturedEventClass, media.getContent());
}

// Call the eventbus to post our SnapCapturedEvent, this will take us to the SnapPreviewFragment
Object busProvider = callStaticMethod(findClass("com.snapchat.android.util.eventbus.BusProvider", lpparam.classLoader), Obfuscator.GET_BUS.getValue(snapchatVersion));
callMethod(busProvider, Obfuscator.BUS_POST.getValue(snapchatVersion), snapCaptureEvent);
// Clean up after ourselves, otherwise snapchat will crash
initializedUri = null;
}
};

Snapprefs':

XC_MethodHook cameraLoadedHook = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
HookMethods.refreshPreferences(); // Refresh preferences for captions
if (initializedUri == null) {
return; // We don't have an image to send, so don't try to send one
}

XposedUtils.log("Doing it's magic!");
Object snapCaptureEvent;

findAndHookMethod("com.snapchat.android.camera.CameraFragment", lpparam.classLoader, "a", Bitmap.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = mediaImg.getContent();
Logger.log("Set IMAGE media in camerafragment", true);
}
});
findAndHookMethod("com.snapchat.android.camera.CameraFragment", lpparam.classLoader, "a", Uri.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = mediaVid.getContent();
Logger.log("Set Video media in camerafragment", true);
}
});
initializedUri = null;
}
};

They are not even close.