184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta/* 284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Copyright (C) 2014 The Android Open Source Project 384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * 484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * you may not use this file except in compliance with the License. 684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * You may obtain a copy of the License at 784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * 884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * http://www.apache.org/licenses/LICENSE-2.0 984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * 1084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Unless required by applicable law or agreed to in writing, software 1184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS, 1284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * See the License for the specific language governing permissions and 1484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * limitations under the License. 1584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta */ 1684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 1784cc05cacd2786261b01d3be2364944c90765801Deepanshu Guptapackage com.android.layoutlib.bridge.bars; 1884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 1984cc05cacd2786261b01d3be2364944c90765801Deepanshu Guptaimport com.android.resources.Density; 2084cc05cacd2786261b01d3be2364944c90765801Deepanshu Guptaimport com.android.resources.LayoutDirection; 2184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 2284cc05cacd2786261b01d3be2364944c90765801Deepanshu Guptaimport java.io.InputStream; 2384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 2484cc05cacd2786261b01d3be2364944c90765801Deepanshu Guptapublic class IconLoader { 2584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 2684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private final String mIconName; 2784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private final Density mDesiredDensity; 2884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private final int mPlatformVersion; 2984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private final LayoutDirection mDirection; 3084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 3184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private Density mCurrentDensity; 3284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private StringBuilder mCurrentPath; 3384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 3484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta IconLoader(String iconName, Density density, int platformVersion, LayoutDirection direction) { 3584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mIconName = iconName; 3684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mDesiredDensity = density; 3784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mPlatformVersion = platformVersion; 3884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mDirection = direction; 3984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // An upper bound on the length of the path for the icon: /bars/v21/ldrtl-xxxhdpi/ 4084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta final int iconPathLength = 24; 4184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentPath = new StringBuilder(iconPathLength + iconName.length()); 4284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 4384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 4484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta public InputStream getIcon() { 4584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta for (String resourceDir : Config.getResourceDirs(mPlatformVersion)) { 4684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentDensity = null; 4784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta InputStream stream = getIcon(resourceDir); 4884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (stream != null) { 4984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return stream; 5084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 5184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 5284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return null; 5384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 5484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 5584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta /** 5684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Should only be called after {@link #getIcon()}. Returns the density of the icon, if found by 5784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * {@code getIcon()}. If no icon was found, then the return value has no meaning. 5884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta */ 5984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta public Density getDensity() { 6084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return mCurrentDensity; 6184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 6284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 6384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta /** 6484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Should only be called after {@link #getIcon()}. Returns the path to the icon, if found by 6584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * {@code getIcon()}. If no icon was found, then the return value has no meaning. 6684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta */ 6784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta public String getPath() { 6884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return mCurrentPath.toString(); 6984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 7084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 7184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta /** 7284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Search for icon in the resource directory. This iterates over all densities. 7384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * If a match is found, mCurrentDensity will be set to the icon's density. 7484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta */ 7584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private InputStream getIcon(String resourceDir) { 7684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // First check for the desired density. 7784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta InputStream stream = getIcon(resourceDir, mDesiredDensity); 7884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (stream != null) { 7984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentDensity = mDesiredDensity; 8084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return stream; 8184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 8284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // Didn't find in the desired density. Search in all. 8384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta for (Density density : Density.values()) { 8484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (density == mDesiredDensity) { 8584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // Skip the desired density since it's already been checked. 8684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta continue; 8784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 8884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta stream = getIcon(resourceDir, density); 8984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (stream != null) { 9084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentDensity = density; 9184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return stream; 9284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 9384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 9484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return null; 9584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 9684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta 9784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta /** 9884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * Returns the icon for given density present in the given resource directory, taking layout 9984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta * direction into consideration. 10084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta */ 10184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta private InputStream getIcon(String resourceDir, Density density) { 10284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentPath.setLength(0); 10384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // Currently we don't have any LTR only resources and hence the check is skipped. If they 10484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // are ever added, change to: 10584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta // if (mDirection == LayoutDirection.RTL || mDirection == LayoutDirection.LTR) { 10684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (mDirection == LayoutDirection.RTL) { 10784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentPath.append(resourceDir) 10884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append(mDirection.getResourceValue()) 10984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append('-') 11084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append(density.getResourceValue()) 11184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append('/') 11284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append(mIconName); 11384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta InputStream stream = getClass().getResourceAsStream(mCurrentPath.toString()); 11484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta if (stream != null) { 11584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return stream; 11684cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 11784cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentPath.setLength(0); 11884cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 11984cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta mCurrentPath.append(resourceDir) 12084cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append(density.getResourceValue()) 12184cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append('/') 12284cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta .append(mIconName); 12384cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta return getClass().getResourceAsStream(mCurrentPath.toString()); 12484cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta } 12584cc05cacd2786261b01d3be2364944c90765801Deepanshu Gupta} 126