Offset 1, 80 lines modifiedOffset 1, 485 lines modified
  
1 package·com.android.car.ui;1 package·com.android.car.ui;
  
 2 import·android.content.res.TypedArray;
 3 import·android.view.accessibility.AccessibilityNodeInfo;
 4 import·com.android.car.ui.utils.CarUiUtils;
2 import·android.graphics.Canvas;5 import·android.graphics.Canvas;
3 import·android.view.View;6 import·android.view.ViewGroup;
4 import·android.view.ViewTreeObserver$OnGlobalFocusChangeListener;7 import·android.view.ViewTreeObserver$OnGlobalFocusChangeListener;
 8 import·android.util.Log;
 9 import·java.util.Iterator;
 10 import·java.util.HashMap;
 11 import·android.content.res.Resources;
 12 import·android.os.Bundle;
 13 import·android.view.ViewParent;
 14 import·android.os.SystemClock;
 15 import·com.android.car.ui.utils.ViewUtils;
5 import·android.util.AttributeSet;16 import·android.util.AttributeSet;
6 import·android.content.Context;17 import·android.content.Context;
 18 import·java.util.Arrays;
 19 import·java.util.Map;
 20 import·android.view.View;
7 import·android.graphics.drawable.Drawable;21 import·android.graphics.drawable.Drawable;
 22 import·java.util.List;
8 import·android.widget.LinearLayout;23 import·android.widget.LinearLayout;
  
9 public·class·FocusArea·extends·LinearLayout24 public·class·FocusArea·extends·LinearLayout
10 {25 {
 26 ····private·static·final·int·INVALID_DIMEN·=·255;
 27 ····private·static·final·int·INVALID_DIRECTION·=·255;
 28 ····private·static·final·List·NUDGE_DIRECTIONS;
 29 ····private·static·final·String·TAG·=·"FocusArea";
11 ····private·Drawable·mBackgroundHighlight;30 ····private·Drawable·mBackgroundHighlight;
 31 ····private·int·mBottomOffset;
 32 ····private·boolean·mClearFocusAreaHistoryWhenRotating;
 33 ····private·int·mDefaultFocusId;
 34 ····private·boolean·mDefaultFocusOverridesHistory;
 35 ····private·View·mDefaultFocusView;
12 ····private·boolean·mEnableBackgroundHighlight;36 ····private·boolean·mEnableBackgroundHighlight;
13 ····private·boolean·mEnableForegroundHighlight;37 ····private·boolean·mEnableForegroundHighlight;
 38 ····private·View·mFocusedView;
14 ····private·Drawable·mForegroundHighlight;39 ····private·Drawable·mForegroundHighlight;
15 ····private·boolean·mHasFocus;40 ····private·boolean·mHasFocus;
 41 ····private·int·mLeftOffset;
 42 ····private·int·mNudgeShortcutDirection;
 43 ····private·int·mNudgeShortcutId;
 44 ····private·View·mNudgeShortcutView;
16 ····private·int·mPaddingBottom;45 ····private·int·mPaddingBottom;
17 ····private·int·mPaddingLeft;46 ····private·int·mPaddingLeft;
18 ····private·int·mPaddingRight;47 ····private·int·mPaddingRight;
19 ····private·int·mPaddingTop;48 ····private·int·mPaddingTop;
 49 ····private·FocusArea·mPreviousFocusArea;
 50 ····private·int·mRightOffset;
 51 ····private·RotaryCache·mRotaryCache;
 52 ····private·boolean·mRtl;
 53 ····private·Map·mSpecifiedNudgeFocusAreaMap;
 54 ····private·Map·mSpecifiedNudgeIdMap;
 55 ····private·int·mTopOffset;
 56 ····
 57 ····static·{
 58 ········NUDGE_DIRECTIONS·=·Arrays.asList(17,·66,·33,·130);
 59 ····}
20 ····60 ····
21 ····public·FocusArea(final·Context·context)·{61 ····public·FocusArea(final·Context·context)·{
22 ········super(context);62 ········super(context);
23 ········this.init();63 ········this.init(context,·null);
24 ····}64 ····}
25 ····65 ····
26 ····public·FocusArea(final·Context·context,·final·AttributeSet·set)·{66 ····public·FocusArea(final·Context·context,·final·AttributeSet·set)·{
27 ········super(context,·set);67 ········super(context,·set);
28 ········this.init();68 ········this.init(context,·set);
29 ····}69 ····}
30 ····70 ····
31 ····public·FocusArea(final·Context·context,·final·AttributeSet·set,·final·int·n)·{71 ····public·FocusArea(final·Context·context,·final·AttributeSet·set,·final·int·n)·{
32 ········super(context,·set,·n);72 ········super(context,·set,·n);
33 ········this.init();73 ········this.init(context,·set);
34 ····}74 ····}
35 ····75 ····
36 ····public·FocusArea(final·Context·context,·final·AttributeSet·set,·final·int·n,·final·int·n2)·{76 ····public·FocusArea(final·Context·context,·final·AttributeSet·set,·final·int·n,·final·int·n2)·{
37 ········super(context,·set,·n,·n2);77 ········super(context,·set,·n,·n2);
38 ········this.init();78 ········this.init(context,·set);
 79 ····}
 80 ····
 81 ····private·boolean·focusDefaultFocusView()·{
 82 ········return·this.requestFocus(this.mDefaultFocusView);
 83 ····}
 84 ····
 85 ····private·boolean·focusOnDescendant()·{
 86 ········final·boolean·focusOnFocusedByDefaultView·=·this.focusOnFocusedByDefaultView();
 87 ········final·boolean·b·=·true;
 88 ········if·(focusOnFocusedByDefaultView)·{
 89 ············return·b;
 90 ········}
 91 ········if·(this.focusOnPrimaryFocusView())·{
 92 ············return·b;
 93 ········}
 94 ········if·(this.mDefaultFocusOverridesHistory)·{
 95 ············if·(this.focusDefaultFocusView()·||·this.focusOnLastFocusedView())·{
 96 ················return·b;
 97 ············}
 98 ········}
 99 ········else·if·(this.focusOnLastFocusedView()·||·this.focusDefaultFocusView())·{
 100 ············return·b;
 101 ········}
 102 ········return·this.focusOnFirstFocusableView();
 103 ····}
 104 ····
 105 ····private·boolean·focusOnFirstFocusableView()·{
 106 ········return·this.requestFocus(ViewUtils.findFocusableDescendant((View)this));
 107 ····}
 108 ····
 109 ····private·boolean·focusOnFocusedByDefaultView()·{
 110 ········return·this.requestFocus(ViewUtils.findFocusedByDefaultView((View)this));
 111 ····}
 112 ····
 113 ····private·boolean·focusOnLastFocusedView()·{
 114 ········return·this.requestFocus(this.mRotaryCache.getFocusedView(SystemClock.uptimeMillis()));
 115 ····}
 116 ····
 117 ····private·boolean·focusOnPrimaryFocusView()·{
 118 ········return·this.requestFocus(ViewUtils.findPrimaryFocusView((View)this));
 119 ····}
 120 ····
 121 ····private·static·FocusArea·getAncestorFocusArea(final·View·view)·{
 122 ········for·(ViewParent·viewParent·=·view.getParent();·viewParent·!=·null;·viewParent·=·viewParent.getParent())·{
 123 ············if·(viewParent·instanceof·FocusArea)·{
 124 ················return·(FocusArea)viewParent;
 125 ············}
 126 ········}
 127 ········return·null;
 128 ····}
 129 ····
 130 ····private·static·int·getNudgeDirection(final·Bundle·bundle)·{
 131 ········int·int1·=·-1;
 132 ········if·(bundle·!=·null)·{
 133 ············int1·=·bundle.getInt("com.android.car.ui.utils.NUDGE_DIRECTION",·int1);
 134 ········}
 135 ········return·int1;
 136 ····}
 137 ····
 138 ····private·static·int·getOppositeDirection(final·int·n)·{
 139 ········final·int·n2·=·66;
 140 ········final·int·n3·=·17;
 141 ········if·(n·==·n3)·{
 142 ············return·n2;
 143 ········}
 144 ········final·int·n4·=·130;
 145 ········final·int·n5·=·33;
 146 ········if·(n·==·n5)·{
 147 ············return·n4;
 148 ········}
 149 ········if·(n·==·n2)·{
 150 ············return·n3;
 151 ········}
 152 ········if·(n·==·n4)·{
 153 ············return·n5;
 154 ········}
 155 ········throw·new·IllegalArgumentException("direction·must·be·FOCUS_UP,·FOCUS_DOWN,·FOCUS_LEFT,·or·FOCUS_RIGHT.");
 156 ····}
 157 ····
 158 ····private·FocusArea·getSpecifiedFocusArea(final·int·n)·{
 159 ········this.maybeInitializeSpecifiedFocusAreas();
 160 ········return·this.mSpecifiedNudgeFocusAreaMap.get(n);
39 ····}161 ····}
40 ····162 ····
41 ····private·void·init()·{163 ····private·void·init(final·Context·context,·final·AttributeSet·set)·{
42 ········this.mEnableForegroundHighlight·=·this.getContext().getResources().getBoolean(R$bool.car_ui_enable_focus_area_foreground_highlight);164 ········final·Resources·resources·=·this.getContext().getResources();
43 ········this.mEnableBackgroundHighlight·=·this.getContext().getResources().getBoolean(R$bool.car_ui_enable_focus_area_background_highlight);165 ········this.mEnableForegroundHighlight·=·resources.getBoolean(R$bool.car_ui_enable_focus_area_foreground_highlight);
44 ········this.mForegroundHighlight·=·this.getContext().getResources().getDrawable(R$drawable.car_ui_focus_area_foreground_highlight,·this.getContext().getTheme());166 ········this.mEnableBackgroundHighlight·=·resources.getBoolean(R$bool.car_ui_enable_focus_area_background_highlight);
45 ········this.mBackgroundHighlight·=·this.getContext().getResources().getDrawable(R$drawable.car_ui_focus_area_background_highlight,·this.getContext().getTheme());167 ········this.mForegroundHighlight·=·resources.getDrawable(R$drawable.car_ui_focus_area_foreground_highlight,·this.getContext().getTheme());
 168 ········this.mBackgroundHighlight·=·resources.getDrawable(R$drawable.car_ui_focus_area_background_highlight,·this.getContext().getTheme());
 169 ········this.mDefaultFocusOverridesHistory·=·resources.getBoolean(R$bool.car_ui_focus_area_default_focus_overrides_history);
 170 ········this.mClearFocusAreaHistoryWhenRotating·=·resources.getBoolean(R$bool.car_ui_clear_focus_area_history_when_rotating);
 171 ········this.mRotaryCache·=·new·RotaryCache(resources.getInteger(R$integer.car_ui_focus_history_cache_type),·resources.getInteger(R$integer.car_ui_focus_history_expiration_period_ms),·resources.getInteger(R$integer.car_ui_focus_area_history_cache_type),·resources.getInteger(R$integer.car_ui_focus_area_history_expiration_period_ms));
46 ········this.setImportantForAccessibility(1);172 ········this.setImportantForAccessibility(1);
47 ········this.setWillNotDraw(false);173 ········this.setWillNotDraw(false);
48 ········this.getViewTreeObserver().addOnGlobalFocusChangeListener((ViewTreeObserver$OnGlobalFocusChangeListener)new·-$$Lambda$FocusArea$Mt3bujuVuhIqHFNk5yQVNfMwfXs(this));174 ········this.registerFocusChangeListener();
 175 ········this.initAttrs(context,·set);
 176 ····}
 177 ····
 178 ····private·void·initAttrs(Context·obtainStyledAttributes,·final·AttributeSet·set)·{
 179 ········if·(set·==·null)·{
 180 ············return;
 181 ········}
 182 ········obtainStyledAttributes·=·(Context)obtainStyledAttributes.obtainStyledAttributes(set,·R$styleable.FocusArea);
 183 ········try·{
 184 ············final·int·focusArea_defaultFocus·=·R$styleable.FocusArea_defaultFocus;
 185 ············final·int·n·=·-1;
 186 ············this.mDefaultFocusId·=·((TypedArray)obtainStyledAttributes).getResourceId(focusArea_defaultFocus,·n);
 187 ············int·n2·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingStart,·n);
 188 ············boolean·b·=·false;
 189 ············if·(n2·==·n)·{
 190 ················n2·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingHorizontal,·0);
 191 ············}
 192 ············int·n3·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingEnd,·n);
 193 ············if·(n3·==·n)·{
 194 ················n3·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingHorizontal,·0);
 195 ············}
 196 ············final·int·layoutDirection·=·this.getLayoutDirection();
 197 ············final·boolean·b2·=·true;
 198 ············final·boolean·mRtl·=·layoutDirection·==·(b2·?·1·:·0)·&&·b2;
 199 ············this.mRtl·=·mRtl;
 200 ············int·mPaddingLeft;
 201 ············if·(mRtl)·{
 202 ················mPaddingLeft·=·n3;
 203 ············}
 204 ············else·{
 205 ················mPaddingLeft·=·n2;
 206 ············}
 207 ············this.mPaddingLeft·=·mPaddingLeft;
 208 ············int·mPaddingRight;
 209 ············if·(this.mRtl)·{
 210 ················mPaddingRight·=·n2;
 211 ············}
 212 ············else·{
 213 ················mPaddingRight·=·n3;
 214 ············}
 215 ············this.mPaddingRight·=·mPaddingRight;
 216 ············final·int·dimensionPixelSize·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingTop,·n);
 217 ············this.mPaddingTop·=·dimensionPixelSize;
 218 ············if·(dimensionPixelSize·==·n)·{
 219 ················this.mPaddingTop·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingVertical,·0);
 220 ············}
 221 ············if·((this.mPaddingBottom·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingBottom,·n))·==·n)·{
 222 ················this.mPaddingBottom·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_highlightPaddingVertical,·0);
 223 ············}
 224 ············int·mRightOffset·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_startBoundOffset,·n);
 225 ············if·(mRightOffset·==·n)·{
 226 ················mRightOffset·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_horizontalBoundOffset,·n2);
 227 ············}
 228 ············int·n4·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_endBoundOffset,·n);
 229 ············if·(n4·==·n)·{
 230 ················n4·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_horizontalBoundOffset,·n3);
 231 ············}
 232 ············int·mLeftOffset;
 233 ············if·(this.mRtl)·{
 234 ················mLeftOffset·=·n4;
 235 ············}
 236 ············else·{
 237 ················mLeftOffset·=·mRightOffset;
 238 ············}
 239 ············this.mLeftOffset·=·mLeftOffset;
 240 ············if·(!this.mRtl)·{
 241 ················mRightOffset·=·n4;
 242 ············}
 243 ············this.mRightOffset·=·mRightOffset;
 244 ············final·int·dimensionPixelSize2·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_topBoundOffset,·n);
 245 ············this.mTopOffset·=·dimensionPixelSize2;
 246 ············if·(dimensionPixelSize2·==·n)·{
 247 ················this.mTopOffset·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_verticalBoundOffset,·this.mPaddingTop);
 248 ············}
 249 ············if·((this.mBottomOffset·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_bottomBoundOffset,·n))·==·n)·{
 250 ················this.mBottomOffset·=·((TypedArray)obtainStyledAttributes).getDimensionPixelSize(R$styleable.FocusArea_verticalBoundOffset,·this.mPaddingBottom);
 251 ············}
 252 ············this.mNudgeShortcutId·=·((TypedArray)obtainStyledAttributes).getResourceId(R$styleable.FocusArea_nudgeShortcut,·n);
 253 ············this.mNudgeShortcutDirection·=·((TypedArray)obtainStyledAttributes).getInt(R$styleable.FocusArea_nudgeShortcutDirection,·n);
 254 ············final·boolean·b3·=·this.mNudgeShortcutId·==·n·&&·b2;
 255 ············if·(this.mNudgeShortcutDirection·==·n)·{
 256 ················b·=·b2;
 257 ············}
 258 ············if·(!(b3·^·b))·{
 259 ················(this.mSpecifiedNudgeIdMap·=·new·HashMap()).put(17,·((TypedArray)obtainStyledAttributes).getResourceId(R$styleable.FocusArea_nudgeLeft,·n));
 260 ················this.mSpecifiedNudgeIdMap.put(66,·((TypedArray)obtainStyledAttributes).getResourceId(R$styleable.FocusArea_nudgeRight,·n));
 261 ················this.mSpecifiedNudgeIdMap.put(33,·((TypedArray)obtainStyledAttributes).getResourceId(R$styleable.FocusArea_nudgeUp,·n));
 262 ················this.mSpecifiedNudgeIdMap.put(130,·((TypedArray)obtainStyledAttributes).getResourceId(R$styleable.FocusArea_nudgeDown,·n));
 263 ················return;
 264 ············}
 265 ············throw·new·IllegalStateException("nudgeShortcut·and·nudgeShortcutDirection·must·be·specified·together");
 266 ········}
 267 ········finally·{
 268 ············((TypedArray)obtainStyledAttributes).recycle();
 269 ········}
 270 ····}
 271 ····
 272 ····private·void·maybeClearFocusAreaHistory(final·boolean·b,·final·View·view)·{
 273 ········if·(!this.mClearFocusAreaHistoryWhenRotating)·{
 274 ············return;
 275 ········}
 276 ········if·(b)·{
 277 ············if·(view·!=·null)·{
 278 ················if·(getAncestorFocusArea(view)·!=·this)·{
 279 ····················return;
 280 ················}
 281 ················this.mRotaryCache.clearFocusAreaHistory();
 282 ············}
 283 ········}
 284 ····}
 285 ····
 286 ····private·void·maybeInitializeSpecifiedFocusAreas()·{
 287 ········if·(this.mSpecifiedNudgeFocusAreaMap·!=·null)·{
 288 ············return;
 289 ········}
 290 ········final·View·rootView·=·this.getRootView();
 291 ········this.mSpecifiedNudgeFocusAreaMap·=·new·HashMap();
 292 ········for·(final·Integer·n·:·FocusArea.NUDGE_DIRECTIONS)·{
 293 ············this.mSpecifiedNudgeFocusAreaMap.put(n,·rootView.findViewById((int)(Integer)this.mSpecifiedNudgeIdMap.get(n)));
 294 ········}
 295 ····}
 296 ····
 297 ····private·void·maybeUpdateFocusAreaHighlight(final·boolean·b)·{
 298 ········if·(!this.mEnableBackgroundHighlight·&&·!this.mEnableForegroundHighlight)·{
 299 ············return;
 300 ········}
 301 ········if·(this.mHasFocus·!=·b)·{
 302 ············this.invalidate();
 303 ········}
 304 ····}
 305 ····
 306 ····private·void·maybeUpdatePreviousFocusArea(final·boolean·b,·final·View·view)·{
 307 ········if·(!this.mHasFocus·&&·b)·{
 308 ············if·(view·!=·null)·{
 309 ················if·((this.mPreviousFocusArea·=·getAncestorFocusArea(view))·==·null)·{
 310 ····················final·StringBuilder·sb·=·new·StringBuilder();
 311 ····················sb.append("No·parent·FocusArea·for·");
 312 ····················sb.append(view);
 313 ····················Log.w("FocusArea",·sb.toString());
 314 ················}
 315 ············}
 316 ········}
 317 ····}
 318 ····
 319 ····private·boolean·nudgeToAnotherFocusArea(final·Bundle·bundle)·{
 320 ········final·int·nudgeDirection·=·getNudgeDirection(bundle);
 321 ········final·long·uptimeMillis·=·SystemClock.uptimeMillis();
 322 ········final·FocusArea·specifiedFocusArea·=·this.getSpecifiedFocusArea(nudgeDirection);
 323 ········boolean·b·=·true;
 324 ········final·boolean·b2·=·specifiedFocusArea·!=·null·&&·specifiedFocusArea.focusOnDescendant()·&&·b;
 325 ········FocusArea·focusArea;
 326 ········boolean·b3;
 327 ········if·(!b2)·{
 328 ············final·FocusArea·cachedFocusArea·=·this.mRotaryCache.getCachedFocusArea(nudgeDirection,·uptimeMillis);
 329 ············if·(cachedFocusArea·==·null·||·!cachedFocusArea.focusOnDescendant())·{
 330 ················b·=·false;
 331 ············}
 332 ············focusArea·=·cachedFocusArea;
 333 ············b3·=·b;
 334 ········}
 335 ········else·{
 336 ············focusArea·=·specifiedFocusArea;
 337 ············b3·=·b2;
 338 ········}
 339 ········if·(b3)·{
 340 ············this.saveFocusAreaHistory(nudgeDirection,·this,·focusArea,·uptimeMillis);
 341 ········}
 342 ········return·b3;
 343 ····}
 344 ····
 345 ····private·boolean·nudgeToShortcutView(final·Bundle·bundle)·{
 346 ········final·int·mNudgeShortcutDirection·=·this.mNudgeShortcutDirection;
 347 ········final·int·n·=·-1;
 348 ········return·mNudgeShortcutDirection·!=·n·&&·(bundle·!=·null·&&·bundle.getInt("com.android.car.ui.utils.NUDGE_DIRECTION",·n)·==·this.mNudgeShortcutDirection)·&&·!this.mNudgeShortcutView.isFocused()·&&·this.requestFocus(this.mNudgeShortcutView);
 349 ····}
 350 ····
 351 ····private·void·registerFocusChangeListener()·{
 352 ········this.getViewTreeObserver().addOnGlobalFocusChangeListener((ViewTreeObserver$OnGlobalFocusChangeListener)new·-$$Lambda$FocusArea$7x79I33igF0gDSKGrgNpHjao0QM(this));
 353 ····}
 354 ····
 355 ····private·boolean·requestFocus(final·View·view)·{
 356 ········return·view·!=·null·&&·view.isAttachedToWindow()·&&·view.performAccessibilityAction(1,·(Bundle)null);
 357 ····}
 358 ····
 359 ····private·void·saveFocusAreaHistory(int·oppositeDirection,·final·FocusArea·focusArea,·final·FocusArea·focusArea2,·final·long·n)·{
 360 ········focusArea.mRotaryCache.saveFocusArea(oppositeDirection,·focusArea2,·n);
 361 ········oppositeDirection·=·getOppositeDirection(oppositeDirection);
 362 ········focusArea2.mRotaryCache.saveFocusArea(oppositeDirection,·focusArea,·n);
 363 ····}
 364 ····
 365 ····private·void·saveFocusHistory(final·boolean·b)·{
 366 ········if·(!b)·{
 367 ············this.mRotaryCache.saveFocusedView(this.mFocusedView,·SystemClock.uptimeMillis());
 368 ············this.mFocusedView·=·null;
 369 ············return;
 370 ········}
 371 ········Object·mFocusedView·=·this.getFocusedChild();
 372 ········while·(mFocusedView·!=·null·&&·!((View)mFocusedView).isFocused())·{
 373 ············if·(mFocusedView·instanceof·ViewGroup)·{
 374 ················mFocusedView·=·((ViewGroup)mFocusedView).getFocusedChild();
 375 ············}
 376 ············else·{
 377 ················mFocusedView·=·null;
 378 ············}
 379 ········}
 380 ········this.mFocusedView·=·(View)mFocusedView;
49 ····}381 ····}
50 ····382 ····
51 ····public·void·draw(final·Canvas·canvas)·{383 ····public·void·draw(final·Canvas·canvas)·{
52 ········super.draw(canvas);384 ········super.draw(canvas);
53 ········if·(this.mEnableForegroundHighlight·&&·this.mHasFocus)·{385 ········if·(this.mEnableForegroundHighlight·&&·this.mHasFocus·&&·!this.isInTouchMode())·{
54 ············this.mForegroundHighlight.setBounds(this.mPaddingLeft·+·this.getScrollX(),·this.mPaddingTop·+·this.getScrollY(),·this.getScrollX()·+·this.getWidth()·-·this.mPaddingRight,·this.getScrollY()·+·this.getHeight()·-·this.mPaddingBottom);386 ············this.mForegroundHighlight.setBounds(this.mPaddingLeft·+·this.getScrollX(),·this.mPaddingTop·+·this.getScrollY(),·this.getScrollX()·+·this.getWidth()·-·this.mPaddingRight,·this.getScrollY()·+·this.getHeight()·-·this.mPaddingBottom);
55 ············this.mForegroundHighlight.draw(canvas);387 ············this.mForegroundHighlight.draw(canvas);
56 ········}388 ········}
57 ····}389 ····}
58 ····390 ····
 391 ····void·enableForegroundHighlight()·{
 392 ········this.mEnableForegroundHighlight·=·true;
 393 ····}
 394 ····
59 ····public·CharSequence·getAccessibilityClassName()·{395 ····public·CharSequence·getAccessibilityClassName()·{
60 ········return·FocusArea.class.getName();396 ········return·FocusArea.class.getName();
61 ····}397 ····}
62 ····398 ····
63 ····public·void·onDraw(final·Canvas·canvas)·{399 ····public·void·onDraw(final·Canvas·canvas)·{
64 ········super.onDraw(canvas);400 ········super.onDraw(canvas);
65 ········if·(this.mEnableBackgroundHighlight·&&·this.mHasFocus)·{401 ········if·(this.mEnableBackgroundHighlight·&&·this.mHasFocus·&&·!this.isInTouchMode())·{
66 ············this.mBackgroundHighlight.setBounds(this.mPaddingLeft·+·this.getScrollX(),·this.mPaddingTop·+·this.getScrollY(),·this.getScrollX()·+·this.getWidth()·-·this.mPaddingRight,·this.getScrollY()·+·this.getHeight()·-·this.mPaddingBottom);402 ············this.mBackgroundHighlight.setBounds(this.mPaddingLeft·+·this.getScrollX(),·this.mPaddingTop·+·this.getScrollY(),·this.getScrollX()·+·this.getWidth()·-·this.mPaddingRight,·this.getScrollY()·+·this.getHeight()·-·this.mPaddingBottom);
67 ············this.mBackgroundHighlight.draw(canvas);403 ············this.mBackgroundHighlight.draw(canvas);
68 ········}404 ········}
69 ····}405 ····}
70 ····406 ····
 407 ····protected·void·onFinishInflate()·{
 408 ········super.onFinishInflate();
 409 ········final·int·mDefaultFocusId·=·this.mDefaultFocusId;
 410 ········final·int·n·=·-1;
 411 ········if·(mDefaultFocusId·!=·n)·{
 412 ············this.mDefaultFocusView·=·CarUiUtils.requireViewByRefId((View)this,·mDefaultFocusId);
 413 ········}
 414 ········final·int·mNudgeShortcutId·=·this.mNudgeShortcutId;
 415 ········if·(mNudgeShortcutId·!=·n)·{
 416 ············this.mNudgeShortcutView·=·CarUiUtils.requireViewByRefId((View)this,·mNudgeShortcutId);
 417 ········}
 418 ····}
 419 ····
 420 ····public·void·onInitializeAccessibilityNodeInfo(final·AccessibilityNodeInfo·accessibilityNodeInfo)·{
 421 ········super.onInitializeAccessibilityNodeInfo(accessibilityNodeInfo);
 422 ········final·Bundle·extras·=·accessibilityNodeInfo.getExtras();
 423 ········extras.putInt("com.android.car.ui.utils.FOCUS_AREA_LEFT_BOUND_OFFSET",·this.mLeftOffset);
 424 ········extras.putInt("com.android.car.ui.utils.FOCUS_AREA_RIGHT_BOUND_OFFSET",·this.mRightOffset);
 425 ········extras.putInt("com.android.car.ui.utils.FOCUS_AREA_TOP_BOUND_OFFSET",·this.mTopOffset);
 426 ········extras.putInt("com.android.car.ui.utils.FOCUS_AREA_BOTTOM_BOUND_OFFSET",·this.mBottomOffset);
 427 ····}
 428 ····
 429 ····protected·void·onLayout(final·boolean·b,·int·mLeftOffset,·final·int·n,·final·int·n2,·final·int·n3)·{
 430 ········super.onLayout(b,·mLeftOffset,·n,·n2,·n3);
 431 ········final·int·layoutDirection·=·this.getLayoutDirection();
 432 ········mLeftOffset·=·1;
 433 ········if·(layoutDirection·!=·mLeftOffset)·{
 434 ············mLeftOffset·=·0;
 435 ········}
 436 ········if·((this.mRtl·?·1·:·0)·!=·mLeftOffset)·{
 437 ············this.mRtl·=·(mLeftOffset·!=·0);
 438 ············final·int·mPaddingLeft·=·this.mPaddingLeft;
 439 ············mLeftOffset·=·this.mPaddingRight;
 440 ············this.mPaddingLeft·=·mLeftOffset;
 441 ············this.mPaddingRight·=·mPaddingLeft;
 442 ············final·int·mLeftOffset2·=·this.mLeftOffset;
 443 ············mLeftOffset·=·this.mRightOffset;
 444 ············this.mLeftOffset·=·mLeftOffset;
 445 ············this.mRightOffset·=·mLeftOffset2;
 446 ········}
 447 ····}
 448 ····
 449 ····public·boolean·performAccessibilityAction(int·focusOnDescendant,·final·Bundle·bundle)·{
 450 ········if·(focusOnDescendant·==·1)·{
 451 ············focusOnDescendant·=·(this.focusOnDescendant()·?·1·:·0);
 452 ············if·(focusOnDescendant·!=·0·&&·this.mPreviousFocusArea·!=·null)·{
 453 ················final·int·nudgeDirection·=·getNudgeDirection(bundle);
 454 ················if·(nudgeDirection·!=·-1)·{
 455 ····················this.saveFocusAreaHistory(nudgeDirection,·this.mPreviousFocusArea,·this,·SystemClock.uptimeMillis());
 456 ················}
 457 ············}
 458 ············return·focusOnDescendant·!=·0;
 459 ········}
 460 ········if·(focusOnDescendant·==·16777216)·{
 461 ············return·this.nudgeToShortcutView(bundle);
 462 ········}
 463 ········if·(focusOnDescendant·!=·33554432)·{
 464 ············return·super.performAccessibilityAction(focusOnDescendant,·bundle);
 465 ········}
 466 ········return·this.nudgeToAnotherFocusArea(bundle);
 467 ····}
 468 ····
 469 ····public·void·setBoundsOffset(final·int·mLeftOffset,·final·int·mTopOffset,·final·int·mRightOffset,·final·int·mBottomOffset)·{
 470 ········this.mLeftOffset·=·mLeftOffset;
 471 ········this.mTopOffset·=·mTopOffset;
 472 ········this.mRightOffset·=·mRightOffset;
 473 ········this.mBottomOffset·=·mBottomOffset;
 474 ····}
 475 ····
71 ····public·void·setHighlightPadding(final·int·mPaddingLeft,·final·int·mPaddingTop,·final·int·mPaddingRight,·final·int·mPaddingBottom)·{476 ····public·void·setHighlightPadding(final·int·mPaddingLeft,·final·int·mPaddingTop,·final·int·mPaddingRight,·final·int·mPaddingBottom)·{
72 ········if·(this.mPaddingLeft·==·mPaddingLeft·&&·this.mPaddingTop·==·mPaddingTop·&&·this.mPaddingRight·==·mPaddingRight·&&·this.mPaddingBottom·==·mPaddingBottom)·{477 ········if·(this.mPaddingLeft·==·mPaddingLeft·&&·this.mPaddingTop·==·mPaddingTop·&&·this.mPaddingRight·==·mPaddingRight·&&·this.mPaddingBottom·==·mPaddingBottom)·{
73 ············return;478 ············return;
74 ········}479 ········}
75 ········this.mPaddingLeft·=·mPaddingLeft;480 ········this.mPaddingLeft·=·mPaddingLeft;
76 ········this.mPaddingTop·=·mPaddingTop;481 ········this.mPaddingTop·=·mPaddingTop;
77 ········this.mPaddingRight·=·mPaddingRight;482 ········this.mPaddingRight·=·mPaddingRight;