1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.layoutlib.bridge.android; 18 19 import android.os.IBinder; 20 import com.android.annotations.Nullable; 21 import com.android.ide.common.rendering.api.ILayoutPullParser; 22 import com.android.ide.common.rendering.api.IProjectCallback; 23 import com.android.ide.common.rendering.api.LayoutLog; 24 import com.android.ide.common.rendering.api.RenderResources; 25 import com.android.ide.common.rendering.api.ResourceReference; 26 import com.android.ide.common.rendering.api.ResourceValue; 27 import com.android.ide.common.rendering.api.StyleResourceValue; 28 import com.android.layoutlib.bridge.Bridge; 29 import com.android.layoutlib.bridge.BridgeConstants; 30 import com.android.layoutlib.bridge.android.view.WindowManagerImpl; 31 import com.android.layoutlib.bridge.impl.ParserFactory; 32 import com.android.layoutlib.bridge.impl.Stack; 33 import com.android.resources.ResourceType; 34 import com.android.util.Pair; 35 36 import org.xmlpull.v1.XmlPullParser; 37 import org.xmlpull.v1.XmlPullParserException; 38 39 import android.content.BroadcastReceiver; 40 import android.content.ComponentName; 41 import android.content.ContentResolver; 42 import android.content.Context; 43 import android.content.Intent; 44 import android.content.IntentFilter; 45 import android.content.IntentSender; 46 import android.content.ServiceConnection; 47 import android.content.SharedPreferences; 48 import android.content.pm.ApplicationInfo; 49 import android.content.pm.PackageManager; 50 import android.content.res.AssetManager; 51 import android.content.res.BridgeResources; 52 import android.content.res.BridgeTypedArray; 53 import android.content.res.Configuration; 54 import android.content.res.Resources; 55 import android.content.res.Resources.Theme; 56 import android.database.DatabaseErrorHandler; 57 import android.database.sqlite.SQLiteDatabase; 58 import android.database.sqlite.SQLiteDatabase.CursorFactory; 59 import android.graphics.Bitmap; 60 import android.graphics.drawable.Drawable; 61 import android.hardware.display.DisplayManager; 62 import android.net.Uri; 63 import android.os.Bundle; 64 import android.os.Handler; 65 import android.os.Looper; 66 import android.os.PowerManager; 67 import android.os.UserHandle; 68 import android.util.AttributeSet; 69 import android.util.DisplayMetrics; 70 import android.util.TypedValue; 71 import android.view.BridgeInflater; 72 import android.view.Display; 73 import android.view.DisplayAdjustments; 74 import android.view.View; 75 import android.view.ViewGroup; 76 import android.view.WindowManager; 77 import android.view.accessibility.AccessibilityManager; 78 import android.view.textservice.TextServicesManager; 79 80 import java.io.File; 81 import java.io.FileInputStream; 82 import java.io.FileNotFoundException; 83 import java.io.FileOutputStream; 84 import java.io.IOException; 85 import java.io.InputStream; 86 import java.util.ArrayList; 87 import java.util.HashMap; 88 import java.util.IdentityHashMap; 89 import java.util.List; 90 import java.util.Map; 91 92 /** 93 * Custom implementation of Context/Activity to handle non compiled resources. 94 */ 95 public final class BridgeContext extends Context { 96 97 /** The map adds cookies to each view so that IDE can link xml tags to views. */ 98 private final HashMap<View, Object> mViewKeyMap = new HashMap<View, Object>(); 99 /** 100 * In some cases, when inflating an xml, some objects are created. Then later, the objects are 101 * converted to views. This map stores the mapping from objects to cookies which can then be 102 * used to populate the mViewKeyMap. 103 */ 104 private final HashMap<Object, Object> mViewKeyHelpMap = new HashMap<Object, Object>(); 105 private Resources mSystemResources; 106 private final Object mProjectKey; 107 private final DisplayMetrics mMetrics; 108 private final RenderResources mRenderResources; 109 private final Configuration mConfig; 110 private final ApplicationInfo mApplicationInfo; 111 private final IProjectCallback mProjectCallback; 112 private final WindowManager mWindowManager; 113 private final DisplayManager mDisplayManager; 114 115 private Resources.Theme mTheme; 116 117 private final Map<Object, Map<String, String>> mDefaultPropMaps = 118 new IdentityHashMap<Object, Map<String,String>>(); 119 120 // maps for dynamically generated id representing style objects (StyleResourceValue) 121 private Map<Integer, StyleResourceValue> mDynamicIdToStyleMap; 122 private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap; 123 private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace 124 125 // cache for TypedArray generated from IStyleResourceValue object 126 private Map<int[], Map<Integer, BridgeTypedArray>> mTypedArrayCache; 127 private BridgeInflater mBridgeInflater; 128 129 private BridgeContentResolver mContentResolver; 130 131 private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<BridgeXmlBlockParser>(); 132 private SharedPreferences mSharedPreferences; 133 134 /** 135 * @param projectKey An Object identifying the project. This is used for the cache mechanism. 136 * @param metrics the {@link DisplayMetrics}. 137 * @param renderResources the configured resources (both framework and projects) for this 138 * render. 139 * @param config the Configuration object for this render. 140 * @param targetSdkVersion the targetSdkVersion of the application. 141 */ BridgeContext(Object projectKey, DisplayMetrics metrics, RenderResources renderResources, IProjectCallback projectCallback, Configuration config, int targetSdkVersion, boolean hasRtlSupport)142 public BridgeContext(Object projectKey, DisplayMetrics metrics, 143 RenderResources renderResources, 144 IProjectCallback projectCallback, 145 Configuration config, 146 int targetSdkVersion, 147 boolean hasRtlSupport) { 148 mProjectKey = projectKey; 149 mMetrics = metrics; 150 mProjectCallback = projectCallback; 151 152 mRenderResources = renderResources; 153 mConfig = config; 154 155 mApplicationInfo = new ApplicationInfo(); 156 mApplicationInfo.targetSdkVersion = targetSdkVersion; 157 if (hasRtlSupport) { 158 mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL; 159 } 160 161 mWindowManager = new WindowManagerImpl(mMetrics); 162 mDisplayManager = new DisplayManager(this); 163 } 164 165 /** 166 * Initializes the {@link Resources} singleton to be linked to this {@link Context}, its 167 * {@link DisplayMetrics}, {@link Configuration}, and {@link IProjectCallback}. 168 * 169 * @see #disposeResources() 170 */ initResources()171 public void initResources() { 172 AssetManager assetManager = AssetManager.getSystem(); 173 174 mSystemResources = BridgeResources.initSystem( 175 this, 176 assetManager, 177 mMetrics, 178 mConfig, 179 mProjectCallback); 180 mTheme = mSystemResources.newTheme(); 181 } 182 183 /** 184 * Disposes the {@link Resources} singleton. 185 */ disposeResources()186 public void disposeResources() { 187 BridgeResources.disposeSystem(); 188 } 189 setBridgeInflater(BridgeInflater inflater)190 public void setBridgeInflater(BridgeInflater inflater) { 191 mBridgeInflater = inflater; 192 } 193 addViewKey(View view, Object viewKey)194 public void addViewKey(View view, Object viewKey) { 195 mViewKeyMap.put(view, viewKey); 196 } 197 getViewKey(View view)198 public Object getViewKey(View view) { 199 return mViewKeyMap.get(view); 200 } 201 addCookie(Object o, Object cookie)202 public void addCookie(Object o, Object cookie) { 203 mViewKeyHelpMap.put(o, cookie); 204 } 205 getCookie(Object o)206 public Object getCookie(Object o) { 207 return mViewKeyHelpMap.get(o); 208 } 209 getProjectKey()210 public Object getProjectKey() { 211 return mProjectKey; 212 } 213 getMetrics()214 public DisplayMetrics getMetrics() { 215 return mMetrics; 216 } 217 getProjectCallback()218 public IProjectCallback getProjectCallback() { 219 return mProjectCallback; 220 } 221 getRenderResources()222 public RenderResources getRenderResources() { 223 return mRenderResources; 224 } 225 getDefaultPropMap(Object key)226 public Map<String, String> getDefaultPropMap(Object key) { 227 return mDefaultPropMaps.get(key); 228 } 229 getConfiguration()230 public Configuration getConfiguration() { 231 return mConfig; 232 } 233 234 /** 235 * Adds a parser to the stack. 236 * @param parser the parser to add. 237 */ pushParser(BridgeXmlBlockParser parser)238 public void pushParser(BridgeXmlBlockParser parser) { 239 if (ParserFactory.LOG_PARSER) { 240 System.out.println("PUSH " + parser.getParser().toString()); 241 } 242 mParserStack.push(parser); 243 } 244 245 /** 246 * Removes the parser at the top of the stack 247 */ popParser()248 public void popParser() { 249 BridgeXmlBlockParser parser = mParserStack.pop(); 250 if (ParserFactory.LOG_PARSER) { 251 System.out.println("POPD " + parser.getParser().toString()); 252 } 253 } 254 255 /** 256 * Returns the current parser at the top the of the stack. 257 * @return a parser or null. 258 */ getCurrentParser()259 public BridgeXmlBlockParser getCurrentParser() { 260 return mParserStack.peek(); 261 } 262 263 /** 264 * Returns the previous parser. 265 * @return a parser or null if there isn't any previous parser 266 */ getPreviousParser()267 public BridgeXmlBlockParser getPreviousParser() { 268 if (mParserStack.size() < 2) { 269 return null; 270 } 271 return mParserStack.get(mParserStack.size() - 2); 272 } 273 resolveThemeAttribute(int resid, TypedValue outValue, boolean resolveRefs)274 public boolean resolveThemeAttribute(int resid, TypedValue outValue, boolean resolveRefs) { 275 Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resid); 276 boolean isFrameworkRes = true; 277 if (resourceInfo == null) { 278 resourceInfo = mProjectCallback.resolveResourceId(resid); 279 isFrameworkRes = false; 280 } 281 282 if (resourceInfo == null) { 283 return false; 284 } 285 286 ResourceValue value = mRenderResources.findItemInTheme(resourceInfo.getSecond(), 287 isFrameworkRes); 288 if (resolveRefs) { 289 value = mRenderResources.resolveResValue(value); 290 } 291 292 if (value == null) { 293 // unable to find the attribute. 294 return false; 295 } 296 297 // check if this is a style resource 298 if (value instanceof StyleResourceValue) { 299 // get the id that will represent this style. 300 outValue.resourceId = getDynamicIdByStyle((StyleResourceValue)value); 301 return true; 302 } 303 304 int a; 305 // if this is a framework value. 306 if (value.isFramework()) { 307 // look for idName in the android R classes. 308 // use 0 a default res value as it's not a valid id value. 309 a = getFrameworkResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/); 310 } else { 311 // look for idName in the project R class. 312 // use 0 a default res value as it's not a valid id value. 313 a = getProjectResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/); 314 } 315 316 if (a != 0) { 317 outValue.resourceId = a; 318 return true; 319 } 320 321 return false; 322 } 323 324 resolveId(int id)325 public ResourceReference resolveId(int id) { 326 // first get the String related to this id in the framework 327 Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id); 328 329 if (resourceInfo != null) { 330 return new ResourceReference(resourceInfo.getSecond(), true); 331 } 332 333 // didn't find a match in the framework? look in the project. 334 if (mProjectCallback != null) { 335 resourceInfo = mProjectCallback.resolveResourceId(id); 336 337 if (resourceInfo != null) { 338 return new ResourceReference(resourceInfo.getSecond(), false); 339 } 340 } 341 342 // The base value for R.style is 0x01030000 and the custom style is 0x02030000. 343 // So, if the second byte is 03, it's probably a style. 344 if ((id >> 16 & 0xFF) == 0x03) { 345 return getStyleByDynamicId(id); 346 } 347 return null; 348 } 349 inflateView(ResourceReference resource, ViewGroup parent, boolean attachToRoot, boolean skipCallbackParser)350 public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent, 351 boolean attachToRoot, boolean skipCallbackParser) { 352 boolean isPlatformLayout = resource.isFramework(); 353 354 if (!isPlatformLayout && !skipCallbackParser) { 355 // check if the project callback can provide us with a custom parser. 356 ILayoutPullParser parser = getParser(resource); 357 358 if (parser != null) { 359 BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser, 360 this, resource.isFramework()); 361 try { 362 pushParser(blockParser); 363 return Pair.of( 364 mBridgeInflater.inflate(blockParser, parent, attachToRoot), 365 true); 366 } finally { 367 popParser(); 368 } 369 } 370 } 371 372 ResourceValue resValue; 373 if (resource instanceof ResourceValue) { 374 resValue = (ResourceValue) resource; 375 } else { 376 if (isPlatformLayout) { 377 resValue = mRenderResources.getFrameworkResource(ResourceType.LAYOUT, 378 resource.getName()); 379 } else { 380 resValue = mRenderResources.getProjectResource(ResourceType.LAYOUT, 381 resource.getName()); 382 } 383 } 384 385 if (resValue != null) { 386 387 File xml = new File(resValue.getValue()); 388 if (xml.isFile()) { 389 // we need to create a pull parser around the layout XML file, and then 390 // give that to our XmlBlockParser 391 try { 392 XmlPullParser parser = ParserFactory.create(xml); 393 394 // set the resource ref to have correct view cookies 395 mBridgeInflater.setResourceReference(resource); 396 397 BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser, 398 this, resource.isFramework()); 399 try { 400 pushParser(blockParser); 401 return Pair.of( 402 mBridgeInflater.inflate(blockParser, parent, attachToRoot), 403 false); 404 } finally { 405 popParser(); 406 } 407 } catch (XmlPullParserException e) { 408 Bridge.getLog().error(LayoutLog.TAG_BROKEN, 409 "Failed to configure parser for " + xml, e, null /*data*/); 410 // we'll return null below. 411 } catch (FileNotFoundException e) { 412 // this shouldn't happen since we check above. 413 } finally { 414 mBridgeInflater.setResourceReference(null); 415 } 416 } else { 417 Bridge.getLog().error(LayoutLog.TAG_BROKEN, 418 String.format("File %s is missing!", xml), null); 419 } 420 } else { 421 Bridge.getLog().error(LayoutLog.TAG_BROKEN, 422 String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "", 423 resource.getName()), null); 424 } 425 426 return Pair.of(null, false); 427 } 428 429 @SuppressWarnings("deprecation") getParser(ResourceReference resource)430 private ILayoutPullParser getParser(ResourceReference resource) { 431 ILayoutPullParser parser; 432 if (resource instanceof ResourceValue) { 433 parser = mProjectCallback.getParser((ResourceValue) resource); 434 } else { 435 parser = mProjectCallback.getParser(resource.getName()); 436 } 437 return parser; 438 } 439 440 // ------------ Context methods 441 442 @Override getResources()443 public Resources getResources() { 444 return mSystemResources; 445 } 446 447 @Override getTheme()448 public Theme getTheme() { 449 return mTheme; 450 } 451 452 @Override getClassLoader()453 public ClassLoader getClassLoader() { 454 return this.getClass().getClassLoader(); 455 } 456 457 @Override getSystemService(String service)458 public Object getSystemService(String service) { 459 if (LAYOUT_INFLATER_SERVICE.equals(service)) { 460 return mBridgeInflater; 461 } 462 463 if (TEXT_SERVICES_MANAGER_SERVICE.equals(service)) { 464 // we need to return a valid service to avoid NPE 465 return TextServicesManager.getInstance(); 466 } 467 468 if (WINDOW_SERVICE.equals(service)) { 469 return mWindowManager; 470 } 471 472 // needed by SearchView 473 if (INPUT_METHOD_SERVICE.equals(service)) { 474 return null; 475 } 476 477 if (POWER_SERVICE.equals(service)) { 478 return new PowerManager(this, new BridgePowerManager(), new Handler()); 479 } 480 481 if (DISPLAY_SERVICE.equals(service)) { 482 return mDisplayManager; 483 } 484 485 if (ACCESSIBILITY_SERVICE.equals(service)) { 486 return AccessibilityManager.getInstance(this); 487 } 488 489 throw new UnsupportedOperationException("Unsupported Service: " + service); 490 } 491 492 493 @Override obtainStyledAttributes(int[] attrs)494 public final BridgeTypedArray obtainStyledAttributes(int[] attrs) { 495 // No style is specified here, so create the typed array based on the default theme 496 // and the styles already applied to it. A null value of style indicates that the default 497 // theme should be used. 498 return createStyleBasedTypedArray(null, attrs); 499 } 500 501 @Override obtainStyledAttributes(int resid, int[] attrs)502 public final BridgeTypedArray obtainStyledAttributes(int resid, int[] attrs) 503 throws Resources.NotFoundException { 504 StyleResourceValue style = null; 505 // get the StyleResourceValue based on the resId; 506 if (resid != 0) { 507 style = getStyleByDynamicId(resid); 508 509 if (style == null) { 510 // In some cases, style may not be a dynamic id, so we do a full search. 511 ResourceReference ref = resolveId(resid); 512 if (ref != null) { 513 style = mRenderResources.getStyle(ref.getName(), ref.isFramework()); 514 } 515 } 516 517 if (style == null) { 518 throw new Resources.NotFoundException(); 519 } 520 } 521 522 if (mTypedArrayCache == null) { 523 mTypedArrayCache = new HashMap<int[], Map<Integer,BridgeTypedArray>>(); 524 525 Map<Integer, BridgeTypedArray> map = new HashMap<Integer, BridgeTypedArray>(); 526 mTypedArrayCache.put(attrs, map); 527 528 BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs); 529 map.put(resid, ta); 530 531 return ta; 532 } 533 534 // get the 2nd map 535 Map<Integer, BridgeTypedArray> map = mTypedArrayCache.get(attrs); 536 if (map == null) { 537 map = new HashMap<Integer, BridgeTypedArray>(); 538 mTypedArrayCache.put(attrs, map); 539 } 540 541 // get the array from the 2nd map 542 BridgeTypedArray ta = map.get(resid); 543 544 if (ta == null) { 545 ta = createStyleBasedTypedArray(style, attrs); 546 map.put(resid, ta); 547 } 548 549 return ta; 550 } 551 552 @Override obtainStyledAttributes(AttributeSet set, int[] attrs)553 public final BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) { 554 return obtainStyledAttributes(set, attrs, 0, 0); 555 } 556 557 @Override obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)558 public BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, 559 int defStyleAttr, int defStyleRes) { 560 561 Map<String, String> defaultPropMap = null; 562 boolean isPlatformFile = true; 563 564 // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java 565 if (set instanceof BridgeXmlBlockParser) { 566 BridgeXmlBlockParser parser = null; 567 parser = (BridgeXmlBlockParser)set; 568 569 isPlatformFile = parser.isPlatformFile(); 570 571 Object key = parser.getViewCookie(); 572 if (key != null) { 573 defaultPropMap = mDefaultPropMaps.get(key); 574 if (defaultPropMap == null) { 575 defaultPropMap = new HashMap<String, String>(); 576 mDefaultPropMaps.put(key, defaultPropMap); 577 } 578 } 579 580 } else if (set instanceof BridgeLayoutParamsMapAttributes) { 581 // this is only for temp layout params generated dynamically, so this is never 582 // platform content. 583 isPlatformFile = false; 584 } else if (set != null) { // null parser is ok 585 // really this should not be happening since its instantiated in Bridge 586 Bridge.getLog().error(LayoutLog.TAG_BROKEN, 587 "Parser is not a BridgeXmlBlockParser!", null /*data*/); 588 return null; 589 } 590 591 List<Pair<String, Boolean>> attributeList = searchAttrs(attrs); 592 593 BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, 594 isPlatformFile); 595 596 // look for a custom style. 597 String customStyle = null; 598 if (set != null) { 599 customStyle = set.getAttributeValue(null /* namespace*/, "style"); 600 } 601 602 StyleResourceValue customStyleValues = null; 603 if (customStyle != null) { 604 ResourceValue item = mRenderResources.findResValue(customStyle, 605 isPlatformFile /*forceFrameworkOnly*/); 606 607 // resolve it in case it links to something else 608 item = mRenderResources.resolveResValue(item); 609 610 if (item instanceof StyleResourceValue) { 611 customStyleValues = (StyleResourceValue)item; 612 } 613 } 614 615 // resolve the defStyleAttr value into a IStyleResourceValue 616 StyleResourceValue defStyleValues = null; 617 618 if (defStyleAttr != 0) { 619 // get the name from the int. 620 Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr); 621 622 if (defaultPropMap != null) { 623 String defStyleName = defStyleAttribute.getFirst(); 624 if (defStyleAttribute.getSecond()) { 625 defStyleName = "android:" + defStyleName; 626 } 627 defaultPropMap.put("style", defStyleName); 628 } 629 630 // look for the style in the current theme, and its parent: 631 ResourceValue item = mRenderResources.findItemInTheme(defStyleAttribute.getFirst(), 632 defStyleAttribute.getSecond()); 633 634 if (item != null) { 635 // item is a reference to a style entry. Search for it. 636 item = mRenderResources.findResValue(item.getValue(), item.isFramework()); 637 638 if (item instanceof StyleResourceValue) { 639 defStyleValues = (StyleResourceValue)item; 640 } 641 } else { 642 Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR, 643 String.format( 644 "Failed to find style '%s' in current theme", 645 defStyleAttribute.getFirst()), 646 null /*data*/); 647 } 648 } else if (defStyleRes != 0) { 649 boolean isFrameworkRes = true; 650 Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes); 651 if (value == null) { 652 value = mProjectCallback.resolveResourceId(defStyleRes); 653 isFrameworkRes = false; 654 } 655 656 if (value != null) { 657 if ((value.getFirst() == ResourceType.STYLE)) { 658 // look for the style in all resources: 659 StyleResourceValue item = mRenderResources.getStyle(value.getSecond(), 660 isFrameworkRes); 661 if (item != null) { 662 if (defaultPropMap != null) { 663 defaultPropMap.put("style", item.getName()); 664 } 665 666 defStyleValues = item; 667 } else { 668 Bridge.getLog().error(null, 669 String.format( 670 "Style with id 0x%x (resolved to '%s') does not exist.", 671 defStyleRes, value.getSecond()), 672 null); 673 } 674 } else { 675 Bridge.getLog().error(null, 676 String.format( 677 "Resource id 0x%x is not of type STYLE (instead %s)", 678 defStyleRes, value.getFirst().toString()), 679 null); 680 } 681 } else { 682 Bridge.getLog().error(null, 683 String.format( 684 "Failed to find style with id 0x%x in current theme", 685 defStyleRes), 686 null); 687 } 688 } 689 690 String appNamespace = mProjectCallback.getNamespace(); 691 692 if (attributeList != null) { 693 for (int index = 0 ; index < attributeList.size() ; index++) { 694 Pair<String, Boolean> attribute = attributeList.get(index); 695 696 if (attribute == null) { 697 continue; 698 } 699 700 String attrName = attribute.getFirst(); 701 boolean frameworkAttr = attribute.getSecond(); 702 String value = null; 703 if (set != null) { 704 value = set.getAttributeValue( 705 frameworkAttr ? BridgeConstants.NS_RESOURCES : appNamespace, 706 attrName); 707 708 // if this is an app attribute, and the first get fails, try with the 709 // new res-auto namespace as well 710 if (!frameworkAttr && value == null) { 711 value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName); 712 } 713 } 714 715 // if there's no direct value for this attribute in the XML, we look for default 716 // values in the widget defStyle, and then in the theme. 717 if (value == null) { 718 ResourceValue resValue = null; 719 720 // look for the value in the custom style first (and its parent if needed) 721 if (customStyleValues != null) { 722 resValue = mRenderResources.findItemInStyle(customStyleValues, 723 attrName, frameworkAttr); 724 } 725 726 // then look for the value in the default Style (and its parent if needed) 727 if (resValue == null && defStyleValues != null) { 728 resValue = mRenderResources.findItemInStyle(defStyleValues, 729 attrName, frameworkAttr); 730 } 731 732 // if the item is not present in the defStyle, we look in the main theme (and 733 // its parent themes) 734 if (resValue == null) { 735 resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr); 736 } 737 738 // if we found a value, we make sure this doesn't reference another value. 739 // So we resolve it. 740 if (resValue != null) { 741 // put the first default value, before the resolution. 742 if (defaultPropMap != null) { 743 defaultPropMap.put(attrName, resValue.getValue()); 744 } 745 746 resValue = mRenderResources.resolveResValue(resValue); 747 } 748 749 ta.bridgeSetValue(index, attrName, frameworkAttr, resValue); 750 } else { 751 // there is a value in the XML, but we need to resolve it in case it's 752 // referencing another resource or a theme value. 753 ta.bridgeSetValue(index, attrName, frameworkAttr, 754 mRenderResources.resolveValue(null, attrName, value, isPlatformFile)); 755 } 756 } 757 } 758 759 ta.sealArray(); 760 761 return ta; 762 } 763 764 @Override getMainLooper()765 public Looper getMainLooper() { 766 return Looper.myLooper(); 767 } 768 769 770 // ------------- private new methods 771 772 /** 773 * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the 774 * values found in the given style. If no style is specified, the default theme, along with the 775 * styles applied to it are used. 776 * 777 * @see #obtainStyledAttributes(int, int[]) 778 */ createStyleBasedTypedArray(@ullable StyleResourceValue style, int[] attrs)779 private BridgeTypedArray createStyleBasedTypedArray(@Nullable StyleResourceValue style, 780 int[] attrs) throws Resources.NotFoundException { 781 782 List<Pair<String, Boolean>> attributes = searchAttrs(attrs); 783 784 BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, 785 false); 786 787 // for each attribute, get its name so that we can search it in the style 788 for (int i = 0 ; i < attrs.length ; i++) { 789 Pair<String, Boolean> attribute = attributes.get(i); 790 791 if (attribute != null) { 792 // look for the value in the given style 793 ResourceValue resValue; 794 if (style != null) { 795 resValue = mRenderResources.findItemInStyle(style, attribute.getFirst(), 796 attribute.getSecond()); 797 } else { 798 resValue = mRenderResources.findItemInTheme(attribute.getFirst(), 799 attribute.getSecond()); 800 } 801 802 if (resValue != null) { 803 // resolve it to make sure there are no references left. 804 ta.bridgeSetValue(i, attribute.getFirst(), attribute.getSecond(), 805 mRenderResources.resolveResValue(resValue)); 806 } 807 } 808 } 809 810 ta.sealArray(); 811 812 return ta; 813 } 814 815 /** 816 * The input int[] attrs is a list of attributes. The returns a list of information about 817 * each attributes. The information is (name, isFramework) 818 * <p/> 819 * 820 * @param attrs An attribute array reference given to obtainStyledAttributes. 821 * @return List of attribute information. 822 */ searchAttrs(int[] attrs)823 private List<Pair<String, Boolean>> searchAttrs(int[] attrs) { 824 List<Pair<String, Boolean>> results = new ArrayList<Pair<String, Boolean>>(attrs.length); 825 826 // for each attribute, get its name so that we can search it in the style 827 for (int attr : attrs) { 828 Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attr); 829 boolean isFramework = false; 830 if (resolvedResource != null) { 831 isFramework = true; 832 } else { 833 resolvedResource = mProjectCallback.resolveResourceId(attr); 834 } 835 836 if (resolvedResource != null) { 837 results.add(Pair.of(resolvedResource.getSecond(), isFramework)); 838 } else { 839 results.add(null); 840 } 841 } 842 843 return results; 844 } 845 846 /** 847 * Searches for the attribute referenced by its internal id. 848 * 849 * @param attr An attribute reference given to obtainStyledAttributes such as defStyle. 850 * @return A (name, isFramework) pair describing the attribute if found. Returns null 851 * if nothing is found. 852 */ searchAttr(int attr)853 public Pair<String, Boolean> searchAttr(int attr) { 854 Pair<ResourceType, String> info = Bridge.resolveResourceId(attr); 855 if (info != null) { 856 return Pair.of(info.getSecond(), Boolean.TRUE); 857 } 858 859 info = mProjectCallback.resolveResourceId(attr); 860 if (info != null) { 861 return Pair.of(info.getSecond(), Boolean.FALSE); 862 } 863 864 return null; 865 } 866 getDynamicIdByStyle(StyleResourceValue resValue)867 public int getDynamicIdByStyle(StyleResourceValue resValue) { 868 if (mDynamicIdToStyleMap == null) { 869 // create the maps. 870 mDynamicIdToStyleMap = new HashMap<Integer, StyleResourceValue>(); 871 mStyleToDynamicIdMap = new HashMap<StyleResourceValue, Integer>(); 872 } 873 874 // look for an existing id 875 Integer id = mStyleToDynamicIdMap.get(resValue); 876 877 if (id == null) { 878 // generate a new id 879 id = ++mDynamicIdGenerator; 880 881 // and add it to the maps. 882 mDynamicIdToStyleMap.put(id, resValue); 883 mStyleToDynamicIdMap.put(resValue, id); 884 } 885 886 return id; 887 } 888 getStyleByDynamicId(int i)889 private StyleResourceValue getStyleByDynamicId(int i) { 890 if (mDynamicIdToStyleMap != null) { 891 return mDynamicIdToStyleMap.get(i); 892 } 893 894 return null; 895 } 896 getFrameworkResourceValue(ResourceType resType, String resName, int defValue)897 public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) { 898 if (getRenderResources().getFrameworkResource(resType, resName) != null) { 899 // Bridge.getResourceId creates a new resource id if an existing one isn't found. So, 900 // we check for the existence of the resource before calling it. 901 return Bridge.getResourceId(resType, resName); 902 } 903 904 return defValue; 905 } 906 getProjectResourceValue(ResourceType resType, String resName, int defValue)907 public int getProjectResourceValue(ResourceType resType, String resName, int defValue) { 908 // getResourceId creates a new resource id if an existing resource id isn't found. So, we 909 // check for the existence of the resource before calling it. 910 if (getRenderResources().getProjectResource(resType, resName) != null) { 911 if (mProjectCallback != null) { 912 Integer value = mProjectCallback.getResourceId(resType, resName); 913 if (value != null) { 914 return value; 915 } 916 } 917 } 918 919 return defValue; 920 } 921 922 //------------ NOT OVERRIDEN -------------------- 923 924 @Override bindService(Intent arg0, ServiceConnection arg1, int arg2)925 public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) { 926 // pass 927 return false; 928 } 929 930 @Override checkCallingOrSelfPermission(String arg0)931 public int checkCallingOrSelfPermission(String arg0) { 932 // pass 933 return 0; 934 } 935 936 @Override checkCallingOrSelfUriPermission(Uri arg0, int arg1)937 public int checkCallingOrSelfUriPermission(Uri arg0, int arg1) { 938 // pass 939 return 0; 940 } 941 942 @Override checkCallingPermission(String arg0)943 public int checkCallingPermission(String arg0) { 944 // pass 945 return 0; 946 } 947 948 @Override checkCallingUriPermission(Uri arg0, int arg1)949 public int checkCallingUriPermission(Uri arg0, int arg1) { 950 // pass 951 return 0; 952 } 953 954 @Override checkPermission(String arg0, int arg1, int arg2)955 public int checkPermission(String arg0, int arg1, int arg2) { 956 // pass 957 return 0; 958 } 959 960 @Override checkPermission(String arg0, int arg1, int arg2, IBinder arg3)961 public int checkPermission(String arg0, int arg1, int arg2, IBinder arg3) { 962 // pass 963 return 0; 964 } 965 966 @Override checkUriPermission(Uri arg0, int arg1, int arg2, int arg3)967 public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3) { 968 // pass 969 return 0; 970 } 971 972 @Override checkUriPermission(Uri arg0, int arg1, int arg2, int arg3, IBinder arg4)973 public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3, IBinder arg4) { 974 // pass 975 return 0; 976 } 977 978 @Override checkUriPermission(Uri arg0, String arg1, String arg2, int arg3, int arg4, int arg5)979 public int checkUriPermission(Uri arg0, String arg1, String arg2, int arg3, 980 int arg4, int arg5) { 981 // pass 982 return 0; 983 } 984 985 @Override clearWallpaper()986 public void clearWallpaper() { 987 // pass 988 989 } 990 991 @Override createPackageContext(String arg0, int arg1)992 public Context createPackageContext(String arg0, int arg1) { 993 // pass 994 return null; 995 } 996 997 @Override createPackageContextAsUser(String arg0, int arg1, UserHandle user)998 public Context createPackageContextAsUser(String arg0, int arg1, UserHandle user) { 999 // pass 1000 return null; 1001 } 1002 1003 @Override createConfigurationContext(Configuration overrideConfiguration)1004 public Context createConfigurationContext(Configuration overrideConfiguration) { 1005 // pass 1006 return null; 1007 } 1008 1009 @Override createDisplayContext(Display display)1010 public Context createDisplayContext(Display display) { 1011 // pass 1012 return null; 1013 } 1014 1015 @Override databaseList()1016 public String[] databaseList() { 1017 // pass 1018 return null; 1019 } 1020 1021 @Override createApplicationContext(ApplicationInfo application, int flags)1022 public Context createApplicationContext(ApplicationInfo application, int flags) 1023 throws PackageManager.NameNotFoundException { 1024 return null; 1025 } 1026 1027 @Override deleteDatabase(String arg0)1028 public boolean deleteDatabase(String arg0) { 1029 // pass 1030 return false; 1031 } 1032 1033 @Override deleteFile(String arg0)1034 public boolean deleteFile(String arg0) { 1035 // pass 1036 return false; 1037 } 1038 1039 @Override enforceCallingOrSelfPermission(String arg0, String arg1)1040 public void enforceCallingOrSelfPermission(String arg0, String arg1) { 1041 // pass 1042 1043 } 1044 1045 @Override enforceCallingOrSelfUriPermission(Uri arg0, int arg1, String arg2)1046 public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1, 1047 String arg2) { 1048 // pass 1049 1050 } 1051 1052 @Override enforceCallingPermission(String arg0, String arg1)1053 public void enforceCallingPermission(String arg0, String arg1) { 1054 // pass 1055 1056 } 1057 1058 @Override enforceCallingUriPermission(Uri arg0, int arg1, String arg2)1059 public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) { 1060 // pass 1061 1062 } 1063 1064 @Override enforcePermission(String arg0, int arg1, int arg2, String arg3)1065 public void enforcePermission(String arg0, int arg1, int arg2, String arg3) { 1066 // pass 1067 1068 } 1069 1070 @Override enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3, String arg4)1071 public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3, 1072 String arg4) { 1073 // pass 1074 1075 } 1076 1077 @Override enforceUriPermission(Uri arg0, String arg1, String arg2, int arg3, int arg4, int arg5, String arg6)1078 public void enforceUriPermission(Uri arg0, String arg1, String arg2, 1079 int arg3, int arg4, int arg5, String arg6) { 1080 // pass 1081 1082 } 1083 1084 @Override fileList()1085 public String[] fileList() { 1086 // pass 1087 return null; 1088 } 1089 1090 @Override getAssets()1091 public AssetManager getAssets() { 1092 // pass 1093 return null; 1094 } 1095 1096 @Override getCacheDir()1097 public File getCacheDir() { 1098 // pass 1099 return null; 1100 } 1101 1102 @Override getCodeCacheDir()1103 public File getCodeCacheDir() { 1104 // pass 1105 return null; 1106 } 1107 1108 @Override getExternalCacheDir()1109 public File getExternalCacheDir() { 1110 // pass 1111 return null; 1112 } 1113 1114 @Override getContentResolver()1115 public ContentResolver getContentResolver() { 1116 if (mContentResolver == null) { 1117 mContentResolver = new BridgeContentResolver(this); 1118 } 1119 return mContentResolver; 1120 } 1121 1122 @Override getDatabasePath(String arg0)1123 public File getDatabasePath(String arg0) { 1124 // pass 1125 return null; 1126 } 1127 1128 @Override getDir(String arg0, int arg1)1129 public File getDir(String arg0, int arg1) { 1130 // pass 1131 return null; 1132 } 1133 1134 @Override getFileStreamPath(String arg0)1135 public File getFileStreamPath(String arg0) { 1136 // pass 1137 return null; 1138 } 1139 1140 @Override getFilesDir()1141 public File getFilesDir() { 1142 // pass 1143 return null; 1144 } 1145 1146 @Override getNoBackupFilesDir()1147 public File getNoBackupFilesDir() { 1148 // pass 1149 return null; 1150 } 1151 1152 @Override getExternalFilesDir(String type)1153 public File getExternalFilesDir(String type) { 1154 // pass 1155 return null; 1156 } 1157 1158 @Override getPackageCodePath()1159 public String getPackageCodePath() { 1160 // pass 1161 return null; 1162 } 1163 1164 @Override getPackageManager()1165 public PackageManager getPackageManager() { 1166 // pass 1167 return null; 1168 } 1169 1170 @Override getPackageName()1171 public String getPackageName() { 1172 // pass 1173 return null; 1174 } 1175 1176 @Override getBasePackageName()1177 public String getBasePackageName() { 1178 // pass 1179 return null; 1180 } 1181 1182 @Override getOpPackageName()1183 public String getOpPackageName() { 1184 // pass 1185 return null; 1186 } 1187 1188 @Override getApplicationInfo()1189 public ApplicationInfo getApplicationInfo() { 1190 return mApplicationInfo; 1191 } 1192 1193 @Override getPackageResourcePath()1194 public String getPackageResourcePath() { 1195 // pass 1196 return null; 1197 } 1198 1199 @Override getSharedPrefsFile(String name)1200 public File getSharedPrefsFile(String name) { 1201 // pass 1202 return null; 1203 } 1204 1205 @Override getSharedPreferences(String arg0, int arg1)1206 public SharedPreferences getSharedPreferences(String arg0, int arg1) { 1207 if (mSharedPreferences == null) { 1208 mSharedPreferences = new BridgeSharedPreferences(); 1209 } 1210 return mSharedPreferences; 1211 } 1212 1213 @Override getWallpaper()1214 public Drawable getWallpaper() { 1215 // pass 1216 return null; 1217 } 1218 1219 @Override getWallpaperDesiredMinimumWidth()1220 public int getWallpaperDesiredMinimumWidth() { 1221 return -1; 1222 } 1223 1224 @Override getWallpaperDesiredMinimumHeight()1225 public int getWallpaperDesiredMinimumHeight() { 1226 return -1; 1227 } 1228 1229 @Override grantUriPermission(String arg0, Uri arg1, int arg2)1230 public void grantUriPermission(String arg0, Uri arg1, int arg2) { 1231 // pass 1232 1233 } 1234 1235 @Override openFileInput(String arg0)1236 public FileInputStream openFileInput(String arg0) throws FileNotFoundException { 1237 // pass 1238 return null; 1239 } 1240 1241 @Override openFileOutput(String arg0, int arg1)1242 public FileOutputStream openFileOutput(String arg0, int arg1) throws FileNotFoundException { 1243 // pass 1244 return null; 1245 } 1246 1247 @Override openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2)1248 public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2) { 1249 // pass 1250 return null; 1251 } 1252 1253 @Override openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2, DatabaseErrorHandler arg3)1254 public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, 1255 CursorFactory arg2, DatabaseErrorHandler arg3) { 1256 // pass 1257 return null; 1258 } 1259 1260 @Override peekWallpaper()1261 public Drawable peekWallpaper() { 1262 // pass 1263 return null; 1264 } 1265 1266 @Override registerReceiver(BroadcastReceiver arg0, IntentFilter arg1)1267 public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1) { 1268 // pass 1269 return null; 1270 } 1271 1272 @Override registerReceiver(BroadcastReceiver arg0, IntentFilter arg1, String arg2, Handler arg3)1273 public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1, 1274 String arg2, Handler arg3) { 1275 // pass 1276 return null; 1277 } 1278 1279 @Override registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5, IntentFilter arg1, String arg2, Handler arg3)1280 public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5, 1281 IntentFilter arg1, String arg2, Handler arg3) { 1282 // pass 1283 return null; 1284 } 1285 1286 @Override removeStickyBroadcast(Intent arg0)1287 public void removeStickyBroadcast(Intent arg0) { 1288 // pass 1289 1290 } 1291 1292 @Override revokeUriPermission(Uri arg0, int arg1)1293 public void revokeUriPermission(Uri arg0, int arg1) { 1294 // pass 1295 1296 } 1297 1298 @Override sendBroadcast(Intent arg0)1299 public void sendBroadcast(Intent arg0) { 1300 // pass 1301 1302 } 1303 1304 @Override sendBroadcast(Intent arg0, String arg1)1305 public void sendBroadcast(Intent arg0, String arg1) { 1306 // pass 1307 1308 } 1309 1310 @Override sendBroadcast(Intent intent, String receiverPermission, int appOp)1311 public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { 1312 // pass 1313 } 1314 1315 @Override sendOrderedBroadcast(Intent arg0, String arg1)1316 public void sendOrderedBroadcast(Intent arg0, String arg1) { 1317 // pass 1318 1319 } 1320 1321 @Override sendOrderedBroadcast(Intent arg0, String arg1, BroadcastReceiver arg2, Handler arg3, int arg4, String arg5, Bundle arg6)1322 public void sendOrderedBroadcast(Intent arg0, String arg1, 1323 BroadcastReceiver arg2, Handler arg3, int arg4, String arg5, 1324 Bundle arg6) { 1325 // pass 1326 1327 } 1328 1329 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1330 public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, 1331 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 1332 String initialData, Bundle initialExtras) { 1333 // pass 1334 } 1335 1336 @Override sendBroadcastAsUser(Intent intent, UserHandle user)1337 public void sendBroadcastAsUser(Intent intent, UserHandle user) { 1338 // pass 1339 } 1340 1341 @Override sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)1342 public void sendBroadcastAsUser(Intent intent, UserHandle user, 1343 String receiverPermission) { 1344 // pass 1345 } 1346 1347 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1348 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 1349 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 1350 int initialCode, String initialData, Bundle initialExtras) { 1351 // pass 1352 } 1353 1354 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1355 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 1356 String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 1357 Handler scheduler, 1358 int initialCode, String initialData, Bundle initialExtras) { 1359 // pass 1360 } 1361 1362 @Override sendStickyBroadcast(Intent arg0)1363 public void sendStickyBroadcast(Intent arg0) { 1364 // pass 1365 1366 } 1367 1368 @Override sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1369 public void sendStickyOrderedBroadcast(Intent intent, 1370 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, 1371 Bundle initialExtras) { 1372 // pass 1373 } 1374 1375 @Override sendStickyBroadcastAsUser(Intent intent, UserHandle user)1376 public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 1377 // pass 1378 } 1379 1380 @Override sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)1381 public void sendStickyOrderedBroadcastAsUser(Intent intent, 1382 UserHandle user, BroadcastReceiver resultReceiver, 1383 Handler scheduler, int initialCode, String initialData, 1384 Bundle initialExtras) { 1385 // pass 1386 } 1387 1388 @Override removeStickyBroadcastAsUser(Intent intent, UserHandle user)1389 public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 1390 // pass 1391 } 1392 1393 @Override setTheme(int arg0)1394 public void setTheme(int arg0) { 1395 // pass 1396 1397 } 1398 1399 @Override setWallpaper(Bitmap arg0)1400 public void setWallpaper(Bitmap arg0) throws IOException { 1401 // pass 1402 1403 } 1404 1405 @Override setWallpaper(InputStream arg0)1406 public void setWallpaper(InputStream arg0) throws IOException { 1407 // pass 1408 1409 } 1410 1411 @Override startActivity(Intent arg0)1412 public void startActivity(Intent arg0) { 1413 // pass 1414 } 1415 1416 @Override startActivity(Intent arg0, Bundle arg1)1417 public void startActivity(Intent arg0, Bundle arg1) { 1418 // pass 1419 } 1420 1421 @Override startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)1422 public void startIntentSender(IntentSender intent, 1423 Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 1424 throws IntentSender.SendIntentException { 1425 // pass 1426 } 1427 1428 @Override startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options)1429 public void startIntentSender(IntentSender intent, 1430 Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, 1431 Bundle options) throws IntentSender.SendIntentException { 1432 // pass 1433 } 1434 1435 @Override startInstrumentation(ComponentName arg0, String arg1, Bundle arg2)1436 public boolean startInstrumentation(ComponentName arg0, String arg1, 1437 Bundle arg2) { 1438 // pass 1439 return false; 1440 } 1441 1442 @Override startService(Intent arg0)1443 public ComponentName startService(Intent arg0) { 1444 // pass 1445 return null; 1446 } 1447 1448 @Override stopService(Intent arg0)1449 public boolean stopService(Intent arg0) { 1450 // pass 1451 return false; 1452 } 1453 1454 @Override startServiceAsUser(Intent arg0, UserHandle arg1)1455 public ComponentName startServiceAsUser(Intent arg0, UserHandle arg1) { 1456 // pass 1457 return null; 1458 } 1459 1460 @Override stopServiceAsUser(Intent arg0, UserHandle arg1)1461 public boolean stopServiceAsUser(Intent arg0, UserHandle arg1) { 1462 // pass 1463 return false; 1464 } 1465 1466 @Override unbindService(ServiceConnection arg0)1467 public void unbindService(ServiceConnection arg0) { 1468 // pass 1469 1470 } 1471 1472 @Override unregisterReceiver(BroadcastReceiver arg0)1473 public void unregisterReceiver(BroadcastReceiver arg0) { 1474 // pass 1475 1476 } 1477 1478 @Override getApplicationContext()1479 public Context getApplicationContext() { 1480 return this; 1481 } 1482 1483 @Override startActivities(Intent[] arg0)1484 public void startActivities(Intent[] arg0) { 1485 // pass 1486 1487 } 1488 1489 @Override startActivities(Intent[] arg0, Bundle arg1)1490 public void startActivities(Intent[] arg0, Bundle arg1) { 1491 // pass 1492 1493 } 1494 1495 @Override isRestricted()1496 public boolean isRestricted() { 1497 return false; 1498 } 1499 1500 @Override getObbDir()1501 public File getObbDir() { 1502 Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "OBB not supported", null); 1503 return null; 1504 } 1505 1506 @Override getDisplayAdjustments(int displayId)1507 public DisplayAdjustments getDisplayAdjustments(int displayId) { 1508 // pass 1509 return null; 1510 } 1511 1512 @Override getUserId()1513 public int getUserId() { 1514 return 0; // not used 1515 } 1516 1517 @Override getExternalFilesDirs(String type)1518 public File[] getExternalFilesDirs(String type) { 1519 // pass 1520 return new File[0]; 1521 } 1522 1523 @Override getObbDirs()1524 public File[] getObbDirs() { 1525 // pass 1526 return new File[0]; 1527 } 1528 1529 @Override getExternalCacheDirs()1530 public File[] getExternalCacheDirs() { 1531 // pass 1532 return new File[0]; 1533 } 1534 1535 @Override getExternalMediaDirs()1536 public File[] getExternalMediaDirs() { 1537 // pass 1538 return new File[0]; 1539 } 1540 } 1541