Java Code Examples for android.content.res.Resources#newTheme()

The following examples show how to use android.content.res.Resources#newTheme() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: RetalDriverApplication.java    From ratel with Apache License 2.0 6 votes vote down vote up
protected void loadResources(String dexPath) {
    try {
        AssetManager assetManager = AssetManager.class.newInstance();
        Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
        addAssetPath.invoke(assetManager, dexPath);
        mAssetManager = assetManager;
    } catch (Exception e) {
        Log.i("inject", "loadResource error:" + Log.getStackTraceString(e));
        e.printStackTrace();
    }
    Resources superRes = super.getResources();
    superRes.getDisplayMetrics();
    superRes.getConfiguration();
    mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
    mTheme = mResources.newTheme();
    mTheme.setTo(super.getTheme());
}
 
Example 2
Source File: ActionData.java    From Status with Apache License 2.0 6 votes vote down vote up
@Nullable
public Drawable getIcon(Context context) {
    Resources resources = null;
    PackageInfo packageInfo = null;

    try {
        resources = context.getPackageManager().getResourcesForApplication(packageName);
        packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException ignored) {
    }

    if (resources == null || packageInfo == null) return null;

    Resources.Theme theme = resources.newTheme();
    theme.applyStyle(packageInfo.applicationInfo.theme, false);

    try {
        return ResourcesCompat.getDrawable(resources, getIcon(), theme);
    } catch (Resources.NotFoundException e) {
        return null;
    }
}
 
Example 3
Source File: NotificationData.java    From Status with Apache License 2.0 6 votes vote down vote up
@Nullable
private Drawable getDrawable(Context context, int resource, String packageName) {
    if (packageName == null) return null;

    Resources resources = null;
    PackageInfo packageInfo = null;

    try {
        resources = context.getPackageManager().getResourcesForApplication(packageName);
        packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException ignored) {
    }

    if (resources == null || packageInfo == null) return null;

    Resources.Theme theme = resources.newTheme();
    theme.applyStyle(packageInfo.applicationInfo.theme, false);

    try {
        return ResourcesCompat.getDrawable(resources, resource, theme);
    } catch (Resources.NotFoundException | OutOfMemoryError e) {
        return null;
    }
}
 
Example 4
Source File: PluginUtil.java    From VirtualAPK with Apache License 2.0 5 votes vote down vote up
public static void hookActivityResources(Activity activity, String packageName) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && isVivo(activity.getResources())) {
        // for 5.0+ vivo
        return;
    }

    // designed for 5.0 - only, but some bad phones not work, eg:letv
    try {
        Context base = activity.getBaseContext();
        final LoadedPlugin plugin = PluginManager.getInstance(activity).getLoadedPlugin(packageName);
        final Resources resources = plugin.getResources();
        if (resources != null) {
            Reflector.with(base).field("mResources").set(resources);

            // copy theme
            Resources.Theme theme = resources.newTheme();
            theme.setTo(activity.getTheme());
            Reflector reflector = Reflector.with(activity);
            int themeResource = reflector.field("mThemeResource").get();
            theme.applyStyle(themeResource, true);
            reflector.field("mTheme").set(theme);

            reflector.field("mResources").set(resources);
        }
    } catch (Exception e) {
        Log.w(Constants.TAG, e);
    }
}
 
Example 5
Source File: ThemeManager.java    From revolution-irc with GNU General Public License v3.0 5 votes vote down vote up
public void applyThemeToActivity(Activity activity) {
    if (currentCustomThemePatcher == null && currentCustomTheme != null) {
        ThemeResourceFileBuilder.CustomTheme theme = ThemeResourceFileBuilder
                .createTheme(context, currentCustomTheme);
        currentTheme = theme;
        File themeFile = ThemeResourceFileBuilder.createThemeZipFile(context,
                theme.getResTable());
        currentCustomThemePatcher = new Theme(context, themeFile.getAbsolutePath());
    }
    ThemeResInfo currentBaseTheme = currentTheme;
    if (currentCustomTheme != null)
        currentBaseTheme = currentCustomTheme.baseThemeInfo;
    boolean isThemeDark = currentBaseTheme instanceof BaseTheme &&
            ((BaseTheme) currentBaseTheme).isDark;
    if (currentCustomThemePatcher == null && isThemeDark) {
        currentCustomThemePatcher = new Theme(activity.getAssets());
    }
    if (mNeedsApplyIrcColors) {
        Configuration c = new Configuration();
        c.setToDefaults();
        c.uiMode = Configuration.UI_MODE_TYPE_NORMAL;
        if (currentBaseTheme instanceof BaseTheme && ((BaseTheme) currentBaseTheme).isDark)
            c.uiMode |= Configuration.UI_MODE_NIGHT_YES;
        Resources r = new Resources(currentCustomThemePatcher != null ?
                currentCustomThemePatcher.getAssetManager() : context.getAssets(),
                new DisplayMetrics(), c);
        Resources.Theme t = r.newTheme();
        ThemeResInfo resInfo = currentTheme != null ? currentTheme : fallbackTheme;
        t.applyStyle(resInfo.getThemeResId(), true);
        IRCColorUtils.loadColors(t, resInfo.getIRCColorsResId());
        mNeedsApplyIrcColors = false;
    }
    if (currentCustomThemePatcher != null) {
        currentCustomThemePatcher.applyToActivity(activity);
    }
    if (isThemeDark)
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    else
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
 
Example 6
Source File: MyApplication.java    From ClassLoader with Apache License 2.0 5 votes vote down vote up
protected void loadResources() throws InstantiationException, IllegalAccessException, IllegalArgumentException,
        InvocationTargetException, NoSuchMethodException, NoSuchFieldException {
    Log.d(TAG, "MyApplication : loadResources()");
    AssetManager am = (AssetManager) AssetManager.class.newInstance();
    am.getClass().getMethod("addAssetPath", String.class).invoke(am, dexPath);
    mAssetManager = am;
    Constructor<?> constructor_Resources = Resources.class.getConstructor(AssetManager.class, cc.getResources()
            .getDisplayMetrics().getClass(), cc.getResources().getConfiguration().getClass());
    mResources = (Resources) constructor_Resources.newInstance(am, cc.getResources().getDisplayMetrics(), cc.getResources().getConfiguration());
    mTheme = mResources.newTheme();
    mTheme.applyStyle(android.R.style.Theme_Light_NoTitleBar_Fullscreen, true);
}
 
Example 7
Source File: CompatForSupportv7_23_2.java    From Android-Plugin-Framework with MIT License 5 votes vote down vote up
@Override
public boolean add(V object) {
    WeakReference ref = (WeakReference)object;
    Object tintContextWrapper = ref.get();
    if (tintContextWrapper != null) {
        Resources resources = ((ContextWrapper)tintContextWrapper).getBaseContext().getResources();
        RefInvoker.setField(tintContextWrapper, TintContextWrapper, "mResources", resources);
        Resources.Theme theme = resources.newTheme();
        theme.setTo(((ContextWrapper)tintContextWrapper).getBaseContext().getTheme());
        RefInvoker.setField(tintContextWrapper, TintContextWrapper, "mTheme", theme);
    }
    return super.add(object);
}
 
Example 8
Source File: PluginLoadedApk.java    From Neptune with Apache License 2.0 4 votes vote down vote up
/**
 * 创建插件的Resource {@link ResourcesProxy},通过此Resource对象
 * 插件可以访问主工程和插件的资源
 */
private void createPluginResource() {

    PluginDebugLog.runtimeLog(TAG, "createPluginResource for " + mPluginPackageName);
    PackageManager pm = mHostContext.getPackageManager();
    AssetManager am = null;
    try {
        Class<?>[] paramTypes = new Class[]{String.class};
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            // Android 5.0以下系统方法创建的AssetManager不支持扩展资源表,始终new出来
            am = AssetManager.class.newInstance();
            ReflectionUtils.on(am).call("addAssetPath", sMethods, paramTypes, mPluginPath);
        } else {
            // Android 5.0以上使用PackageManager的公开方法创建, 避免反射
            Resources resources = pm.getResourcesForApplication(mPluginPackageInfo.getApplicationInfo());
            am = resources.getAssets();
        }
        boolean shouldAddHostRes = !mPluginPackageInfo.isIndividualMode() && mPluginPackageInfo.isResourceNeedMerge();
        if (shouldAddHostRes) {
            // 添加宿主的资源到插件的AssetManager
            ReflectionUtils.on(am).call("addAssetPath", sMethods, paramTypes,
                    mHostContext.getApplicationInfo().sourceDir);
            PluginDebugLog.runtimeLog(TAG, "--- Resource merging into plugin @ " + mPluginPackageInfo.getPackageName());
        }
        // 添加系统Webview资源, Android L+
        if (mPluginPackageInfo.isNeedAddWebviewResource()) {
            addWebviewAssetPath(am);
        }

        mPluginAssetManager = am;
    } catch (Exception e) {
        ErrorUtil.throwErrorIfNeed(e);
        String errMsg = "create plugin resources failed: " + e.getMessage();
        PluginManager.deliver(mHostContext, false, mPluginPackageName, ErrorType.ERROR_PLUGIN_INIT_RESOURCES, errMsg);
    }

    Configuration config = new Configuration();
    config.setTo(mHostResource.getConfiguration());
    if (mPluginPackageInfo.isIndividualMode()) {
        // 独立插件包,不依赖宿主的Resource
        mPluginResource = new Resources(mPluginAssetManager, mHostResource.getDisplayMetrics(),
                config);
    } else {
        mPluginResource = new ResourcesProxy(mPluginAssetManager, mHostResource.getDisplayMetrics(),
                config, mHostResource, mPluginPackageName);
    }
    mPluginTheme = mPluginResource.newTheme();
    mPluginTheme.setTo(mHostContext.getTheme());
    mResourceTool = new ResourcesToolForPlugin(mHostContext);
}
 
Example 9
Source File: LaunchModeManager.java    From Phantom with Apache License 2.0 4 votes vote down vote up
/**
 * 获取一个占位activity
 *
 * @param pluginActivity 插件activity
 * @param launchMode     插件activity启动模式
 * @param isFixed        是否建立固定映射关系
 * @return 占位activity
 * @throws ProxyActivityLessException 占位activity不够异常
 */
private String findActivity(String pluginActivity, int launchMode, boolean isFixed)
        throws ProxyActivityLessException {

    String activity = MODE_STANDARD;
    ActivityPool pool = null;

    switch (launchMode) {
        case ActivityInfo.LAUNCH_MULTIPLE:
            final PhantomCore phantomCore = PhantomCore.getInstance();
            final ComponentName componentName = ComponentName.unflattenFromString(pluginActivity);
            if (componentName != null) {
                final ActivityInfo ai = phantomCore.findActivityInfo(componentName);
                final PluginInfo pluginInfo = phantomCore.findPluginInfoByActivityName(componentName);
                final int themeResourceId = ai == null ? -1 : ai.getThemeResource();
                if (themeResourceId != -1 && pluginInfo != null) {
                    final Resources resources = pluginInfo.getPluginResources();
                    if (resources != null) {
                        final Resources.Theme theme = resources.newTheme();
                        theme.applyStyle(themeResourceId, true);
                        final TypedArray sa = theme.obtainStyledAttributes(
                                new int[]{android.R.attr.windowIsTranslucent});
                        final boolean translucent = sa.getBoolean(0, false);
                        sa.recycle();
                        activity = translucent ? MODE_STANDARD_TRANSLUCENT : MODE_STANDARD;
                    }
                }
            }
            break;
        case ActivityInfo.LAUNCH_SINGLE_TOP:
            pool = mSingleTopPool;
            break;
        case ActivityInfo.LAUNCH_SINGLE_INSTANCE:
            pool = mSingleInstancePool;
            break;
        case ActivityInfo.LAUNCH_SINGLE_TASK:
            pool = mSingleTaskPool;
            break;
        default:
            break;
    }

    if (null != pool) {
        activity = isFixed ? pool.resolveFixedActivity(pluginActivity) : pool.resolveActivity(pluginActivity);
    }

    String msg = String.format("resolve %s Activity for %s proxy is %s, fixed is %s",
            launchModeToString(launchMode), pluginActivity, activity, isFixed);
    VLog.d(msg);
    if (null == activity) {
        //占位activity不够使用, 这种情况不做处理,宿主提供足够的占位activity
        //这里不做主动回收,如果做主动回收可能会使程序正常执行流程发送改变
        ProxyActivityLessException pae = new ProxyActivityLessException(msg);
        LogReporter.reportException(pae, null);
        mCache.clean();
        throw pae;
    }

    return activity;
}