Merge "Update preload list, clean up drawable theming" into lmp-mr1-dev

This commit is contained in:
Alan Viverette
2014-10-14 22:47:36 +00:00
committed by Android (Google) Code Review
22 changed files with 333 additions and 402 deletions

View File

@@ -17,7 +17,8 @@
android:height="76dp"
android:width="76dp"
android:viewportHeight="48"
android:viewportWidth="48" >
android:viewportWidth="48"
android:tint="?attr/colorControlActivated">
<group
android:name="root"
@@ -27,7 +28,7 @@
android:name="progressBar"
android:fillColor="#00000000"
android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
android:strokeColor="?attr/colorControlActivated"
android:strokeColor="@color/white"
android:strokeLineCap="square"
android:strokeLineJoin="miter"
android:strokeWidth="4"

View File

@@ -17,7 +17,8 @@
android:height="48dp"
android:width="48dp"
android:viewportHeight="48"
android:viewportWidth="48" >
android:viewportWidth="48"
android:tint="?attr/colorControlActivated">
<group
android:name="root"
@@ -27,7 +28,7 @@
android:name="progressBar"
android:fillColor="#00000000"
android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
android:strokeColor="?attr/colorControlActivated"
android:strokeColor="@color/white"
android:strokeLineCap="square"
android:strokeLineJoin="miter"
android:strokeWidth="4"

View File

@@ -17,7 +17,8 @@
android:height="16dp"
android:width="16dp"
android:viewportHeight="48"
android:viewportWidth="48" >
android:viewportWidth="48"
android:tint="?attr/colorControlActivated">
<group
android:name="root"
@@ -27,7 +28,7 @@
android:name="progressBar"
android:fillColor="#00000000"
android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
android:strokeColor="?attr/colorControlActivated"
android:strokeColor="@color/white"
android:strokeLineCap="square"
android:strokeLineJoin="miter"
android:strokeWidth="4"

View File

@@ -298,162 +298,75 @@
<item>@drawable/quickcontact_badge_overlay_pressed_light</item>
<!-- Material assets -->
<item>@drawable/ab_share_pack_mtrl_alpha</item>
<item>@drawable/ab_solid_shadow_mtrl_alpha</item>
<item>@drawable/btn_cab_done_mtrl_alpha</item>
<item>@drawable/btn_check_to_off_mtrl_000</item>
<item>@drawable/btn_check_to_off_mtrl_001</item>
<item>@drawable/btn_check_to_off_mtrl_002</item>
<item>@drawable/btn_check_to_off_mtrl_003</item>
<item>@drawable/btn_check_to_off_mtrl_004</item>
<item>@drawable/btn_check_to_off_mtrl_005</item>
<item>@drawable/btn_check_to_off_mtrl_006</item>
<item>@drawable/btn_check_to_off_mtrl_007</item>
<item>@drawable/btn_check_to_off_mtrl_008</item>
<item>@drawable/btn_check_to_off_mtrl_009</item>
<item>@drawable/btn_check_to_off_mtrl_010</item>
<item>@drawable/btn_check_to_off_mtrl_011</item>
<item>@drawable/btn_check_to_off_mtrl_012</item>
<item>@drawable/btn_check_to_off_mtrl_013</item>
<item>@drawable/btn_check_to_off_mtrl_014</item>
<item>@drawable/btn_check_to_off_mtrl_015</item>
<item>@drawable/btn_check_to_on_mtrl_000</item>
<item>@drawable/btn_check_to_on_mtrl_001</item>
<item>@drawable/btn_check_to_on_mtrl_002</item>
<item>@drawable/btn_check_to_on_mtrl_003</item>
<item>@drawable/btn_check_to_on_mtrl_004</item>
<item>@drawable/btn_check_to_on_mtrl_005</item>
<item>@drawable/btn_check_to_on_mtrl_006</item>
<item>@drawable/btn_check_to_on_mtrl_007</item>
<item>@drawable/btn_check_to_on_mtrl_008</item>
<item>@drawable/btn_check_to_on_mtrl_009</item>
<item>@drawable/btn_check_to_on_mtrl_010</item>
<item>@drawable/btn_check_to_on_mtrl_011</item>
<item>@drawable/btn_check_to_on_mtrl_012</item>
<item>@drawable/btn_check_to_on_mtrl_013</item>
<item>@drawable/btn_check_to_on_mtrl_014</item>
<item>@drawable/btn_check_to_on_mtrl_015</item>
<item>@drawable/btn_radio_to_off_mtrl_000</item>
<item>@drawable/btn_radio_to_off_mtrl_001</item>
<item>@drawable/btn_radio_to_off_mtrl_002</item>
<item>@drawable/btn_radio_to_off_mtrl_003</item>
<item>@drawable/btn_radio_to_off_mtrl_004</item>
<item>@drawable/btn_radio_to_off_mtrl_005</item>
<item>@drawable/btn_radio_to_off_mtrl_006</item>
<item>@drawable/btn_radio_to_off_mtrl_007</item>
<item>@drawable/btn_radio_to_off_mtrl_008</item>
<item>@drawable/btn_radio_to_off_mtrl_009</item>
<item>@drawable/btn_radio_to_off_mtrl_010</item>
<item>@drawable/btn_radio_to_off_mtrl_011</item>
<item>@drawable/btn_radio_to_off_mtrl_012</item>
<item>@drawable/btn_radio_to_off_mtrl_013</item>
<item>@drawable/btn_radio_to_off_mtrl_014</item>
<item>@drawable/btn_radio_to_off_mtrl_015</item>
<item>@drawable/btn_radio_to_on_mtrl_000</item>
<item>@drawable/btn_radio_to_on_mtrl_001</item>
<item>@drawable/btn_radio_to_on_mtrl_002</item>
<item>@drawable/btn_radio_to_on_mtrl_003</item>
<item>@drawable/btn_radio_to_on_mtrl_004</item>
<item>@drawable/btn_radio_to_on_mtrl_005</item>
<item>@drawable/btn_radio_to_on_mtrl_006</item>
<item>@drawable/btn_radio_to_on_mtrl_007</item>
<item>@drawable/btn_radio_to_on_mtrl_008</item>
<item>@drawable/btn_radio_to_on_mtrl_009</item>
<item>@drawable/btn_radio_to_on_mtrl_010</item>
<item>@drawable/btn_radio_to_on_mtrl_011</item>
<item>@drawable/btn_radio_to_on_mtrl_012</item>
<item>@drawable/btn_radio_to_on_mtrl_013</item>
<item>@drawable/btn_radio_to_on_mtrl_014</item>
<item>@drawable/btn_radio_to_on_mtrl_015</item>
<item>@drawable/btn_rating_star_off_mtrl_alpha</item>
<item>@drawable/btn_rating_star_on_mtrl_alpha</item>
<item>@drawable/btn_star_mtrl_alpha</item>
<item>@drawable/btn_switch_to_off_mtrl_00001</item>
<item>@drawable/btn_switch_to_off_mtrl_00002</item>
<item>@drawable/btn_switch_to_off_mtrl_00003</item>
<item>@drawable/btn_switch_to_off_mtrl_00004</item>
<item>@drawable/btn_switch_to_off_mtrl_00005</item>
<item>@drawable/btn_switch_to_off_mtrl_00006</item>
<item>@drawable/btn_switch_to_off_mtrl_00007</item>
<item>@drawable/btn_switch_to_off_mtrl_00008</item>
<item>@drawable/btn_switch_to_off_mtrl_00009</item>
<item>@drawable/btn_switch_to_off_mtrl_00010</item>
<item>@drawable/btn_switch_to_off_mtrl_00011</item>
<item>@drawable/btn_switch_to_off_mtrl_00012</item>
<item>@drawable/btn_switch_to_on_mtrl_00001</item>
<item>@drawable/btn_switch_to_on_mtrl_00002</item>
<item>@drawable/btn_switch_to_on_mtrl_00003</item>
<item>@drawable/btn_switch_to_on_mtrl_00004</item>
<item>@drawable/btn_switch_to_on_mtrl_00005</item>
<item>@drawable/btn_switch_to_on_mtrl_00006</item>
<item>@drawable/btn_switch_to_on_mtrl_00007</item>
<item>@drawable/btn_switch_to_on_mtrl_00008</item>
<item>@drawable/btn_switch_to_on_mtrl_00009</item>
<item>@drawable/btn_switch_to_on_mtrl_00010</item>
<item>@drawable/btn_switch_to_on_mtrl_00011</item>
<item>@drawable/btn_switch_to_on_mtrl_00012</item>
<item>@drawable/btn_toggle_indicator_mtrl_alpha</item>
<item>@drawable/expander_close_mtrl_alpha</item>
<item>@drawable/expander_open_mtrl_alpha</item>
<item>@drawable/fastscroll_thumb_mtrl_alpha</item>
<item>@drawable/fastscroll_track_mtrl_alpha</item>
<item>@drawable/ab_share_pack_material</item>
<item>@drawable/ab_solid_shadow_material</item>
<item>@drawable/activated_background_material</item>
<item>@drawable/btn_borderless_material</item>
<item>@drawable/btn_cab_done_material</item>
<item>@drawable/btn_check_material_anim</item>
<item>@drawable/btn_default_material</item>
<item>@drawable/btn_radio_material_anim</item>
<item>@drawable/btn_star_material</item>
<item>@drawable/btn_toggle_material</item>
<item>@drawable/cab_background_bottom_material</item>
<item>@drawable/cab_background_top_material</item>
<item>@drawable/dialog_background_material</item>
<item>@drawable/dialog_background_shadow_material</item>
<item>@drawable/edit_text_material</item>
<item>@drawable/expander_group_material</item>
<item>@drawable/fastscroll_label_left_material</item>
<item>@drawable/fastscroll_label_right_material</item>
<item>@drawable/fastscroll_thumb_material</item>
<item>@drawable/fastscroll_track_material</item>
<item>@drawable/ic_ab_back_material</item>
<item>@drawable/ic_cab_done_mtrl_alpha</item>
<item>@drawable/ic_clear_mtrl_alpha</item>
<item>@drawable/ic_commit_search_api_mtrl_alpha</item>
<item>@drawable/ic_clear_material</item>
<item>@drawable/ic_commit_search_api_material</item>
<item>@drawable/ic_dialog_alert_material</item>
<item>@drawable/ic_find_next_mtrl_alpha</item>
<item>@drawable/ic_find_previous_mtrl_alpha</item>
<item>@drawable/ic_find_next_material</item>
<item>@drawable/ic_find_previous_material</item>
<item>@drawable/ic_go_search_api_material</item>
<item>@drawable/ic_media_route_disabled_mtrl_alpha</item>
<item>@drawable/ic_media_route_off_mtrl_alpha</item>
<item>@drawable/ic_media_route_on_0_mtrl_alpha</item>
<item>@drawable/ic_media_route_on_1_mtrl_alpha</item>
<item>@drawable/ic_media_route_on_2_mtrl_alpha</item>
<item>@drawable/ic_media_route_on_mtrl_alpha</item>
<item>@drawable/ic_media_route_connecting_material</item>
<item>@drawable/ic_media_route_material</item>
<item>@drawable/ic_menu_copy_material</item>
<item>@drawable/ic_menu_cut_material</item>
<item>@drawable/ic_menu_find_mtrl_alpha</item>
<item>@drawable/ic_menu_find_material</item>
<item>@drawable/ic_menu_moreoverflow_material</item>
<item>@drawable/ic_menu_paste_material</item>
<item>@drawable/ic_menu_search_mtrl_alpha</item>
<item>@drawable/ic_menu_search_material</item>
<item>@drawable/ic_menu_selectall_material</item>
<item>@drawable/ic_menu_share_material</item>
<item>@drawable/ic_search_api_material</item>
<item>@drawable/ic_voice_search_api_material</item>
<item>@drawable/list_divider_mtrl_alpha</item>
<item>@drawable/list_section_divider_mtrl_alpha</item>
<item>@drawable/popup_background_mtrl_mult</item>
<item>@drawable/progress_mtrl_alpha</item>
<item>@drawable/scrollbar_handle_mtrl_alpha</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_000</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_001</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_002</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_003</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_004</item>
<item>@drawable/scrubber_control_from_pressed_mtrl_005</item>
<item>@drawable/scrubber_control_off_pressed_mtrl_alpha</item>
<item>@drawable/scrubber_control_off_mtrl_alpha</item>
<item>@drawable/scrubber_control_on_pressed_mtrl_alpha</item>
<item>@drawable/scrubber_control_on_mtrl_alpha</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_000</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_001</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_002</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_003</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_004</item>
<item>@drawable/scrubber_control_to_pressed_mtrl_005</item>
<item>@drawable/scrubber_primary_mtrl_alpha</item>
<item>@drawable/scrubber_track_mtrl_alpha</item>
<item>@drawable/spinner_mtrl_am_alpha</item>
<item>@drawable/switch_track_mtrl_alpha</item>
<item>@drawable/text_cursor_mtrl_alpha</item>
<item>@drawable/textfield_activated_mtrl_alpha</item>
<item>@drawable/textfield_default_mtrl_alpha</item>
<item>@drawable/textfield_search_activated_mtrl_alpha</item>
<item>@drawable/textfield_search_default_mtrl_alpha</item>
<item>@drawable/text_select_handle_left_mtrl_alpha</item>
<item>@drawable/text_select_handle_middle_mtrl_alpha</item>
<item>@drawable/text_select_handle_right_mtrl_alpha</item>
<item>@drawable/item_background_borderless_material</item>
<item>@drawable/item_background_material</item>
<item>@drawable/list_divider_material</item>
<item>@drawable/list_section_divider_material</item>
<item>@drawable/notification_material_action_background</item>
<item>@drawable/notification_material_media_action_background</item>
<item>@drawable/popup_background_material</item>
<item>@drawable/progress_horizontal_material</item>
<item>@drawable/progress_indeterminate_horizontal_material</item>
<item>@drawable/progress_large_material</item>
<item>@drawable/progress_medium_material</item>
<item>@drawable/progress_small_material</item>
<item>@drawable/ratingbar_full_empty_material</item>
<item>@drawable/ratingbar_full_filled_material</item>
<item>@drawable/ratingbar_full_material</item>
<item>@drawable/scrollbar_handle_material</item>
<item>@drawable/scrubber_control_material_anim</item>
<item>@drawable/scrubber_control_selector_material</item>
<item>@drawable/scrubber_progress_horizontal_material</item>
<item>@drawable/spinner_background_material</item>
<item>@drawable/spinner_textfield_background_material</item>
<item>@drawable/switch_thumb_material_anim</item>
<item>@drawable/switch_track_material</item>
<item>@drawable/tab_indicator_material</item>
<item>@drawable/text_cursor_material</item>
<item>@drawable/textfield_search_material</item>
<item>@drawable/text_select_handle_left_material</item>
<item>@drawable/text_select_handle_middle_material</item>
<item>@drawable/text_select_handle_right_material</item>
<item>@drawable/ic_account_circle</item>
</array>
<!-- Do not translate. These are all of the color state list resources that should be

View File

@@ -313,6 +313,26 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac
}
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);
final AnimatedRotateState state = mState;
if (state == null) {
return;
}
if (state.mDrawable != null) {
state.mDrawable.applyTheme(t);
}
}
@Override
public boolean canApplyTheme() {
final AnimatedRotateState state = mState;
return state != null && state.mDrawable != null && state.mDrawable.canApplyTheme();
}
public void setFramesCount(int framesCount) {
mState.mFramesCount = framesCount;
mIncrement = 360.0f / mState.mFramesCount;

View File

@@ -16,7 +16,6 @@ package android.graphics.drawable;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -137,15 +136,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
private boolean mMutated;
public AnimatedVectorDrawable() {
mAnimatedVectorState = new AnimatedVectorDrawableState(null);
this(null, null);
}
private AnimatedVectorDrawable(AnimatedVectorDrawableState state, Resources res,
Theme theme) {
mAnimatedVectorState = new AnimatedVectorDrawableState(state);
if (theme != null && canApplyTheme()) {
applyTheme(theme);
}
private AnimatedVectorDrawable(AnimatedVectorDrawableState state, Resources res) {
mAnimatedVectorState = new AnimatedVectorDrawableState(state, mCallback, res);
}
@Override
@@ -290,7 +285,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
VectorDrawable vectorDrawable = (VectorDrawable) res.getDrawable(
drawableRes, theme).mutate();
vectorDrawable.setAllowCaching(false);
vectorDrawable.setCallback(mCallback);
pathErrorScale = vectorDrawable.getPixelSize();
if (mAnimatedVectorState.mVectorDrawable != null) {
mAnimatedVectorState.mVectorDrawable.setCallback(null);
}
mAnimatedVectorState.mVectorDrawable = vectorDrawable;
}
a.recycle();
@@ -338,14 +337,22 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
ArrayList<Animator> mAnimators;
ArrayMap<Animator, String> mTargetNameMap;
public AnimatedVectorDrawableState(AnimatedVectorDrawableState copy) {
public AnimatedVectorDrawableState(AnimatedVectorDrawableState copy,
Callback owner, Resources res) {
if (copy != null) {
mChangingConfigurations = copy.mChangingConfigurations;
if (copy.mVectorDrawable != null) {
mVectorDrawable = (VectorDrawable) copy.mVectorDrawable.getConstantState().newDrawable();
mVectorDrawable.mutate();
mVectorDrawable.setAllowCaching(false);
final ConstantState cs = copy.mVectorDrawable.getConstantState();
if (res != null) {
mVectorDrawable = (VectorDrawable) cs.newDrawable(res);
} else {
mVectorDrawable = (VectorDrawable) cs.newDrawable();
}
mVectorDrawable = (VectorDrawable) mVectorDrawable.mutate();
mVectorDrawable.setCallback(owner);
mVectorDrawable.setLayoutDirection(copy.mVectorDrawable.getLayoutDirection());
mVectorDrawable.setBounds(copy.mVectorDrawable.getBounds());
mVectorDrawable.setAllowCaching(false);
}
if (copy.mAnimators != null) {
final int numAnimators = copy.mAnimators.size();
@@ -368,17 +375,12 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
@Override
public Drawable newDrawable() {
return new AnimatedVectorDrawable(this, null, null);
return new AnimatedVectorDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new AnimatedVectorDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new AnimatedVectorDrawable(this, res, theme);
return new AnimatedVectorDrawable(this, res);
}
@Override
@@ -482,4 +484,21 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
}
return true;
}
private final Callback mCallback = new Callback() {
@Override
public void invalidateDrawable(Drawable who) {
invalidateSelf();
}
@Override
public void scheduleDrawable(Drawable who, Runnable what, long when) {
scheduleSelf(what, when);
}
@Override
public void unscheduleDrawable(Drawable who, Runnable what) {
unscheduleSelf(what);
}
};
}

View File

@@ -132,7 +132,7 @@ public class BitmapDrawable extends Drawable {
*/
@Deprecated
public BitmapDrawable(Bitmap bitmap) {
this(new BitmapState(bitmap), null, null);
this(new BitmapState(bitmap), null);
}
/**
@@ -140,7 +140,7 @@ public class BitmapDrawable extends Drawable {
* the display metrics of the resources.
*/
public BitmapDrawable(Resources res, Bitmap bitmap) {
this(new BitmapState(bitmap), res, null);
this(new BitmapState(bitmap), res);
mBitmapState.mTargetDensity = mTargetDensity;
}
@@ -151,7 +151,7 @@ public class BitmapDrawable extends Drawable {
*/
@Deprecated
public BitmapDrawable(String filepath) {
this(new BitmapState(BitmapFactory.decodeFile(filepath)), null, null);
this(new BitmapState(BitmapFactory.decodeFile(filepath)), null);
if (mBitmapState.mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath);
}
@@ -162,7 +162,7 @@ public class BitmapDrawable extends Drawable {
*/
@SuppressWarnings("unused")
public BitmapDrawable(Resources res, String filepath) {
this(new BitmapState(BitmapFactory.decodeFile(filepath)), null, null);
this(new BitmapState(BitmapFactory.decodeFile(filepath)), null);
mBitmapState.mTargetDensity = mTargetDensity;
if (mBitmapState.mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath);
@@ -176,7 +176,7 @@ public class BitmapDrawable extends Drawable {
*/
@Deprecated
public BitmapDrawable(java.io.InputStream is) {
this(new BitmapState(BitmapFactory.decodeStream(is)), null, null);
this(new BitmapState(BitmapFactory.decodeStream(is)), null);
if (mBitmapState.mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is);
}
@@ -187,7 +187,7 @@ public class BitmapDrawable extends Drawable {
*/
@SuppressWarnings("unused")
public BitmapDrawable(Resources res, java.io.InputStream is) {
this(new BitmapState(BitmapFactory.decodeStream(is)), null, null);
this(new BitmapState(BitmapFactory.decodeStream(is)), null);
mBitmapState.mTargetDensity = mTargetDensity;
if (mBitmapState.mBitmap == null) {
android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is);
@@ -919,17 +919,12 @@ public class BitmapDrawable extends Drawable {
@Override
public Drawable newDrawable() {
return new BitmapDrawable(this, null, null);
return new BitmapDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new BitmapDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new BitmapDrawable(this, res, theme);
return new BitmapDrawable(this, res);
}
@Override
@@ -942,16 +937,10 @@ public class BitmapDrawable extends Drawable {
* The one constructor to rule them all. This is called by all public
* constructors to set the state and initialize local properties.
*/
private BitmapDrawable(BitmapState state, Resources res, Theme theme) {
if (theme != null && state.canApplyTheme()) {
// If we need to apply a theme, implicitly mutate.
mBitmapState = new BitmapState(state);
applyTheme(theme);
} else {
mBitmapState = state;
}
private BitmapDrawable(BitmapState state, Resources res) {
mBitmapState = state;
initializeWithState(state, res);
initializeWithState(mBitmapState, res);
}
/**

View File

@@ -114,6 +114,26 @@ public class ClipDrawable extends Drawable implements Drawable.Callback {
dr.setCallback(this);
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);
final ClipState state = mClipState;
if (state == null) {
return;
}
if (state.mDrawable != null) {
state.mDrawable.applyTheme(t);
}
}
@Override
public boolean canApplyTheme() {
final ClipState state = mClipState;
return state != null && state.mDrawable != null && state.mDrawable.canApplyTheme();
}
// overrides from Drawable.Callback
@Override

View File

@@ -299,17 +299,12 @@ public class ColorDrawable extends Drawable {
@Override
public Drawable newDrawable() {
return new ColorDrawable(this, null, null);
return new ColorDrawable(this);
}
@Override
public Drawable newDrawable(Resources res) {
return new ColorDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new ColorDrawable(this, res, theme);
return new ColorDrawable(this);
}
@Override
@@ -318,14 +313,8 @@ public class ColorDrawable extends Drawable {
}
}
private ColorDrawable(ColorState state, Resources res, Theme theme) {
if (theme != null && state.canApplyTheme()) {
mColorState = new ColorState(state);
applyTheme(theme);
} else {
mColorState = state;
}
private ColorDrawable(ColorState state) {
mColorState = state;
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
}
}

View File

@@ -1216,7 +1216,7 @@ public abstract class Drawable {
* implemented for drawables that can have a theme applied.
*/
public Drawable newDrawable(Resources res, Theme theme) {
return newDrawable();
return newDrawable(null);
}
/**

View File

@@ -592,8 +592,6 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
final DrawableContainer mOwner;
final Resources mRes;
Theme mTheme;
SparseArray<ConstantStateFuture> mDrawableFutures;
int mChangingConfigurations;
@@ -801,17 +799,17 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
}
final void applyTheme(Theme theme) {
// No need to call createAllFutures, since future drawables will
// apply the theme when they are prepared.
final int N = mNumChildren;
final Drawable[] drawables = mDrawables;
for (int i = 0; i < N; i++) {
if (drawables[i] != null) {
drawables[i].applyTheme(theme);
if (theme != null) {
createAllFutures();
final int N = mNumChildren;
final Drawable[] drawables = mDrawables;
for (int i = 0; i < N; i++) {
if (drawables[i] != null && drawables[i].canApplyTheme()) {
drawables[i].applyTheme(theme);
}
}
}
mTheme = theme;
}
@Override
@@ -1068,10 +1066,8 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
final Drawable result;
if (state.mRes == null) {
result = mConstantState.newDrawable();
} else if (state.mTheme == null) {
result = mConstantState.newDrawable(state.mRes);
} else {
result = mConstantState.newDrawable(state.mRes, state.mTheme);
result = mConstantState.newDrawable(state.mRes);
}
result.setLayoutDirection(state.mLayoutDirection);
result.setCallback(state.mOwner);

View File

@@ -174,7 +174,7 @@ public class GradientDrawable extends Drawable {
}
public GradientDrawable() {
this(new GradientState(Orientation.TOP_BOTTOM, null), null);
this(new GradientState(Orientation.TOP_BOTTOM, null));
}
/**
@@ -182,7 +182,7 @@ public class GradientDrawable extends Drawable {
* of colors for the gradient.
*/
public GradientDrawable(Orientation orientation, int[] colors) {
this(new GradientState(orientation, colors), null);
this(new GradientState(orientation, colors));
}
@Override
@@ -1022,13 +1022,16 @@ public class GradientDrawable extends Drawable {
super.applyTheme(t);
final GradientState state = mGradientState;
if (state == null || state.mThemeAttrs == null) {
if (state == null) {
return;
}
final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.GradientDrawable);
updateStateFromTypedArray(a);
a.recycle();
if (state.mThemeAttrs != null) {
final TypedArray a = t.resolveAttributes(
state.mThemeAttrs, R.styleable.GradientDrawable);
updateStateFromTypedArray(a);
a.recycle();
}
applyThemeChildElements(t);
@@ -1086,11 +1089,7 @@ public class GradientDrawable extends Drawable {
@Override
public boolean canApplyTheme() {
final GradientState st = mGradientState;
return st != null && (st.mThemeAttrs != null || st.mAttrSize != null
|| st.mAttrGradient != null || st.mAttrSolid != null
|| st.mAttrStroke != null || st.mAttrCorners != null
|| st.mAttrPadding != null);
return super.canApplyTheme() || mGradientState != null && mGradientState.canApplyTheme();
}
private void applyThemeChildElements(Theme t) {
@@ -1627,22 +1626,19 @@ public class GradientDrawable extends Drawable {
@Override
public boolean canApplyTheme() {
return mThemeAttrs != null;
return mThemeAttrs != null || mAttrSize != null || mAttrGradient != null
|| mAttrSolid != null || mAttrStroke != null || mAttrCorners != null
|| mAttrPadding != null;
}
@Override
public Drawable newDrawable() {
return new GradientDrawable(this, null);
return new GradientDrawable(this);
}
@Override
public Drawable newDrawable(Resources res) {
return new GradientDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new GradientDrawable(this, theme);
return new GradientDrawable(this);
}
@Override
@@ -1746,18 +1742,11 @@ public class GradientDrawable extends Drawable {
* The resulting drawable is guaranteed to have a new constant state.
*
* @param state Constant state from which the drawable inherits
* @param theme Theme to apply to the drawable
*/
private GradientDrawable(GradientState state, Theme theme) {
if (theme != null && state.canApplyTheme()) {
// If we need to apply a theme, implicitly mutate.
mGradientState = new GradientState(state);
applyTheme(theme);
} else {
mGradientState = state;
}
private GradientDrawable(GradientState state) {
mGradientState = state;
initializeWithState(state);
initializeWithState(mGradientState);
mGradientIsDirty = true;
mMutated = false;

View File

@@ -170,24 +170,30 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
super.applyTheme(t);
final InsetState state = mInsetState;
if (state == null || state.mThemeAttrs == null) {
if (state == null) {
return;
}
final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.InsetDrawable);
try {
updateStateFromTypedArray(a);
verifyRequiredAttributes(a);
} catch (XmlPullParserException e) {
throw new RuntimeException(e);
} finally {
a.recycle();
if (state.mThemeAttrs != null) {
final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.InsetDrawable);
try {
updateStateFromTypedArray(a);
verifyRequiredAttributes(a);
} catch (XmlPullParserException e) {
throw new RuntimeException(e);
} finally {
a.recycle();
}
}
if (state.mDrawable != null && state.mDrawable.canApplyTheme()) {
state.mDrawable.applyTheme(t);
}
}
@Override
public boolean canApplyTheme() {
return mInsetState != null && mInsetState.mThemeAttrs != null;
return super.canApplyTheme() || mInsetState != null && mInsetState.canApplyTheme();
}
@Override
@@ -438,6 +444,12 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
return mChangingConfigurations;
}
@Override
public boolean canApplyTheme() {
return super.canApplyTheme() || mThemeAttrs != null
|| mDrawable != null && mDrawable.canApplyTheme();
}
boolean canConstantState() {
if (!mCheckedConstantState) {
mCanConstantState = mDrawable.getConstantState() != null;

View File

@@ -100,10 +100,10 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
* @param state The constant drawable state.
*/
LayerDrawable(Drawable[] layers, LayerState state) {
this(state, null, null);
int length = layers.length;
ChildDrawable[] r = new ChildDrawable[length];
this(state, null);
final int length = layers.length;
final ChildDrawable[] r = new ChildDrawable[length];
for (int i = 0; i < length; i++) {
r[i] = new ChildDrawable();
r[i].mDrawable = layers[i];
@@ -117,18 +117,14 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
LayerDrawable() {
this((LayerState) null, null, null);
this((LayerState) null, null);
}
LayerDrawable(LayerState state, Resources res, Theme theme) {
final LayerState as = createConstantState(state, res);
mLayerState = as;
if (as.mNum > 0) {
LayerDrawable(LayerState state, Resources res) {
mLayerState = createConstantState(state, res);
if (mLayerState.mNum > 0) {
ensurePadding();
}
if (theme != null && canApplyTheme()) {
applyTheme(theme);
}
}
LayerState createConstantState(LayerState state, Resources res) {
@@ -256,8 +252,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
a.recycle();
}
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
final ChildDrawable[] array = state.mChildren;
final int N = state.mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable layer = array[i];
if (layer.mThemeAttrs != null) {
@@ -279,25 +275,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
@Override
public boolean canApplyTheme() {
final LayerState state = mLayerState;
if (state == null) {
return false;
}
if (state.mThemeAttrs != null) {
return true;
}
final ChildDrawable[] array = state.mChildren;
final int N = state.mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable layer = array[i];
if (layer.mThemeAttrs != null || layer.mDrawable.canApplyTheme()) {
return true;
}
}
return false;
return super.canApplyTheme() || mLayerState != null && mLayerState.canApplyTheme();
}
/**
@@ -1042,22 +1020,30 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
@Override
public boolean canApplyTheme() {
return mThemeAttrs != null;
if (mThemeAttrs != null) {
return true;
}
final ChildDrawable[] array = mChildren;
final int N = mNum;
for (int i = 0; i < N; i++) {
final ChildDrawable layer = array[i];
if (layer.mThemeAttrs != null || layer.mDrawable.canApplyTheme()) {
return true;
}
}
return false;
}
@Override
public Drawable newDrawable() {
return new LayerDrawable(this, null, null);
return new LayerDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new LayerDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new LayerDrawable(this, res, theme);
return new LayerDrawable(this, res);
}
@Override

View File

@@ -90,7 +90,7 @@ public class NinePatchDrawable extends Drawable {
*/
@Deprecated
public NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String srcName) {
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), null, null);
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), null);
}
/**
@@ -99,7 +99,7 @@ public class NinePatchDrawable extends Drawable {
*/
public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] chunk,
Rect padding, String srcName) {
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), res, null);
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding), res);
mNinePatchState.mTargetDensity = mTargetDensity;
}
@@ -112,7 +112,7 @@ public class NinePatchDrawable extends Drawable {
public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] chunk,
Rect padding, Rect opticalInsets, String srcName) {
this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding, opticalInsets),
res, null);
res);
mNinePatchState.mTargetDensity = mTargetDensity;
}
@@ -123,7 +123,7 @@ public class NinePatchDrawable extends Drawable {
*/
@Deprecated
public NinePatchDrawable(NinePatch patch) {
this(new NinePatchState(patch, new Rect()), null, null);
this(new NinePatchState(patch, new Rect()), null);
}
/**
@@ -131,7 +131,7 @@ public class NinePatchDrawable extends Drawable {
* based on the display metrics of the resources.
*/
public NinePatchDrawable(Resources res, NinePatch patch) {
this(new NinePatchState(patch, new Rect()), res, null);
this(new NinePatchState(patch, new Rect()), res);
mNinePatchState.mTargetDensity = mTargetDensity;
}
@@ -654,17 +654,12 @@ public class NinePatchDrawable extends Drawable {
@Override
public Drawable newDrawable() {
return new NinePatchDrawable(this, null, null);
return new NinePatchDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new NinePatchDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new NinePatchDrawable(this, res, theme);
return new NinePatchDrawable(this, res);
}
@Override
@@ -677,16 +672,10 @@ public class NinePatchDrawable extends Drawable {
* The one constructor to rule them all. This is called by all public
* constructors to set the state and initialize local properties.
*/
private NinePatchDrawable(NinePatchState state, Resources res, Theme theme) {
if (theme != null && state.canApplyTheme()) {
// If we need to apply a theme, implicitly mutate.
mNinePatchState = new NinePatchState(state);
applyTheme(theme);
} else {
mNinePatchState = state;
}
private NinePatchDrawable(NinePatchState state, Resources res) {
mNinePatchState = state;
initializeWithState(state, res);
initializeWithState(mNinePatchState, res);
}
/**

View File

@@ -167,7 +167,7 @@ public class RippleDrawable extends LayerDrawable {
* Constructor used for drawable inflation.
*/
RippleDrawable() {
this(new RippleState(null, null, null), null, null);
this(new RippleState(null, null, null), null);
}
/**
@@ -180,7 +180,7 @@ public class RippleDrawable extends LayerDrawable {
*/
public RippleDrawable(@NonNull ColorStateList color, @Nullable Drawable content,
@Nullable Drawable mask) {
this(new RippleState(null, null, null), null, null);
this(new RippleState(null, null, null), null);
if (color == null) {
throw new IllegalArgumentException("RippleDrawable requires a non-null color");
@@ -473,7 +473,7 @@ public class RippleDrawable extends LayerDrawable {
@Override
public boolean canApplyTheme() {
return super.canApplyTheme() || mState != null && mState.mTouchThemeAttrs != null;
return super.canApplyTheme() || mState != null && mState.canApplyTheme();
}
@Override
@@ -927,17 +927,12 @@ public class RippleDrawable extends LayerDrawable {
@Override
public Drawable newDrawable() {
return new RippleDrawable(this, null, null);
return new RippleDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new RippleDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new RippleDrawable(this, res, theme);
return new RippleDrawable(this, res);
}
}
@@ -971,37 +966,18 @@ public class RippleDrawable extends LayerDrawable {
return mState.mMaxRadius;
}
private RippleDrawable(RippleState state, Resources res, Theme theme) {
boolean needsTheme = false;
private RippleDrawable(RippleState state, Resources res) {
mState = new RippleState(state, this, res);
mLayerState = mState;
final RippleState ns;
if (theme != null && state != null && state.canApplyTheme()) {
ns = new RippleState(state, this, res);
needsTheme = true;
} else if (state == null) {
ns = new RippleState(null, this, res);
} else {
// We always need a new state since child drawables contain local
// state but live within the parent's constant state.
// TODO: Move child drawables into local state.
ns = new RippleState(state, this, res);
if (mState.mNum > 0) {
ensurePadding();
}
if (res != null) {
mDensity = res.getDisplayMetrics().density;
}
mState = ns;
mLayerState = ns;
if (ns.mNum > 0) {
ensurePadding();
}
if (needsTheme) {
applyTheme(theme);
}
initializeFromState();
}

View File

@@ -16,6 +16,8 @@
package android.graphics.drawable;
import com.android.internal.R;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -475,6 +477,26 @@ public class RotateDrawable extends Drawable implements Drawable.Callback {
}
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);
final RotateState state = mState;
if (state == null) {
return;
}
if (state.mDrawable != null) {
state.mDrawable.applyTheme(t);
}
}
@Override
public boolean canApplyTheme() {
final RotateState state = mState;
return state != null && state.mDrawable != null && state.mDrawable.canApplyTheme();
}
@Override
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {

View File

@@ -128,6 +128,26 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback {
}
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);
final ScaleState state = mScaleState;
if (state == null) {
return;
}
if (state.mDrawable != null) {
state.mDrawable.applyTheme(t);
}
}
@Override
public boolean canApplyTheme() {
final ScaleState state = mScaleState;
return state != null && state.mDrawable != null && state.mDrawable.canApplyTheme();
}
// overrides from Drawable.Callback
public void invalidateDrawable(Drawable who) {

View File

@@ -76,7 +76,7 @@ public class ShapeDrawable extends Drawable {
* ShapeDrawable constructor.
*/
public ShapeDrawable() {
this(new ShapeState(null), null, null);
this(new ShapeState(null), null);
}
/**
@@ -85,7 +85,7 @@ public class ShapeDrawable extends Drawable {
* @param s the Shape that this ShapeDrawable should be
*/
public ShapeDrawable(Shape s) {
this(new ShapeState(null), null, null);
this(new ShapeState(null), null);
mShapeState.mShape = s;
}
@@ -555,17 +555,12 @@ public class ShapeDrawable extends Drawable {
@Override
public Drawable newDrawable() {
return new ShapeDrawable(this, null, null);
return new ShapeDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
return new ShapeDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new ShapeDrawable(this, res, theme);
return new ShapeDrawable(this, res);
}
@Override
@@ -578,13 +573,8 @@ public class ShapeDrawable extends Drawable {
* The one constructor to rule them all. This is called by all public
* constructors to set the state and initialize local properties.
*/
private ShapeDrawable(ShapeState state, Resources res, Theme theme) {
if (theme != null && state.canApplyTheme()) {
mShapeState = new ShapeState(state);
applyTheme(theme);
} else {
mShapeState = state;
}
private ShapeDrawable(ShapeState state, Resources res) {
mShapeState = state;
initializeWithState(state, res);
}

View File

@@ -288,7 +288,16 @@ public class StateListDrawable extends DrawableContainer {
super(orig, owner, res);
if (orig != null) {
mStateSets = Arrays.copyOf(orig.mStateSets, orig.mStateSets.length);
// Perform a deep copy.
final int[][] sets = orig.mStateSets;
final int count = sets.length;
mStateSets = new int[count][];
for (int i = 0; i < count; i++) {
final int[] set = sets[i];
if (set != null) {
mStateSets[i] = set.clone();
}
}
} else {
mStateSets = new int[getCapacity()][];
}
@@ -330,6 +339,13 @@ public class StateListDrawable extends DrawableContainer {
}
}
@Override
public void applyTheme(Theme theme) {
super.applyTheme(theme);
onStateChange(getState());
}
void setConstantState(StateListState state) {
super.setConstantState(state);

View File

@@ -17,7 +17,6 @@
package android.graphics.drawable;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.graphics.Canvas;
import android.os.SystemClock;
@@ -86,11 +85,11 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
* @see #TransitionDrawable(Drawable[])
*/
TransitionDrawable() {
this(new TransitionState(null, null, null), null, null);
this(new TransitionState(null, null, null), (Resources) null);
}
private TransitionDrawable(TransitionState state, Resources res, Theme theme) {
super(state, res, theme);
private TransitionDrawable(TransitionState state, Resources res) {
super(state, res);
}
private TransitionDrawable(TransitionState state, Drawable[] layers) {
@@ -245,24 +244,18 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba
}
static class TransitionState extends LayerState {
TransitionState(TransitionState orig, TransitionDrawable owner,
Resources res) {
TransitionState(TransitionState orig, TransitionDrawable owner, Resources res) {
super(orig, owner, res);
}
@Override
public Drawable newDrawable() {
return new TransitionDrawable(this, null, null);
return new TransitionDrawable(this, (Resources) null);
}
@Override
public Drawable newDrawable(Resources res) {
return new TransitionDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new TransitionDrawable(this, res, theme);
return new TransitionDrawable(this, res);
}
@Override

View File

@@ -14,6 +14,7 @@
package android.graphics.drawable;
import android.annotation.NonNull;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
@@ -212,15 +213,8 @@ public class VectorDrawable extends Drawable {
mVectorState = new VectorDrawableState();
}
private VectorDrawable(VectorDrawableState state, Resources res, Theme theme) {
if (theme != null && state.canApplyTheme()) {
// If we need to apply a theme, implicitly mutate.
mVectorState = new VectorDrawableState(state);
applyTheme(theme);
} else {
mVectorState = state;
}
private VectorDrawable(@NonNull VectorDrawableState state) {
mVectorState = state;
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
}
@@ -765,17 +759,12 @@ public class VectorDrawable extends Drawable {
@Override
public Drawable newDrawable() {
return new VectorDrawable(this, null, null);
return new VectorDrawable(this);
}
@Override
public Drawable newDrawable(Resources res) {
return new VectorDrawable(this, res, null);
}
@Override
public Drawable newDrawable(Resources res, Theme theme) {
return new VectorDrawable(this, res, theme);
return new VectorDrawable(this);
}
@Override