Resources_Theme_Delegate.java revision 130d2353edda445b8e36a6b5e4b176fd748035b0
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage android.content.res; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.annotations.Nullable; 20bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.ide.common.rendering.api.ResourceReference; 21bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.ide.common.rendering.api.StyleResourceValue; 22bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.layoutlib.bridge.android.BridgeContext; 23bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.layoutlib.bridge.impl.DelegateManager; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.RenderSessionImpl; 25bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.resources.ResourceType; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources.NotFoundException; 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources.Theme; 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.AttributeSet; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.TypedValue; 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 34bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta * Delegate used to provide new implementation of a select few methods of {@link Resources.Theme} 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Through the layoutlib_create tool, the original methods of Theme have been replaced 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * by calls to methods of the same name in this delegate class. 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class Resources_Theme_Delegate { 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 42bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta // Whether to use the Theme.mThemeResId as primary theme. 43bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean force; 44bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 45bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta // ---- delegate manager ---- 46bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 47bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta private static final DelegateManager<Resources_Theme_Delegate> sManager = 48bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta new DelegateManager<Resources_Theme_Delegate>(Resources_Theme_Delegate.class); 49bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 50bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta public static DelegateManager<Resources_Theme_Delegate> getDelegateManager() { 51bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return sManager; 52bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 53bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 54bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta // ---- delegate methods. ---- 55bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /*package*/ static TypedArray obtainStyledAttributes( 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Resources thisResources, Theme thisTheme, 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int[] attrs) { 60bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean changed = setupResources(thisTheme); 61bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs); 62bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta restoreResources(changed); 63bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return ta; 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /*package*/ static TypedArray obtainStyledAttributes( 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Resources thisResources, Theme thisTheme, 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int resid, int[] attrs) 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throws NotFoundException { 71bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean changed = setupResources(thisTheme); 72bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs); 73bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta restoreResources(changed); 74bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return ta; 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /*package*/ static TypedArray obtainStyledAttributes( 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Resources thisResources, Theme thisTheme, 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { 81bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean changed = setupResources(thisTheme); 82bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(set, attrs, 83bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta defStyleAttr, defStyleRes); 84bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta restoreResources(changed); 85bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return ta; 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /*package*/ static boolean resolveAttribute( 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Resources thisResources, Theme thisTheme, 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int resid, TypedValue outValue, 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski boolean resolveRefs) { 93bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean changed = setupResources(thisTheme); 94bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta boolean found = RenderSessionImpl.getCurrentContext().resolveThemeAttribute( 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resid, outValue, resolveRefs); 96bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta restoreResources(changed); 97bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return found; 98bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 99bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 100130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta @LayoutlibDelegate 101130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta /*package*/ static TypedArray resolveAttributes(Resources thisResources, Theme thisTheme, 102130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta int[] values, int[] attrs) { 103130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta // FIXME 104130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta return null; 105130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta } 106130d2353edda445b8e36a6b5e4b176fd748035b0Deepanshu Gupta 107bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta // ---- private helper methods ---- 108bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 109bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta private static boolean setupResources(Theme thisTheme) { 110bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta Resources_Theme_Delegate themeDelegate = sManager.getDelegate(thisTheme.getNativeTheme()); 111bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta StyleResourceValue style = resolveStyle(thisTheme.getAppliedStyleResId()); 112bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta if (style != null) { 113bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta RenderSessionImpl.getCurrentContext().getRenderResources() 114bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta .applyStyle(style, themeDelegate.force); 115bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return true; 116bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 117bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return false; 118bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 119bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 120bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta private static void restoreResources(boolean changed) { 121bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta if (changed) { 122bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta RenderSessionImpl.getCurrentContext().getRenderResources().clearStyles(); 123bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 124bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 125bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta 126bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta @Nullable 127bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta private static StyleResourceValue resolveStyle(int nativeResid) { 128bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta if (nativeResid == 0) { 129bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return null; 130bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 131bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta BridgeContext context = RenderSessionImpl.getCurrentContext(); 132bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta ResourceReference theme = context.resolveId(nativeResid); 133bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta if (theme.isFramework()) { 134bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return (StyleResourceValue) context.getRenderResources() 135bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta .getFrameworkResource(ResourceType.STYLE, theme.getName()); 136bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } else { 137bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta return (StyleResourceValue) context.getRenderResources() 138bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta .getProjectResource(ResourceType.STYLE, theme.getName()); 139bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta } 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 142