You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
create ContentProvider from AndroidManifest.xml
This is required for androidx startup library. Only onCreate method is called for now.
This commit is contained in:
31
src/api-impl/android/content/ContentProvider.java
Normal file
31
src/api-impl/android/content/ContentProvider.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package android.content;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
|
||||||
|
import com.reandroid.arsc.chunk.xml.ResXmlElement;
|
||||||
|
|
||||||
|
public class ContentProvider {
|
||||||
|
|
||||||
|
static void createContentProviders() throws ReflectiveOperationException {
|
||||||
|
List<ResXmlElement> providers = Context.manifest.getApplicationElement().listElements(AndroidManifestBlock.TAG_provider);
|
||||||
|
System.out.println(providers);
|
||||||
|
for (ResXmlElement providerElement : providers) {
|
||||||
|
String providerName = providerElement.searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString();
|
||||||
|
if (providerName.startsWith(".")) {
|
||||||
|
providerName = Context.manifest.getPackageName() + providerName;
|
||||||
|
}
|
||||||
|
System.out.println("creating " + providerName);
|
||||||
|
Class<? extends ContentProvider> providerCls = Class.forName(providerName).asSubclass(ContentProvider.class);
|
||||||
|
ContentProvider provider = providerCls.getConstructor().newInstance();
|
||||||
|
provider.onCreate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onCreate() {return false;}
|
||||||
|
|
||||||
|
public Context getContext() {
|
||||||
|
return Context.this_application;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -54,7 +54,7 @@ public class Context extends Object {
|
|||||||
public static final String DISPLAY_SERVICE = "display";
|
public static final String DISPLAY_SERVICE = "display";
|
||||||
public static final String MEDIA_ROUTER_SERVICE = "media_router";
|
public static final String MEDIA_ROUTER_SERVICE = "media_router";
|
||||||
public static final String WINDOW_SERVICE = "window";
|
public static final String WINDOW_SERVICE = "window";
|
||||||
private static AndroidManifestBlock manifest = null;
|
public static AndroidManifestBlock manifest = null;
|
||||||
|
|
||||||
static AssetManager assets;
|
static AssetManager assets;
|
||||||
static DisplayMetrics dm;
|
static DisplayMetrics dm;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import android.content.res.Resources;
|
|||||||
import android.content.res.XmlResourceParser;
|
import android.content.res.XmlResourceParser;
|
||||||
// import android.graphics.drawable.Drawable;
|
// import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.AndroidException;
|
import android.util.AndroidException;
|
||||||
@@ -35,6 +36,9 @@ import java.io.File;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
|
||||||
|
import com.reandroid.arsc.chunk.xml.ResXmlElement;
|
||||||
|
|
||||||
class IPackageInstallObserver {}
|
class IPackageInstallObserver {}
|
||||||
class VerificationParams {}
|
class VerificationParams {}
|
||||||
class ContainerEncryptionParams {}
|
class ContainerEncryptionParams {}
|
||||||
@@ -1690,7 +1694,28 @@ public class PackageManager {
|
|||||||
*/
|
*/
|
||||||
public ProviderInfo getProviderInfo(ComponentName component,
|
public ProviderInfo getProviderInfo(ComponentName component,
|
||||||
int flags) throws NameNotFoundException {
|
int flags) throws NameNotFoundException {
|
||||||
return null;
|
ProviderInfo providerInfo = new ProviderInfo();
|
||||||
|
if ((flags & GET_META_DATA) == GET_META_DATA) {
|
||||||
|
String cls = component.getClassName();
|
||||||
|
List<ResXmlElement> providers = Context.manifest.getApplicationElement().listElements(AndroidManifestBlock.TAG_provider);
|
||||||
|
for (ResXmlElement providerElement : providers) {
|
||||||
|
String providerName = providerElement.searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString();
|
||||||
|
if (providerName.startsWith(".")) {
|
||||||
|
providerName = Context.manifest.getPackageName() + providerName;
|
||||||
|
}
|
||||||
|
if (providerName.equals(cls)) {
|
||||||
|
List<ResXmlElement> metaDatas = providerElement.listElements(AndroidManifestBlock.TAG_meta_data);
|
||||||
|
Bundle bundle = new Bundle(metaDatas.size());
|
||||||
|
for (ResXmlElement metaData : metaDatas) {
|
||||||
|
bundle.putString(metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString(),
|
||||||
|
metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_value).getValueAsString());
|
||||||
|
}
|
||||||
|
providerInfo.metaData = bundle;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return providerInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ hax_jar = jar('hax', [
|
|||||||
'android/content/ComponentCallbacks.java',
|
'android/content/ComponentCallbacks.java',
|
||||||
'android/content/ComponentCallbacks2.java',
|
'android/content/ComponentCallbacks2.java',
|
||||||
'android/content/ComponentName.java',
|
'android/content/ComponentName.java',
|
||||||
|
'android/content/ContentProvider.java',
|
||||||
'android/content/ContentResolver.java',
|
'android/content/ContentResolver.java',
|
||||||
'android/content/ContentValues.java',
|
'android/content/ContentValues.java',
|
||||||
'android/content/Context.java',
|
'android/content/Context.java',
|
||||||
|
|||||||
@@ -357,6 +357,11 @@ static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* h
|
|||||||
|
|
||||||
prepare_main_looper(env);
|
prepare_main_looper(env);
|
||||||
|
|
||||||
|
jclass content_provider = (*env)->FindClass(env, "android/content/ContentProvider");
|
||||||
|
(*env)->CallStaticObjectMethod(env, content_provider, _STATIC_METHOD(content_provider, "createContentProviders", "()V"));
|
||||||
|
if((*env)->ExceptionCheck(env))
|
||||||
|
(*env)->ExceptionDescribe(env);
|
||||||
|
|
||||||
(*env)->CallVoidMethod(env, application_object, _METHOD(handle_cache.application.class, "onCreate", "()V"));
|
(*env)->CallVoidMethod(env, application_object, _METHOD(handle_cache.application.class, "onCreate", "()V"));
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
|
|||||||
Reference in New Issue
Block a user