diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatBackgroundHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatBackgroundHelperDelegate.java index 34fa00c4ca..232daba13f 100644 --- a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatBackgroundHelperDelegate.java +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatBackgroundHelperDelegate.java @@ -14,7 +14,7 @@ public * * 代理 skin.support.widget.SkinCompatBackgroundHelper 类 */ -class MogoSkinCompatBackgroundHelperDelegate extends MogoSkinCompatHelperDelegate implements IMogoSkinCompatSupportable { +class MogoSkinCompatBackgroundHelperDelegate extends MogoSkinCompatHelperDelegate { private static Method sMethodOnSetBackgroundResource; @@ -24,8 +24,12 @@ class MogoSkinCompatBackgroundHelperDelegate extends MogoSkinCompatHelperDelegat } public MogoSkinCompatBackgroundHelperDelegate( View view ) { - loadClazz(); - initDelegateInstance( view ); + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{View.class}; } public void onSetBackgroundResource( int resId ) { diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatHelperDelegate.java index c03309f84b..1fd5349102 100644 --- a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatHelperDelegate.java +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatHelperDelegate.java @@ -21,6 +21,7 @@ abstract class MogoSkinCompatHelperDelegate implements IMogoSkinCompatSupportabl protected Object mDelegate; protected volatile static Method sMethodApplySkin; protected volatile static Method sMethodLoadFromAttributes; + private static Constructor sConstructor; public MogoSkinCompatHelperDelegate( View view ) { loadClazz(); @@ -41,10 +42,14 @@ abstract class MogoSkinCompatHelperDelegate implements IMogoSkinCompatSupportabl protected void initDelegateInstance( View view ) { try { - if ( mTargetClazz != null ) { - Constructor constructor = mTargetClazz.getConstructor( getConstructParameterClazz() ); - constructor.setAccessible( true ); - mDelegate = constructor.newInstance( view ); + if ( sConstructor == null ) { + if ( mTargetClazz != null ) { + sConstructor = mTargetClazz.getConstructor( getConstructParameterClazz() ); + sConstructor.setAccessible( true ); + } + } + if ( sConstructor != null ) { + mDelegate = sConstructor.newInstance( view ); } } catch ( Exception e ) { e.printStackTrace(); diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatImageHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatImageHelperDelegate.java new file mode 100644 index 0000000000..9eb4a0875e --- /dev/null +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatImageHelperDelegate.java @@ -0,0 +1,53 @@ +package com.mogo.skin.support.helper; + +import android.view.View; +import android.widget.ImageView; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public +/** + * @author congtaowang + * @since 2020/9/3 + * + * 描述 + */ +class MogoSkinCompatImageHelperDelegate extends MogoSkinCompatHelperDelegate { + + private static Method sSetImageResourceMethod; + + public MogoSkinCompatImageHelperDelegate( ImageView view ) { + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{ImageView.class}; + } + + public void setImageResource( int resId ) { + if ( sSetImageResourceMethod == null ) { + try { + sSetImageResourceMethod = mTargetClazz.getDeclaredMethod( "setImageResource", int.class ); + sSetImageResourceMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sSetImageResourceMethod != null ) { + try { + sSetImageResourceMethod.invoke( mDelegate, resId ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + } + + @Override + protected String getDelegateClazzName() { + return "skin.support.widget.SkinCompatImageHelper"; + } +} diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatProgressBarHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatProgressBarHelperDelegate.java new file mode 100644 index 0000000000..49db770732 --- /dev/null +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatProgressBarHelperDelegate.java @@ -0,0 +1,28 @@ +package com.mogo.skin.support.helper; + +import android.view.View; +import android.widget.ProgressBar; + +public +/** + * @author congtaowang + * @since 2020/9/3 + * + * 描述 + */ +class MogoSkinCompatProgressBarHelperDelegate extends MogoSkinCompatHelperDelegate { + + public MogoSkinCompatProgressBarHelperDelegate( ProgressBar view ) { + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{ProgressBar.class}; + } + + @Override + protected String getDelegateClazzName() { + return "skin.support.widget.SkinCompatProgressBarHelper"; + } +} diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatSeekBarHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatSeekBarHelperDelegate.java new file mode 100644 index 0000000000..513d45f847 --- /dev/null +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatSeekBarHelperDelegate.java @@ -0,0 +1,28 @@ +package com.mogo.skin.support.helper; + +import android.view.View; +import android.widget.SeekBar; + +public +/** + * @author congtaowang + * @since 2020/9/3 + * + * 描述 + */ +class MogoSkinCompatSeekBarHelperDelegate extends MogoSkinCompatHelperDelegate { + + public MogoSkinCompatSeekBarHelperDelegate( SeekBar view ) { + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{SeekBar.class}; + } + + @Override + protected String getDelegateClazzName() { + return "skin.support.widget.SkinCompatSeekBarHelper"; + } +} diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperDelegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperDelegate.java new file mode 100644 index 0000000000..064021eabe --- /dev/null +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperDelegate.java @@ -0,0 +1,122 @@ +package com.mogo.skin.support.helper; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.DrawableRes; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public +/** + * @author congtaowang + * @since 2020/9/3 + * + * 描述 + */ +class MogoSkinCompatTextHelperDelegate extends MogoSkinCompatHelperDelegate { + + private static Method sOnSetTextAppearanceMethod; + private static Method sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod; + private static Method sOnSetCompoundDrawablesWithIntrinsicBoundsMethod; + private static Method sGetTextColorResIdMethod; + + public MogoSkinCompatTextHelperDelegate( TextView view ) { + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{TextView.class}; + } + + public void onSetTextAppearance( Context context, int resId ) { + if ( sOnSetTextAppearanceMethod == null ) { + try { + sOnSetTextAppearanceMethod = mTargetClazz.getDeclaredMethod( "onSetTextAppearance", Context.class, int.class ); + sOnSetTextAppearanceMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetTextAppearanceMethod != null ) { + try { + sOnSetTextAppearanceMethod.invoke( mDelegate, context, resId ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + + } + + public void onSetCompoundDrawablesRelativeWithIntrinsicBounds( + @DrawableRes int start, @DrawableRes int top, @DrawableRes int end, @DrawableRes int bottom ) { + if ( sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod == null ) { + try { + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod = mTargetClazz.getDeclaredMethod( "onSetCompoundDrawablesRelativeWithIntrinsicBounds", int.class, int.class, int.class, int.class ); + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod != null ) { + try { + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod.invoke( mDelegate, start, top, end, bottom ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + } + + public void onSetCompoundDrawablesWithIntrinsicBounds( + @DrawableRes int left, @DrawableRes int top, @DrawableRes int right, @DrawableRes int bottom ) { + if ( sOnSetCompoundDrawablesWithIntrinsicBoundsMethod == null ) { + try { + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod = mTargetClazz.getDeclaredMethod( "onSetCompoundDrawablesWithIntrinsicBounds", int.class, int.class, int.class, int.class ); + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetCompoundDrawablesWithIntrinsicBoundsMethod != null ) { + try { + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod.invoke( mDelegate, left, top, right, bottom ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + } + + public int getTextColorResId() { + if ( sGetTextColorResIdMethod == null ) { + try { + sGetTextColorResIdMethod = mTargetClazz.getDeclaredMethod( "getTextColorResId" ); + sGetTextColorResIdMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sGetTextColorResIdMethod != null ) { + try { + Object result = sGetTextColorResIdMethod.invoke( mDelegate ); + return ( ( Integer ) result ).intValue(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + protected String getDelegateClazzName() { + return "skin.support.widget.SkinCompatTextHelper"; + } +} diff --git a/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperV17Delegate.java b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperV17Delegate.java new file mode 100644 index 0000000000..457c8ae2f5 --- /dev/null +++ b/skin/mogo-skin-support/src/main/java/com/mogo/skin/support/helper/MogoSkinCompatTextHelperV17Delegate.java @@ -0,0 +1,126 @@ +package com.mogo.skin.support.helper; + +import android.annotation.TargetApi; +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.RequiresApi; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public +/** + * @author congtaowang + * @since 2020/9/3 + * + * 描述 + */ +@RequiresApi( 17 ) +@TargetApi( 17 ) +class MogoSkinCompatTextHelperV17Delegate extends MogoSkinCompatHelperDelegate { + + private static Method sOnSetTextAppearanceMethod; + private static Method sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod; + private static Method sOnSetCompoundDrawablesWithIntrinsicBoundsMethod; + private static Method sGetTextColorResIdMethod; + + public MogoSkinCompatTextHelperV17Delegate( TextView view ) { + super( view ); + } + + @Override + protected Class< ? extends View >[] getConstructParameterClazz() { + return new Class[]{TextView.class}; + } + + public void onSetTextAppearance( Context context, int resId ) { + if ( sOnSetTextAppearanceMethod == null ) { + try { + sOnSetTextAppearanceMethod = mTargetClazz.getDeclaredMethod( "onSetTextAppearance", Context.class, int.class ); + sOnSetTextAppearanceMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetTextAppearanceMethod != null ) { + try { + sOnSetTextAppearanceMethod.invoke( mDelegate, context, resId ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + + } + + public void onSetCompoundDrawablesRelativeWithIntrinsicBounds( + @DrawableRes int start, @DrawableRes int top, @DrawableRes int end, @DrawableRes int bottom ) { + if ( sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod == null ) { + try { + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod = mTargetClazz.getDeclaredMethod( "onSetCompoundDrawablesRelativeWithIntrinsicBounds", int.class, int.class, int.class, int.class ); + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod != null ) { + try { + sOnSetCompoundDrawablesRelativeWithIntrinsicBoundsMethod.invoke( mDelegate, start, top, end, bottom ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + } + + public void onSetCompoundDrawablesWithIntrinsicBounds( + @DrawableRes int left, @DrawableRes int top, @DrawableRes int right, @DrawableRes int bottom ) { + if ( sOnSetCompoundDrawablesWithIntrinsicBoundsMethod == null ) { + try { + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod = mTargetClazz.getDeclaredMethod( "onSetCompoundDrawablesWithIntrinsicBounds", int.class, int.class, int.class, int.class ); + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sOnSetCompoundDrawablesWithIntrinsicBoundsMethod != null ) { + try { + sOnSetCompoundDrawablesWithIntrinsicBoundsMethod.invoke( mDelegate, left, top, right, bottom ); + } catch ( IllegalAccessException e ) { + e.printStackTrace(); + } catch ( InvocationTargetException e ) { + e.printStackTrace(); + } + } + } + + public int getTextColorResId() { + if ( sGetTextColorResIdMethod == null ) { + try { + sGetTextColorResIdMethod = mTargetClazz.getDeclaredMethod( "getTextColorResId" ); + sGetTextColorResIdMethod.setAccessible( true ); + } catch ( NoSuchMethodException e ) { + e.printStackTrace(); + } + } + if ( sGetTextColorResIdMethod != null ) { + try { + Object result = sGetTextColorResIdMethod.invoke( mDelegate ); + return ( ( Integer ) result ).intValue(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + protected String getDelegateClazzName() { + return "skin.support.widget.SkinCompatTextHelperV17"; + } +} diff --git a/skin/skin-support/src/main/java/skin/support/app/SkinCompatDelegate.java b/skin/skin-support/src/main/java/skin/support/app/SkinCompatDelegate.java index d8c1cd5903..814105646e 100755 --- a/skin/skin-support/src/main/java/skin/support/app/SkinCompatDelegate.java +++ b/skin/skin-support/src/main/java/skin/support/app/SkinCompatDelegate.java @@ -5,6 +5,8 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; +import com.mogo.skin.support.IMogoSkinCompatSupportable; + import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -21,6 +23,7 @@ public class SkinCompatDelegate implements LayoutInflater.Factory2 { private final Context mContext; private SkinCompatViewInflater mSkinCompatViewInflater; private List> mSkinHelpers = new CopyOnWriteArrayList<>(); + private List> mMogoSkinHelpers = new CopyOnWriteArrayList<>(); private SkinCompatDelegate(Context context) { mContext = context; @@ -36,6 +39,9 @@ public class SkinCompatDelegate implements LayoutInflater.Factory2 { if (view instanceof SkinCompatSupportable) { mSkinHelpers.add(new WeakReference<>((SkinCompatSupportable) view)); } + if (view instanceof IMogoSkinCompatSupportable) { + mMogoSkinHelpers.add(new WeakReference<>((IMogoSkinCompatSupportable) view)); + } return view; } @@ -50,6 +56,9 @@ public class SkinCompatDelegate implements LayoutInflater.Factory2 { if (view instanceof SkinCompatSupportable) { mSkinHelpers.add(new WeakReference<>((SkinCompatSupportable) view)); } + if (view instanceof IMogoSkinCompatSupportable) { + mMogoSkinHelpers.add(new WeakReference<>((IMogoSkinCompatSupportable) view)); + } return view; } @@ -82,5 +91,12 @@ public class SkinCompatDelegate implements LayoutInflater.Factory2 { } } } + if (mMogoSkinHelpers != null && !mMogoSkinHelpers.isEmpty()) { + for (WeakReference ref : mMogoSkinHelpers) { + if (ref != null && ref.get() != null) { + ((IMogoSkinCompatSupportable) ref.get()).applySkin(); + } + } + } } }