diff --git a/AutoViewPager/.gitignore b/AutoViewPager/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3bd8ae1faeeb7a8a26e5f86ae6191facfd82b878
--- /dev/null
+++ b/AutoViewPager/.gitignore
@@ -0,0 +1,16 @@
+*.iml
+.gradle
+.gradle/
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+/.idea
+.idea/
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/AutoViewPager/build.gradle b/AutoViewPager/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d98773d482a1fe880892a1625b8267b8deb35345
--- /dev/null
+++ b/AutoViewPager/build.gradle
@@ -0,0 +1,36 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ namespace 'com.ggz.autoviewpager'
+ compileSdk 31
+
+ defaultConfig {
+ minSdk 24
+ targetSdk 31
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.3.0'
+ implementation 'com.google.android.material:material:1.4.0'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+}
\ No newline at end of file
diff --git a/AutoViewPager/consumer-rules.pro b/AutoViewPager/consumer-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/AutoViewPager/proguard-rules.pro b/AutoViewPager/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..481bb434814107eb79d7a30b676d344b0df2f8ce
--- /dev/null
+++ b/AutoViewPager/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/AutoViewPager/src/androidTest/java/com/ggz/autoviewpager/ExampleInstrumentedTest.java b/AutoViewPager/src/androidTest/java/com/ggz/autoviewpager/ExampleInstrumentedTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..587b3995c6bf335bef3aab551507fd3e350467f4
--- /dev/null
+++ b/AutoViewPager/src/androidTest/java/com/ggz/autoviewpager/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.ggz.autoviewpager;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.ggz.autoviewpager.test", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/AutoViewPager/src/main/AndroidManifest.xml b/AutoViewPager/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a5918e68abcdde7f61ccae4f0ad4885b764573fd
--- /dev/null
+++ b/AutoViewPager/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/AutoViewPager/src/main/java/com/ggz/autoviewpager/AutoViewPager.java b/AutoViewPager/src/main/java/com/ggz/autoviewpager/AutoViewPager.java
new file mode 100644
index 0000000000000000000000000000000000000000..31093bf3643e2ca4f257854d30a40a8f3c14d43e
--- /dev/null
+++ b/AutoViewPager/src/main/java/com/ggz/autoviewpager/AutoViewPager.java
@@ -0,0 +1,469 @@
+package com.ggz.autoviewpager;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.Scroller;
+
+import androidx.viewpager.widget.ViewPager;
+
+import java.lang.reflect.Field;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/*******************************************************************************
+ * FileName: AutoViewPager
+ *
+ * Description: 可自动播放的ViewPager
+ *
+ * Author: juhg
+ *
+ * Version: v1.0
+ *
+ * Date: 16/8/1
+ *
+ * Copyright: all rights reserved by Freeman.
+ *******************************************************************************/
+public class AutoViewPager extends RelativeLayout implements MyViewPager.OnPageChangeListener, Runnable {
+
+ private int mDefaultPager;
+ private int mItemCount;
+ private int mIndicatorSize;
+ private int mIndicatorLayoutMargin;
+ private int mIndicatorGap;
+ private int mAutoSwitchTime;
+ private int mIndicatorGravity;
+ private int mIndicatorNormalIcon;
+ private int mIndicatorSelectedIcon;
+ private int mPagerMargin;
+ private int mPagerWidth;
+ private int mPagerPaddingLeft;
+ private int mPagerPaddingRight;
+ private int mTransformer;
+ private float mDefaultAlpha;
+ private float mDefaultScale;
+ private boolean mIsAutoPlay;
+ private boolean mLoopPlay;
+ private boolean mShowIndicator;
+
+ private LinearLayout indicatorLayout;
+ private MyViewPager viewPager;
+ private Context context;
+ private ImageView[] indicatorIcons;
+ private OnItemView itemView;
+ private Handler handler = new Handler();
+
+ public final static int INDICATOR_GRAVITY_TOP = 1;
+ public final static int INDICATOR_GRAVITY_BOTTOM = 2;
+
+ public final static int TRANSFORM_TYPE_NONE = 0;
+ public final static int TRANSFORM_TYPE_FADE = 1;
+ public final static int TRANSFORM_TYPE_SCALE = 2;
+ public final static int TRANSFORM_TYPE_ROTATE = 3;
+ public final static int TRANSFORM_TYPE_FLIP = 4;
+ public final static int TRANSFORM_TYPE_SQUARE = 5;
+ public final static int TRANSFORM_TYPE_TURNTABLE = 6;
+ public final static int TRANSFORM_TYPE_CASCADING = 7;
+
+ public AutoViewPager(Context context) {
+ this(context, null);
+ }
+
+ public AutoViewPager(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public AutoViewPager(Context context, AttributeSet attrs, int style) {
+ super(context, attrs, style);
+ this.context = context;
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AutoViewPager);
+ mIndicatorSize = (int)array.getDimension(R.styleable.AutoViewPager_indicatorIconSize, 0);
+ mIndicatorLayoutMargin = (int) array.getDimension(R.styleable.AutoViewPager_indicatorLayoutMargin, 10);
+ mIndicatorGap = (int) array.getDimension(R.styleable.AutoViewPager_indicatorGap, 10);
+ mIndicatorNormalIcon = array.getResourceId(R.styleable.AutoViewPager_indicatorNormalIcon, 0);
+ mIndicatorSelectedIcon = array.getResourceId(R.styleable.AutoViewPager_indicatorSelectedIcon, 0);
+ mAutoSwitchTime = array.getInteger(R.styleable.AutoViewPager_autoSwitchTime, 4000);
+ mIsAutoPlay = array.getBoolean(R.styleable.AutoViewPager_isAutoPlay, false);
+ mLoopPlay = array.getBoolean(R.styleable.AutoViewPager_loopPlay, false);
+ mShowIndicator = array.getBoolean(R.styleable.AutoViewPager_showIndicator, false);
+ mIndicatorGravity = array.getInt(R.styleable.AutoViewPager_indicatorGravity, INDICATOR_GRAVITY_BOTTOM);
+ mPagerMargin = array.getDimensionPixelOffset(R.styleable.AutoViewPager_pagerMargin, 0);
+ mPagerPaddingLeft = array.getDimensionPixelOffset(R.styleable.AutoViewPager_pagerPaddingLeft, 0);
+ mPagerPaddingRight = array.getDimensionPixelOffset(R.styleable.AutoViewPager_pagerPaddingRight, 0);
+ mPagerWidth = array.getDimensionPixelOffset(R.styleable.AutoViewPager_pagerWidth, 0);
+ mTransformer = array.getInt(R.styleable.AutoViewPager_transformer, TRANSFORM_TYPE_NONE);
+ array.recycle();
+ init();
+ }
+
+ private void init() {
+ viewPager = new MyViewPager(context);
+ viewPager.setId(generateId());
+ viewPager.setClipToPadding(false);
+ viewPager.setPageMargin(mPagerMargin);
+ viewPager.setPadding(mPagerPaddingLeft, 0, mPagerPaddingRight, 0);
+ viewPager.addOnPageChangeListener(this);
+ setPagerTransformer();
+ addView(viewPager);
+ }
+
+ private void setPagerTransformer() {
+ MyViewPager.PageTransformer pageTransformer = null;
+ switch (mTransformer) {
+ case TRANSFORM_TYPE_FADE:
+ pageTransformer = PageTransformerFactory.fadeTransformer;
+ break;
+ case TRANSFORM_TYPE_SCALE:
+ pageTransformer = PageTransformerFactory.getScaleTransformer(viewPager, mPagerPaddingLeft, mDefaultScale, mDefaultAlpha);
+ break;
+ case TRANSFORM_TYPE_ROTATE:
+ pageTransformer = PageTransformerFactory.rotateTransformer;
+ break;
+ case TRANSFORM_TYPE_FLIP:
+ pageTransformer = PageTransformerFactory.flipTransformer;
+ break;
+ case TRANSFORM_TYPE_SQUARE:
+ pageTransformer = PageTransformerFactory.squareTransformer;
+ break;
+ case TRANSFORM_TYPE_TURNTABLE:
+ pageTransformer = PageTransformerFactory.turntableTransformer;
+ break;
+ case TRANSFORM_TYPE_CASCADING:
+ pageTransformer = PageTransformerFactory.cascadingTransformer;
+ break;
+ default:
+ break;
+ }
+
+ if (pageTransformer != null) {
+ viewPager.setPageTransformer(true, pageTransformer);
+ }
+ }
+
+ public int getCurrentItem() {
+ return viewPager.getCurrentItem() % mItemCount;
+ }
+
+ public void setCurrentItem(int index) {
+ mDefaultPager = index;
+ }
+
+ public void setIndicatorIconSize(int size) {
+ this.mIndicatorSize = size;
+ }
+
+ public void setIndicatorLayoutMargin(int margin) {
+ this.mIndicatorLayoutMargin = margin;
+ }
+
+ public void setIndicatorGap(int gap) {
+ this.mIndicatorGap = gap;
+ }
+
+ public void setmIndicatorNormalIcon(int resId) {
+ mIndicatorNormalIcon = resId;
+ }
+
+ public void setmIndicatorSelectedIcon(int resId) {
+ mIndicatorNormalIcon = resId;
+ }
+
+ public void setSwitchTime(int switchTime) {
+ this.mAutoSwitchTime = switchTime;
+ }
+
+ public void setAutoPlay(boolean isAutoPlay) {
+ this.mIsAutoPlay = isAutoPlay;
+ }
+
+ public void setLoopPlay(boolean isLoopPlay) {
+ this.mLoopPlay = isLoopPlay;
+ }
+
+ public void setShowIndicator(boolean showIndicator) {
+ this.mShowIndicator = showIndicator;
+ }
+
+ public void setPagerTransformer(MyViewPager.PageTransformer transformer) {
+ viewPager.setPageTransformer(true, transformer);
+ }
+
+ public void setPagerTransformer(int transformer) {
+ this.mTransformer = transformer;
+ setPagerTransformer();
+ }
+
+ public void setDefaultScale(float defaultScale) {
+ mDefaultScale = defaultScale;
+ setPagerTransformer();
+ }
+
+ public void setDefaultAlpha(float defaultAlpha) {
+ mDefaultAlpha = defaultAlpha;
+ setPagerTransformer();
+ }
+
+ public void setVelocityLimit(int velocityLimit) {
+ viewPager.setVelocityLimit(velocityLimit);
+ }
+
+ public void setPagerPaddingLeft(int pagerPaddingLeft) {
+ this.mPagerPaddingLeft = pagerPaddingLeft;
+ viewPager.setPadding(mPagerPaddingLeft, 0, mPagerPaddingRight, 0);
+ }
+
+ public void setmPagerPaddingRight(int pagerPaddingRight) {
+ this.mPagerPaddingRight = pagerPaddingRight;
+ viewPager.setPadding(mPagerPaddingLeft, 0, mPagerPaddingRight, 0);
+ }
+
+ public void setPagerPadding(int pagerPadding) {
+ this.mPagerPaddingLeft = pagerPadding;
+ this.mPagerPaddingRight = pagerPadding;
+ viewPager.setPadding(mPagerPaddingLeft, 0, mPagerPaddingRight, 0);
+ }
+
+ public int getPagerPaddingLeft() {
+ return mPagerPaddingLeft;
+ }
+
+ public int getPagerPaddingRight() {
+ return mPagerPaddingRight;
+ }
+
+
+ public void setPagerMargin(int margin) {
+ viewPager.setPageMargin(margin);
+ }
+
+ public int getPagerMargin() {
+ return viewPager.getPageMargin();
+ }
+
+ public void setPagerWidth(int pagerWidth) {
+ mPagerWidth = pagerWidth;
+ }
+
+ public int getPagerWidth() {
+ return mPagerWidth;
+ }
+
+
+ @Override
+ public void run() {
+ if (mIsAutoPlay) {
+ int index = viewPager.getCurrentItem();
+ index++;
+ viewPager.setCurrentItem(index);
+ }
+ }
+
+ private void addIndicatorLayout() {
+ indicatorLayout = new LinearLayout(context);
+ indicatorLayout.setGravity(Gravity.CENTER_HORIZONTAL);
+ indicatorLayout.setOrientation(LinearLayout.HORIZONTAL);
+ indicatorIcons = new ImageView[mItemCount];
+ int gap = mIndicatorGap / 2;
+ for (int i = 0; i < mItemCount; i++) {
+ indicatorIcons[i] = new ImageView(context);
+ LinearLayout.LayoutParams params;
+ if (mIndicatorSize > 0) {
+ params = new LinearLayout.LayoutParams(mIndicatorSize, mIndicatorSize);
+ } else {
+ params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ }
+ params.leftMargin = params.rightMargin = gap;
+ if (mDefaultPager == i) {
+ indicatorIcons[i].setImageResource(mIndicatorSelectedIcon);
+ } else {
+ indicatorIcons[i].setImageResource(mIndicatorNormalIcon);
+ }
+ indicatorLayout.addView(indicatorIcons[i], params);
+ }
+
+ LayoutParams params = new LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ if (mIndicatorGravity == INDICATOR_GRAVITY_TOP) {
+ params.topMargin = mIndicatorLayoutMargin;
+ params.addRule(ALIGN_TOP, viewPager.getId());
+ } else {
+ params.bottomMargin = mIndicatorLayoutMargin;
+ params.addRule(ALIGN_BOTTOM, viewPager.getId());
+ }
+ addView(indicatorLayout, params);
+ }
+
+ public void setAdapter(int count) {
+ if (count <= 0) {
+ return;
+ }
+
+ this.mItemCount = count;
+ viewPager.setAdapter(new MyPagerAdapter());
+ viewPager.setOffscreenPageLimit(mItemCount);
+ viewPager.setCurrentItem(mDefaultPager);
+ if (mShowIndicator) {
+ addIndicatorLayout();
+ }
+
+ if (mIsAutoPlay) {
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ int index = viewPager.getCurrentItem();
+ index++;
+ viewPager.setCurrentItem(index);
+ }
+ }, mAutoSwitchTime);
+ }
+ }
+
+ public void setAdapter(int count, int limit) {
+ setAdapter(count);
+ viewPager.setOffscreenPageLimit(limit);
+ }
+
+ /**
+ * 为View生成唯一的Id
+ * @return
+ */
+ private int generateId() {
+ for (;;) {
+ AtomicInteger sNextGeneratedId = new AtomicInteger(1);
+ final int result = sNextGeneratedId.get();
+ // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
+ int newValue = result + 1;
+ if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
+ if (sNextGeneratedId.compareAndSet(result, newValue)) {
+ return result;
+ }
+ }
+ }
+
+ private void resetIndicatorIcon(int position) {
+ for (int i = 0; i < mItemCount; i++) {
+ if (position == i) {
+ indicatorIcons[i].setImageResource(mIndicatorSelectedIcon);
+ } else {
+ indicatorIcons[i].setImageResource(mIndicatorNormalIcon);
+ }
+ }
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+ }
+
+ @Override
+ public void onPageSelected(final int position) {
+ if (mShowIndicator) {
+ resetIndicatorIcon(position % mItemCount);
+ }
+ if (mIsAutoPlay || mLoopPlay) {
+ handler.removeCallbacks(this);
+ handler.postDelayed(this, mAutoSwitchTime);
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ }
+
+ /**
+ * 设置切换过程的时间
+ * @param duration
+ */
+ public void setDuration(int duration) {
+ try {
+ Field field = ViewPager.class.getDeclaredField("mScroller");
+ field.setAccessible(true);
+ MyScroller scroller = new MyScroller(viewPager.getContext(), new LinearInterpolator());
+ field.set(viewPager, scroller);
+ scroller.setDuration(duration);
+ } catch (Exception e) {
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public void setItemView(OnItemView itemView) {
+ this.itemView = itemView;
+ }
+
+ public interface OnItemView {
+ View getView(ViewGroup container, int position);
+ }
+
+ public class MyPagerAdapter extends CustomPagerAdapter {
+
+ @Override
+ public float getPageWidth(int position) {
+ if (mPagerWidth != 0) {
+ return mPagerWidth * 1.0f / Resources.getSystem().getDisplayMetrics().widthPixels;
+ }
+
+ return super.getPageWidth(position);
+ }
+
+ @Override
+ public int getCount() {
+ if (mIsAutoPlay || mLoopPlay) {
+ return Integer.MAX_VALUE;
+ } else {
+ return mItemCount;
+ }
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return view.equals(object);
+ }
+
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ return itemView.getView(container, position % mItemCount);
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ container.removeView((View) object);
+ }
+ }
+
+ public static class MyScroller extends Scroller {
+
+ private int mDuration;
+
+ public MyScroller(Context context) {
+ super(context);
+ }
+
+ public MyScroller(Context context, Interpolator interpolator) {
+ super(context, interpolator);
+ }
+
+ @Override
+ public void startScroll(int startX, int startY, int dx, int dy) {
+ this.startScroll(startX, startY, dx, dy, mDuration);
+ }
+
+ @Override
+ public void startScroll(int startX, int startY, int dx, int dy, int duration) {
+ super.startScroll(startX, startY, dx, dy, mDuration);
+ }
+
+ public void setDuration(int duration) {
+ this.mDuration = duration;
+ }
+ }
+}
diff --git a/AutoViewPager/src/main/java/com/ggz/autoviewpager/CustomPagerAdapter.java b/AutoViewPager/src/main/java/com/ggz/autoviewpager/CustomPagerAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5c8a9532382dfbe31df029b52364e668517452b
--- /dev/null
+++ b/AutoViewPager/src/main/java/com/ggz/autoviewpager/CustomPagerAdapter.java
@@ -0,0 +1,278 @@
+package com.ggz.autoviewpager;
+
+import android.database.DataSetObservable;
+import android.database.DataSetObserver;
+import android.os.Parcelable;
+import android.view.View;
+import android.view.ViewGroup;
+
+/*******************************************************************************
+ * Description:
+ *
+ * Author: Freeman
+ *
+ * Date: 2018/5/18
+ *
+ * Copyright: all rights reserved by Freeman.
+ *******************************************************************************/
+
+public abstract class CustomPagerAdapter {
+ private final DataSetObservable mObservable = new DataSetObservable();
+ private DataSetObserver mViewPagerObserver;
+
+ public static final int POSITION_UNCHANGED = -1;
+ public static final int POSITION_NONE = -2;
+
+ /**
+ * Return the number of views available.
+ */
+ public abstract int getCount();
+
+ /**
+ * Called when a change in the shown pages is going to start being made.
+ * @param container The containing View which is displaying this adapter's
+ * page views.
+ */
+ public void startUpdate(ViewGroup container) {
+ startUpdate((View) container);
+ }
+
+ /**
+ * Create the page for the given position. The adapter is responsible
+ * for adding the view to the container given here, although it only
+ * must ensure this is done by the time it returns from
+ * {@link #finishUpdate(ViewGroup)}.
+ *
+ * @param container The containing View in which the page will be shown.
+ * @param position The page position to be instantiated.
+ * @return Returns an Object representing the new page. This does not
+ * need to be a View, but can be some other container of the page.
+ */
+ public Object instantiateItem(ViewGroup container, int position) {
+ return instantiateItem((View) container, position);
+ }
+
+ /**
+ * Remove a page for the given position. The adapter is responsible
+ * for removing the view from its container, although it only must ensure
+ * this is done by the time it returns from {@link #finishUpdate(ViewGroup)}.
+ *
+ * @param container The containing View from which the page will be removed.
+ * @param position The page position to be removed.
+ * @param object The same object that was returned by
+ * {@link #instantiateItem(View, int)}.
+ */
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ destroyItem((View) container, position, object);
+ }
+
+ /**
+ * Called to inform the adapter of which item is currently considered to
+ * be the "primary", that is the one show to the user as the current page.
+ *
+ * @param container The containing View from which the page will be removed.
+ * @param position The page position that is now the primary.
+ * @param object The same object that was returned by
+ * {@link #instantiateItem(View, int)}.
+ */
+ public void setPrimaryItem(ViewGroup container, int position, Object object) {
+ setPrimaryItem((View) container, position, object);
+ }
+
+ /**
+ * Called when the a change in the shown pages has been completed. At this
+ * point you must ensure that all of the pages have actually been added or
+ * removed from the container as appropriate.
+ * @param container The containing View which is displaying this adapter's
+ * page views.
+ */
+ public void finishUpdate(ViewGroup container) {
+ finishUpdate((View) container);
+ }
+
+ /**
+ * Called when a change in the shown pages is going to start being made.
+ * @param container The containing View which is displaying this adapter's
+ * page views.
+ *
+ * @deprecated Use {@link #startUpdate(ViewGroup)}
+ */
+ @Deprecated
+ public void startUpdate(View container) {
+ }
+
+ /**
+ * Create the page for the given position. The adapter is responsible
+ * for adding the view to the container given here, although it only
+ * must ensure this is done by the time it returns from
+ * {@link #finishUpdate(ViewGroup)}.
+ *
+ * @param container The containing View in which the page will be shown.
+ * @param position The page position to be instantiated.
+ * @return Returns an Object representing the new page. This does not
+ * need to be a View, but can be some other container of the page.
+ *
+ * @deprecated Use {@link #instantiateItem(ViewGroup, int)}
+ */
+ @Deprecated
+ public Object instantiateItem(View container, int position) {
+ throw new UnsupportedOperationException(
+ "Required method instantiateItem was not overridden");
+ }
+
+ /**
+ * Remove a page for the given position. The adapter is responsible
+ * for removing the view from its container, although it only must ensure
+ * this is done by the time it returns from {@link #finishUpdate(View)}.
+ *
+ * @param container The containing View from which the page will be removed.
+ * @param position The page position to be removed.
+ * @param object The same object that was returned by
+ * {@link #instantiateItem(View, int)}.
+ *
+ * @deprecated Use {@link #destroyItem(ViewGroup, int, Object)}
+ */
+ @Deprecated
+ public void destroyItem(View container, int position, Object object) {
+ throw new UnsupportedOperationException("Required method destroyItem was not overridden");
+ }
+
+ /**
+ * Called to inform the adapter of which item is currently considered to
+ * be the "primary", that is the one show to the user as the current page.
+ *
+ * @param container The containing View from which the page will be removed.
+ * @param position The page position that is now the primary.
+ * @param object The same object that was returned by
+ * {@link #instantiateItem(View, int)}.
+ *
+ * @deprecated Use {@link #setPrimaryItem(ViewGroup, int, Object)}
+ */
+ @Deprecated
+ public void setPrimaryItem(View container, int position, Object object) {
+ }
+
+ /**
+ * Called when the a change in the shown pages has been completed. At this
+ * point you must ensure that all of the pages have actually been added or
+ * removed from the container as appropriate.
+ * @param container The containing View which is displaying this adapter's
+ * page views.
+ *
+ * @deprecated Use {@link #finishUpdate(ViewGroup)}
+ */
+ @Deprecated
+ public void finishUpdate(View container) {
+ }
+
+ /**
+ * Determines whether a page View is associated with a specific key object
+ * as returned by {@link #instantiateItem(ViewGroup, int)}. This method is
+ * required for a PagerAdapter to function properly.
+ *
+ * @param view Page View to check for association with object
+ * @param object Object to check for association with view
+ * @return true if view
is associated with the key object object
+ */
+ public abstract boolean isViewFromObject(View view, Object object);
+
+ /**
+ * Save any instance state associated with this adapter and its pages that should be
+ * restored if the current UI state needs to be reconstructed.
+ *
+ * @return Saved state for this adapter
+ */
+ public Parcelable saveState() {
+ return null;
+ }
+
+ /**
+ * Restore any instance state associated with this adapter and its pages
+ * that was previously saved by {@link #saveState()}.
+ *
+ * @param state State previously saved by a call to {@link #saveState()}
+ * @param loader A ClassLoader that should be used to instantiate any restored objects
+ */
+ public void restoreState(Parcelable state, ClassLoader loader) {
+ }
+
+ /**
+ * Called when the host view is attempting to determine if an item's position
+ * has changed. Returns {@link #POSITION_UNCHANGED} if the position of the given
+ * item has not changed or {@link #POSITION_NONE} if the item is no longer present
+ * in the adapter.
+ *
+ * The default implementation assumes that items will never
+ * change position and always returns {@link #POSITION_UNCHANGED}.
+ *
+ * @param object Object representing an item, previously returned by a call to
+ * {@link #instantiateItem(View, int)}.
+ * @return object's new position index from [0, {@link #getCount()}),
+ * {@link #POSITION_UNCHANGED} if the object's position has not changed,
+ * or {@link #POSITION_NONE} if the item is no longer present.
+ */
+ public int getItemPosition(Object object) {
+ return POSITION_UNCHANGED;
+ }
+
+ /**
+ * This method should be called by the application if the data backing this adapter has changed
+ * and associated views should update.
+ */
+ public void notifyDataSetChanged() {
+ synchronized (this) {
+ if (mViewPagerObserver != null) {
+ mViewPagerObserver.onChanged();
+ }
+ }
+ mObservable.notifyChanged();
+ }
+
+ /**
+ * Register an observer to receive callbacks related to the adapter's data changing.
+ *
+ * @param observer The {@link DataSetObserver} which will receive callbacks.
+ */
+ public void registerDataSetObserver(DataSetObserver observer) {
+ mObservable.registerObserver(observer);
+ }
+
+ /**
+ * Unregister an observer from callbacks related to the adapter's data changing.
+ *
+ * @param observer The {@link DataSetObserver} which will be unregistered.
+ */
+ public void unregisterDataSetObserver(DataSetObserver observer) {
+ mObservable.unregisterObserver(observer);
+ }
+
+ void setViewPagerObserver(DataSetObserver observer) {
+ synchronized (this) {
+ mViewPagerObserver = observer;
+ }
+ }
+
+ /**
+ * This method may be called by the ViewPager to obtain a title string
+ * to describe the specified page. This method may return null
+ * indicating no title for this page. The default implementation returns
+ * null.
+ *
+ * @param position The position of the title requested
+ * @return A title for the requested page
+ */
+ public CharSequence getPageTitle(int position) {
+ return null;
+ }
+
+ /**
+ * Returns the proportional width of a given page as a percentage of the
+ * ViewPager's measured width from (0.f-1.f]
+ *
+ * @param position The position of the page requested
+ * @return Proportional width for the given page position
+ */
+ public float getPageWidth(int position) {
+ return 1.f;
+ }
+}
\ No newline at end of file
diff --git a/AutoViewPager/src/main/java/com/ggz/autoviewpager/LoadMoreViewPager.java b/AutoViewPager/src/main/java/com/ggz/autoviewpager/LoadMoreViewPager.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a7e77725d1c9ea0da9b85152958add0f5ab74ef
--- /dev/null
+++ b/AutoViewPager/src/main/java/com/ggz/autoviewpager/LoadMoreViewPager.java
@@ -0,0 +1,105 @@
+package com.ggz.autoviewpager;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.VelocityTracker;
+import android.view.ViewConfiguration;
+import android.widget.Scroller;
+
+import androidx.viewpager.widget.ViewPager;
+
+/*******************************************************************************
+ * Description: 实现ViewPager左拉加载更多的功能
+ *
+ * Author: Freeman
+ *
+ * Date: 2018/5/3
+ *
+ * Copyright: all rights reserved by Freeman.
+ *******************************************************************************/
+
+public class LoadMoreViewPager extends ViewPager {
+
+ private int miniVelocity;
+ private int itemWidth;
+ private int scrollRange;
+ private VelocityTracker velocityTracker;
+ private Scroller scroller;
+
+ public LoadMoreViewPager(Context context) {
+ this(context, null);
+ }
+
+ public LoadMoreViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ scroller = new Scroller(context);
+ velocityTracker = VelocityTracker.obtain();
+ ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
+ miniVelocity = viewConfiguration.getScaledMinimumFlingVelocity();
+ }
+
+ @Override
+ protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
+ super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
+ }
+
+ @Override
+ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
+ Log.i("out", "deltax==" + deltaX + " scrollX=" + scrollX + " scrollRangeX=" + scrollRangeX + " maxOverScrollX=" + maxOverScrollX);
+ return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, 300, scrollRangeY, 300, maxOverScrollY, true);
+ }
+
+// @Override
+// public void computeScroll() {
+// super.computeScroll();
+// if (!scroller.isFinished() && scroller.computeScrollOffset()) {
+// Log.i("out", "currentX==" + scroller.getCurrY());
+// scrollTo(-scroller.getCurrX(), 0);
+//
+// invalidate();
+// } else {
+// if (itemWidth != 0) {
+// int index = Math.round(scroller.getCurrX() / itemWidth);
+// scrollTo(index * itemWidth, 0);
+// }
+// }
+// }
+
+ private int getMaxX() {
+ if (scrollRange == 0) {
+ int count;
+ if (getAdapter() != null && (count = getAdapter().getCount()) > 0) {
+ Log.i("out", "pageWidth=" + getAdapter().getPageWidth(0) * getMeasuredWidth() + " pageMargin=" + getPageMargin());
+ itemWidth = (int) (getAdapter().getPageWidth(0) + getPageMargin());
+ scrollRange = (int) (count * getAdapter().getPageWidth(0) * getMeasuredWidth()
+ + (count - 1) * getPageMargin());
+ }
+ }
+
+ return scrollRange;
+ }
+
+// @Override
+// public boolean onTouchEvent(MotionEvent ev) {
+// velocityTracker.addMovement(ev);
+// if (ev.getActionMasked() == MotionEvent.ACTION_UP) {
+// velocityTracker.computeCurrentVelocity(1000);
+// int velocityX = (int) velocityTracker.getXVelocity();
+// Log.i("out", "velocityX=" + velocityX + " miniVelocity=" + miniVelocity + " maxX=" + getMaxX());
+// if (velocityX > miniVelocity) {
+// scroller.fling(getScrollX(), getScrollY(), velocityX, 0, 0, getMaxX(), 0, 0);
+// }
+// return false;
+// }
+//
+// return super.onTouchEvent(ev);
+// }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ velocityTracker.recycle();
+ velocityTracker = null;
+ }
+}
diff --git a/AutoViewPager/src/main/java/com/ggz/autoviewpager/MyViewPager.java b/AutoViewPager/src/main/java/com/ggz/autoviewpager/MyViewPager.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5c304652cd1edfc7ee981cb60e4aa6212b9aed5
--- /dev/null
+++ b/AutoViewPager/src/main/java/com/ggz/autoviewpager/MyViewPager.java
@@ -0,0 +1,3139 @@
+package com.ggz.autoviewpager;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.AbsSavedState;
+import android.view.FocusFinder;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.WindowInsets;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Interpolator;
+import android.widget.EdgeEffect;
+import android.widget.Scroller;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.AccessibilityDelegateCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.viewpager.widget.PagerAdapter;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/*******************************************************************************
+ * Description:
+ *
+ * Author: Freeman
+ *
+ * Date: 2018/5/18
+ *
+ * Copyright: all rights reserved by Freeman.
+ *******************************************************************************/
+
+public class MyViewPager extends ViewGroup {
+ private static final String TAG = "ViewPager";
+ private static final boolean DEBUG = false;
+
+ private static final boolean USE_CACHE = false;
+
+ private static final int DEFAULT_OFFSCREEN_PAGES = 1;
+ private static final int MAX_SETTLE_DURATION = 600; // ms
+ private static final int MIN_DISTANCE_FOR_FLING = 25; // dips
+
+ private static final int DEFAULT_GUTTER_SIZE = 16; // dips
+
+ private static final int MIN_FLING_VELOCITY = 400; // dips
+
+ static final int[] LAYOUT_ATTRS = new int[] {
+ android.R.attr.layout_gravity
+ };
+
+ /**
+ * Used to track what the expected number of items in the adapter should be.
+ * If the app changes this when we don't expect it, we'll throw a big obnoxious exception.
+ */
+ private int mExpectedAdapterCount;
+
+ static class ItemInfo {
+ Object object;
+ int position;
+ boolean scrolling;
+ float widthFactor;
+ float offset;
+ }
+
+ private static final Comparator COMPARATOR = new Comparator(){
+ @Override
+ public int compare(ItemInfo lhs, ItemInfo rhs) {
+ return lhs.position - rhs.position;
+ }
+ };
+
+ private static final Interpolator sInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float t) {
+ t -= 1.0f;
+ return t * t * t * t * t + 1.0f;
+ }
+ };
+
+ private final ArrayList mItems = new ArrayList();
+ private final ItemInfo mTempItem = new ItemInfo();
+
+ private final Rect mTempRect = new Rect();
+
+ CustomPagerAdapter mAdapter;
+ int mCurItem; // Index of currently displayed page.
+ private int mRestoredCurItem = -1;
+ private Parcelable mRestoredAdapterState = null;
+ private ClassLoader mRestoredClassLoader = null;
+
+ private Scroller mScroller;
+ private boolean mIsScrollStarted;
+ private int mVelocityLimit;
+ private PagerObserver mObserver;
+
+ private int mPageMargin;
+ private Drawable mMarginDrawable;
+ private int mTopPageBounds;
+ private int mBottomPageBounds;
+
+ // Offsets of the first and last items, if known.
+ // Set during population, used to determine if we are at the beginning
+ // or end of the pager data set during touch scrolling.
+ private float mFirstOffset = -Float.MAX_VALUE;
+ private float mLastOffset = Float.MAX_VALUE;
+
+ private int mChildWidthMeasureSpec;
+ private int mChildHeightMeasureSpec;
+ private boolean mInLayout;
+
+ private boolean mScrollingCacheEnabled;
+
+ private boolean mPopulatePending;
+ private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
+
+ private boolean mIsBeingDragged;
+ private boolean mIsUnableToDrag;
+ private int mDefaultGutterSize;
+ private int mGutterSize;
+ private int mTouchSlop;
+ /**
+ * Position of the last motion event.
+ */
+ private float mLastMotionX;
+ private float mLastMotionY;
+ private float mInitialMotionX;
+ private float mInitialMotionY;
+ /**
+ * ID of the active pointer. This is used to retain consistency during
+ * drags/flings if multiple pointers are used.
+ */
+ private int mActivePointerId = INVALID_POINTER;
+ /**
+ * Sentinel value for no current active pointer.
+ * Used by {@link #mActivePointerId}.
+ */
+ private static final int INVALID_POINTER = -1;
+
+ /**
+ * Determines speed during touch scrolling
+ */
+ private VelocityTracker mVelocityTracker;
+ private int mMinimumVelocity;
+ private int mMaximumVelocity;
+ private int mFlingDistance;
+ private int mCloseEnough;
+
+ // If the pager is at least this close to its final position, complete the scroll
+ // on touch down and let the user interact with the content inside instead of
+ // "catching" the flinging pager.
+ private static final int CLOSE_ENOUGH = 2; // dp
+
+ private boolean mFakeDragging;
+ private long mFakeDragBeginTime;
+
+ private EdgeEffect mLeftEdge;
+ private EdgeEffect mRightEdge;
+
+ private boolean mFirstLayout = true;
+ private boolean mNeedCalculatePageOffsets = false;
+ private boolean mCalledSuper;
+ private int mDecorChildCount;
+
+ private List mOnPageChangeListeners;
+ private OnPageChangeListener mOnPageChangeListener;
+ private OnPageChangeListener mInternalPageChangeListener;
+ private List mAdapterChangeListeners;
+ private PageTransformer mPageTransformer;
+ private int mPageTransformerLayerType;
+
+ private static final int DRAW_ORDER_DEFAULT = 0;
+ private static final int DRAW_ORDER_FORWARD = 1;
+ private static final int DRAW_ORDER_REVERSE = 2;
+ private int mDrawingOrder;
+ private ArrayList mDrawingOrderedChildren;
+ private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator();
+
+ /**
+ * Indicates that the pager is in an idle, settled state. The current page
+ * is fully in view and no animation is in progress.
+ */
+ public static final int SCROLL_STATE_IDLE = 0;
+
+ /**
+ * Indicates that the pager is currently being dragged by the user.
+ */
+ public static final int SCROLL_STATE_DRAGGING = 1;
+
+ /**
+ * Indicates that the pager is in the process of settling to a final position.
+ */
+ public static final int SCROLL_STATE_SETTLING = 2;
+
+ private final Runnable mEndScrollRunnable = new Runnable() {
+ @Override
+ public void run() {
+ setScrollState(SCROLL_STATE_IDLE);
+ populate();
+ }
+ };
+
+ private int mScrollState = SCROLL_STATE_IDLE;
+
+ /**
+ * Callback interface for responding to changing state of the selected page.
+ */
+ public interface OnPageChangeListener {
+
+ /**
+ * This method will be invoked when the current page is scrolled, either as part
+ * of a programmatically initiated smooth scroll or a user initiated touch scroll.
+ *
+ * @param position Position index of the first page currently being displayed.
+ * Page position+1 will be visible if positionOffset is nonzero.
+ * @param positionOffset Value from [0, 1) indicating the offset from the page at position.
+ * @param positionOffsetPixels Value in pixels indicating the offset from position.
+ */
+ void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
+
+ /**
+ * This method will be invoked when a new page becomes selected. Animation is not
+ * necessarily complete.
+ *
+ * @param position Position index of the new selected page.
+ */
+ void onPageSelected(int position);
+
+ /**
+ * Called when the scroll state changes. Useful for discovering when the user
+ * begins dragging, when the pager is automatically settling to the current page,
+ * or when it is fully stopped/idle.
+ *
+ * @param state The new scroll state.
+ * @see MyViewPager#SCROLL_STATE_IDLE
+ * @see MyViewPager#SCROLL_STATE_DRAGGING
+ * @see MyViewPager#SCROLL_STATE_SETTLING
+ */
+ void onPageScrollStateChanged(int state);
+ }
+
+ /**
+ * Simple implementation of the {@link OnPageChangeListener} interface with stub
+ * implementations of each method. Extend this if you do not intend to override
+ * every method of {@link OnPageChangeListener}.
+ */
+ public static class SimpleOnPageChangeListener implements OnPageChangeListener {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ // This space for rent
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ // This space for rent
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ // This space for rent
+ }
+ }
+
+ /**
+ * A PageTransformer is invoked whenever a visible/attached page is scrolled.
+ * This offers an opportunity for the application to apply a custom transformation
+ * to the page views using animation properties.
+ *
+ * As property animation is only supported as of Android 3.0 and forward,
+ * setting a PageTransformer on a ViewPager on earlier platform versions will
+ * be ignored.
+ */
+ public interface PageTransformer {
+ /**
+ * Apply a property transformation to the given page.
+ *
+ * @param page Apply the transformation to this page
+ * @param position Position of page relative to the current front-and-center
+ * position of the pager. 0 is front and center. 1 is one full
+ * page position to the right, and -1 is one page position to the left.
+ */
+ void transformPage(View page, float position);
+ }
+
+ /**
+ * Callback interface for responding to adapter changes.
+ */
+ public interface OnAdapterChangeListener {
+ /**
+ * Called when the adapter for the given view pager has changed.
+ *
+ * @param viewPager ViewPager where the adapter change has happened
+ * @param oldAdapter the previously set adapter
+ * @param newAdapter the newly set adapter
+ */
+ void onAdapterChanged(@NonNull MyViewPager viewPager,
+ @Nullable CustomPagerAdapter oldAdapter, @Nullable CustomPagerAdapter newAdapter);
+ }
+
+ /**
+ * Annotation which allows marking of views to be decoration views when added to a view
+ * pager.
+ *
+ * Views marked with this annotation can be added to the view pager with a layout resource.
+ * An example being {@link}.
+ *
+ * You can also control whether a view is a decor view but setting
+ * {@link LayoutParams#isDecor} on the child's layout params.
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ @Inherited
+ public @interface DecorView {
+ }
+
+ public MyViewPager(Context context) {
+ super(context);
+ initViewPager();
+ }
+
+ public MyViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initViewPager();
+ }
+
+ void initViewPager() {
+ setWillNotDraw(false);
+ setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
+ setFocusable(true);
+ final Context context = getContext();
+ mScroller = new Scroller(context, sInterpolator);
+ final ViewConfiguration configuration = ViewConfiguration.get(context);
+ final float density = context.getResources().getDisplayMetrics().density;
+
+ mTouchSlop = configuration.getScaledPagingTouchSlop();
+ mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density);
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+ mLeftEdge = new EdgeEffect(context);
+ mRightEdge = new EdgeEffect(context);
+
+ mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);
+ mCloseEnough = (int) (CLOSE_ENOUGH * density);
+ mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density);
+
+ ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate());
+
+ if (ViewCompat.getImportantForAccessibility(this)
+ == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ ViewCompat.setImportantForAccessibility(this,
+ ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+
+ ViewCompat.setOnApplyWindowInsetsListener(this,
+ new androidx.core.view.OnApplyWindowInsetsListener() {
+ /*@Override
+ public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
+ return null;
+ }*/
+
+ private final Rect mTempRect = new Rect();
+
+ @Override
+ public WindowInsetsCompat onApplyWindowInsets(final View v,
+ final WindowInsetsCompat originalInsets) {
+ // First let the ViewPager itself try and consume them...
+ final WindowInsetsCompat applied =
+ ViewCompat.onApplyWindowInsets(v, originalInsets);
+ if (applied.isConsumed()) {
+ // If the ViewPager consumed all insets, return now
+ return applied;
+ }
+
+ // Now we'll manually dispatch the insets to our children. Since ViewPager
+ // children are always full-height, we do not want to use the standard
+ // ViewGroup dispatchApplyWindowInsets since if child 0 consumes them,
+ // the rest of the children will not receive any insets. To workaround this
+ // we manually dispatch the applied insets, not allowing children to
+ // consume them from each other. We do however keep track of any insets
+ // which are consumed, returning the union of our children's consumption
+ final Rect res = mTempRect;
+ res.left = applied.getSystemWindowInsetLeft();
+ res.top = applied.getSystemWindowInsetTop();
+ res.right = applied.getSystemWindowInsetRight();
+ res.bottom = applied.getSystemWindowInsetBottom();
+
+ for (int i = 0, count = getChildCount(); i < count; i++) {
+ final WindowInsetsCompat childInsets = ViewCompat
+ .dispatchApplyWindowInsets(getChildAt(i), applied);
+ // Now keep track of any consumed by tracking each dimension's min
+ // value
+ res.left = Math.min(childInsets.getSystemWindowInsetLeft(),
+ res.left);
+ res.top = Math.min(childInsets.getSystemWindowInsetTop(),
+ res.top);
+ res.right = Math.min(childInsets.getSystemWindowInsetRight(),
+ res.right);
+ res.bottom = Math.min(childInsets.getSystemWindowInsetBottom(),
+ res.bottom);
+ }
+
+ // Now return a new WindowInsets, using the consumed window insets
+ return applied.replaceSystemWindowInsets(
+ res.left, res.top, res.right, res.bottom);
+ }
+ });
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ removeCallbacks(mEndScrollRunnable);
+ // To be on the safe side, abort the scroller
+ if ((mScroller != null) && !mScroller.isFinished()) {
+ mScroller.abortAnimation();
+ }
+ super.onDetachedFromWindow();
+ }
+
+ void setScrollState(int newState) {
+ if (mScrollState == newState) {
+ return;
+ }
+
+ mScrollState = newState;
+ if (mPageTransformer != null) {
+ // PageTransformers can do complex things that benefit from hardware layers.
+ enableLayers(newState != SCROLL_STATE_IDLE);
+ }
+ dispatchOnScrollStateChanged(newState);
+ }
+
+ /**
+ * Set a PagerAdapter that will supply views for this pager as needed.
+ *
+ * @param adapter Adapter to use
+ */
+ public void setAdapter(CustomPagerAdapter adapter) {
+ if (mAdapter != null) {
+ mAdapter.setViewPagerObserver(null);
+ mAdapter.startUpdate(this);
+ for (int i = 0; i < mItems.size(); i++) {
+ final ItemInfo ii = mItems.get(i);
+ mAdapter.destroyItem(this, ii.position, ii.object);
+ }
+ mAdapter.finishUpdate(this);
+ mItems.clear();
+ removeNonDecorViews();
+ mCurItem = 0;
+ scrollTo(0, 0);
+ }
+
+ final CustomPagerAdapter oldAdapter = mAdapter;
+ mAdapter = adapter;
+ mExpectedAdapterCount = 0;
+
+ if (mAdapter != null) {
+ if (mObserver == null) {
+ mObserver = new PagerObserver();
+ }
+ mAdapter.setViewPagerObserver(mObserver);
+ mPopulatePending = false;
+ final boolean wasFirstLayout = mFirstLayout;
+ mFirstLayout = true;
+ mExpectedAdapterCount = mAdapter.getCount();
+ if (mRestoredCurItem >= 0) {
+ mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
+ setCurrentItemInternal(mRestoredCurItem, false, true);
+ mRestoredCurItem = -1;
+ mRestoredAdapterState = null;
+ mRestoredClassLoader = null;
+ } else if (!wasFirstLayout) {
+ populate();
+ } else {
+ requestLayout();
+ }
+ }
+
+ // Dispatch the change to any listeners
+ if (mAdapterChangeListeners != null && !mAdapterChangeListeners.isEmpty()) {
+ for (int i = 0, count = mAdapterChangeListeners.size(); i < count; i++) {
+ mAdapterChangeListeners.get(i).onAdapterChanged(this, oldAdapter, adapter);
+ }
+ }
+ }
+
+ private void removeNonDecorViews() {
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) {
+ removeViewAt(i);
+ i--;
+ }
+ }
+ }
+
+ /**
+ * Retrieve the current adapter supplying pages.
+ *
+ * @return The currently registered PagerAdapter
+ */
+ public CustomPagerAdapter getAdapter() {
+ return mAdapter;
+ }
+
+ /**
+ * Add a listener that will be invoked whenever the adapter for this ViewPager changes.
+ *
+ * @param listener listener to add
+ */
+ public void addOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
+ if (mAdapterChangeListeners == null) {
+ mAdapterChangeListeners = new ArrayList<>();
+ }
+ mAdapterChangeListeners.add(listener);
+ }
+
+ /**
+ * Remove a listener that was previously added via
+ * {@link #addOnAdapterChangeListener(OnAdapterChangeListener)}.
+ *
+ * @param listener listener to remove
+ */
+ public void removeOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
+ if (mAdapterChangeListeners != null) {
+ mAdapterChangeListeners.remove(listener);
+ }
+ }
+
+ private int getClientWidth() {
+ return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
+ }
+
+ /**
+ * Set the currently selected page. If the ViewPager has already been through its first
+ * layout with its current adapter there will be a smooth animated transition between
+ * the current item and the specified item.
+ *
+ * @param item Item index to select
+ */
+ public void setCurrentItem(int item) {
+ mPopulatePending = false;
+ setCurrentItemInternal(item, !mFirstLayout, false);
+ }
+
+ /**
+ * Set the currently selected page.
+ *
+ * @param item Item index to select
+ * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
+ */
+ public void setCurrentItem(int item, boolean smoothScroll) {
+ mPopulatePending = false;
+ setCurrentItemInternal(item, smoothScroll, false);
+ }
+
+ public int getCurrentItem() {
+ return mCurItem;
+ }
+
+ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) {
+ setCurrentItemInternal(item, smoothScroll, always, 0);
+ }
+
+ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
+ if (mAdapter == null || mAdapter.getCount() <= 0) {
+ setScrollingCacheEnabled(false);
+ return;
+ }
+ if (!always && mCurItem == item && mItems.size() != 0) {
+ setScrollingCacheEnabled(false);
+ return;
+ }
+
+ if (item < 0) {
+ item = 0;
+ } else if (item >= mAdapter.getCount()) {
+ item = mAdapter.getCount() - 1;
+ }
+ final int pageLimit = mOffscreenPageLimit;
+ if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
+ // We are doing a jump by more than one page. To avoid
+ // glitches, we want to keep all current pages in the view
+ // until the scroll ends.
+ for (int i = 0; i < mItems.size(); i++) {
+ mItems.get(i).scrolling = true;
+ }
+ }
+ final boolean dispatchSelected = mCurItem != item;
+
+ if (mFirstLayout) {
+ // We don't have any idea how big we are yet and shouldn't have any pages either.
+ // Just set things up and let the pending layout handle things.
+ mCurItem = item;
+ if (dispatchSelected) {
+ dispatchOnPageSelected(item);
+ }
+ requestLayout();
+ } else {
+ populate(item);
+ scrollToItem(item, smoothScroll, velocity, dispatchSelected);
+ }
+ }
+
+ private void scrollToItem(int item, boolean smoothScroll, int velocity,
+ boolean dispatchSelected) {
+ final ItemInfo curInfo = infoForPosition(item);
+ int destX = 0;
+ if (curInfo != null) {
+ final int width = getClientWidth();
+ destX = (int) (width * Math.max(mFirstOffset,
+ Math.min(curInfo.offset, mLastOffset)));
+ }
+ if (smoothScroll) {
+ smoothScrollTo(destX, 0, velocity);
+ if (dispatchSelected) {
+ dispatchOnPageSelected(item);
+ }
+ } else {
+ if (dispatchSelected) {
+ dispatchOnPageSelected(item);
+ }
+ completeScroll(false);
+ scrollTo(destX, 0);
+ pageScrolled(destX);
+ }
+ }
+
+ /**
+ * Set a listener that will be invoked whenever the page changes or is incrementally
+ * scrolled. See {@link OnPageChangeListener}.
+ *
+ * @param listener Listener to set
+ *
+ * @deprecated Use {@link #addOnPageChangeListener(OnPageChangeListener)}
+ * and {@link #removeOnPageChangeListener(OnPageChangeListener)} instead.
+ */
+ @Deprecated
+ public void setOnPageChangeListener(OnPageChangeListener listener) {
+ mOnPageChangeListener = listener;
+ }
+
+ /**
+ * Add a listener that will be invoked whenever the page changes or is incrementally
+ * scrolled. See {@link OnPageChangeListener}.
+ *
+ * Components that add a listener should take care to remove it when finished.
+ * Other components that take ownership of a view may call {@link #clearOnPageChangeListeners()}
+ * to remove all attached listeners.
+ *
+ * @param listener listener to add
+ */
+ public void addOnPageChangeListener(OnPageChangeListener listener) {
+ if (mOnPageChangeListeners == null) {
+ mOnPageChangeListeners = new ArrayList<>();
+ }
+ mOnPageChangeListeners.add(listener);
+ }
+
+ /**
+ * Remove a listener that was previously added via
+ * {@link #addOnPageChangeListener(OnPageChangeListener)}.
+ *
+ * @param listener listener to remove
+ */
+ public void removeOnPageChangeListener(OnPageChangeListener listener) {
+ if (mOnPageChangeListeners != null) {
+ mOnPageChangeListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Remove all listeners that are notified of any changes in scroll state or position.
+ */
+ public void clearOnPageChangeListeners() {
+ if (mOnPageChangeListeners != null) {
+ mOnPageChangeListeners.clear();
+ }
+ }
+
+ /**
+ * Sets a {@link PageTransformer} that will be called for each attached page whenever
+ * the scroll position is changed. This allows the application to apply custom property
+ * transformations to each page, overriding the default sliding behavior.
+ *
+ * Note: By default, calling this method will cause contained pages to use
+ * {@link View#LAYER_TYPE_HARDWARE}. This layer type allows custom alpha transformations,
+ * but it will cause issues if any of your pages contain a {@link android.view.SurfaceView}
+ * and you have not called {@link android.view.SurfaceView#setZOrderOnTop(boolean)} to put that
+ * {@link android.view.SurfaceView} above your app content. To disable this behavior, call
+ * {@link #setPageTransformer(boolean, PageTransformer,int)} and pass
+ * {@link View#LAYER_TYPE_NONE} for {@code pageLayerType}.
+ *
+ * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
+ * to be drawn from last to first instead of first to last.
+ * @param transformer PageTransformer that will modify each page's animation properties
+ */
+ public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
+ setPageTransformer(reverseDrawingOrder, transformer, View.LAYER_TYPE_HARDWARE);
+ }
+
+ /**
+ * Sets a {@link PageTransformer} that will be called for each attached page whenever
+ * the scroll position is changed. This allows the application to apply custom property
+ * transformations to each page, overriding the default sliding behavior.
+ *
+ * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
+ * to be drawn from last to first instead of first to last.
+ * @param transformer PageTransformer that will modify each page's animation properties
+ * @param pageLayerType View layer type that should be used for ViewPager pages. It should be
+ * either {@link View#LAYER_TYPE_HARDWARE},
+ * {@link View#LAYER_TYPE_SOFTWARE}, or
+ * {@link View#LAYER_TYPE_NONE}.
+ */
+ public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer,
+ int pageLayerType) {
+ final boolean hasTransformer = transformer != null;
+ final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
+ mPageTransformer = transformer;
+ setChildrenDrawingOrderEnabled(hasTransformer);
+ if (hasTransformer) {
+ mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
+ mPageTransformerLayerType = pageLayerType;
+ } else {
+ mDrawingOrder = DRAW_ORDER_DEFAULT;
+ }
+ if (needsPopulate) populate();
+ }
+
+ @Override
+ protected int getChildDrawingOrder(int childCount, int i) {
+ final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
+ final int result =
+ ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
+ return result;
+ }
+
+ /**
+ * Set a separate OnPageChangeListener for internal use by the support library.
+ *
+ * @param listener Listener to set
+ * @return The old listener that was set, if any.
+ */
+ OnPageChangeListener setInternalPageChangeListener(OnPageChangeListener listener) {
+ OnPageChangeListener oldListener = mInternalPageChangeListener;
+ mInternalPageChangeListener = listener;
+ return oldListener;
+ }
+
+ /**
+ * Returns the number of pages that will be retained to either side of the
+ * current page in the view hierarchy in an idle state. Defaults to 1.
+ *
+ * @return How many pages will be kept offscreen on either side
+ * @see #setOffscreenPageLimit(int)
+ */
+ public int getOffscreenPageLimit() {
+ return mOffscreenPageLimit;
+ }
+
+ /**
+ * Set the number of pages that should be retained to either side of the
+ * current page in the view hierarchy in an idle state. Pages beyond this
+ * limit will be recreated from the adapter when needed.
+ *
+ * This is offered as an optimization. If you know in advance the number
+ * of pages you will need to support or have lazy-loading mechanisms in place
+ * on your pages, tweaking this setting can have benefits in perceived smoothness
+ * of paging animations and interaction. If you have a small number of pages (3-4)
+ * that you can keep active all at once, less time will be spent in layout for
+ * newly created view subtrees as the user pages back and forth.
+ *
+ * You should keep this limit low, especially if your pages have complex layouts.
+ * This setting defaults to 1.
+ *
+ * @param limit How many pages will be kept offscreen in an idle state.
+ */
+ public void setOffscreenPageLimit(int limit) {
+ if (limit < DEFAULT_OFFSCREEN_PAGES) {
+ Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "
+ + DEFAULT_OFFSCREEN_PAGES);
+ limit = DEFAULT_OFFSCREEN_PAGES;
+ }
+ if (limit != mOffscreenPageLimit) {
+ mOffscreenPageLimit = limit;
+ populate();
+ }
+ }
+
+ /**
+ * Set the margin between pages.
+ *
+ * @param marginPixels Distance between adjacent pages in pixels
+ * @see #getPageMargin()
+ * @see #setPageMarginDrawable(Drawable)
+ * @see #setPageMarginDrawable(int)
+ */
+ public void setPageMargin(int marginPixels) {
+ final int oldMargin = mPageMargin;
+ mPageMargin = marginPixels;
+
+ final int width = getWidth();
+ recomputeScrollPosition(width, width, marginPixels, oldMargin);
+
+ requestLayout();
+ }
+
+ /**
+ * Return the margin between pages.
+ *
+ * @return The size of the margin in pixels
+ */
+ public int getPageMargin() {
+ return mPageMargin;
+ }
+
+ /**
+ * Set a drawable that will be used to fill the margin between pages.
+ *
+ * @param d Drawable to display between pages
+ */
+ public void setPageMarginDrawable(Drawable d) {
+ mMarginDrawable = d;
+ if (d != null) refreshDrawableState();
+ setWillNotDraw(d == null);
+ invalidate();
+ }
+
+ /**
+ * Set a drawable that will be used to fill the margin between pages.
+ *
+ * @param resId Resource ID of a drawable to display between pages
+ */
+ public void setPageMarginDrawable(@DrawableRes int resId) {
+ setPageMarginDrawable(ContextCompat.getDrawable(getContext(), resId));
+ }
+
+ @Override
+ protected boolean verifyDrawable(Drawable who) {
+ return super.verifyDrawable(who) || who == mMarginDrawable;
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ final Drawable d = mMarginDrawable;
+ if (d != null && d.isStateful()) {
+ d.setState(getDrawableState());
+ }
+ }
+
+ // We want the duration of the page snap animation to be influenced by the distance that
+ // the screen has to travel, however, we don't want this duration to be effected in a
+ // purely linear fashion. Instead, we use this method to moderate the effect that the distance
+ // of travel has on the overall snap duration.
+ float distanceInfluenceForSnapDuration(float f) {
+ f -= 0.5f; // center the values about 0.
+ f *= 0.3f * (float) Math.PI / 2.0f;
+ return (float) Math.sin(f);
+ }
+
+ /**
+ * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+ *
+ * @param x the number of pixels to scroll by on the X axis
+ * @param y the number of pixels to scroll by on the Y axis
+ */
+ void smoothScrollTo(int x, int y) {
+ smoothScrollTo(x, y, 0);
+ }
+
+ /**
+ * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+ *
+ * @param x the number of pixels to scroll by on the X axis
+ * @param y the number of pixels to scroll by on the Y axis
+ * @param velocity the velocity associated with a fling, if applicable. (0 otherwise)
+ */
+ void smoothScrollTo(int x, int y, int velocity) {
+ if (getChildCount() == 0) {
+ // Nothing to do.
+ setScrollingCacheEnabled(false);
+ return;
+ }
+
+ int sx;
+ boolean wasScrolling = (mScroller != null) && !mScroller.isFinished();
+ if (wasScrolling) {
+ // We're in the middle of a previously initiated scrolling. Check to see
+ // whether that scrolling has actually started (if we always call getStartX
+ // we can get a stale value from the scroller if it hadn't yet had its first
+ // computeScrollOffset call) to decide what is the current scrolling position.
+ sx = mIsScrollStarted ? mScroller.getCurrX() : mScroller.getStartX();
+ // And abort the current scrolling.
+ mScroller.abortAnimation();
+ setScrollingCacheEnabled(false);
+ } else {
+ sx = getScrollX();
+ }
+ int sy = getScrollY();
+ int dx = x - sx;
+ int dy = y - sy;
+ if (dx == 0 && dy == 0) {
+ completeScroll(false);
+ populate();
+ setScrollState(SCROLL_STATE_IDLE);
+ return;
+ }
+
+ setScrollingCacheEnabled(true);
+ setScrollState(SCROLL_STATE_SETTLING);
+
+ final int width = getClientWidth();
+ final int halfWidth = width / 2;
+ final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / width);
+ final float distance = halfWidth + halfWidth
+ * distanceInfluenceForSnapDuration(distanceRatio);
+
+ int duration;
+ velocity = Math.abs(velocity);
+ if (velocity > 0) {
+ duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
+ } else {
+ final float pageWidth = width * mAdapter.getPageWidth(mCurItem);
+ final float pageDelta = (float) Math.abs(dx) / (pageWidth + mPageMargin);
+ duration = (int) ((pageDelta + 1) * 100);
+ }
+ duration = Math.min(duration, MAX_SETTLE_DURATION);
+
+ // Reset the "scroll started" flag. It will be flipped to true in all places
+ // where we call computeScrollOffset().
+ mIsScrollStarted = false;
+ mScroller.startScroll(sx, sy, dx, dy, duration);
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+
+ ItemInfo addNewItem(int position, int index) {
+ ItemInfo ii = new ItemInfo();
+ ii.position = position;
+ ii.object = mAdapter.instantiateItem(this, position);
+ ii.widthFactor = mAdapter.getPageWidth(position);
+ if (index < 0 || index >= mItems.size()) {
+ mItems.add(ii);
+ } else {
+ mItems.add(index, ii);
+ }
+ return ii;
+ }
+
+ void dataSetChanged() {
+ // This method only gets called if our observer is attached, so mAdapter is non-null.
+
+ final int adapterCount = mAdapter.getCount();
+ mExpectedAdapterCount = adapterCount;
+ boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1
+ && mItems.size() < adapterCount;
+ int newCurrItem = mCurItem;
+
+ boolean isUpdating = false;
+ for (int i = 0; i < mItems.size(); i++) {
+ final ItemInfo ii = mItems.get(i);
+ final int newPos = mAdapter.getItemPosition(ii.object);
+
+ if (newPos == PagerAdapter.POSITION_UNCHANGED) {
+ continue;
+ }
+
+ if (newPos == PagerAdapter.POSITION_NONE) {
+ mItems.remove(i);
+ i--;
+
+ if (!isUpdating) {
+ mAdapter.startUpdate(this);
+ isUpdating = true;
+ }
+
+ mAdapter.destroyItem(this, ii.position, ii.object);
+ needPopulate = true;
+
+ if (mCurItem == ii.position) {
+ // Keep the current item in the valid range
+ newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
+ needPopulate = true;
+ }
+ continue;
+ }
+
+ if (ii.position != newPos) {
+ if (ii.position == mCurItem) {
+ // Our current item changed position. Follow it.
+ newCurrItem = newPos;
+ }
+
+ ii.position = newPos;
+ needPopulate = true;
+ }
+ }
+
+ if (isUpdating) {
+ mAdapter.finishUpdate(this);
+ }
+
+ Collections.sort(mItems, COMPARATOR);
+
+ if (needPopulate) {
+ // Reset our known page widths; populate will recompute them.
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) {
+ lp.widthFactor = 0.f;
+ }
+ }
+
+ setCurrentItemInternal(newCurrItem, false, true);
+ requestLayout();
+ }
+ }
+
+ void populate() {
+ populate(mCurItem);
+ }
+
+ void populate(int newCurrentItem) {
+ ItemInfo oldCurInfo = null;
+ if (mCurItem != newCurrentItem) {
+ oldCurInfo = infoForPosition(mCurItem);
+ mCurItem = newCurrentItem;
+ }
+
+ if (mAdapter == null) {
+ sortChildDrawingOrder();
+ return;
+ }
+
+ // Bail now if we are waiting to populate. This is to hold off
+ // on creating views from the time the user releases their finger to
+ // fling to a new position until we have finished the scroll to
+ // that position, avoiding glitches from happening at that point.
+ if (mPopulatePending) {
+ if (DEBUG) Log.i(TAG, "populate is pending, skipping for now...");
+ sortChildDrawingOrder();
+ return;
+ }
+
+ // Also, don't populate until we are attached to a window. This is to
+ // avoid trying to populate before we have restored our view hierarchy
+ // state and conflicting with what is restored.
+ if (getWindowToken() == null) {
+ return;
+ }
+
+ mAdapter.startUpdate(this);
+
+ final int pageLimit = mOffscreenPageLimit;
+ final int startPos = Math.max(0, mCurItem - pageLimit);
+ final int N = mAdapter.getCount();
+ final int endPos = Math.min(N - 1, mCurItem + pageLimit);
+
+ if (N != mExpectedAdapterCount) {
+ String resName;
+ try {
+ resName = getResources().getResourceName(getId());
+ } catch (Resources.NotFoundException e) {
+ resName = Integer.toHexString(getId());
+ }
+ throw new IllegalStateException("The application's PagerAdapter changed the adapter's"
+ + " contents without calling PagerAdapter#notifyDataSetChanged!"
+ + " Expected adapter item count: " + mExpectedAdapterCount + ", found: " + N
+ + " Pager id: " + resName
+ + " Pager class: " + getClass()
+ + " Problematic adapter: " + mAdapter.getClass());
+ }
+
+ // Locate the currently focused item or add it if needed.
+ int curIndex = -1;
+ ItemInfo curItem = null;
+ for (curIndex = 0; curIndex < mItems.size(); curIndex++) {
+ final ItemInfo ii = mItems.get(curIndex);
+ if (ii.position >= mCurItem) {
+ if (ii.position == mCurItem) curItem = ii;
+ break;
+ }
+ }
+
+ if (curItem == null && N > 0) {
+ curItem = addNewItem(mCurItem, curIndex);
+ }
+
+ // Fill 3x the available width or up to the number of offscreen
+ // pages requested to either side, whichever is larger.
+ // If we have no current item we have no work to do.
+ if (curItem != null) {
+ float extraWidthLeft = 0.f;
+ int itemIndex = curIndex - 1;
+ ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ final int clientWidth = getClientWidth();
+ final float leftWidthNeeded = clientWidth <= 0 ? 0 :
+ 2.f - curItem.widthFactor + (float) getPaddingLeft() / (float) clientWidth;
+ for (int pos = mCurItem - 1; pos >= 0; pos--) {
+ if (extraWidthLeft >= leftWidthNeeded && pos < startPos) {
+ if (ii == null) {
+ break;
+ }
+ if (pos == ii.position && !ii.scrolling) {
+ mItems.remove(itemIndex);
+ mAdapter.destroyItem(this, pos, ii.object);
+ if (DEBUG) {
+ Log.i(TAG, "populate() - destroyItem() with pos: " + pos
+ + " view: " + ((View) ii.object));
+ }
+ itemIndex--;
+ curIndex--;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ }
+ } else if (ii != null && pos == ii.position) {
+ extraWidthLeft += ii.widthFactor;
+ itemIndex--;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ } else {
+ ii = addNewItem(pos, itemIndex + 1);
+ extraWidthLeft += ii.widthFactor;
+ curIndex++;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ }
+ }
+
+ float extraWidthRight = curItem.widthFactor;
+ itemIndex = curIndex + 1;
+ if (extraWidthRight < 2.f) {
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ final float rightWidthNeeded = clientWidth <= 0 ? 0 :
+ (float) getPaddingRight() / (float) clientWidth + 2.f;
+ for (int pos = mCurItem + 1; pos < N; pos++) {
+ if (extraWidthRight >= rightWidthNeeded && pos > endPos) {
+ if (ii == null) {
+ break;
+ }
+ if (pos == ii.position && !ii.scrolling) {
+ mItems.remove(itemIndex);
+ mAdapter.destroyItem(this, pos, ii.object);
+ if (DEBUG) {
+ Log.i(TAG, "populate() - destroyItem() with pos: " + pos
+ + " view: " + ((View) ii.object));
+ }
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ }
+ } else if (ii != null && pos == ii.position) {
+ extraWidthRight += ii.widthFactor;
+ itemIndex++;
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ } else {
+ ii = addNewItem(pos, itemIndex);
+ itemIndex++;
+ extraWidthRight += ii.widthFactor;
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ }
+ }
+ }
+
+ calculatePageOffsets(curItem, curIndex, oldCurInfo);
+ }
+
+ if (DEBUG) {
+ Log.i(TAG, "Current page list:");
+ for (int i = 0; i < mItems.size(); i++) {
+ Log.i(TAG, "#" + i + ": page " + mItems.get(i).position);
+ }
+ }
+
+ mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
+
+ mAdapter.finishUpdate(this);
+
+ // Check width measurement of current pages and drawing sort order.
+ // Update LayoutParams as needed.
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ lp.childIndex = i;
+ if (!lp.isDecor && lp.widthFactor == 0.f) {
+ // 0 means requery the adapter for this, it doesn't have a valid width.
+ final ItemInfo ii = infoForChild(child);
+ if (ii != null) {
+ lp.widthFactor = ii.widthFactor;
+ lp.position = ii.position;
+ }
+ }
+ }
+ sortChildDrawingOrder();
+
+ if (hasFocus()) {
+ View currentFocused = findFocus();
+ ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null;
+ if (ii == null || ii.position != mCurItem) {
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ if (child.requestFocus(View.FOCUS_FORWARD)) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void sortChildDrawingOrder() {
+ if (mDrawingOrder != DRAW_ORDER_DEFAULT) {
+ if (mDrawingOrderedChildren == null) {
+ mDrawingOrderedChildren = new ArrayList();
+ } else {
+ mDrawingOrderedChildren.clear();
+ }
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ mDrawingOrderedChildren.add(child);
+ }
+ Collections.sort(mDrawingOrderedChildren, sPositionComparator);
+ }
+ }
+
+ private void calculatePageOffsets(ItemInfo curItem, int curIndex, ItemInfo oldCurInfo) {
+ final int N = mAdapter.getCount();
+ final int width = getClientWidth();
+ final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+ // Fix up offsets for later layout.
+ if (oldCurInfo != null) {
+ final int oldCurPosition = oldCurInfo.position;
+ // Base offsets off of oldCurInfo.
+ if (oldCurPosition < curItem.position) {
+ int itemIndex = 0;
+ ItemInfo ii = null;
+ float offset = oldCurInfo.offset + oldCurInfo.widthFactor + marginOffset;
+ for (int pos = oldCurPosition + 1;
+ pos <= curItem.position && itemIndex < mItems.size(); pos++) {
+ ii = mItems.get(itemIndex);
+ while (pos > ii.position && itemIndex < mItems.size() - 1) {
+ itemIndex++;
+ ii = mItems.get(itemIndex);
+ }
+ while (pos < ii.position) {
+ // We don't have an item populated for this,
+ // ask the adapter for an offset.
+ offset += mAdapter.getPageWidth(pos) + marginOffset;
+ pos++;
+ }
+ ii.offset = offset;
+ offset += ii.widthFactor + marginOffset;
+ }
+ } else if (oldCurPosition > curItem.position) {
+ int itemIndex = mItems.size() - 1;
+ ItemInfo ii = null;
+ float offset = oldCurInfo.offset;
+ for (int pos = oldCurPosition - 1;
+ pos >= curItem.position && itemIndex >= 0; pos--) {
+ ii = mItems.get(itemIndex);
+ while (pos < ii.position && itemIndex > 0) {
+ itemIndex--;
+ ii = mItems.get(itemIndex);
+ }
+ while (pos > ii.position) {
+ // We don't have an item populated for this,
+ // ask the adapter for an offset.
+ offset -= mAdapter.getPageWidth(pos) + marginOffset;
+ pos--;
+ }
+ offset -= ii.widthFactor + marginOffset;
+ ii.offset = offset;
+ }
+ }
+ }
+
+ // Base all offsets off of curItem.
+ final int itemCount = mItems.size();
+ float offset = curItem.offset;
+ int pos = curItem.position - 1;
+ mFirstOffset = curItem.position == 0 ? curItem.offset : -Float.MAX_VALUE;
+ mLastOffset = curItem.position == N - 1
+ ? curItem.offset + curItem.widthFactor - 1 : Float.MAX_VALUE;
+ // Previous pages
+ for (int i = curIndex - 1; i >= 0; i--, pos--) {
+ final ItemInfo ii = mItems.get(i);
+ while (pos > ii.position) {
+ offset -= mAdapter.getPageWidth(pos--) + marginOffset;
+ }
+ offset -= ii.widthFactor + marginOffset;
+ ii.offset = offset;
+ if (ii.position == 0) mFirstOffset = offset;
+ }
+ offset = curItem.offset + curItem.widthFactor + marginOffset;
+ pos = curItem.position + 1;
+ // Next pages
+ for (int i = curIndex + 1; i < itemCount; i++, pos++) {
+ final ItemInfo ii = mItems.get(i);
+ while (pos < ii.position) {
+ offset += mAdapter.getPageWidth(pos++) + marginOffset;
+ }
+ if (ii.position == N - 1) {
+ mLastOffset = offset + ii.widthFactor - 1;
+ }
+ ii.offset = offset;
+ offset += ii.widthFactor + marginOffset;
+ }
+
+ mNeedCalculatePageOffsets = false;
+ }
+
+ /**
+ * This is the persistent state that is saved by ViewPager. Only needed
+ * if you are creating a sublass of ViewPager that must save its own
+ * state, in which case it should implement a subclass of this which
+ * contains that state.
+ */
+ public static class SavedState extends AbsSavedState {
+ int position;
+ Parcelable adapterState;
+ ClassLoader loader;
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeInt(position);
+ out.writeParcelable(adapterState, flags);
+ }
+
+ @Override
+ public String toString() {
+ return "FragmentPager.SavedState{"
+ + Integer.toHexString(System.identityHashCode(this))
+ + " position=" + position + "}";
+ }
+
+ public static final Creator CREATOR = new ClassLoaderCreator() {
+ @Override
+ public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+ return new SavedState(in, loader);
+ }
+
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in, null);
+ }
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+
+ SavedState(Parcel in, ClassLoader loader) {
+ super(in, loader);
+ if (loader == null) {
+ loader = getClass().getClassLoader();
+ }
+ position = in.readInt();
+ adapterState = in.readParcelable(loader);
+ this.loader = loader;
+ }
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ SavedState ss = new SavedState(superState);
+ ss.position = mCurItem;
+ if (mAdapter != null) {
+ ss.adapterState = mAdapter.saveState();
+ }
+ return ss;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if (!(state instanceof SavedState)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+
+ if (mAdapter != null) {
+ mAdapter.restoreState(ss.adapterState, ss.loader);
+ setCurrentItemInternal(ss.position, false, true);
+ } else {
+ mRestoredCurItem = ss.position;
+ mRestoredAdapterState = ss.adapterState;
+ mRestoredClassLoader = ss.loader;
+ }
+ }
+
+ @Override
+ public void addView(View child, int index, ViewGroup.LayoutParams params) {
+ if (!checkLayoutParams(params)) {
+ params = generateLayoutParams(params);
+ }
+ final LayoutParams lp = (LayoutParams) params;
+ // Any views added via inflation should be classed as part of the decor
+ lp.isDecor |= isDecorView(child);
+ if (mInLayout) {
+ if (lp != null && lp.isDecor) {
+ throw new IllegalStateException("Cannot add pager decor view during layout");
+ }
+ lp.needsMeasure = true;
+ addViewInLayout(child, index, params);
+ } else {
+ super.addView(child, index, params);
+ }
+
+ if (USE_CACHE) {
+ if (child.getVisibility() != GONE) {
+ child.setDrawingCacheEnabled(mScrollingCacheEnabled);
+ } else {
+ child.setDrawingCacheEnabled(false);
+ }
+ }
+ }
+
+ private static boolean isDecorView(@NonNull View view) {
+ Class> clazz = view.getClass();
+ return clazz.getAnnotation(DecorView.class) != null;
+ }
+
+ @Override
+ public void removeView(View view) {
+ if (mInLayout) {
+ removeViewInLayout(view);
+ } else {
+ super.removeView(view);
+ }
+ }
+
+ ItemInfo infoForChild(View child) {
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (mAdapter.isViewFromObject(child, ii.object)) {
+ return ii;
+ }
+ }
+ return null;
+ }
+
+ ItemInfo infoForAnyChild(View child) {
+ ViewParent parent;
+ while ((parent = child.getParent()) != this) {
+ if (parent == null || !(parent instanceof View)) {
+ return null;
+ }
+ child = (View) parent;
+ }
+ return infoForChild(child);
+ }
+
+ ItemInfo infoForPosition(int position) {
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (ii.position == position) {
+ return ii;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mFirstLayout = true;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // For simple implementation, our internal size is always 0.
+ // We depend on the container to specify the layout size of
+ // our view. We can't really know what it is since we will be
+ // adding and removing different arbitrary views and do not
+ // want the layout to change as this happens.
+ setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
+ getDefaultSize(0, heightMeasureSpec));
+
+ final int measuredWidth = getMeasuredWidth();
+ final int maxGutterSize = measuredWidth / 10;
+ mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
+
+ // Children are just made to fill our space.
+ int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
+ int childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
+
+ /*
+ * Make sure all children have been properly measured. Decor views first.
+ * Right now we cheat and make this less complicated by assuming decor
+ * views won't intersect. We will pin to edges based on gravity.
+ */
+ int size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (lp != null && lp.isDecor) {
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+ int widthMode = MeasureSpec.AT_MOST;
+ int heightMode = MeasureSpec.AT_MOST;
+ boolean consumeVertical = vgrav == Gravity.TOP || vgrav == Gravity.BOTTOM;
+ boolean consumeHorizontal = hgrav == Gravity.LEFT || hgrav == Gravity.RIGHT;
+
+ if (consumeVertical) {
+ widthMode = MeasureSpec.EXACTLY;
+ } else if (consumeHorizontal) {
+ heightMode = MeasureSpec.EXACTLY;
+ }
+
+ int widthSize = childWidthSize;
+ int heightSize = childHeightSize;
+ if (lp.width != LayoutParams.WRAP_CONTENT) {
+ widthMode = MeasureSpec.EXACTLY;
+ if (lp.width != LayoutParams.MATCH_PARENT) {
+ widthSize = lp.width;
+ }
+ }
+ if (lp.height != LayoutParams.WRAP_CONTENT) {
+ heightMode = MeasureSpec.EXACTLY;
+ if (lp.height != LayoutParams.MATCH_PARENT) {
+ heightSize = lp.height;
+ }
+ }
+ final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
+ final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
+ child.measure(widthSpec, heightSpec);
+
+ if (consumeVertical) {
+ childHeightSize -= child.getMeasuredHeight();
+ } else if (consumeHorizontal) {
+ childWidthSize -= child.getMeasuredWidth();
+ }
+ }
+ }
+ }
+
+ mChildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);
+ mChildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY);
+
+ // Make sure we have created all fragments that we need to have shown.
+ mInLayout = true;
+ populate();
+ mInLayout = false;
+
+ // Page views next.
+ size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ if (DEBUG) {
+ Log.v(TAG, "Measuring #" + i + " " + child + ": " + mChildWidthMeasureSpec);
+ }
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (lp == null || !lp.isDecor) {
+ final int widthSpec = MeasureSpec.makeMeasureSpec(
+ (int) (childWidthSize * lp.widthFactor), MeasureSpec.EXACTLY);
+ child.measure(widthSpec, mChildHeightMeasureSpec);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ // Make sure scroll position is set correctly.
+ if (w != oldw) {
+ recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
+ }
+ }
+
+ private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
+ if (oldWidth > 0 && !mItems.isEmpty()) {
+ if (!mScroller.isFinished()) {
+ mScroller.setFinalX(getCurrentItem() * getClientWidth());
+ } else {
+ final int widthWithMargin = width - getPaddingLeft() - getPaddingRight() + margin;
+ final int oldWidthWithMargin = oldWidth - getPaddingLeft() - getPaddingRight()
+ + oldMargin;
+ final int xpos = getScrollX();
+ final float pageOffset = (float) xpos / oldWidthWithMargin;
+ final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
+
+ scrollTo(newOffsetPixels, getScrollY());
+ }
+ } else {
+ final ItemInfo ii = infoForPosition(mCurItem);
+ final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0;
+ final int scrollPos =
+ (int) (scrollOffset * (width - getPaddingLeft() - getPaddingRight()));
+ if (scrollPos != getScrollX()) {
+ completeScroll(false);
+ scrollTo(scrollPos, getScrollY());
+ }
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ final int count = getChildCount();
+ int width = r - l;
+ int height = b - t;
+ int paddingLeft = getPaddingLeft();
+ int paddingTop = getPaddingTop();
+ int paddingRight = getPaddingRight();
+ int paddingBottom = getPaddingBottom();
+ final int scrollX = getScrollX();
+
+ int decorCount = 0;
+
+ // First pass - decor views. We need to do this in two passes so that
+ // we have the proper offsets for non-decor views later.
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ int childLeft = 0;
+ int childTop = 0;
+ if (lp.isDecor) {
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+ switch (hgrav) {
+ default:
+ childLeft = paddingLeft;
+ break;
+ case Gravity.LEFT:
+ childLeft = paddingLeft;
+ paddingLeft += child.getMeasuredWidth();
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
+ paddingLeft);
+ break;
+ case Gravity.RIGHT:
+ childLeft = width - paddingRight - child.getMeasuredWidth();
+ paddingRight += child.getMeasuredWidth();
+ break;
+ }
+ switch (vgrav) {
+ default:
+ childTop = paddingTop;
+ break;
+ case Gravity.TOP:
+ childTop = paddingTop;
+ paddingTop += child.getMeasuredHeight();
+ break;
+ case Gravity.CENTER_VERTICAL:
+ childTop = Math.max((height - child.getMeasuredHeight()) / 2,
+ paddingTop);
+ break;
+ case Gravity.BOTTOM:
+ childTop = height - paddingBottom - child.getMeasuredHeight();
+ paddingBottom += child.getMeasuredHeight();
+ break;
+ }
+ childLeft += scrollX;
+ child.layout(childLeft, childTop,
+ childLeft + child.getMeasuredWidth(),
+ childTop + child.getMeasuredHeight());
+ decorCount++;
+ }
+ }
+ }
+
+ final int childWidth = width - paddingLeft - paddingRight;
+ // Page views. Do this once we have the right padding offsets from above.
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ ItemInfo ii;
+ if (!lp.isDecor && (ii = infoForChild(child)) != null) {
+ int loff = (int) (childWidth * ii.offset);
+ int childLeft = paddingLeft + loff;
+ int childTop = paddingTop;
+ if (lp.needsMeasure) {
+ // This was added during layout and needs measurement.
+ // Do it now that we know what we're working with.
+ lp.needsMeasure = false;
+ final int widthSpec = MeasureSpec.makeMeasureSpec(
+ (int) (childWidth * lp.widthFactor),
+ MeasureSpec.EXACTLY);
+ final int heightSpec = MeasureSpec.makeMeasureSpec(
+ (int) (height - paddingTop - paddingBottom),
+ MeasureSpec.EXACTLY);
+ child.measure(widthSpec, heightSpec);
+ }
+ if (DEBUG) {
+ Log.v(TAG, "Positioning #" + i + " " + child + " f=" + ii.object
+ + ":" + childLeft + "," + childTop + " " + child.getMeasuredWidth()
+ + "x" + child.getMeasuredHeight());
+ }
+ child.layout(childLeft, childTop,
+ childLeft + child.getMeasuredWidth(),
+ childTop + child.getMeasuredHeight());
+ }
+ }
+ }
+ mTopPageBounds = paddingTop;
+ mBottomPageBounds = height - paddingBottom;
+ mDecorChildCount = decorCount;
+
+ if (mFirstLayout) {
+ scrollToItem(mCurItem, false, 0, false);
+ }
+ mFirstLayout = false;
+ }
+
+ @Override
+ public void computeScroll() {
+ mIsScrollStarted = true;
+ if (!mScroller.isFinished() && mScroller.computeScrollOffset()) {
+ int oldX = getScrollX();
+ int oldY = getScrollY();
+ int x = mScroller.getCurrX();
+ int y = mScroller.getCurrY();
+
+ if (oldX != x || oldY != y) {
+ scrollTo(x, y);
+ if (!pageScrolled(x)) {
+ mScroller.abortAnimation();
+ scrollTo(0, y);
+ }
+ }
+
+ // Keep on drawing until the animation has finished.
+ ViewCompat.postInvalidateOnAnimation(this);
+ return;
+ }
+
+ // Done with scroll, clean up state.
+ completeScroll(true);
+ }
+
+ private boolean pageScrolled(int xpos) {
+ if (mItems.size() == 0) {
+ if (mFirstLayout) {
+ // If we haven't been laid out yet, we probably just haven't been populated yet.
+ // Let's skip this call since it doesn't make sense in this state
+ return false;
+ }
+ mCalledSuper = false;
+ onPageScrolled(0, 0, 0);
+ if (!mCalledSuper) {
+ throw new IllegalStateException(
+ "onPageScrolled did not call superclass implementation");
+ }
+ return false;
+ }
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int width = getClientWidth();
+ final int widthWithMargin = width + mPageMargin;
+ final float marginOffset = (float) mPageMargin / width;
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) xpos / width) - ii.offset)
+ / (ii.widthFactor + marginOffset);
+ final int offsetPixels = (int) (pageOffset * widthWithMargin);
+
+ mCalledSuper = false;
+ onPageScrolled(currentPage, pageOffset, offsetPixels);
+ if (!mCalledSuper) {
+ throw new IllegalStateException(
+ "onPageScrolled did not call superclass implementation");
+ }
+ return true;
+ }
+
+ /**
+ * This method will be invoked when the current page is scrolled, either as part
+ * of a programmatically initiated smooth scroll or a user initiated touch scroll.
+ * If you override this method you must call through to the superclass implementation
+ * (e.g. super.onPageScrolled(position, offset, offsetPixels)) before onPageScrolled
+ * returns.
+ *
+ * @param position Position index of the first page currently being displayed.
+ * Page position+1 will be visible if positionOffset is nonzero.
+ * @param offset Value from [0, 1) indicating the offset from the page at position.
+ * @param offsetPixels Value in pixels indicating the offset from position.
+ */
+ @CallSuper
+ protected void onPageScrolled(int position, float offset, int offsetPixels) {
+ // Offset any decor views if needed - keep them on-screen at all times.
+ if (mDecorChildCount > 0) {
+ final int scrollX = getScrollX();
+ int paddingLeft = getPaddingLeft();
+ int paddingRight = getPaddingRight();
+ final int width = getWidth();
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) continue;
+
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ int childLeft = 0;
+ switch (hgrav) {
+ default:
+ childLeft = paddingLeft;
+ break;
+ case Gravity.LEFT:
+ childLeft = paddingLeft;
+ paddingLeft += child.getWidth();
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
+ paddingLeft);
+ break;
+ case Gravity.RIGHT:
+ childLeft = width - paddingRight - child.getMeasuredWidth();
+ paddingRight += child.getMeasuredWidth();
+ break;
+ }
+ childLeft += scrollX;
+
+ final int childOffset = childLeft - child.getLeft();
+ if (childOffset != 0) {
+ child.offsetLeftAndRight(childOffset);
+ }
+ }
+ }
+
+ dispatchOnPageScrolled(position, offset, offsetPixels);
+
+ if (mPageTransformer != null) {
+ final int scrollX = getScrollX();
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ if (lp.isDecor) continue;
+ final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
+ mPageTransformer.transformPage(child, transformPos);
+ }
+ }
+
+ mCalledSuper = true;
+ }
+
+ private void dispatchOnPageScrolled(int position, float offset, int offsetPixels) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
+ if (mOnPageChangeListeners != null) {
+ for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+ OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+ if (listener != null) {
+ listener.onPageScrolled(position, offset, offsetPixels);
+ }
+ }
+ }
+ if (mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
+ }
+
+ private void dispatchOnPageSelected(int position) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(position);
+ }
+ if (mOnPageChangeListeners != null) {
+ for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+ OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+ if (listener != null) {
+ listener.onPageSelected(position);
+ }
+ }
+ }
+ if (mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(position);
+ }
+ }
+
+ private void dispatchOnScrollStateChanged(int state) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrollStateChanged(state);
+ }
+ if (mOnPageChangeListeners != null) {
+ for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+ OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+ if (listener != null) {
+ listener.onPageScrollStateChanged(state);
+ }
+ }
+ }
+ if (mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageScrollStateChanged(state);
+ }
+ }
+
+ private void completeScroll(boolean postEvents) {
+ boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING;
+ if (needPopulate) {
+ // Done with scroll, no longer want to cache view drawing.
+ setScrollingCacheEnabled(false);
+ boolean wasScrolling = !mScroller.isFinished();
+ if (wasScrolling) {
+ mScroller.abortAnimation();
+ int oldX = getScrollX();
+ int oldY = getScrollY();
+ int x = mScroller.getCurrX();
+ int y = mScroller.getCurrY();
+ if (oldX != x || oldY != y) {
+ scrollTo(x, y);
+ if (x != oldX) {
+ pageScrolled(x);
+ }
+ }
+ }
+ }
+ mPopulatePending = false;
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (ii.scrolling) {
+ needPopulate = true;
+ ii.scrolling = false;
+ }
+ }
+ if (needPopulate) {
+ if (postEvents) {
+ ViewCompat.postOnAnimation(this, mEndScrollRunnable);
+ } else {
+ mEndScrollRunnable.run();
+ }
+ }
+ }
+
+ private boolean isGutterDrag(float x, float dx) {
+ return (x < mGutterSize && dx > 0) || (x > getWidth() - mGutterSize && dx < 0);
+ }
+
+ private void enableLayers(boolean enable) {
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final int layerType = enable
+ ? mPageTransformerLayerType : View.LAYER_TYPE_NONE;
+ getChildAt(i).setLayerType(layerType, null);
+ }
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ /*
+ * This method JUST determines whether we want to intercept the motion.
+ * If we return true, onMotionEvent will be called and we do the actual
+ * scrolling there.
+ */
+
+ final int action = ev.getAction() & MotionEvent.ACTION_MASK;
+
+ // Always take care of the touch gesture being complete.
+ if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+ // Release the drag.
+ if (DEBUG) Log.v(TAG, "Intercept done!");
+ resetTouch();
+ return false;
+ }
+
+ // Nothing more to do here if we have decided whether or not we
+ // are dragging.
+ if (action != MotionEvent.ACTION_DOWN) {
+ if (mIsBeingDragged) {
+ if (DEBUG) Log.v(TAG, "Intercept returning true!");
+ return true;
+ }
+ if (mIsUnableToDrag) {
+ if (DEBUG) Log.v(TAG, "Intercept returning false!");
+ return false;
+ }
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_MOVE: {
+ /*
+ * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
+ * whether the user has moved far enough from his original down touch.
+ */
+
+ /*
+ * Locally do absolute value. mLastMotionY is set to the y value
+ * of the down event.
+ */
+ final int activePointerId = mActivePointerId;
+ if (activePointerId == INVALID_POINTER) {
+ // If we don't have a valid id, the touch down wasn't on content.
+ break;
+ }
+
+ final int pointerIndex = ev.findPointerIndex(activePointerId);
+ final float x = ev.getX(pointerIndex);
+ final float dx = x - mLastMotionX;
+ final float xDiff = Math.abs(dx);
+ final float y = ev.getY(pointerIndex);
+ final float yDiff = Math.abs(y - mInitialMotionY);
+ if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
+
+ Log.i("out", "dx==" + Math.abs(dx) + " diffY=" + yDiff);
+ if (dx != 0 && !isGutterDrag(mLastMotionX, dx)
+ && canScroll(this, false, (int) dx, (int) x, (int) y)) {
+ // Nested view has scrollable area under this point. Let it be handled there.
+ mLastMotionX = x;
+ mLastMotionY = y;
+ mIsUnableToDrag = true;
+ return false;
+ }
+ if (xDiff > mTouchSlop && xDiff * 0.5f > yDiff) {
+ if (DEBUG) Log.v(TAG, "Starting drag!");
+ mIsBeingDragged = true;
+ requestParentDisallowInterceptTouchEvent(true);
+ setScrollState(SCROLL_STATE_DRAGGING);
+ mLastMotionX = dx > 0
+ ? mInitialMotionX + mTouchSlop : mInitialMotionX - mTouchSlop;
+ mLastMotionY = y;
+ setScrollingCacheEnabled(true);
+ } else if (yDiff > mTouchSlop) {
+ // The finger has moved enough in the vertical
+ // direction to be counted as a drag... abort
+ // any attempt to drag horizontally, to work correctly
+ // with children that have scrolling containers.
+ if (DEBUG) Log.v(TAG, "Starting unable to drag!");
+ mIsUnableToDrag = true;
+ }
+ if (mIsBeingDragged) {
+ // Scroll to follow the motion event
+ if (performDrag(x)) {
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ }
+ break;
+ }
+
+ case MotionEvent.ACTION_DOWN: {
+ /*
+ * Remember location of down touch.
+ * ACTION_DOWN always refers to pointer index 0.
+ */
+ mLastMotionX = mInitialMotionX = ev.getX();
+ mLastMotionY = mInitialMotionY = ev.getY();
+ mActivePointerId = ev.getPointerId(0);
+ mIsUnableToDrag = false;
+
+ mIsScrollStarted = true;
+ mScroller.computeScrollOffset();
+ if (mScrollState == SCROLL_STATE_SETTLING
+ && Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) {
+ // Let the user 'catch' the pager as it animates.
+ mScroller.abortAnimation();
+ mPopulatePending = false;
+ populate();
+ mIsBeingDragged = true;
+ requestParentDisallowInterceptTouchEvent(true);
+ setScrollState(SCROLL_STATE_DRAGGING);
+ } else {
+ completeScroll(false);
+ mIsBeingDragged = false;
+ }
+
+ if (DEBUG) {
+ Log.v(TAG, "Down at " + mLastMotionX + "," + mLastMotionY
+ + " mIsBeingDragged=" + mIsBeingDragged
+ + "mIsUnableToDrag=" + mIsUnableToDrag);
+ }
+ break;
+ }
+
+ case MotionEvent.ACTION_POINTER_UP:
+ onSecondaryPointerUp(ev);
+ break;
+ }
+
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(ev);
+
+ /*
+ * The only time we want to intercept motion events is if we are in the
+ * drag mode.
+ */
+ return mIsBeingDragged;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ if (mFakeDragging) {
+ // A fake drag is in progress already, ignore this real one
+ // but still eat the touch events.
+ // (It is likely that the user is multi-touching the screen.)
+ return true;
+ }
+
+ if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
+ // Don't handle edge touches immediately -- they may actually belong to one of our
+ // descendants.
+ return false;
+ }
+
+ if (mAdapter == null || mAdapter.getCount() == 0) {
+ // Nothing to present or scroll; nothing to touch.
+ return false;
+ }
+
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(ev);
+
+ final int action = ev.getAction();
+ boolean needsInvalidate = false;
+
+ switch (action & MotionEvent.ACTION_MASK) {
+ case MotionEvent.ACTION_DOWN: {
+ mScroller.abortAnimation();
+ mPopulatePending = false;
+ populate();
+
+ // Remember where the motion event started
+ mLastMotionX = mInitialMotionX = ev.getX();
+ mLastMotionY = mInitialMotionY = ev.getY();
+ mActivePointerId = ev.getPointerId(0);
+ break;
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (!mIsBeingDragged) {
+ final int pointerIndex = ev.findPointerIndex(mActivePointerId);
+ if (pointerIndex == -1) {
+ // A child has consumed some touch events and put us into an inconsistent
+ // state.
+ needsInvalidate = resetTouch();
+ break;
+ }
+ final float x = ev.getX(pointerIndex);
+ final float xDiff = Math.abs(x - mLastMotionX);
+ final float y = ev.getY(pointerIndex);
+ final float yDiff = Math.abs(y - mLastMotionY);
+ if (DEBUG) {
+ Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
+ }
+
+ if (xDiff > mTouchSlop && xDiff > yDiff) {
+ if (DEBUG) Log.v(TAG, "Starting drag!");
+ mIsBeingDragged = true;
+ requestParentDisallowInterceptTouchEvent(true);
+ mLastMotionX = x - mInitialMotionX > 0 ? mInitialMotionX + mTouchSlop :
+ mInitialMotionX - mTouchSlop;
+ mLastMotionY = y;
+ setScrollState(SCROLL_STATE_DRAGGING);
+ setScrollingCacheEnabled(true);
+
+ // Disallow Parent Intercept, just in case
+ ViewParent parent = getParent();
+ if (parent != null) {
+ parent.requestDisallowInterceptTouchEvent(true);
+ }
+ }
+ }
+ // Not else! Note that mIsBeingDragged can be set above.
+ if (mIsBeingDragged) {
+ // Scroll to follow the motion event
+ final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+ final float x = ev.getX(activePointerIndex);
+ needsInvalidate |= performDrag(x);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ Log.i("out", "isBeingDragged==" + mIsBeingDragged);
+ if (mIsBeingDragged) {
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId);
+ Log.i("out", "velocity==" + initialVelocity);
+ mPopulatePending = true;
+ final int width = getClientWidth();
+ final int scrollX = getScrollX();
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final float marginOffset = (float) mPageMargin / width;
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) scrollX / width) - ii.offset)
+ / (ii.widthFactor + marginOffset);
+ final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+ final float x = ev.getX(activePointerIndex);
+ final int totalDelta = (int) (x - mInitialMotionX);
+ int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+ totalDelta);
+ setCurrentItemInternal(nextPage, true, true, initialVelocity);
+
+ needsInvalidate = resetTouch();
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ if (mIsBeingDragged) {
+ scrollToItem(mCurItem, true, 0, false);
+ needsInvalidate = resetTouch();
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN: {
+ final int index = ev.getActionIndex();
+ final float x = ev.getX(index);
+ mLastMotionX = x;
+ mActivePointerId = ev.getPointerId(index);
+ break;
+ }
+ case MotionEvent.ACTION_POINTER_UP:
+ onSecondaryPointerUp(ev);
+ mLastMotionX = ev.getX(ev.findPointerIndex(mActivePointerId));
+ break;
+ }
+ if (needsInvalidate) {
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ return true;
+ }
+
+ private boolean resetTouch() {
+ boolean needsInvalidate;
+ mActivePointerId = INVALID_POINTER;
+ endDrag();
+ mLeftEdge.onRelease();
+ mRightEdge.onRelease();
+ needsInvalidate = mLeftEdge.isFinished() || mRightEdge.isFinished();
+ return needsInvalidate;
+ }
+
+ private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept) {
+ final ViewParent parent = getParent();
+ if (parent != null) {
+ parent.requestDisallowInterceptTouchEvent(disallowIntercept);
+ }
+ }
+
+ private boolean performDrag(float x) {
+ boolean needsInvalidate = false;
+
+ final float deltaX = mLastMotionX - x;
+ mLastMotionX = x;
+
+ float oldScrollX = getScrollX();
+ float scrollX = oldScrollX + deltaX;
+ final int width = getClientWidth();
+
+ float leftBound = width * mFirstOffset;
+ float rightBound = width * mLastOffset;
+ boolean leftAbsolute = true;
+ boolean rightAbsolute = true;
+
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+ if (firstItem.position != 0) {
+ leftAbsolute = false;
+ leftBound = firstItem.offset * width;
+ }
+ if (lastItem.position != mAdapter.getCount() - 1) {
+ rightAbsolute = false;
+ rightBound = lastItem.offset * width;
+ }
+
+ if (scrollX < leftBound) {
+ if (leftAbsolute) {
+ float over = leftBound - scrollX;
+ mLeftEdge.onPull(Math.abs(over) / width);
+ needsInvalidate = true;
+ }
+ scrollX = leftBound;
+ } else if (scrollX > rightBound) {
+ if (rightAbsolute) {
+ float over = scrollX - rightBound;
+ mRightEdge.onPull(Math.abs(over) / width);
+ needsInvalidate = true;
+ }
+ scrollX = rightBound;
+ }
+ // Don't lose the rounded component
+ mLastMotionX += scrollX - (int) scrollX;
+ scrollTo((int) scrollX, getScrollY());
+ pageScrolled((int) scrollX);
+
+ return needsInvalidate;
+ }
+
+ /**
+ * @return Info about the page at the current scroll position.
+ * This can be synthetic for a missing middle page; the 'object' field can be null.
+ */
+ private ItemInfo infoForCurrentScrollPosition() {
+ final int width = getClientWidth();
+ final float scrollOffset = width > 0 ? (float) getScrollX() / width : 0;
+ final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+ int lastPos = -1;
+ float lastOffset = 0.f;
+ float lastWidth = 0.f;
+ boolean first = true;
+
+ ItemInfo lastItem = null;
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ float offset;
+ if (!first && ii.position != lastPos + 1) {
+ // Create a synthetic item for a missing page.
+ ii = mTempItem;
+ ii.offset = lastOffset + lastWidth + marginOffset;
+ ii.position = lastPos + 1;
+ ii.widthFactor = mAdapter.getPageWidth(ii.position);
+ i--;
+ }
+ offset = ii.offset;
+
+ final float leftBound = offset;
+ final float rightBound = offset + ii.widthFactor + marginOffset;
+ if (first || scrollOffset >= leftBound) {
+ if (scrollOffset < rightBound || i == mItems.size() - 1) {
+ return ii;
+ }
+ } else {
+ return lastItem;
+ }
+ first = false;
+ lastPos = ii.position;
+ lastOffset = offset;
+ lastWidth = ii.widthFactor;
+ lastItem = ii;
+ }
+
+ return lastItem;
+ }
+
+ public void setVelocityLimit(int velocityLimit) {
+ mVelocityLimit = velocityLimit;
+ }
+
+ private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {
+ int targetPage;
+ if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
+ int offset = 0;
+ if (mVelocityLimit > 0) {
+ offset = Math.round(Math.abs(velocity) / mVelocityLimit);
+ }
+ targetPage = velocity > 0 ? currentPage - offset : currentPage + offset + 1;
+ } else {
+ final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f;
+ targetPage = currentPage + (int) (pageOffset + truncator);
+ }
+
+ if (mItems.size() > 0) {
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+
+ // Only let the user target pages we have items for
+ targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
+ }
+
+ return targetPage;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ boolean needsInvalidate = false;
+
+ final int overScrollMode = getOverScrollMode();
+ if (overScrollMode == View.OVER_SCROLL_ALWAYS
+ || (overScrollMode == View.OVER_SCROLL_IF_CONTENT_SCROLLS
+ && mAdapter != null && mAdapter.getCount() > 1)) {
+ if (!mLeftEdge.isFinished()) {
+ final int restoreCount = canvas.save();
+ final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+ final int width = getWidth();
+
+ canvas.rotate(270);
+ canvas.translate(-height + getPaddingTop(), mFirstOffset * width);
+ mLeftEdge.setSize(height, width);
+ needsInvalidate |= mLeftEdge.draw(canvas);
+ canvas.restoreToCount(restoreCount);
+ }
+ if (!mRightEdge.isFinished()) {
+ final int restoreCount = canvas.save();
+ final int width = getWidth();
+ final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+
+ canvas.rotate(90);
+ canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width);
+ mRightEdge.setSize(height, width);
+ needsInvalidate |= mRightEdge.draw(canvas);
+ canvas.restoreToCount(restoreCount);
+ }
+ } else {
+ mLeftEdge.finish();
+ mRightEdge.finish();
+ }
+
+ if (needsInvalidate) {
+ // Keep animating
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Draw the margin drawable between pages if needed.
+ if (mPageMargin > 0 && mMarginDrawable != null && mItems.size() > 0 && mAdapter != null) {
+ final int scrollX = getScrollX();
+ final int width = getWidth();
+
+ final float marginOffset = (float) mPageMargin / width;
+ int itemIndex = 0;
+ ItemInfo ii = mItems.get(0);
+ float offset = ii.offset;
+ final int itemCount = mItems.size();
+ final int firstPos = ii.position;
+ final int lastPos = mItems.get(itemCount - 1).position;
+ for (int pos = firstPos; pos < lastPos; pos++) {
+ while (pos > ii.position && itemIndex < itemCount) {
+ ii = mItems.get(++itemIndex);
+ }
+
+ float drawAt;
+ if (pos == ii.position) {
+ drawAt = (ii.offset + ii.widthFactor) * width;
+ offset = ii.offset + ii.widthFactor + marginOffset;
+ } else {
+ float widthFactor = mAdapter.getPageWidth(pos);
+ drawAt = (offset + widthFactor) * width;
+ offset += widthFactor + marginOffset;
+ }
+
+ if (drawAt + mPageMargin > scrollX) {
+ mMarginDrawable.setBounds(Math.round(drawAt), mTopPageBounds,
+ Math.round(drawAt + mPageMargin), mBottomPageBounds);
+ mMarginDrawable.draw(canvas);
+ }
+
+ if (drawAt > scrollX + width) {
+ break; // No more visible, no sense in continuing
+ }
+ }
+ }
+ }
+
+ /**
+ * Start a fake drag of the pager.
+ *
+ * A fake drag can be useful if you want to synchronize the motion of the ViewPager
+ * with the touch scrolling of another view, while still letting the ViewPager
+ * control the snapping motion and fling behavior. (e.g. parallax-scrolling tabs.)
+ * Call {@link #fakeDragBy(float)} to simulate the actual drag motion. Call
+ * {@link #endFakeDrag()} to complete the fake drag and fling as necessary.
+ *
+ *
During a fake drag the ViewPager will ignore all touch events. If a real drag
+ * is already in progress, this method will return false.
+ *
+ * @return true if the fake drag began successfully, false if it could not be started.
+ *
+ * @see #fakeDragBy(float)
+ * @see #endFakeDrag()
+ */
+ public boolean beginFakeDrag() {
+ if (mIsBeingDragged) {
+ return false;
+ }
+ mFakeDragging = true;
+ setScrollState(SCROLL_STATE_DRAGGING);
+ mInitialMotionX = mLastMotionX = 0;
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ } else {
+ mVelocityTracker.clear();
+ }
+ final long time = SystemClock.uptimeMillis();
+ final MotionEvent ev = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ mVelocityTracker.addMovement(ev);
+ ev.recycle();
+ mFakeDragBeginTime = time;
+ return true;
+ }
+
+ /**
+ * End a fake drag of the pager.
+ *
+ * @see #beginFakeDrag()
+ * @see #fakeDragBy(float)
+ */
+ public void endFakeDrag() {
+ if (!mFakeDragging) {
+ throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+ }
+
+ if (mAdapter != null) {
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId);
+ mPopulatePending = true;
+ final int width = getClientWidth();
+ final int scrollX = getScrollX();
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) scrollX / width) - ii.offset) / ii.widthFactor;
+ final int totalDelta = (int) (mLastMotionX - mInitialMotionX);
+ int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+ totalDelta);
+ setCurrentItemInternal(nextPage, true, true, initialVelocity);
+ }
+ endDrag();
+
+ mFakeDragging = false;
+ }
+
+ /**
+ * Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first.
+ *
+ * @param xOffset Offset in pixels to drag by.
+ * @see #beginFakeDrag()
+ * @see #endFakeDrag()
+ */
+ public void fakeDragBy(float xOffset) {
+ if (!mFakeDragging) {
+ throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+ }
+
+ if (mAdapter == null) {
+ return;
+ }
+
+ mLastMotionX += xOffset;
+
+ float oldScrollX = getScrollX();
+ float scrollX = oldScrollX - xOffset;
+ final int width = getClientWidth();
+
+ float leftBound = width * mFirstOffset;
+ float rightBound = width * mLastOffset;
+
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+ if (firstItem.position != 0) {
+ leftBound = firstItem.offset * width;
+ }
+ if (lastItem.position != mAdapter.getCount() - 1) {
+ rightBound = lastItem.offset * width;
+ }
+
+ if (scrollX < leftBound) {
+ scrollX = leftBound;
+ } else if (scrollX > rightBound) {
+ scrollX = rightBound;
+ }
+ // Don't lose the rounded component
+ mLastMotionX += scrollX - (int) scrollX;
+ scrollTo((int) scrollX, getScrollY());
+ pageScrolled((int) scrollX);
+
+ // Synthesize an event for the VelocityTracker.
+ final long time = SystemClock.uptimeMillis();
+ final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
+ mLastMotionX, 0, 0);
+ mVelocityTracker.addMovement(ev);
+ ev.recycle();
+ }
+
+ /**
+ * Returns true if a fake drag is in progress.
+ *
+ * @return true if currently in a fake drag, false otherwise.
+ *
+ * @see #beginFakeDrag()
+ * @see #fakeDragBy(float)
+ * @see #endFakeDrag()
+ */
+ public boolean isFakeDragging() {
+ return mFakeDragging;
+ }
+
+ private void onSecondaryPointerUp(MotionEvent ev) {
+ final int pointerIndex = ev.getActionIndex();
+ final int pointerId = ev.getPointerId(pointerIndex);
+ if (pointerId == mActivePointerId) {
+ // This was our active pointer going up. Choose a new
+ // active pointer and adjust accordingly.
+ final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+ mLastMotionX = ev.getX(newPointerIndex);
+ mActivePointerId = ev.getPointerId(newPointerIndex);
+ if (mVelocityTracker != null) {
+ mVelocityTracker.clear();
+ }
+ }
+ }
+
+ private void endDrag() {
+ mIsBeingDragged = false;
+ mIsUnableToDrag = false;
+
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ }
+
+ private void setScrollingCacheEnabled(boolean enabled) {
+ if (mScrollingCacheEnabled != enabled) {
+ mScrollingCacheEnabled = enabled;
+ if (USE_CACHE) {
+ final int size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ child.setDrawingCacheEnabled(enabled);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Check if this ViewPager can be scrolled horizontally in a certain direction.
+ *
+ * @param direction Negative to check scrolling left, positive to check scrolling right.
+ * @return Whether this ViewPager can be scrolled in the specified direction. It will always
+ * return false if the specified direction is 0.
+ */
+ @Override
+ public boolean canScrollHorizontally(int direction) {
+ if (mAdapter == null) {
+ return false;
+ }
+
+ final int width = getClientWidth();
+ final int scrollX = getScrollX();
+ if (direction < 0) {
+ return (scrollX > (int) (width * mFirstOffset));
+ } else if (direction > 0) {
+ return (scrollX < (int) (width * mLastOffset));
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Tests scrollability within child views of v given a delta of dx.
+ *
+ * @param v View to test for horizontal scrollability
+ * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+ * or just its children (false).
+ * @param dx Delta scrolled in pixels
+ * @param x X coordinate of the active touch point
+ * @param y Y coordinate of the active touch point
+ * @return true if child views of v can be scrolled by delta of dx.
+ */
+ protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+ if (v instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) v;
+ final int scrollX = v.getScrollX();
+ final int scrollY = v.getScrollY();
+ final int count = group.getChildCount();
+ // Count backwards - let topmost views consume scroll distance first.
+ for (int i = count - 1; i >= 0; i--) {
+ // TODO: Add versioned support here for transformed views.
+ // This will not work for transformed views in Honeycomb+
+ final View child = group.getChildAt(i);
+ if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight()
+ && y + scrollY >= child.getTop() && y + scrollY < child.getBottom()
+ && canScroll(child, true, dx, x + scrollX - child.getLeft(),
+ y + scrollY - child.getTop())) {
+ return true;
+ }
+ }
+ }
+
+ return checkV && v.canScrollHorizontally(-dx);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ // Let the focused view and/or our descendants get the key first
+ return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+ }
+
+ /**
+ * You can call this function yourself to have the scroll view perform
+ * scrolling from a key event, just as if the event had been dispatched to
+ * it by the view hierarchy.
+ *
+ * @param event The key event to execute.
+ * @return Return true if the event was handled, else false.
+ */
+ public boolean executeKeyEvent(KeyEvent event) {
+ boolean handled = false;
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+ handled = pageLeft();
+ } else {
+ handled = arrowScroll(FOCUS_LEFT);
+ }
+ break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+ handled = pageRight();
+ } else {
+ handled = arrowScroll(FOCUS_RIGHT);
+ }
+ break;
+ case KeyEvent.KEYCODE_TAB:
+ if (event.hasNoModifiers()) {
+ handled = arrowScroll(FOCUS_FORWARD);
+ } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+ handled = arrowScroll(FOCUS_BACKWARD);
+ }
+ break;
+ }
+ }
+ return handled;
+ }
+
+ /**
+ * Handle scrolling in response to a left or right arrow click.
+ *
+ * @param direction The direction corresponding to the arrow key that was pressed. It should be
+ * either {@link View#FOCUS_LEFT} or {@link View#FOCUS_RIGHT}.
+ * @return Whether the scrolling was handled successfully.
+ */
+ public boolean arrowScroll(int direction) {
+ View currentFocused = findFocus();
+ if (currentFocused == this) {
+ currentFocused = null;
+ } else if (currentFocused != null) {
+ boolean isChild = false;
+ for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+ parent = parent.getParent()) {
+ if (parent == this) {
+ isChild = true;
+ break;
+ }
+ }
+ if (!isChild) {
+ // This would cause the focus search down below to fail in fun ways.
+ final StringBuilder sb = new StringBuilder();
+ sb.append(currentFocused.getClass().getSimpleName());
+ for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+ parent = parent.getParent()) {
+ sb.append(" => ").append(parent.getClass().getSimpleName());
+ }
+ Log.e(TAG, "arrowScroll tried to find focus based on non-child "
+ + "current focused view " + sb.toString());
+ currentFocused = null;
+ }
+ }
+
+ boolean handled = false;
+
+ View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused,
+ direction);
+ if (nextFocused != null && nextFocused != currentFocused) {
+ if (direction == View.FOCUS_LEFT) {
+ // If there is nothing to the left, or this is causing us to
+ // jump to the right, then what we really want to do is page left.
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft >= currLeft) {
+ handled = pageLeft();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ } else if (direction == View.FOCUS_RIGHT) {
+ // If there is nothing to the right, or this is causing us to
+ // jump to the left, then what we really want to do is page right.
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft <= currLeft) {
+ handled = pageRight();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ }
+ } else if (direction == FOCUS_LEFT || direction == FOCUS_BACKWARD) {
+ // Trying to move left and nothing there; try to page.
+ handled = pageLeft();
+ } else if (direction == FOCUS_RIGHT || direction == FOCUS_FORWARD) {
+ // Trying to move right and nothing there; try to page.
+ handled = pageRight();
+ }
+ if (handled) {
+ playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction));
+ }
+ return handled;
+ }
+
+ private Rect getChildRectInPagerCoordinates(Rect outRect, View child) {
+ if (outRect == null) {
+ outRect = new Rect();
+ }
+ if (child == null) {
+ outRect.set(0, 0, 0, 0);
+ return outRect;
+ }
+ outRect.left = child.getLeft();
+ outRect.right = child.getRight();
+ outRect.top = child.getTop();
+ outRect.bottom = child.getBottom();
+
+ ViewParent parent = child.getParent();
+ while (parent instanceof ViewGroup && parent != this) {
+ final ViewGroup group = (ViewGroup) parent;
+ outRect.left += group.getLeft();
+ outRect.right += group.getRight();
+ outRect.top += group.getTop();
+ outRect.bottom += group.getBottom();
+
+ parent = group.getParent();
+ }
+ return outRect;
+ }
+
+ boolean pageLeft() {
+ if (mCurItem > 0) {
+ setCurrentItem(mCurItem - 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ boolean pageRight() {
+ if (mAdapter != null && mCurItem < (mAdapter.getCount() - 1)) {
+ setCurrentItem(mCurItem + 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * We only want the current page that is being shown to be focusable.
+ */
+ @Override
+ public void addFocusables(ArrayList views, int direction, int focusableMode) {
+ final int focusableCount = views.size();
+
+ final int descendantFocusability = getDescendantFocusability();
+
+ if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) {
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ child.addFocusables(views, direction, focusableMode);
+ }
+ }
+ }
+ }
+
+ // we add ourselves (if focusable) in all cases except for when we are
+ // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable. this is
+ // to avoid the focus search finding layouts when a more precise search
+ // among the focusable children would be more interesting.
+ if (descendantFocusability != FOCUS_AFTER_DESCENDANTS
+ || (focusableCount == views.size())) { // No focusable descendants
+ // Note that we can't call the superclass here, because it will
+ // add all views in. So we need to do the same thing View does.
+ if (!isFocusable()) {
+ return;
+ }
+ if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE
+ && isInTouchMode() && !isFocusableInTouchMode()) {
+ return;
+ }
+ if (views != null) {
+ views.add(this);
+ }
+ }
+ }
+
+ /**
+ * We only want the current page that is being shown to be touchable.
+ */
+ @Override
+ public void addTouchables(ArrayList views) {
+ // Note that we don't call super.addTouchables(), which means that
+ // we don't call View.addTouchables(). This is okay because a ViewPager
+ // is itself not touchable.
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ child.addTouchables(views);
+ }
+ }
+ }
+ }
+
+ /**
+ * We only want the current page that is being shown to be focusable.
+ */
+ @Override
+ protected boolean onRequestFocusInDescendants(int direction,
+ Rect previouslyFocusedRect) {
+ int index;
+ int increment;
+ int end;
+ int count = getChildCount();
+ if ((direction & FOCUS_FORWARD) != 0) {
+ index = 0;
+ increment = 1;
+ end = count;
+ } else {
+ index = count - 1;
+ increment = -1;
+ end = -1;
+ }
+ for (int i = index; i != end; i += increment) {
+ View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ if (child.requestFocus(direction, previouslyFocusedRect)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ // Dispatch scroll events from this ViewPager.
+ if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ // Dispatch all other accessibility events from the current page.
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ final ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem
+ && child.dispatchPopulateAccessibilityEvent(event)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams();
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+ return generateDefaultLayoutParams();
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams && super.checkLayoutParams(p);
+ }
+
+ @Override
+ public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ class MyAccessibilityDelegate extends AccessibilityDelegateCompat {
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(host, event);
+ event.setClassName(MyViewPager.class.getName());
+ event.setScrollable(canScroll());
+ if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED && mAdapter != null) {
+ event.setItemCount(mAdapter.getCount());
+ event.setFromIndex(mCurItem);
+ event.setToIndex(mCurItem);
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setClassName(MyViewPager.class.getName());
+ info.setScrollable(canScroll());
+ if (canScrollHorizontally(1)) {
+ info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+ }
+ if (canScrollHorizontally(-1)) {
+ info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
+ }
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (super.performAccessibilityAction(host, action, args)) {
+ return true;
+ }
+ switch (action) {
+ case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
+ if (canScrollHorizontally(1)) {
+ setCurrentItem(mCurItem + 1);
+ return true;
+ }
+ } return false;
+ case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
+ if (canScrollHorizontally(-1)) {
+ setCurrentItem(mCurItem - 1);
+ return true;
+ }
+ } return false;
+ }
+ return false;
+ }
+
+ private boolean canScroll() {
+ return (mAdapter != null) && (mAdapter.getCount() > 1);
+ }
+ }
+
+ private class PagerObserver extends DataSetObserver {
+ PagerObserver() {
+ }
+
+ @Override
+ public void onChanged() {
+ dataSetChanged();
+ }
+ @Override
+ public void onInvalidated() {
+ dataSetChanged();
+ }
+ }
+
+ /**
+ * Layout parameters that should be supplied for views added to a
+ * ViewPager.
+ */
+ public static class LayoutParams extends ViewGroup.LayoutParams {
+ /**
+ * true if this view is a decoration on the pager itself and not
+ * a view supplied by the adapter.
+ */
+ public boolean isDecor;
+
+ /**
+ * Gravity setting for use on decor views only:
+ * Where to position the view page within the overall ViewPager
+ * container; constants are defined in {@link Gravity}.
+ */
+ public int gravity;
+
+ /**
+ * Width as a 0-1 multiplier of the measured pager width
+ */
+ float widthFactor = 0.f;
+
+ /**
+ * true if this view was added during layout and needs to be measured
+ * before being positioned.
+ */
+ boolean needsMeasure;
+
+ /**
+ * Adapter position this view is for if !isDecor
+ */
+ int position;
+
+ /**
+ * Current child index within the ViewPager that this view occupies
+ */
+ int childIndex;
+
+ public LayoutParams() {
+ super(MATCH_PARENT, MATCH_PARENT);
+ }
+
+ public LayoutParams(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+ gravity = a.getInteger(0, Gravity.TOP);
+ a.recycle();
+ }
+ }
+
+ static class ViewPositionComparator implements Comparator {
+ @Override
+ public int compare(View lhs, View rhs) {
+ final LayoutParams llp = (LayoutParams) lhs.getLayoutParams();
+ final LayoutParams rlp = (LayoutParams) rhs.getLayoutParams();
+ if (llp.isDecor != rlp.isDecor) {
+ return llp.isDecor ? 1 : -1;
+ }
+ return llp.position - rlp.position;
+ }
+ }
+}
diff --git a/AutoViewPager/src/main/java/com/ggz/autoviewpager/PageTransformerFactory.java b/AutoViewPager/src/main/java/com/ggz/autoviewpager/PageTransformerFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..3581c7dd6448b08117b0fbec2fd224d27c45f8a6
--- /dev/null
+++ b/AutoViewPager/src/main/java/com/ggz/autoviewpager/PageTransformerFactory.java
@@ -0,0 +1,141 @@
+package com.ggz.autoviewpager;
+
+import android.view.View;
+
+/*******************************************************************************
+ * Description: MyViewPager动画
+ *
+ * Author: Freeman
+ *
+ * Date: 2018/5/3
+ *
+ * Copyright: all rights reserved by Freeman.
+ *******************************************************************************/
+
+public class PageTransformerFactory {
+
+ public final static MyViewPager.PageTransformer getScaleTransformer(final MyViewPager viewPager,
+ final int mPagerPaddingLeft, final float defaultScale, final float defaultAlpha) {
+
+ return new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ position = (page.getLeft() - (viewPager.getScrollX() + mPagerPaddingLeft)) * 1.0f / viewPager.getWidth();
+ page.setPivotY(page.getHeight() / 2);
+ if (position >= -1 && position <= 0) { // 当前页面滑出屏幕(0-->-1)
+ float scaleRatio = (1 - defaultScale) * Math.abs(position);
+ float alpha = (1 - defaultAlpha) * Math.abs(position);
+ page.setScaleX(1 - scaleRatio);
+ page.setScaleY(1 - scaleRatio);
+ page.setPivotX(page.getWidth());
+ page.setAlpha(1 - alpha);
+ } else if (position > 0 && position <= 1) { // 新页面滑入(1-->0)
+ float scaleRatio = (1 - defaultScale) * (1 - position);
+ float alpha = (1 - defaultAlpha) * (1 - position);
+ page.setPivotX(0);
+ page.setScaleX(defaultScale + scaleRatio);
+ page.setScaleY(defaultScale + scaleRatio);
+ page.setAlpha(defaultAlpha + alpha);
+ } else {
+ /**
+ * Nothing
+ */
+ }
+ }
+ };
+ }
+
+ public final static MyViewPager.PageTransformer scaleTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ float defaultAlpha = 0.85f;
+ float defaultScale = 0.6f;
+ position = position - (int)position;
+ if (position >= -1 && position <= 0) { // 当前页面滑出屏幕(0-->-1)
+ float scaleRatio = (1 - defaultScale) * Math.abs(position);
+ page.setScaleX(1 - scaleRatio);
+ page.setScaleY(1 - scaleRatio);
+ page.setPivotX(0f);
+ page.setPivotX(page.getWidth());
+ float alpha = (1 - defaultAlpha) * Math.abs(position);
+ page.setAlpha(1 - alpha);
+ } else if (position > 0 && position <= 1) { // 新页面滑入(1-->0)
+ float scaleRatio = (1 - defaultScale) * (1 - position);
+ page.setPivotX(0);
+ page.setScaleX(defaultScale + scaleRatio);
+ page.setScaleY(defaultScale + scaleRatio);
+ float alpha = (1 - defaultAlpha) * (1 - position);
+ page.setAlpha(defaultAlpha + alpha);
+ } else {
+ /**
+ * Nothing
+ */
+ }
+ }
+ };
+
+ public final static MyViewPager.PageTransformer fadeTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ page.setAlpha(1 - Math.abs(position));
+ }
+ };
+
+ public final static MyViewPager.PageTransformer flipTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ if (position > 0) {
+ page.setTranslationX(-page.getWidth() * position);
+ }
+ page.setPivotX(0);
+ page.setAlpha(1 - Math.abs(position));
+ page.setRotationY(90 * position);
+ page.setCameraDistance(10000);
+ }
+ };
+
+ public final static MyViewPager.PageTransformer rotateTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ page.setPivotX(page.getWidth()/2);
+ page.setTranslationX(-page.getWidth() * position);
+ page.setRotationY(90 * position);
+ page.setCameraDistance(10000);
+ page.setAlpha(1 - Math.abs(position));
+ }
+ };
+
+ public final static MyViewPager.PageTransformer turntableTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ page.setRotation(40 * position);
+ page.setTranslationX(800 * position);
+ }
+ };
+
+ public final static MyViewPager.PageTransformer squareTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ if (position >= -1 && position <= 0) {
+ page.setPivotX(page.getWidth());
+ } else {
+ page.setPivotX(0);
+ }
+ page.setRotationY(90 *position);
+ page.setCameraDistance(10000);
+ }
+ };
+
+ public final static MyViewPager.PageTransformer cascadingTransformer = new MyViewPager.PageTransformer() {
+ @Override
+ public void transformPage(View page, float position) {
+ if (position >= -1 && position <= 0) {
+ page.setTranslationX(-page.getWidth() * position);
+ page.setAlpha(1 - Math.abs(position));
+ page.setScaleX(1 + 0.5f * position);
+ page.setScaleY(1 + 0.5f * position);
+ page.setCameraDistance(10000);
+ }
+ }
+ };
+}
diff --git a/AutoViewPager/src/main/res/values/attrs.xml b/AutoViewPager/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1d2a3e6457daa229d8460b7cf7d9fbabb9a49023
--- /dev/null
+++ b/AutoViewPager/src/main/res/values/attrs.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AutoViewPager/src/main/res/values/strings.xml b/AutoViewPager/src/main/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..20d77fe87a450ef6cb677a57591a95e42c2abe4a
--- /dev/null
+++ b/AutoViewPager/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ AutoViewPager
+
diff --git a/AutoViewPager/src/test/java/com/ggz/autoviewpager/ExampleUnitTest.java b/AutoViewPager/src/test/java/com/ggz/autoviewpager/ExampleUnitTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..669019df0f537c58079f643b82e4a0ab0f508f08
--- /dev/null
+++ b/AutoViewPager/src/test/java/com/ggz/autoviewpager/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.ggz.autoviewpager;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/H264/build.gradle b/H264/build.gradle
index f8280621c107ea2f78a8bc53eee9a30469046bf1..ffc66371710ef1946bf1fa0752ba708bdfe936b0 100644
--- a/H264/build.gradle
+++ b/H264/build.gradle
@@ -13,7 +13,6 @@ android {
versionCode 1
versionName "1.0"
- consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
@@ -35,15 +34,15 @@ android {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.1'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
implementation project(path: ':code_h264')
implementation 'net.butterflytv.utils:rtmp-client:3.0.1'
/*网络okhttp引入*/
- implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
- implementation 'com.squareup.okio:okio:3.0.0-alpha.5'
+ implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.3'
+ implementation 'com.squareup.okio:okio:3.0.0'
}
\ No newline at end of file
diff --git a/JsonViewer/.gitignore b/JsonViewer/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3bd8ae1faeeb7a8a26e5f86ae6191facfd82b878
--- /dev/null
+++ b/JsonViewer/.gitignore
@@ -0,0 +1,16 @@
+*.iml
+.gradle
+.gradle/
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+/.idea
+.idea/
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/JsonViewer/build.gradle b/JsonViewer/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..13c42b5e192bddf608905e3df575e900ed80ee9e
--- /dev/null
+++ b/JsonViewer/build.gradle
@@ -0,0 +1,50 @@
+plugins {
+ id 'com.android.library'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ compileSdk 30
+
+ defaultConfig {
+ minSdk 24
+ targetSdk 30
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion. VERSION_11
+ targetCompatibility JavaVersion. VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
+}
+
+tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
+ kotlinOptions {
+ // Treat all Kotlin warnings as errors
+ allWarningsAsErrors = false
+ freeCompilerArgs += '-Xopt-in=kotlin.RequiresOptIn'
+ // Enable experimental coroutines APIs, including Flow
+ freeCompilerArgs += '-Xopt-in=kotlin.Experimental'
+
+ // Set JVM target to 11
+ jvmTarget = "11"
+ }
+}
\ No newline at end of file
diff --git a/JsonViewer/consumer-rules.pro b/JsonViewer/consumer-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/JsonViewer/proguard-rules.pro b/JsonViewer/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..481bb434814107eb79d7a30b676d344b0df2f8ce
--- /dev/null
+++ b/JsonViewer/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/JsonViewer/src/main/AndroidManifest.xml b/JsonViewer/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..62b7f443e31b9849ace18ac7b40e43668a4512f4
--- /dev/null
+++ b/JsonViewer/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/JsonViewer/src/main/java/com/weibo/json/viewer/WBJsonRecyclerView.kt b/JsonViewer/src/main/java/com/weibo/json/viewer/WBJsonRecyclerView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..756b0c6c9501093dd53d9dac67cd6a4f1c445bc0
--- /dev/null
+++ b/JsonViewer/src/main/java/com/weibo/json/viewer/WBJsonRecyclerView.kt
@@ -0,0 +1,194 @@
+package com.weibo.json.viewer
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewParent
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.weibo.json.viewer.adapter.WBBaseJsonViewerAdapter
+import com.weibo.json.viewer.adapter.WBJsonViewerAdapter
+import com.weibo.json.viewer.view.WBJsonItemView
+import org.json.JSONArray
+import org.json.JSONObject
+import kotlin.math.sqrt
+
+class WBJsonRecyclerView : RecyclerView {
+
+ private var mAdapter: WBJsonViewerAdapter? = null
+ var mode = 0
+ var oldDist = 0f
+
+ var mSuperParentDisallow = 0 //事件拦截几层父类消耗事件
+
+ constructor(context: Context) : super(context) {
+ initView()
+ }
+
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView()
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
+ context,
+ attrs,
+ defStyle
+ ) {
+ initView()
+ }
+
+ private fun initView() {
+ layoutManager = LinearLayoutManager(context)
+ }
+
+ fun bindJson(jsonStr: String?) {
+ mAdapter = null
+ mAdapter = WBJsonViewerAdapter(jsonStr)
+ adapter = mAdapter
+ }
+
+ fun bindJson(array: JSONArray?) {
+ mAdapter = null
+ mAdapter = WBJsonViewerAdapter(array)
+ adapter = mAdapter
+ }
+
+ fun bindJson(jsonObject: JSONObject?) {
+ mAdapter = null
+ mAdapter = WBJsonViewerAdapter(jsonObject)
+ adapter = mAdapter
+ }
+
+ override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
+ var currentParentView: ViewParent? = parent
+ if (mSuperParentDisallow > 0) {
+
+ for (i in 1..mSuperParentDisallow) {
+ if (i == 1) {
+ continue
+ }
+ currentParentView = currentParentView?.parent
+ }
+
+
+ if (ev?.action == MotionEvent.ACTION_DOWN) {
+ currentParentView?.requestDisallowInterceptTouchEvent(true);
+ } else if (ev?.action == MotionEvent.ACTION_UP || ev?.action == MotionEvent.ACTION_CANCEL) {
+ currentParentView?.requestDisallowInterceptTouchEvent(false);
+ }
+ }
+
+ return super.dispatchTouchEvent(ev)
+ }
+
+ fun setKeyColor(color: Int) {
+ WBBaseJsonViewerAdapter.KEY_COLOR = color
+ }
+
+ fun setValueTextColor(color: Int) {
+ WBBaseJsonViewerAdapter.TEXT_COLOR = color
+ }
+
+ fun setValueNumberColor(color: Int) {
+ WBBaseJsonViewerAdapter.NUMBER_COLOR = color
+ }
+
+ fun setValueBooleanColor(color: Int) {
+ WBBaseJsonViewerAdapter.BOOLEAN_COLOR = color
+ }
+
+ fun setValueUrlColor(color: Int) {
+ WBBaseJsonViewerAdapter.URL_COLOR = color
+ }
+
+ fun setValueNullColor(color: Int) {
+ WBBaseJsonViewerAdapter.NUMBER_COLOR = color
+ }
+
+ fun setBracesColor(color: Int) {
+ WBBaseJsonViewerAdapter.BRACES_COLOR = color
+ }
+
+ private fun setTextSize(textSizeDP: Float) {
+ var sizeDP = textSizeDP
+ if (sizeDP < 10) {
+ sizeDP = 10f
+ } else if (sizeDP > 30) {
+ sizeDP = 30f
+ }
+ if (WBBaseJsonViewerAdapter.TEXT_SIZE_DP != sizeDP) {
+ WBBaseJsonViewerAdapter.TEXT_SIZE_DP = sizeDP
+ if (mAdapter != null) {
+ updateAll(sizeDP)
+ }
+ }
+ }
+
+ fun setScaleEnable(enable: Boolean) {
+ if (enable) {
+ addOnItemTouchListener(touchListener)
+ } else {
+ removeOnItemTouchListener(touchListener)
+ }
+ }
+
+ fun updateAll(textSize: Float) {
+ val manager = layoutManager
+ val count = manager?.childCount ?: 0
+ for (i in 0 until count) {
+ val view = manager?.getChildAt(i)
+ loop(view, textSize)
+ }
+ }
+
+ private fun loop(view: View?, textSize: Float) {
+ if (view is WBJsonItemView) {
+ val group: WBJsonItemView = view as WBJsonItemView
+ group.setTextSize(textSize)
+ val childCount: Int = group.childCount
+ for (i in 0 until childCount) {
+ val view1: View = group.getChildAt(i)
+ loop(view1, textSize)
+ }
+ }
+ }
+
+ private fun zoom(f: Float) {
+ setTextSize(WBBaseJsonViewerAdapter.TEXT_SIZE_DP * f)
+ }
+
+ private fun spacing(event: MotionEvent): Float {
+ val x = event.getX(0) - event.getX(1)
+ val y = event.getY(0) - event.getY(1)
+ return sqrt((x * x + y * y).toDouble()).toFloat()
+ }
+
+ private val touchListener: OnItemTouchListener = object : OnItemTouchListener {
+ override fun onInterceptTouchEvent(rv: RecyclerView, event: MotionEvent): Boolean {
+ when (event.action and event.actionMasked) {
+ MotionEvent.ACTION_DOWN -> mode = 1
+ MotionEvent.ACTION_UP -> mode = 0
+ MotionEvent.ACTION_POINTER_UP -> mode -= 1
+ MotionEvent.ACTION_POINTER_DOWN -> {
+ oldDist = spacing(event)
+ mode += 1
+ }
+ MotionEvent.ACTION_MOVE -> if (mode >= 2) {
+ val newDist = spacing(event)
+ if (Math.abs(newDist - oldDist) > 0.5f) {
+ zoom(newDist / oldDist)
+ oldDist = newDist
+ }
+ }
+ }
+ return false
+ }
+
+ override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
+ }
+
+ override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
+ }
+
+}
\ No newline at end of file
diff --git a/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBBaseJsonViewerAdapter.kt b/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBBaseJsonViewerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..118ce7bc20c1f9cac42a30556898b40a3b4ab7b2
--- /dev/null
+++ b/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBBaseJsonViewerAdapter.kt
@@ -0,0 +1,33 @@
+package com.weibo.json.viewer.adapter
+
+import androidx.recyclerview.widget.RecyclerView
+
+abstract class WBBaseJsonViewerAdapter :
+ RecyclerView.Adapter() {
+
+ companion object {
+ @JvmStatic
+ var KEY_COLOR = -0x6dd867
+
+ @JvmStatic
+ var TEXT_COLOR = -0xc54ab6
+
+ @JvmStatic
+ var NUMBER_COLOR = -0xda551e
+
+ @JvmStatic
+ var BOOLEAN_COLOR = -0x67d80
+
+ @JvmStatic
+ var URL_COLOR = -0x992d2b
+
+ @JvmStatic
+ var NULL_COLOR = -0x10a6cb
+
+ @JvmStatic
+ var BRACES_COLOR = -0xb5aaa1
+
+ @JvmStatic
+ var TEXT_SIZE_DP = 12f
+ }
+}
\ No newline at end of file
diff --git a/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBJsonViewerAdapter.kt b/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBJsonViewerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a4147cf4dde691d77a81b7b4f1e2c9ffef65656c
--- /dev/null
+++ b/JsonViewer/src/main/java/com/weibo/json/viewer/adapter/WBJsonViewerAdapter.kt
@@ -0,0 +1,378 @@
+package com.weibo.json.viewer.adapter
+
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import android.text.style.ForegroundColorSpan
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.weibo.json.viewer.utils.Utils
+import com.weibo.json.viewer.view.WBJsonItemView
+import org.json.JSONArray
+import org.json.JSONException
+import org.json.JSONObject
+import org.json.JSONTokener
+
+class WBJsonViewerAdapter : WBBaseJsonViewerAdapter {
+
+ private var jsonStr: String? = null
+
+ private var mJSONObject: JSONObject? = null
+ private var mJSONArray: JSONArray? = null
+
+ constructor(jsonStr: String?) {
+ this.jsonStr = jsonStr
+ var objectData: Any? = null
+ try {
+ objectData = JSONTokener(jsonStr).nextValue()
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ if (objectData != null && objectData is JSONObject) {
+ mJSONObject = objectData
+ } else if (objectData != null && objectData is JSONArray) {
+ mJSONArray = objectData
+ } else {
+ throw IllegalArgumentException("jsonStr is illegal.")
+ }
+ }
+
+ constructor(jsonObject: JSONObject?) {
+ mJSONObject = jsonObject
+ requireNotNull(mJSONObject) { "jsonObject can not be null." }
+ }
+
+ constructor(jsonArray: JSONArray?) {
+ mJSONArray = jsonArray
+ requireNotNull(mJSONArray) { "jsonArray can not be null." }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WBJsonItemViewHolder {
+ return WBJsonItemViewHolder(WBJsonItemView(parent.context))
+ }
+
+ override fun onBindViewHolder(holder: WBJsonItemViewHolder, position: Int) {
+ val itemView: WBJsonItemView = holder.mMyItemView
+ itemView.setTextSize(WBBaseJsonViewerAdapter.TEXT_SIZE_DP)
+ itemView.setRightColor(WBBaseJsonViewerAdapter.BRACES_COLOR)
+ if (mJSONObject != null) {
+ if (position == 0) {
+ itemView.hideLeft()
+ itemView.hideIcon()
+ itemView.showRight("{")
+ return
+ } else if (position == getItemCount() - 1) {
+ itemView.hideLeft()
+ itemView.hideIcon()
+ itemView.showRight("}")
+ return
+ } else if (mJSONObject?.names() == null) {
+ return
+ }
+ val key = mJSONObject?.names()?.optString(position - 1)?:"" // 遍历key
+ val value = mJSONObject!!.opt(key)
+ if (position < getItemCount() - 2) {
+ handleJsonObject(key, value, itemView, true, 1)
+ } else {
+ handleJsonObject(key, value, itemView, false, 1) // 最后一组,结尾不需要逗号
+ }
+ }
+ if (mJSONArray != null) {
+ if (position == 0) {
+ itemView.hideLeft()
+ itemView.hideIcon()
+ itemView.showRight("[")
+ return
+ } else if (position == getItemCount() - 1) {
+ itemView.hideLeft()
+ itemView.hideIcon()
+ itemView.showRight("]")
+ return
+ }
+ val value = mJSONArray!!.opt(position - 1) // 遍历array
+ if (position < getItemCount() - 2) {
+ handleJsonArray(value, itemView, true, 1)
+ } else {
+ handleJsonArray(value, itemView, false, 1) // 最后一组,结尾不需要逗号
+ }
+ }
+ }
+
+ override fun getItemCount(): Int {
+ if (mJSONObject != null) {
+ return if (mJSONObject!!.names() != null) {
+ mJSONObject!!.names().length() + 2
+ } else {
+ 2
+ }
+ }
+ return if (mJSONArray != null) {
+ mJSONArray!!.length() + 2
+ } else 0
+ }
+
+ /**
+ * 处理 value 上级为 JsonObject 的情况,value有key
+ *
+ * @param value
+ * @param key
+ * @param itemView
+ * @param appendComma
+ * @param hierarchy
+ */
+ private fun handleJsonObject(
+ key: String,
+ value: Any,
+ itemView: WBJsonItemView,
+ appendComma: Boolean,
+ hierarchy: Int
+ ) {
+ val keyBuilder =
+ SpannableStringBuilder(Utils.getHierarchyStr(hierarchy))
+ keyBuilder.append("\"").append(key).append("\"").append(":")
+ keyBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.KEY_COLOR),
+ 0,
+ keyBuilder.length - 1,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ keyBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.BRACES_COLOR),
+ keyBuilder.length - 1,
+ keyBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ itemView.showLeft(keyBuilder)
+ handleValue(value, itemView, appendComma, hierarchy)
+ }
+
+ /**
+ * 处理 value 上级为 JsonArray 的情况,value无key
+ *
+ * @param value
+ * @param itemView
+ * @param appendComma 结尾是否需要逗号(最后一组 value 不需要逗号)
+ * @param hierarchy 缩进层级
+ */
+ fun handleJsonArray(
+ value: Any,
+ itemView: WBJsonItemView,
+ appendComma: Boolean,
+ hierarchy: Int
+ ) {
+ itemView.showLeft(
+ SpannableStringBuilder(
+ Utils.getHierarchyStr(
+ hierarchy
+ )
+ )
+ )
+ handleValue(value, itemView, appendComma, hierarchy)
+ }
+
+ /**
+ * @param value
+ * @param itemView
+ * @param appendComma 结尾是否需要逗号(最后一组 key:value 不需要逗号)
+ * @param hierarchy 缩进层级
+ */
+ private fun handleValue(
+ value: Any?,
+ itemView: WBJsonItemView,
+ appendComma: Boolean,
+ hierarchy: Int
+ ) {
+ val valueBuilder = SpannableStringBuilder()
+ if (value is Number) {
+ valueBuilder.append(value.toString())
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.NUMBER_COLOR),
+ 0,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ } else if (value is Boolean) {
+ valueBuilder.append(value.toString())
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.BOOLEAN_COLOR),
+ 0,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ } else if (value is JSONObject) {
+ itemView.showIcon(true)
+ valueBuilder.append("Object{...}")
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.BRACES_COLOR),
+ 0,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ itemView.setIconClickListener(
+ JsonItemClickListener(
+ value,
+ itemView,
+ appendComma,
+ hierarchy + 1
+ )
+ )
+ } else if (value is JSONArray) {
+ itemView.showIcon(true)
+ valueBuilder.append("Array[").append(value.length().toString()).append("]")
+ val len = valueBuilder.length
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.BRACES_COLOR),
+ 0,
+ 6,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.NUMBER_COLOR),
+ 6,
+ len - 1,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.BRACES_COLOR),
+ len - 1,
+ len,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ itemView.setIconClickListener(
+ JsonItemClickListener(
+ value,
+ itemView,
+ appendComma,
+ hierarchy + 1
+ )
+ )
+ } else if (value is String) {
+ itemView.hideIcon()
+ valueBuilder.append("\"").append(value.toString()).append("\"")
+ if (Utils.isUrl(value.toString())) {
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.TEXT_COLOR),
+ 0,
+ 1,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.URL_COLOR),
+ 1,
+ valueBuilder.length - 1,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.TEXT_COLOR),
+ valueBuilder.length - 1,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ } else {
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.TEXT_COLOR),
+ 0,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ }
+ } else if (valueBuilder.length == 0 || value == null) {
+ itemView.hideIcon()
+ valueBuilder.append("null")
+ valueBuilder.setSpan(
+ ForegroundColorSpan(WBBaseJsonViewerAdapter.NULL_COLOR),
+ 0,
+ valueBuilder.length,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ }
+ if (appendComma) {
+ valueBuilder.append(",")
+ }
+ itemView.showRight(valueBuilder)
+ }
+
+ inner class JsonItemClickListener(
+ private val value: Any?,
+ itemView: WBJsonItemView,
+ appendComma: Boolean,
+ hierarchy: Int
+ ) :
+ View.OnClickListener {
+ private val itemView: WBJsonItemView
+ private val appendComma: Boolean
+ private val hierarchy: Int
+ private var isCollapsed = true
+ private val isJsonArray: Boolean
+ override fun onClick(view: View) {
+ if (itemView.getChildCount() == 1) { // 初始(折叠) --> 展开""
+ isCollapsed = false
+ itemView.showIcon(false)
+ itemView.setTag(itemView.getRightText())
+ itemView.showRight(if (isJsonArray) "[" else "{")
+ val array =
+ if (isJsonArray) value as JSONArray? else (value as JSONObject?)!!.names()
+ var i = 0
+ while (array != null && i < array.length()) {
+ val childItemView = WBJsonItemView(itemView.getContext())
+ childItemView.setTextSize(WBBaseJsonViewerAdapter.TEXT_SIZE_DP)
+ childItemView.setRightColor(WBBaseJsonViewerAdapter.BRACES_COLOR)
+ val childValue = array.opt(i)
+ if (isJsonArray) {
+ handleJsonArray(
+ childValue,
+ childItemView,
+ i < array.length() - 1,
+ hierarchy
+ )
+ } else {
+ handleJsonObject(
+ childValue as String, (value as JSONObject?)!!.opt(
+ childValue
+ ), childItemView, i < array.length() - 1, hierarchy
+ )
+ }
+ itemView.addViewNoInvalidate(childItemView)
+ i++
+ }
+ val childItemView = WBJsonItemView(itemView.getContext())
+ childItemView.setTextSize(WBBaseJsonViewerAdapter.TEXT_SIZE_DP)
+ childItemView.setRightColor(WBBaseJsonViewerAdapter.BRACES_COLOR)
+ val builder: StringBuilder =
+ StringBuilder(Utils.getHierarchyStr(hierarchy - 1))
+ builder.append(if (isJsonArray) "]" else "}").append(if (appendComma) "," else "")
+ childItemView.showRight(builder)
+ itemView.addViewNoInvalidate(childItemView)
+ itemView.requestLayout()
+ itemView.invalidate()
+ } else { // 折叠 <--> 展开
+ val temp: CharSequence? = itemView.getRightText()
+ itemView.showRight(itemView.getTag() as CharSequence)
+ itemView.setTag(temp)
+ itemView.showIcon(!isCollapsed)
+ for (i in 1 until itemView.getChildCount()) {
+ itemView.getChildAt(i)
+ .setVisibility(if (isCollapsed) View.VISIBLE else View.GONE)
+ }
+ isCollapsed = !isCollapsed
+ }
+ }
+
+ init {
+ this.itemView = itemView
+ this.appendComma = appendComma
+ this.hierarchy = hierarchy
+ isJsonArray = value != null && value is JSONArray
+ }
+ }
+
+ inner class WBJsonItemViewHolder(myItemView: WBJsonItemView) :
+ RecyclerView.ViewHolder(myItemView) {
+ var mMyItemView: WBJsonItemView = myItemView
+
+ init {
+ setIsRecyclable(false)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/JsonViewer/src/main/java/com/weibo/json/viewer/utils/Utils.kt b/JsonViewer/src/main/java/com/weibo/json/viewer/utils/Utils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3aa03a2adec98d23c5f5874cbe17598e6d32c7c8
--- /dev/null
+++ b/JsonViewer/src/main/java/com/weibo/json/viewer/utils/Utils.kt
@@ -0,0 +1,77 @@
+package com.weibo.json.viewer.utils
+
+import java.util.regex.Pattern
+
+object Utils {
+
+ private val urlPattern = Pattern.compile(
+ "^((https|http|ftp|rtsp|mms)?://)"
+ + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
+ + "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
+ + "|" // 允许IP和DOMAIN(域名)
+ + "([0-9a-z_!~*'()-]+\\.)*" // 域名- www.
+ + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名
+ + "[a-z]{2,6})" // first level domain- .com or .museum
+ + "(:[0-9]{1,4})?" // 端口- :80
+ + "((/?)|" // a slash isn't required if there is no file name
+ + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"
+ )
+
+ /**
+ * 判断字符串是否是url
+ *
+ * @param str
+ * @return
+ */
+ fun isUrl(str: String?): Boolean {
+ return urlPattern.matcher(str).matches()
+ }
+
+ /**
+ * json 格式化缩进(格式化前不能有缩进,最好是格式化从服务端下发的)
+ *
+ * @param jsonStr
+ * @return
+ */
+ fun jsonFormat(jsonStr: String?): String? {
+ if (jsonStr == null) return ""
+ var level = 0
+ val builder = StringBuilder()
+ for (i in 0 until jsonStr.length) {
+ val c = jsonStr[i]
+ if (level > 0 && '\n' == builder[builder.length - 1]) {
+ builder.append(getHierarchyStr(level))
+ }
+ when (c) {
+ '{', '[' -> {
+ builder.append(c).append("\n")
+ level++
+ }
+ ',' -> builder.append(c).append("\n")
+ '}', ']' -> {
+ builder.append("\n")
+ level--
+ builder.append(getHierarchyStr(level))
+ builder.append(c)
+ }
+ else -> builder.append(c)
+ }
+ }
+ return builder.toString()
+ }
+
+ /**
+ * 对应层级前面所需的空格数
+ *
+ * @param hierarchy 缩进层级
+ * @return
+ */
+ fun getHierarchyStr(hierarchy: Int): String? {
+ val levelStr = StringBuilder()
+ for (levelI in 0 until hierarchy) {
+ levelStr.append(" ")
+ }
+ return levelStr.toString()
+ }
+
+}
\ No newline at end of file
diff --git a/JsonViewer/src/main/java/com/weibo/json/viewer/view/WBJsonItemView.kt b/JsonViewer/src/main/java/com/weibo/json/viewer/view/WBJsonItemView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8f496bd5f326fa897a7736774e4e67b9778d475c
--- /dev/null
+++ b/JsonViewer/src/main/java/com/weibo/json/viewer/view/WBJsonItemView.kt
@@ -0,0 +1,129 @@
+package com.weibo.json.viewer.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.util.TypedValue
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.weibo.json.viewer.R
+import com.weibo.json.viewer.adapter.WBBaseJsonViewerAdapter
+
+open class WBJsonItemView : LinearLayout {
+ private var TEXT_SIZE_DP = 12
+
+ private var mContext: Context? = null
+
+ private var mTvLeft: TextView? = null
+ private var mTvRight: TextView? = null
+ private var mIvIcon: ImageView? = null
+
+ constructor(context: Context?) : super(context) {
+ mContext = context
+ initView()
+ }
+
+ constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
+ mContext = context
+ initView()
+ }
+
+ constructor(
+ context: Context?,
+ attrs: AttributeSet?,
+ defStyleAttr: Int
+ ) : super(context, attrs, defStyleAttr) {
+ mContext = context
+ initView()
+ }
+
+ private fun initView() {
+ orientation = VERTICAL
+ LayoutInflater.from(mContext).inflate(R.layout.jsonviewer_layout_item_view, this, true)
+ mTvLeft = findViewById(R.id.tv_left)
+ mTvRight = findViewById(R.id.tv_right)
+ mIvIcon = findViewById(R.id.iv_icon)
+ }
+
+ fun setTextSize(textViewSizeDp: Float) {
+ var textSizeDp = textViewSizeDp
+ if (textSizeDp < 12) {
+ textSizeDp = 12f
+ } else if (textSizeDp > 30) {
+ textSizeDp = 30f
+ }
+ TEXT_SIZE_DP = textSizeDp.toInt()
+ mTvLeft?.textSize = TEXT_SIZE_DP.toFloat()
+ mTvRight?.textSize = TEXT_SIZE_DP.toFloat()
+ mTvRight?.setTextColor(WBBaseJsonViewerAdapter.BRACES_COLOR)
+
+ // align the vertically expand/collapse icon to the text
+ val textSize = TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_DIP,
+ TEXT_SIZE_DP.toFloat(),
+ resources.displayMetrics
+ )
+ .toInt()
+ val layoutParams = mIvIcon?.layoutParams as LayoutParams
+ layoutParams.height = textSize
+ layoutParams.width = textSize
+ layoutParams.topMargin = textSize / 5
+ mIvIcon?.layoutParams = layoutParams
+ }
+
+ fun setRightColor(color: Int) {
+ mTvRight?.setTextColor(color)
+ }
+
+ fun hideLeft() {
+ mTvLeft?.visibility = GONE
+ }
+
+ fun showLeft(text: CharSequence?) {
+ mTvLeft?.visibility = VISIBLE
+ if (text != null) {
+ mTvLeft?.text = text
+ }
+ }
+
+ fun hideRight() {
+ mTvRight?.visibility = GONE
+ }
+
+ fun showRight(text: CharSequence?) {
+ mTvRight?.visibility = VISIBLE
+ if (text != null) {
+ mTvRight?.text = text
+ }
+ }
+
+ fun getRightText(): CharSequence? {
+ return mTvRight?.text
+ }
+
+ fun hideIcon() {
+ mIvIcon?.visibility = GONE
+ }
+
+ fun showIcon(isPlus: Boolean) {
+ mIvIcon?.visibility = VISIBLE
+ mIvIcon?.setImageResource(if (isPlus) R.drawable.jsonviewer_plus else R.drawable.jsonviewer_minus)
+ mIvIcon?.contentDescription =
+ resources.getString(if (isPlus) R.string.jsonViewer_icon_plus else R.string.jsonViewer_icon_minus)
+ }
+
+ fun setIconClickListener(listener: OnClickListener?) {
+ mIvIcon!!.setOnClickListener(listener)
+ }
+
+ fun addViewNoInvalidate(child: View) {
+ var params = child.layoutParams
+ if (params == null) {
+ params = generateDefaultLayoutParams()
+ requireNotNull(params) { "generateDefaultLayoutParams() cannot return null" }
+ }
+ addViewInLayout(child, -1, params)
+ }
+}
\ No newline at end of file
diff --git a/JsonViewer/src/main/res/drawable/jsonviewer_minus.xml b/JsonViewer/src/main/res/drawable/jsonviewer_minus.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d7ec09a4dacf34ee0a1217d2eef5a59008292aad
--- /dev/null
+++ b/JsonViewer/src/main/res/drawable/jsonviewer_minus.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/JsonViewer/src/main/res/drawable/jsonviewer_plus.xml b/JsonViewer/src/main/res/drawable/jsonviewer_plus.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b41fc3102b6b5026e23ba992f7d98812d5c9f0ef
--- /dev/null
+++ b/JsonViewer/src/main/res/drawable/jsonviewer_plus.xml
@@ -0,0 +1,24 @@
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/JsonViewer/src/main/res/layout/jsonviewer_layout_item_view.xml b/JsonViewer/src/main/res/layout/jsonviewer_layout_item_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1310baf76c8792f09e1d4ed13f7e4b01cecb41ef
--- /dev/null
+++ b/JsonViewer/src/main/res/layout/jsonviewer_layout_item_view.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/JsonViewer/src/main/res/values/strings.xml b/JsonViewer/src/main/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0d7205ed0ce1424ad53c5b73bf33afc806cc3dc4
--- /dev/null
+++ b/JsonViewer/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ expand
+ collapse
+
diff --git a/LongImage/.gitignore b/LongImage/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b0d7942b799edcb52ebdb517a4b63e3c3cd17228
--- /dev/null
+++ b/LongImage/.gitignore
@@ -0,0 +1,17 @@
+*.iml
+.gradle
+.gradle/
+gradle/
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+/.idea
+.idea/
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/LongImage/build.gradle b/LongImage/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..1ebe4faee95cbf2e27113794adaa4c030f60aca2
--- /dev/null
+++ b/LongImage/build.gradle
@@ -0,0 +1,38 @@
+plugins {
+ id 'com.android.library'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ compileSdk 30
+
+ defaultConfig {
+ minSdk 23
+ targetSdk 30
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
+}
\ No newline at end of file
diff --git a/LongImage/proguard-rules.pro b/LongImage/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..481bb434814107eb79d7a30b676d344b0df2f8ce
--- /dev/null
+++ b/LongImage/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/LongImage/src/androidTest/java/com/ggz/picture/ExampleInstrumentedTest.kt b/LongImage/src/androidTest/java/com/ggz/picture/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..13700482769d39f8016b36ac240476f7ba7ad1f1
--- /dev/null
+++ b/LongImage/src/androidTest/java/com/ggz/picture/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.ggz.picture
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.ggz.picture", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/LongImage/src/main/AndroidManifest.xml b/LongImage/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2390e32c9a43bee46c58f13719a84b928ee92f6c
--- /dev/null
+++ b/LongImage/src/main/AndroidManifest.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LongImage/src/main/assets/long_pic.jpeg b/LongImage/src/main/assets/long_pic.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..eb1359cd68505f1ce7e9ad8a4077866e46bda39d
Binary files /dev/null and b/LongImage/src/main/assets/long_pic.jpeg differ
diff --git a/LongImage/src/main/java/com/ggz/picture/LongImage.kt b/LongImage/src/main/java/com/ggz/picture/LongImage.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3c81d1372de534729d71d38bc832418f3a74e87c
--- /dev/null
+++ b/LongImage/src/main/java/com/ggz/picture/LongImage.kt
@@ -0,0 +1,162 @@
+package com.ggz.picture
+
+import android.content.Context
+import android.graphics.*
+import android.os.AsyncTask
+import android.util.AttributeSet
+import android.util.Log
+import android.view.ViewTreeObserver
+import java.lang.ref.WeakReference
+
+class LongImageView : androidx.appcompat.widget.AppCompatImageView {
+
+ companion object {
+ const val TAG = "LongImageView"
+ const val LONG_PIC_PATH = "long_pic.jpeg"
+ }
+
+ private lateinit var mContext: Context
+
+ private lateinit var mBitmapRegionDecoder: BitmapRegionDecoder
+
+ private var mBitmapArray = arrayOfNulls(6)
+
+ var mPreDrawListener: ViewTreeObserver.OnPreDrawListener =
+ ViewTreeObserver.OnPreDrawListener {
+ var rect = Rect()
+ getLocalVisibleRect(rect)
+ Log.d(TAG, "top = $top; rect.top = ${rect.top}; rect.bottom= ${rect.bottom};")
+ true
+ }
+
+ constructor(context: Context) : super(context) {
+ initView(context)
+ }
+
+ constructor(context: Context, attr: AttributeSet) : super(context, attr) {
+ initView(context)
+ }
+
+ constructor(context: Context, attr: AttributeSet, def: Int) : super(context, attr, def) {
+ initView(context)
+ }
+
+
+ fun initView(context: Context) {
+ mContext = context
+
+ //获取图片宽、高度
+ var longImageInput = mContext.assets.open(LONG_PIC_PATH)
+ var temOption: BitmapFactory.Options = BitmapFactory.Options()
+ temOption.inJustDecodeBounds = true
+ BitmapFactory.decodeStream(longImageInput, null, temOption)
+ var longImageWidth: Int = temOption.outWidth
+ var longImageHeight: Int = temOption.outHeight
+ Log.d(TAG, "longImageWidth = $longImageWidth ; longImageHeight = $longImageHeight")
+ post {
+ layoutParams.width = longImageWidth
+ layoutParams.height = longImageHeight
+ }
+
+ //显示区域图片
+ mBitmapRegionDecoder = BitmapRegionDecoder.newInstance(longImageInput, false)
+ var options: BitmapFactory.Options = BitmapFactory.Options()
+ options.inPreferredConfig = Bitmap.Config.RGB_565
+ var bitmap: Bitmap = mBitmapRegionDecoder.decodeRegion(
+ Rect(
+ 0,
+ 0,
+ longImageWidth,
+ longImageHeight / 5
+ ), options
+ )
+
+ setImageBitmap(bitmap)
+
+ }
+
+ fun createBitMaps() {
+ //获取图片宽、高度
+ var longImageInput = mContext.assets.open(LONG_PIC_PATH)
+ var temOption: BitmapFactory.Options = BitmapFactory.Options()
+ temOption.inJustDecodeBounds = true
+ BitmapFactory.decodeStream(longImageInput, null, temOption)
+ var longImageWidth: Int = temOption.outWidth
+ var longImageHeight: Int = temOption.outHeight
+ Log.d(TAG, "longImageWidth = $longImageWidth ; longImageHeight = $longImageHeight")
+
+ var screenHeight = resources.displayMetrics.heightPixels
+ var rect = Rect()
+ getLocalVisibleRect(rect)
+
+
+ }
+
+ override fun onAttachedToWindow() {
+ viewTreeObserver.addOnPreDrawListener(mPreDrawListener)
+ super.onAttachedToWindow()
+ }
+
+ override fun onDetachedFromWindow() {
+ viewTreeObserver.removeOnPreDrawListener(mPreDrawListener)
+ super.onDetachedFromWindow()
+ }
+
+ override fun onDraw(canvas: Canvas?) {
+ super.onDraw(canvas)
+ }
+
+ private fun safeDecodeRegionBitmap(tileImage: TileImage?): Bitmap? {
+ return null
+ }
+
+ inner class TileImage {
+ var isShow: Boolean = false
+ var rect: Rect = Rect()
+ var destRect: Rect = Rect()
+ lateinit var bitmap: Bitmap
+ var opts: BitmapFactory.Options? = null
+ var exifOrientation: Int = 0
+ var regionBitmatTask: RegionBitmatTask? = null
+ }
+
+ inner class RegionBitmatTask : AsyncTask {
+
+ var refView: WeakReference? = null
+ var mTileImage: TileImage? = null
+
+ constructor(longImageView: LongImageView) : super() {
+ refView = WeakReference(longImageView)
+ }
+
+ override fun onCancelled(result: Bitmap?) {
+ super.onCancelled(result)
+ }
+
+ override fun doInBackground(vararg params: TileImage?): Bitmap? {
+ var view = refView?.get()
+ if (view == null) {
+ return null
+ }
+
+ mTileImage = params[0]
+ return view.safeDecodeRegionBitmap(mTileImage)
+ }
+
+ override fun onPreExecute() {
+ super.onPreExecute()
+ }
+
+ override fun onPostExecute(result: Bitmap?) {
+ super.onPostExecute(result)
+ }
+
+ override fun onProgressUpdate(vararg values: Void?) {
+ super.onProgressUpdate(*values)
+ }
+
+ override fun onCancelled() {
+ super.onCancelled()
+ }
+ }
+}
\ No newline at end of file
diff --git a/LongImage/src/main/res/drawable-xxhdpi/long_pic.jpeg b/LongImage/src/main/res/drawable-xxhdpi/long_pic.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..eb1359cd68505f1ce7e9ad8a4077866e46bda39d
Binary files /dev/null and b/LongImage/src/main/res/drawable-xxhdpi/long_pic.jpeg differ
diff --git a/LongImage/src/main/res/drawable/ic_launcher_background.xml b/LongImage/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000000000000000000000000000000000..07d5da9cbf141911847041df5d7b87f0dd5ef9d4
--- /dev/null
+++ b/LongImage/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LongImage/src/main/res/values-night/themes.xml b/LongImage/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8629b2d669f38a398e092d7149fdfdc00874b12f
--- /dev/null
+++ b/LongImage/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/LongImage/src/main/res/values/colors.xml b/LongImage/src/main/res/values/colors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f8c6127d327620c93d2b2d00342a68e97b98a48d
--- /dev/null
+++ b/LongImage/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/LongImage/src/main/res/values/strings.xml b/LongImage/src/main/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e9eab8e04b82ac34639ecf673723266b7d73c15
--- /dev/null
+++ b/LongImage/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ LongImage
+
\ No newline at end of file
diff --git a/LongImage/src/main/res/values/themes.xml b/LongImage/src/main/res/values/themes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b627c01191ed4ff0842c1c6852942d96173111f
--- /dev/null
+++ b/LongImage/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/LongImage/src/test/java/com/ggz/picture/ExampleUnitTest.kt b/LongImage/src/test/java/com/ggz/picture/ExampleUnitTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..391197540cf66221efdcc7a3d82343535fe7782d
--- /dev/null
+++ b/LongImage/src/test/java/com/ggz/picture/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.ggz.picture
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 0b2d792e7b297de542998426a835148ea98e17e1..e7e1fede98eaff465f3ff906f518701befd7e5bf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,6 +4,7 @@ plugins {
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
}
+// id 'com.didi.dokit'
/*apply from '../gradlescript/config.gradle'*/
@@ -38,7 +39,7 @@ android {
}
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = "11"
allWarningsAsErrors = true
}
@@ -46,9 +47,9 @@ android {
generateStubs = true
}
- /* dataBinding{
+ dataBinding{
enabled = true
- }*/
+ }
buildFeatures {
dataBinding = true
@@ -57,8 +58,8 @@ android {
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
composeOptions {
@@ -70,11 +71,21 @@ android {
excludes += "/META-INF/AL2.0"
excludes += "/META-INF/LGPL2.1"
}
+
+ /*configurations.all {
+ resolutionStrategy.eachDependency { DependencyResolveDetails details ->
+ if (details.requested.group == 'androidx.fragment' && details.requested.name == 'fragment' && details.requested.version == '1.3.4') {
+ details.useVersion '1.3.6'
+ details.because 'fixes critical bug in 1.3.4'
+ }
+ }
+ }*/
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
+ implementation project(path: ':AutoViewPager')
/*测试用的包*/
testImplementation 'junit:junit:4.13.2'
@@ -98,56 +109,88 @@ dependencies {
implementation "androidx.navigation:navigation-ui-ktx:$navagition_version"
/*kotlin的协程包*/
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3'
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines_android"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_android"
/* 引入datastore */
- implementation 'androidx.datastore:datastore:1.0.0-beta01'
+ implementation "androidx.datastore:datastore:$data_store"
+
/*Jetpack引入包*/
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
- implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'com.google.android.material:material:1.4.0'
/***********Jetpack End*************/
- implementation "androidx.activity:activity-compose:1.3.0-alpha08"
+ implementation "androidx.activity:activity-compose:$compose_activity_version"
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'androidx.core:core-ktx:1.3.2'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
/*引入recyclerView*/
- implementation 'androidx.recyclerview:recyclerview:1.1.0'
+ implementation "androidx.recyclerview:recyclerview:$recyclerVersion"
/*引入viewPager2*/
- implementation "androidx.viewpager2:viewpager2:1.0.0"
+ implementation "androidx.viewpager2:viewpager2:$viewpager2"
/*引入下拉刷新框架*/
- implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
+ implementation "androidx.swiperefreshlayout:swiperefreshlayout:$swiperefreshlayout"
/*网络okhttp引入*/
- implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
+ implementation "com.squareup.okhttp3:okhttp:$okhttp"
/*引入protobuf*/
- implementation 'com.google.protobuf:protoc:3.15.6'
+ implementation "com.google.protobuf:protoc:$protobuf"
/*数据库的greendao引入*/
- implementation 'org.greenrobot:greendao:3.3.0'
+ implementation "org.greenrobot:greendao:$greendao"
/*RxJava引入包*/
- implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
- implementation 'io.reactivex.rxjava3:rxjava:3.0.8'
+ implementation "io.reactivex.rxjava3:rxandroid:$rxjava_android"
+ implementation "io.reactivex.rxjava3:rxjava:$rxjava_java"
/*Gson 引入*/
- implementation 'com.google.code.gson:gson:2.8.6'
+ implementation "com.google.code.gson:gson:$gson"
/*引入EventBus3*/
- implementation 'org.greenrobot:eventbus:3.2.0'
+ implementation "org.greenrobot:eventbus:$eventbus"
/*引入Glide*/
- implementation 'com.github.bumptech.glide:glide:4.12.0'
+ implementation "com.github.bumptech.glide:glide:$glide"
+
+ /*引入AspectJ*/
+ implementation "org.aspectj:aspectjrt:$aspectj"
+
+ /*引入DoKit Start*/
+ //核心模块
+ /*debugImplementation("io.github.didi.dokit:dokitx:$doKit") {
+ exclude module: 'androidx-fragment'
+ }*/
+
+ //文件同步模块
+ //debugImplementation "io.github.didi.dokit:dokitx-ft:$doKit"
+
+ //一机多控模块
+ //debugImplementation "io.github.didi.dokit:dokitx-mc:$doKit"
+
+ //weex模块
+ //debugImplementation "io.github.didi.dokit:dokitx-weex:$doKit"
+
+ //no-op 模块
+ //releaseImplementation "io.github.didi.dokit:dokitx-no-op:$doKit"
+ /*引入DoKit End*/
+
+ /*Lottie*/
+ implementation "com.airbnb.android:lottie:$lottie"
+
+ /*引入AutoViewPager*/
+// implementation 'com.github.JuHonggang:Autoviewpager:v0.1'
kapt "com.android.databinding:compiler:4.0.2"
+ implementation "com.yuyh.json:jsonviewer:1.0.6"
+
kapt project(':apt')
implementation project(':network')
@@ -155,6 +198,15 @@ dependencies {
/*引入推送的api*/
implementation project(':pushbase:jiguangpush')
implementation project(':pushbase:mipush')
+
+ /*引入长图组件*/
+ implementation project(':LongImage')
+
+ /*引入JsonViewer*/
+ implementation project(':JsonViewer')
+
+ /*引入AutoViewPager*/
+ implementation project(':AutoViewPager')
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
@@ -165,7 +217,91 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
// Enable experimental coroutines APIs, including Flow
freeCompilerArgs += '-Xopt-in=kotlin.Experimental'
- // Set JVM target to 1.8
- jvmTarget = "1.8"
+ // Set JVM target to 11
+ jvmTarget = "11"
}
}
+
+
+/*添加aspectj*/
+import org.aspectj.bridge.IMessage
+import org.aspectj.bridge.MessageHandler
+import org.aspectj.tools.ajc.Main
+
+final def log = project.logger
+final def variants = project.android.applicationVariants
+variants.all { variant ->
+ /*if (!variant.buildType.isDebuggable()) {
+ log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
+ return;
+ }*/
+ JavaCompile javaCompile = variant.javaCompile
+ javaCompile.doLast {
+ String[] args = ["-showWeaveInfo",
+ "-11",
+ "-inpath", javaCompile.destinationDir.toString(),
+ "-aspectpath", javaCompile.classpath.asPath,
+ "-d", javaCompile.destinationDir.toString(),
+ "-classpath", javaCompile.classpath.asPath,
+ "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
+ log.debug "ajc args: " + Arrays.toString(args)
+ MessageHandler handler = new MessageHandler(true);
+ new Main().run(args, handler);
+ for (IMessage message : handler.getMessages(null, true)) {
+ switch (message.getKind()) {
+ case IMessage.ABORT:
+ case IMessage.ERROR:
+ case IMessage.FAIL:
+ log.error message.message, message.thrown
+ break;
+ case IMessage.WARNING:
+ log.warn message.message, message.thrown
+ break;
+ case IMessage.INFO:
+ log.info message.message, message.thrown
+ break;
+ case IMessage.DEBUG:
+ log.debug message.message, message.thrown
+ break;
+ }
+ }
+ }
+}
+
+
+/*添加DoKit*/
+/*
+dokitExt {
+ //通用设置
+ comm {
+ //地图经纬度开关
+ gpsSwitch true
+ //网络开关
+ networkSwitch true
+ //大图开关
+ bigImgSwitch true
+ //webView js 抓包
+ webViewSwitch true
+ }
+
+ slowMethod {
+ //调用栈模式配置 对应gradle.properties中DOKIT_METHOD_STRATEGY=0
+ stackMethod {
+ //默认值为 5ms 小于该值的函数在调用栈中不显示
+ thresholdTime 10
+ //调用栈函数入口 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的入口 假如不需要可以去掉该字段
+ enterMethods = ["com.didichuxing.doraemondemo.MainDebugActivity.test1"]
+ //黑名单 粒度最小到类 暂不支持到方法 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的入口 假如不需要可以去掉该字段
+ methodBlacklist = ["com.facebook.drawee.backends.pipeline.Fresco"]
+ }
+ //普通模式配置 对应gradle.properties中DOKIT_METHOD_STRATEGY=1
+ normalMethod {
+ //默认值为 500ms 小于该值的函数在运行时不会在控制台中被打印
+ thresholdTime 500
+ //需要针对函数插装的包名 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的项目包名 假如不需要可以去掉该字段
+ packageNames = ["com.didichuxing.doraemondemo"]
+ //不需要针对函数插装的包名&类名 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的项目包名 假如不需要可以去掉该字段
+ methodBlacklist = ["com.didichuxing.doraemondemo.dokit"]
+ }
+ }
+}*/
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d3a88133526d49d11b4e15ebaec4a4408a460e75..eab7172388a12ab82a9dab7817301a8a55ecc36d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,12 @@
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
+
+
+
+
+
+
-
+
@@ -78,9 +86,43 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ Log.d(
+ TAG,
+ "AActivity requestCode = " + requestCode + "; permissions = " + permissions.contentToString()
+ + "; grantResults = " + grantResults.contentToString()
+ )
+ }
+
+ fun requestPermission(
+ activity: Activity,
+ permissions: Array,
+ requestCode: Int
+ ) {
+ if (Build.VERSION.SDK_INT >= 23) {
+
+ ActivityCompat.requestPermissions(parent, permissions, requestCode)
+ }
+
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/ButtonsActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/ButtonsActivity.kt
index 002b3530ca0557c22ea4b46b0d6affcec11a1528..94bd417fee88dcc8818dcd72cddf22f21547d89f 100644
--- a/app/src/main/java/com/guiguzi/androidtest/activity/ButtonsActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/ButtonsActivity.kt
@@ -1,10 +1,13 @@
package com.guiguzi.androidtest.activity
+import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Bundle
-import android.os.PersistableBundle
import android.util.Log
+import android.view.GestureDetector
+import android.view.MotionEvent
+import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
@@ -14,9 +17,10 @@ import com.guiguzi.androidtest.R
class ButtonsActivity : Activity() {
companion object {
- const val TAG = "ButtonsActivity"
+ const val TAG = "ButtonsActivityTAG"
}
+ @SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val linearLayout = LinearLayout(baseContext)
@@ -37,10 +41,10 @@ class ButtonsActivity : Activity() {
)
val button1 = Button(baseContext)
- val buttonParams = LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT
- )
+ val buttonParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
button1.setText("brand")
button1.textSize = 22f
button1.setTextColor(resources.getColor(R.color.colorAccent))
@@ -50,10 +54,64 @@ class ButtonsActivity : Activity() {
button1.setOnClickListener {
val brand = android.os.Build.BRAND
- Log.d(TAG, "mobile brand = $brand")
+// Log.d(TAG, "mobile brand = $brand")
+ try {
+ val i = Intent(Intent.ACTION_MAIN)
+ i.flags = Intent.FLAG_ACTIVITY_NEW_TASK // 必须加入new task标识
+ i.addCategory(Intent.CATEGORY_HOME)
+ startActivity(i)
+ } catch (e: Exception) {
+ Log.d(TAG, "出现异常 e = ${e.toString()}")
+ }
+
}
- //测试显示启动
- val intent = Intent(this,MainActivity.javaClass)
+ val button2 = Button(baseContext)
+ button2.text = "双击检测"
+ button2.setOnTouchListener(object : View.OnTouchListener {
+ override fun onTouch(v: View?, event: MotionEvent?): Boolean {
+ GestureDetector(baseContext, object : GestureDetector.OnGestureListener {
+ override fun onDown(e: MotionEvent?): Boolean {
+ Log.d(TAG, "onDown()")
+ return false
+ }
+
+ override fun onShowPress(e: MotionEvent?) {
+ Log.d(TAG, "onShowPress()")
+ }
+
+ override fun onSingleTapUp(e: MotionEvent?): Boolean {
+ Log.d(TAG, "onSingleTapUp()")
+ return false
+ }
+
+ override fun onScroll(
+ e1: MotionEvent?,
+ e2: MotionEvent?,
+ distanceX: Float,
+ distanceY: Float
+ ): Boolean {
+ Log.d(TAG, "onScroll()")
+ return false
+ }
+
+ override fun onLongPress(e: MotionEvent?) {
+ Log.d(TAG, "onLongPress()")
+ }
+
+ override fun onFling(
+ e1: MotionEvent?,
+ e2: MotionEvent?,
+ velocityX: Float,
+ velocityY: Float
+ ): Boolean {
+ Log.d(TAG, "onFling()")
+ return false
+ }
+ }).onTouchEvent(event)
+ return true
+ }
+ })
+ linearLayout.addView(button2, buttonParams)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/CustomViewPagerActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/CustomViewPagerActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6e8c81f676670ecba1f4083b4384446ee9984200
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/CustomViewPagerActivity.kt
@@ -0,0 +1,324 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.os.Bundle
+import android.util.Log
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.widget.EdgeEffectCompat
+import androidx.recyclerview.widget.RecyclerView
+import androidx.viewpager.widget.PagerAdapter
+import androidx.viewpager.widget.ViewPager
+import androidx.viewpager2.widget.ViewPager2
+import com.ggz.autoviewpager.AutoViewPager
+import com.guiguzi.androidtest.R
+import com.guiguzi.androidtest.customView.CustomViewPager
+import java.lang.reflect.Field
+
+class CustomViewPagerActivity : Activity() {
+
+ val TAG: String = this.javaClass.name
+
+ lateinit var mCustomViewPager: CustomViewPager
+ lateinit var mCustomViewPager2: CustomViewPager
+ lateinit var mViewPager: ViewPager
+
+ lateinit var mViewPager2: ViewPager2
+ lateinit var mPagerAdapter:RecyclerView.Adapter
+
+ lateinit var mAutoViewPager: AutoViewPager
+
+ lateinit var mLeftEdge: EdgeEffectCompat
+ lateinit var mRightEdge: EdgeEffectCompat
+
+ private val items = intArrayOf(
+ R.mipmap.image_01,
+ R.mipmap.image_02,
+ R.mipmap.image_03,
+ R.mipmap.image_04,
+ R.mipmap.image_05,
+ R.mipmap.image_01,
+ R.mipmap.image_02,
+ R.mipmap.image_03,
+ R.mipmap.image_04,
+ R.mipmap.image_05,
+ R.mipmap.image_01,
+ R.mipmap.image_02,
+ R.mipmap.image_03,
+ R.mipmap.image_04,
+ R.mipmap.image_05
+ )
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val rootView = LinearLayout(baseContext)
+ rootView.orientation = LinearLayout.VERTICAL
+
+ var customParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ 300
+ )
+ var textParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+ customParams.gravity = Gravity.CENTER
+
+ mCustomViewPager = CustomViewPager(this, null)
+ mCustomViewPager.setOverscrollTranslation(300)
+// mCustomViewPager.onNestedFling()
+// mCustomViewPager.isNestedScrollingEnabled = false
+// mCustomViewPager.clipChildren = true
+// mCustomViewPager.disableLRScroll()
+ mCustomViewPager.pageMargin = 40
+ val textView = TextView(baseContext)
+ textView.text = "1111111111"
+ textView.gravity = Gravity.CENTER
+ rootView.addView(textView, textParams)
+ rootView.addView(mCustomViewPager, customParams)
+
+
+ mAutoViewPager = AutoViewPager(baseContext)
+ mAutoViewPager.setVelocityLimit(3000)
+// mAutoViewPager.setDefaultScale(0.4f)
+ mAutoViewPager.pagerWidth = 400
+ val textView4 = TextView(baseContext)
+ textView4.text = "======AutoViewPager======"
+ textView4.gravity = Gravity.CENTER
+ rootView.addView(textView4, textParams)
+ rootView.addView(mAutoViewPager, customParams)
+
+ mCustomViewPager2 = CustomViewPager(this, null)
+ val textView2 = TextView(baseContext)
+ textView2.text = "222222222222"
+ textView2.gravity = Gravity.CENTER
+ rootView.addView(textView2, textParams)
+ rootView.addView(mCustomViewPager2, customParams)
+
+ mViewPager = ViewPager(baseContext)
+ val textView3 = TextView(baseContext)
+ textView3.text = "333333333"
+ textView3.gravity = Gravity.CENTER
+ rootView.addView(textView3, textParams)
+ rootView.addView(mViewPager, customParams)
+
+ mViewPager2 = ViewPager2(baseContext)
+ val textView5 = TextView(baseContext)
+ textView5.text = "ViewPager2"
+ textView5.gravity = Gravity.CENTER
+ rootView.addView(textView5, textParams)
+ rootView.addView(mViewPager2, customParams)
+
+ init()
+
+ var rootParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+
+ setContentView(rootView)
+ }
+
+ fun init() {
+
+ var items = listOf(
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14"
+ )
+
+ var items2 = listOf(
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14"
+ )
+
+ var items3 = listOf(
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14"
+ )
+
+ var customViewPagerAdapter = CustomViewPagerAdapter()
+ customViewPagerAdapter.itemsData = items
+ mCustomViewPager.adapter = customViewPagerAdapter
+// mCustomViewPager.setVelocityLimit(30000)
+ /* mCustomViewPager.setOnPageChangeListener(object : CenterViewPager.OnPageChangeListener {
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+ if (mLeftEdge != null && mRightEdge != null) {
+ mLeftEdge.finish()
+ mRightEdge.finish()
+ mLeftEdge.setSize(0, 0)
+ mRightEdge.setSize(0, 0)
+ }
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ TODO("Not yet implemented")
+ }
+
+ override fun onPageScrollStateChanged(state: Int) {
+ TODO("Not yet implemented")
+ }
+ })*/
+
+ var customViewPagerAdapter2 = CustomViewPagerAdapter()
+ customViewPagerAdapter2.itemsData = items2
+ mCustomViewPager2.adapter = customViewPagerAdapter2
+ mCustomViewPager2.isCutOff = true
+
+ var customViewPagerAdapter3 = CustomViewPagerAdapter()
+ customViewPagerAdapter3.itemsData = items3
+ mViewPager.adapter = customViewPagerAdapter3
+
+ var customViewPagerAdapter4 = CustomViewPagerAdapter()
+ customViewPagerAdapter4.itemsData = items3
+ setPagerAdapter(mAutoViewPager)
+
+ var customViewPagerAdapter5 = CustomViewPagerAdapter()
+ customViewPagerAdapter5.itemsData = items3
+// mViewPager2.adapter = customViewPagerAdapter5
+
+ /*mPagerAdapter = object : RecyclerView.Adapter() {
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
+ var itemView = LayoutInflater.from(this@CustomViewPagerActivity)
+ .inflate(R.layout.layout_view_page, parent, false)
+ val pageViewHolder = PageViewHolder(itemView)
+ return pageViewHolder
+ }
+
+ override fun onBindViewHolder(holder: MainActivity.PageViewHolder, position: Int) {
+ holder.textView.setText(items3.get(position))
+ }
+
+ override fun getItemCount(): Int {
+ return items3.size
+ }
+ }*/
+
+// mViewPager.setVelocityLimit(3000)
+// disableLRScroll()
+
+ }
+
+ private fun setPagerAdapter(viewPager: AutoViewPager) {
+ viewPager.setItemView { container, position ->
+ val imageView = ImageView(this@CustomViewPagerActivity)
+ imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
+ imageView.setImageResource(items[position])
+ container.addView(imageView)
+ imageView
+ }
+ viewPager.setAdapter(items.size)
+ }
+
+ inner class CustomViewPagerAdapter : PagerAdapter() {
+
+ var itemsData: List? = null
+
+ override fun getCount(): Int {
+ return itemsData?.size ?: 0
+ }
+
+ override fun isViewFromObject(view: View, any: Any): Boolean {
+ return view === any
+ }
+
+ override fun instantiateItem(container: ViewGroup, position: Int): Any {
+
+ var linearLayout = LinearLayout(baseContext)
+ var linearParams = ViewGroup.MarginLayoutParams(
+ 230,
+ 180
+ )
+ linearLayout.setBackgroundColor(baseContext.getColor(R.color.colorPrimaryDark))
+
+ var text_view: TextView = TextView(baseContext)
+ var params = LinearLayout.LayoutParams(
+ 200,
+ 150
+ )
+ text_view.text = itemsData?.get(position) ?: "没有内容"
+ text_view.setTextColor(baseContext.getColor(R.color.colorAccent))
+ text_view.setBackgroundColor(baseContext.getColor(R.color.colorBlack))
+ text_view.gravity = Gravity.CENTER
+ params.gravity = Gravity.CENTER
+
+ linearLayout.addView(text_view, params)
+
+ container.addView(linearLayout, linearParams)
+ return linearLayout
+ }
+
+ override fun destroyItem(container: ViewGroup, position: Int, any: Any) {
+ container.removeView(any as View)
+ }
+
+ override fun getPageWidth(position: Int): Float {
+ return 0.4F
+ }
+ }
+
+ class PageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ var textView = itemView.findViewById(R.id.page_text)
+ }
+
+ fun disableLRScroll() {
+ try {
+ var leftEdgeField: Field? = mCustomViewPager.javaClass.getDeclaredField("mLeftEdge");
+ var rightEdgeField: Field? = mCustomViewPager.javaClass.getDeclaredField("mRightEdge");
+ if (leftEdgeField != null && rightEdgeField != null) {
+ leftEdgeField.setAccessible(true)
+ rightEdgeField.setAccessible(true)
+ mLeftEdge = leftEdgeField.get(mCustomViewPager) as EdgeEffectCompat
+ mRightEdge = rightEdgeField.get(mCustomViewPager) as EdgeEffectCompat
+ }
+ } catch (e: Exception) {
+ Log.d(TAG, "出现异常:${e.toString()}")
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/DialogActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/DialogActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..87af83def94d1ebca56b52eca887294a85867ff8
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/DialogActivity.kt
@@ -0,0 +1,48 @@
+package com.guiguzi.androidtest.activity
+
+import android.os.Bundle
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.LinearLayout
+import androidx.appcompat.app.AppCompatActivity
+import com.guiguzi.androidtest.dialog.CustomDialog
+
+class DialogActivity : AppCompatActivity() {
+
+ lateinit var mRootView: LinearLayout
+ lateinit var mButton1: Button
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ initView()
+ }
+
+ fun initView() {
+ mButton1 = Button(baseContext)
+ mRootView = LinearLayout(baseContext)
+ mRootView.orientation = LinearLayout.VERTICAL
+
+ var linearParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+ linearParams.gravity = Gravity.CENTER
+ mButton1.text = "Dialog"
+ mRootView.addView(mButton1, linearParams)
+
+ var matchParams = ViewGroup.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT
+ )
+
+ setContentView(mRootView, matchParams)
+
+ mButton1.setOnClickListener {
+ val dialog: CustomDialog = CustomDialog(this)
+ dialog.show()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/EActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/EActivity.kt
index e862ab65e2146c0fc06f90197f28ea89f321de15..b267563a537488b4980c9ab3012457c38716ee8e 100644
--- a/app/src/main/java/com/guiguzi/androidtest/activity/EActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/EActivity.kt
@@ -24,7 +24,8 @@ class EActivity : Activity() {
var textView = TextView(this)
textView.text = "hello world,EEEEEEEEEEE"
textView.setOnClickListener {
- var intent = Intent(this, BActivity::class.java)
+// var intent = Intent(this, BActivity::class.java)
+ var intent = Intent(this, FActivity::class.java)
startActivity(intent)
}
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/ErrorAActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/ErrorAActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a8aca397e1370870d8f506970ce6cc98d5bb72f6
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/ErrorAActivity.kt
@@ -0,0 +1,41 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.widget.Button
+import android.widget.TextView
+import com.guiguzi.androidtest.R
+
+class ErrorAActivity : Activity() {
+ companion object {
+ const val TAG = "ErrorTestTAG"
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_error_a)
+ initView()
+ }
+
+ fun initView() {
+
+ findViewById(R.id.title).setText("页面AAAAAAAAAAAAAAA")
+
+ findViewById(R.id.button1).setOnClickListener {
+ val intent = Intent(this, ErrorBActivity::class.java)
+ startActivity(intent)
+ }
+
+ findViewById(R.id.button2).setOnClickListener {
+ val intent = Intent(this, ErrorBActivity::class.java)
+ startActivityForResult(intent, 1)
+ }
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ Log.d(TAG, "requestCode = $requestCode; resultCode = $resultCode")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/ErrorBActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/ErrorBActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3181de1dc01b0f329898820884d857ba704d7eef
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/ErrorBActivity.kt
@@ -0,0 +1,35 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Button
+import android.widget.TextView
+import com.guiguzi.androidtest.R
+
+class ErrorBActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_error_a)
+ initView()
+ }
+
+ fun initView() {
+
+
+ findViewById(R.id.title).setText("页面BBBBBBBBBBBBBBBBBBB")
+
+ findViewById(R.id.button1).setOnClickListener {
+ val intent = Intent(this, ErrorAActivity::class.java)
+ startActivity(intent)
+ }
+
+ findViewById(R.id.button2).setOnClickListener {
+ val intent = Intent(this, ErrorAActivity::class.java)
+ startActivityForResult(intent, 1)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/FActivity.java b/app/src/main/java/com/guiguzi/androidtest/activity/FActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9a8a4e7be3ad9238f62a0cf88c616ae86514c33
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/FActivity.java
@@ -0,0 +1,29 @@
+package com.guiguzi.androidtest.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class FActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ TextView textView = new TextView(getBaseContext());
+ textView.setText("FFFFFF,Activity!");
+ textView.setGravity(Gravity.CENTER);
+
+ LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+ layoutParams.gravity = Gravity.CENTER;
+
+ setContentView(textView, layoutParams);
+
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/GGroupActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/GGroupActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..09b56b5d15d999f3c8caa848999d083099f5924a
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/GGroupActivity.kt
@@ -0,0 +1,73 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.ActivityGroup
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.widget.TabHost
+import com.guiguzi.androidtest.R
+
+class GGroupActivity : ActivityGroup() {
+
+
+ companion object {
+ const val TAG = "ActivityCycle"
+ }
+
+ lateinit var mIntent1: Intent
+ lateinit var mIntent2: Intent
+ lateinit var mIntent3: Intent
+ lateinit var mIntent4: Intent
+
+ lateinit var mTabHost: TabHost
+
+ lateinit var INSTANCE: GGroupActivity
+
+ var tabContentHandlerFactory1 = TabHost.TabContentFactory() {
+ return@TabContentFactory LayoutInflater.from(baseContext).inflate(R.layout.item_page1, null)
+ }
+
+ fun getInstance(): GGroupActivity {
+ return INSTANCE
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_group_layout)
+
+ initView()
+ INSTANCE = this
+ }
+
+ fun initView() {
+
+ mIntent1 = Intent(this, AActivity::class.java)
+ mIntent2 = Intent(this, BActivity::class.java)
+ mIntent3 = Intent(this, CActivity::class.java)
+ mIntent4 = Intent(this, DActivity::class.java)
+
+
+ mTabHost = findViewById(R.id.tab_host)
+ mTabHost.setup(localActivityManager)
+
+ mTabHost.addTab(mTabHost.newTabSpec("button1").setIndicator("标签1").setContent(mIntent1))
+ mTabHost.addTab(mTabHost.newTabSpec("button2").setIndicator("标签2").setContent(mIntent2))
+ mTabHost.addTab(mTabHost.newTabSpec("button3").setIndicator("标签3").setContent(mIntent3))
+ mTabHost.addTab(mTabHost.newTabSpec("button4").setIndicator("标签4").setContent(mIntent4))
+
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ Log.d(
+ TAG,
+ "GGroupActivity requestCode = " + requestCode + "; permissions = " + permissions.contentToString()
+ + "; grantResults = " + grantResults.contentToString()
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/JsonViewActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/JsonViewActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1efbd34ec3342a0063068be2eab114519cfed0fe
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/JsonViewActivity.kt
@@ -0,0 +1,50 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.os.Bundle
+import android.util.Log
+import com.guiguzi.androidtest.R
+import com.weibo.json.viewer.WBJsonRecyclerView
+import java.io.BufferedReader
+import java.io.IOException
+import java.io.InputStream
+import java.io.InputStreamReader
+
+class JsonViewActivity : Activity() {
+
+ companion object {
+ const val TAG = "JsonViewActivity"
+ const val JSON_INSTATION_PUSH_ORDER = "instation_push_order.json"
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_json_view_layout)
+ val jsonRecyclerView: WBJsonRecyclerView = findViewById(R.id.rv_json)
+ jsonRecyclerView.mSuperParentDisallow = 2
+ val test = parseJson(JSON_INSTATION_PUSH_ORDER)
+ jsonRecyclerView.bindJson(test)
+ }
+
+ private fun parseJson(jsonName: String): String? {
+ var jsonStream: InputStream = baseContext.assets.open(jsonName)
+ var bufferedReader: BufferedReader = BufferedReader(InputStreamReader(jsonStream))
+ var strBuilder: StringBuilder = StringBuilder()
+ var line: String? = null
+ try {
+ while (run {
+ line = bufferedReader.readLine()
+ line
+ } != null) {
+ strBuilder.append(line)
+ }
+ } catch (e: IOException) {
+ Log.d(TAG, "parse exception = ${e.toString()}")
+ } finally {
+ jsonStream.close()
+ bufferedReader.close()
+ }
+
+ return strBuilder.toString()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/LoadMoreActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/LoadMoreActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..91a270b114cb2fa7aa1dc8ba28226e0000235f7c
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/LoadMoreActivity.kt
@@ -0,0 +1,9 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+
+class LoadMoreActivity :Activity() {
+
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/LongImageActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/LongImageActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b1a703a7f473b6669e100c33b03e0bf9fdf8b11a
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/LongImageActivity.kt
@@ -0,0 +1,17 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.os.Bundle
+import android.widget.ScrollView
+import com.ggz.picture.LongImageView
+
+class LongImageActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val scrollView: ScrollView = ScrollView(baseContext)
+ val longImageView: LongImageView = LongImageView(baseContext)
+ scrollView.addView(longImageView)
+ setContentView(scrollView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/LottieActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/LottieActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9e478d4be570ad3e4830be51ded1e39a1d3e4c90
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/LottieActivity.kt
@@ -0,0 +1,39 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.os.Bundle
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import com.airbnb.lottie.LottieAnimationView
+
+class LottieActivity : Activity() {
+
+ companion object{
+ const val LottiePath = "lotties/LottieTest.zip"
+ const val LottiePath1 = "lotties/pull_loading_view.json"
+ }
+
+ lateinit var mLottieAnimationView: LottieAnimationView
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ var linearLayout = LinearLayout(baseContext)
+ var linearParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+
+ mLottieAnimationView = LottieAnimationView(baseContext)
+ var lottieParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+ lottieParams.gravity = Gravity.CENTER
+ linearLayout.addView(mLottieAnimationView, lottieParams)
+ mLottieAnimationView.setAnimation(LottiePath)
+ mLottieAnimationView.playAnimation()
+
+ setContentView(linearLayout, linearParams)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/MainActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/MainActivity.kt
index 12196b49382c2755d2fc1bc49a5ba57c34ab7682..1fcfb826d78b8e88a98d853a46c110d45a6cef98 100644
--- a/app/src/main/java/com/guiguzi/androidtest/activity/MainActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/MainActivity.kt
@@ -1,10 +1,18 @@
package com.guiguzi.androidtest.activity
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.ActivityManager
+import android.content.Context
+import android.graphics.PixelFormat
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.GradientDrawable
+import android.os.Build
import android.os.Bundle
import android.util.Log
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
+import android.view.*
+import android.view.View.OnTouchListener
+import android.widget.LinearLayout
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
@@ -14,9 +22,13 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.guiguzi.androidtest.R
-import com.guiguzi.androidtest.fragments.*
+import com.guiguzi.androidtest.fragments.HomeTabFragment
+import com.guiguzi.androidtest.fragments.NewsTabFragment
+import com.guiguzi.androidtest.fragments.PersonTabFragment
+import com.guiguzi.androidtest.fragments.VideoTabFragment
import com.guiguzi.androidtest.utils.AppUiUtils
+
class MainActivity : FragmentActivity() {
companion object {
@@ -35,6 +47,22 @@ class MainActivity : FragmentActivity() {
var indexTab = 0
+ var lastX = 150
+ var lastY = 200
+ var isMove = false
+
+ var mOldSelectView: View? = null
+ var mSelectView: View? = null
+ var isSelectType = false
+ var mGradientDrawable: GradientDrawable? = null
+ var mFirClick = 0L
+ var mSecClick = 0L
+ var mDuration = 0L
+ val windowLayout = WindowManager.LayoutParams(
+ WindowManager.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.MATCH_PARENT
+ )
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_page)
@@ -43,6 +71,10 @@ class MainActivity : FragmentActivity() {
init()
}
+ override fun onResume() {
+ super.onResume()
+ }
+
fun init() {
home_tab_recycler_view = findViewById(R.id.home_tab)
var homeTabAdapter = object : RecyclerView.Adapter() {
@@ -124,6 +156,10 @@ class MainActivity : FragmentActivity() {
}
})
mViewPage.isUserInputEnabled = false
+
+ mViewPage.postDelayed({
+ createWindow()
+ }, 3 * 1000)
}
fun initData() {
@@ -172,6 +208,7 @@ class MainActivity : FragmentActivity() {
}
}
+
fun switchTab(index: Int) {
indexTab = index
home_tab_recycler_view.adapter?.notifyDataSetChanged()
@@ -182,6 +219,227 @@ class MainActivity : FragmentActivity() {
mViewPage.setCurrentItem(indexTab)
}
+ @SuppressLint("WrongConstant")
+ fun createWindow() {
+ /*val textView = TextView(this)
+ textView.text = "hello world"
+ textView.setBackgroundColor(resources.getColor(R.color.colorWhite))*/
+
+ val containerView = LinearLayout(baseContext)
+ containerView.setBackgroundColor(resources.getColor(R.color.color_non))
+ val floatParams: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ floatParams.gravity = Gravity.CENTER
+
+ val floatingView = View(baseContext)
+ mGradientDrawable = createCircleView(baseContext, 80, 80, 40F)
+ floatingView.background = mGradientDrawable
+
+ containerView.addView(floatingView, floatParams)
+
+ windowLayout.gravity = Gravity.CENTER
+ windowLayout.format = PixelFormat.RGBA_8888
+// windowLayout.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL // 三种 flag 从中选一
+ windowLayout.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
+ WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // 三种 flag 从中选一
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
+// windowLayout.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY // type 表示优先级
+// windowLayout.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW // type 表示优先级
+ windowLayout.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW // type 表示优先级
+ } else {
+ windowLayout.type = WindowManager.LayoutParams.TYPE_PHONE // type 表示优先级
+ }
+
+ windowLayout.width = 80
+ windowLayout.height = 80
+ windowLayout.gravity = Gravity.START or Gravity.TOP
+ windowLayout.x = lastX
+ windowLayout.y = lastY
+
+ containerView.setOnTouchListener(object : OnTouchListener {
+ override fun onTouch(v: View?, event: MotionEvent?): Boolean {
+ var floatX: Float = 0F
+ var floatY: Float = 0F
+ val viewWeight = windowLayout.width
+ val viewHeight = windowLayout.height
+ if (event != null) {
+ floatX = event.rawX
+ floatY = event.rawY
+ }
+ when (event?.action) {
+ MotionEvent.ACTION_DOWN -> {
+ isMove = false
+
+ if (mFirClick == 0L) {
+ mFirClick = System.currentTimeMillis()
+ } else {
+ mSecClick = System.currentTimeMillis()
+ }
+ mDuration = mSecClick - mFirClick
+ if (mDuration < 0) {
+
+ } else if (mDuration < 500) {
+ //双击
+ isSelectType = !isSelectType
+ mFirClick = 0L
+ } else {
+ mFirClick = mSecClick
+ }
+
+ if (isSelectType) {
+ if (v != null) {
+ mGradientDrawable?.setStroke(
+ 2,
+ v.resources.getColor(R.color.colorAccent)
+ )
+
+ //屏蔽全局事件
+ windowLayout.flags =
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ }
+ } else {
+ if (v != null) {
+ mGradientDrawable?.setStroke(
+ 2,
+ v.resources.getColor(R.color.colorBlack)
+ )
+ windowLayout.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ }
+ }
+ windowManager.updateViewLayout(containerView, windowLayout)
+
+ }
+
+ MotionEvent.ACTION_MOVE -> {
+ if (Math.abs(floatX - lastX) > ViewConfiguration.get(baseContext).scaledTouchSlop ||
+ Math.abs(floatY - lastY) > ViewConfiguration.get(baseContext).scaledTouchSlop
+ ) {
+ isMove = true
+ windowLayout.x = floatX.toInt() - viewWeight
+ windowLayout.y = floatY.toInt() - viewHeight
+ windowManager.updateViewLayout(containerView, windowLayout)
+
+ }
+ return true
+ }
+
+ MotionEvent.ACTION_UP -> {
+ if (isMove && isSelectType) {
+ //获取坐标所在位置的View
+ val rootView: View? = getRootView()
+
+ if (rootView != null) {
+ val targetView: View? =
+ findViewByXY(rootView, floatX.toInt(), floatY.toInt())
+
+// targetView?.setBackgroundColor(resources.getColor(R.color.black))
+ var shapeCircleDrawable = getShapeCircle(baseContext)
+ var targetParent: ViewParent? = targetView?.parent
+
+ targetView?.background = shapeCircleDrawable
+
+ } else {
+ Log.d(TAG, "获取根节点失败")
+ }
+ }
+
+ if (isMove && isSelectType) {
+ return true
+ }
+ }
+
+ MotionEvent.ACTION_CANCEL -> {
+
+ }
+ }
+ lastX = floatX.toInt()
+ lastY = floatY.toInt()
+ return false
+ }
+ })
+
+ /*containerView.setOnLongClickListener {
+ *//*isSelectType = !isSelectType
+
+ if (isSelectType) {
+ mGradientDrawable?.setStroke(2, it.context.resources.getColor(R.color.colorAccent))
+ } else {
+ mGradientDrawable?.setStroke(2, it.context.resources.getColor(R.color.colorBlack))
+ }*//*
+
+ false
+ }*/
+
+ windowManager.addView(containerView, windowLayout)
+ containerView.measure(
+ View.MeasureSpec.makeMeasureSpec(
+ 0,
+ View.MeasureSpec.UNSPECIFIED
+ ), View.MeasureSpec
+ .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+ )
+
+ }
+
+ fun getRootView(): View? {
+ return findViewById(android.R.id.content)
+ }
+
+ fun isTouchPointInView(view: View, x: Int, y: Int): Boolean {
+ val position = intArrayOf(0, 0)
+ /*var posiont = kotlin.arrayOfNulls(2)*/
+ view.getLocationOnScreen(position)
+ val left = position[0]
+ var top = position[1]
+ var right = left + view.measuredWidth
+ var bottom = top + view.measuredHeight
+ return x in left until right && y > top && y < bottom
+ }
+
+ fun findViewByXY(rootView: View, x: Int, y: Int): View? {
+ var targetView: View? = null
+ val touchedViewList: List = rootView.touchables
+ for (touchableView in touchedViewList) {
+ if (isTouchPointInView(touchableView, x, y)) {
+ targetView = touchableView
+ break
+ }
+ }
+ return targetView
+ }
+
+ fun getTopActivity(context: Context): Activity? {
+ var targetActivity: Activity? = null
+ val activityManager: ActivityManager =
+ context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+
+ val runningTaskInfo: ActivityManager.RunningTaskInfo =
+ activityManager.getRunningTasks(1).get(0)
+ return targetActivity
+ }
+
+ fun getShapeCircle(context: Context): Drawable {
+ return context.resources.getDrawable(R.drawable.shape_circle)
+ }
+
+ fun createCircleView(
+ context: Context,
+ width: Int,
+ height: Int,
+ cornerRadius: Float
+ ): GradientDrawable {
+ val gradientDrawable: GradientDrawable = GradientDrawable()
+ gradientDrawable.setColor(context.getColor(R.color.color_non))
+ gradientDrawable.setSize(width, height)
+ gradientDrawable.setCornerRadius(cornerRadius)
+ gradientDrawable.setStroke(2, context.resources.getColor(R.color.colorBlack))
+
+ return gradientDrawable
+ }
+
class HomeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var textView = itemView.findViewById(R.id.text_view)
}
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/Mvvm2Activity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/Mvvm2Activity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c0f73e568e8fdd1f42fd267ed472750eee06dd49
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/Mvvm2Activity.kt
@@ -0,0 +1,47 @@
+package com.guiguzi.androidtest.activity
+
+import android.os.Bundle
+import android.widget.Button
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.ViewModelProvider
+import com.guiguzi.androidtest.R
+import com.guiguzi.androidtest.mvvm.viewmodel.ViewModelV2
+
+class Mvvm2Activity : AppCompatActivity() {
+
+ lateinit var mText1: TextView
+ lateinit var mText2: TextView
+ lateinit var mText3: TextView
+ lateinit var mText4: TextView
+ lateinit var mButton: Button
+ lateinit var mViewModel: ViewModelV2
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_mvvm_v2)
+ initView()
+ initData()
+ }
+
+ fun initView() {
+ mText1 = findViewById(R.id.text1)
+ mText2 = findViewById(R.id.text2)
+ mText3 = findViewById(R.id.text3)
+ mText4 = findViewById(R.id.text4)
+ mButton = findViewById(R.id.button1)
+ }
+
+ fun initData() {
+ mViewModel = ViewModelProvider(this).get(ViewModelV2::class.java)
+
+ mViewModel.textLiveData1.observe(this) {
+ mText1.setText(it)
+ }
+
+ mButton.setOnClickListener {
+ mViewModel.onAction1("=>text=>")
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/MvvmActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/MvvmActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d95081e2cd981321ba573fc14451846dd9c99500
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/MvvmActivity.kt
@@ -0,0 +1,34 @@
+package com.guiguzi.androidtest.activity
+
+import android.os.Bundle
+import android.os.PersistableBundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.databinding.DataBindingUtil
+import androidx.lifecycle.ViewModelProvider
+import com.guiguzi.androidtest.R
+import com.guiguzi.androidtest.databinding.ActivityMvvmBinding
+import com.guiguzi.androidtest.mvvm.viewmodel.TestViewModel
+
+class MvvmActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ initView()
+ }
+
+ fun initView() {
+
+ //获取布局绑定实例
+ val binding: ActivityMvvmBinding =
+ DataBindingUtil.setContentView(this, R.layout.activity_mvvm)
+ //获取VM实例
+ val vm: TestViewModel = ViewModelProvider(
+ this,
+ ViewModelProvider.AndroidViewModelFactory(getApplication())
+ ).get(TestViewModel::class.java)
+
+ binding.vm = vm
+ //设置VM所使用的生命周期
+ binding.lifecycleOwner = this
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/PermissionActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/PermissionActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..36487dab90c3a5584c5c1606a49d231237e3c0b6
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/PermissionActivity.kt
@@ -0,0 +1,132 @@
+package com.guiguzi.androidtest.activity
+
+import android.Manifest
+import android.app.Activity
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import android.util.Log
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.app.ActivityCompat
+
+class PermissionActivity : Activity() {
+
+ companion object {
+ const val TAG = "TagPermission"
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ var rootView: LinearLayout = LinearLayout(this)
+ rootView.orientation = LinearLayout.VERTICAL
+ var param = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ var textView = TextView(this)
+ textView.text = "hello world,AAAAAAAAAAAAAAAA"
+ textView.setOnClickListener {
+ var intent = Intent(this, BActivity::class.java)
+ startActivity(intent)
+ }
+
+ var textView1 = TextView(this)
+ textView1.setPadding(30, 30, 30, 30)
+ textView1.text = "申请权限"
+ textView1.setOnClickListener {
+ val permissions =
+ arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
+
+ requestPermission(this, permissions, 1)
+ }
+
+ var button1 = Button(this)
+ button1.text = "日历权限"
+ button1.setOnClickListener {
+ val permissions =
+ arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
+
+ requestPermission(this, permissions, 1)
+ }
+
+ var button2 = Button(this)
+ button2.text = "地理位置权限"
+ button2.setOnClickListener {
+ val permissions =
+ arrayOf(
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION
+ )
+
+ requestPermission(this, permissions, 1)
+ }
+
+ var button3 = Button(this)
+ button3.text = "存储权限"
+ button3.setOnClickListener {
+ val permissions =
+ arrayOf(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ )
+
+ requestPermission(this, permissions, 1)
+ }
+
+ var linearLayoutParam = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ linearLayoutParam.gravity = Gravity.CENTER
+
+ rootView.addView(textView, linearLayoutParam)
+ rootView.addView(textView1, linearLayoutParam)
+ rootView.addView(button1)
+ rootView.addView(button2)
+ rootView.addView(button3)
+
+ addContentView(rootView, param)
+ /* setContentView(rootView)*/
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ Log.d(
+ TAG,
+ "onRequestPermissionsResult(); requestCode = " + requestCode + "; permissions = " + permissions.contentToString()
+ + "; grantResults = " + grantResults.contentToString()
+ )
+ }
+
+
+ fun requestPermission(
+ activity: Activity,
+ permissions: Array,
+ requestCode: Int
+ ) {
+ if (Build.VERSION.SDK_INT >= 23) {
+
+ for (i in 0..(permissions.size - 1)) {
+ var shouldRequest =
+ ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])
+ Log.d(
+ TAG,
+ "requestPermission(); permission = ${permissions[i]}; shouldRequest = $shouldRequest"
+ )
+ }
+
+
+ ActivityCompat.requestPermissions(activity, permissions, requestCode)
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/ScrollerActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/ScrollerActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f00c2cc5b12ed28a93013b28ce180d0818fc724d
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/ScrollerActivity.kt
@@ -0,0 +1,14 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.os.Bundle
+import com.guiguzi.androidtest.R
+
+class ScrollerActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_scroller_layout)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/TextViewActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/TextViewActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..663a960daf0c893ef6eb6de2c2bce4128e428ec2
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/TextViewActivity.kt
@@ -0,0 +1,64 @@
+package com.guiguzi.androidtest.activity
+
+import android.app.Activity
+import android.graphics.Color
+import android.os.Bundle
+import android.text.Spannable
+import android.text.SpannableStringBuilder
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.text.style.ForegroundColorSpan
+import android.text.style.URLSpan
+import android.util.Log
+import android.view.Gravity
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
+import android.widget.Toast
+
+class TextViewActivity : Activity() {
+
+ val TAG = "TextViewActivity"
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ var rootView = LinearLayout(baseContext)
+ var contentTV = TextView(baseContext)
+
+ val content = "@鬼谷子 hello world,你好。#好好学习#"
+ var sbBuilder: SpannableStringBuilder = SpannableStringBuilder(content)
+ val blueSpan1 = ForegroundColorSpan(Color.BLUE)
+ val blueSpan2 = ForegroundColorSpan(Color.BLUE)
+ val urlSpan: URLSpan = URLSpan("https://www.baidu.com")
+
+ val clickableSpan1: ClickableSpan = object : ClickableSpan() {
+ override fun onClick(widget: View) {
+ Toast.makeText(baseContext, "clickSpan111 toast", Toast.LENGTH_SHORT).show()
+ Log.d(TAG, "clickSpan111 toast")
+ }
+ }
+
+ sbBuilder.setSpan(clickableSpan1, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
+ sbBuilder.setSpan(blueSpan1, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
+ contentTV.movementMethod = LinkMovementMethod.getInstance()
+
+ val clickableSpan2: ClickableSpan = object : ClickableSpan() {
+ override fun onClick(widget: View) {
+ Toast.makeText(baseContext, "clickSpan222 toast", Toast.LENGTH_SHORT).show()
+ Log.d(TAG, "clickSpan222 toast")
+ }
+ }
+ sbBuilder.setSpan(blueSpan2, 20, 26, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
+ sbBuilder.setSpan(clickableSpan2,20,26,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
+
+ contentTV.setText(sbBuilder)
+
+ var lyParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT
+ )
+ lyParams.gravity = Gravity.CENTER
+ rootView.addView(contentTV, lyParams)
+ setContentView(rootView)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/activity/ViewPageActivity.kt b/app/src/main/java/com/guiguzi/androidtest/activity/ViewPageActivity.kt
index 9534abfec4381e7cf6150816db0c49b8f682ae9b..c2e7fc18b483b5f78b9b2fd7d6e45d0bd766a098 100644
--- a/app/src/main/java/com/guiguzi/androidtest/activity/ViewPageActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/activity/ViewPageActivity.kt
@@ -24,7 +24,7 @@ class ViewPageActivity : Activity() {
mViewPager = findViewById(R.id.view_page1)
var myVPAdapter = MyViewPagerAdapter()
mViewPager.adapter = myVPAdapter
- mViewPager.rotation = 90f
+// mViewPager.rotation = 90f
}
inner class MyViewPagerAdapter : PagerAdapter() {
@@ -32,13 +32,13 @@ class ViewPageActivity : Activity() {
return mData.size
}
- override fun isViewFromObject(view: View, `object`: Any): Boolean {
- return view === `object`
+ override fun isViewFromObject(view: View, any: Any): Boolean {
+ return view === any
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
var view: View = View.inflate(baseContext, R.layout.item_page1, null)
- view.rotation = -90f
+// view.rotation = -90f
var text_view: TextView = view.findViewById(R.id.page_text)
text_view.text = mData[position]
container.addView(view)
diff --git a/app/src/main/java/com/guiguzi/androidtest/activityJava/MainJavaActivity.java b/app/src/main/java/com/guiguzi/androidtest/activityJava/MainJavaActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..1aa88107973be7e48a483a4c8bb16e64a9078213
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/activityJava/MainJavaActivity.java
@@ -0,0 +1,47 @@
+package com.guiguzi.androidtest.activityJava;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+
+import com.guiguzi.androidtest.R;
+import com.guiguzi.androidtest.aspectj.WBTextView;
+import com.guiguzi.androidtest.utils.AppUiUtils;
+
+public class MainJavaActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ LinearLayout linearLayout = new LinearLayout(getBaseContext());
+ WBTextView textView = new WBTextView(getBaseContext());
+ LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(AppUiUtils.dip2px(getBaseContext(), 120),
+ AppUiUtils.dip2px(getBaseContext(), 60));
+ textParams.gravity = Gravity.CENTER;
+
+ textView.setText("hello world");
+ textView.setBackgroundColor(getResources().getColor(R.color.color_grey));
+ textView.setGravity(Gravity.CENTER);
+ linearLayout.addView(textView, textParams);
+
+ textView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast toast = Toast.makeText(MainJavaActivity.this, "Text View On Click!", Toast.LENGTH_LONG);
+ toast.show();
+ }
+ });
+
+ ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+ setContentView(linearLayout, layoutParams);
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/aspectj/IViewData.java b/app/src/main/java/com/guiguzi/androidtest/aspectj/IViewData.java
new file mode 100644
index 0000000000000000000000000000000000000000..2765f39d900134de2a3e9cc31c6babd315136a74
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/aspectj/IViewData.java
@@ -0,0 +1,9 @@
+package com.guiguzi.androidtest.aspectj;
+
+public interface IViewData {
+
+ default String getData() {
+ return "";
+ }
+
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/aspectj/TraceAspect.java b/app/src/main/java/com/guiguzi/androidtest/aspectj/TraceAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..69e45177556f8b57f154c55dfe26d717f5f23546
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/aspectj/TraceAspect.java
@@ -0,0 +1,110 @@
+package com.guiguzi.androidtest.aspectj;
+
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.Trace;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+
+import com.guiguzi.androidtest.R;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+
+//@Aspect
+public class TraceAspect {
+
+ private static final String TAG = "Aspectj";
+
+ /*@Around("execution(* android.view.View.OnClickListener+.onClick(..))")
+ public void onClickAround(JoinPoint joinPoint) throws Throwable {
+ Trace.beginSection(joinPoint.getSignature().toString());
+ Log.d(TAG, "onClickAround done");
+
+ Object[] objectArgs = joinPoint.getArgs();
+ if (objectArgs != null) {
+ for (int i = 0; i < objectArgs.length; i++) {
+ Object objectArg = objectArgs[i];
+ if (objectArg instanceof View) {
+ Log.d(TAG, "onClickAround 是ViewGroup onClick done");
+ View view = (View) objectArg;
+ view.setEnabled(false);
+ }
+ }
+
+ }
+
+ }*/
+
+ /*@Before("execution(* android.view.View.OnClickListener+.onClick(..))")
+ public boolean before(JoinPoint joinPoint) throws Throwable {
+ Trace.beginSection(joinPoint.getSignature().toString());
+ Log.d(TAG, "onClick done");
+
+ Object[] objectArgs = joinPoint.getArgs();
+ if (objectArgs != null) {
+ for (int i = 0; i < objectArgs.length; i++) {
+ Object objectArg = objectArgs[i];
+ if (objectArg instanceof IViewData) {
+ IViewData viewData = (IViewData) objectArg;
+ if (objectArg instanceof View) {
+ View view = (View) objectArg;
+ showDialog(view.getContext(), viewData.getData());
+ }
+ Log.d(TAG, "是IViewData onClick done");
+
+ } else if (objectArg instanceof ViewGroup) {
+ Log.d(TAG, "是View onClick done");
+ ViewGroup viewGroup = (ViewGroup) objectArg;
+ showDialog(viewGroup.getContext());
+ } else if (objectArg instanceof View) {
+ Log.d(TAG, "是ViewGroup onClick done");
+ View view = (View) objectArg;
+// view.setEnabled(false);
+ view.setBackgroundColor(view.getContext().getColor(R.color.colorBlack));
+ showDialog(view.getContext());
+
+ }
+ }
+
+ }
+ return false;
+
+ }*/
+
+ /* @Before("execution(* android.app.Activity+.onCreate(..))")
+ public void aBefore(JoinPoint joinPoint) {
+ Trace.beginSection(joinPoint.getSignature().toString());
+ Log.d(TAG, "Activity before done");
+ }
+
+ @After("execution(* android.app.Activity+.onCreate(..))")
+ public void after() {
+ Trace.endSection();
+ Log.d(TAG, "Activity+ after done");
+ }*/
+
+
+ private void showDialog(Context context) {
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
+ dialogBuilder.setTitle("数据内容如下:");
+ dialogBuilder.setMessage("全局内容");
+ AlertDialog alertDialog = dialogBuilder.create();
+ alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
+ alertDialog.show();
+ }
+
+ private void showDialog(Context context, String content) {
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
+ dialogBuilder.setTitle("数据内容如下:");
+ dialogBuilder.setMessage(content);
+ AlertDialog alertDialog = dialogBuilder.create();
+ alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
+ alertDialog.show();
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/aspectj/WBTextView.java b/app/src/main/java/com/guiguzi/androidtest/aspectj/WBTextView.java
new file mode 100644
index 0000000000000000000000000000000000000000..93aba16232235acb6da71c9e1e2131614714ed81
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/aspectj/WBTextView.java
@@ -0,0 +1,37 @@
+package com.guiguzi.androidtest.aspectj;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.appcompat.widget.AppCompatTextView;
+
+public class WBTextView extends AppCompatTextView implements IViewData {
+
+
+ public WBTextView(Context context) {
+ super(context);
+ }
+
+ public WBTextView(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ }
+
+ public WBTextView(Context context, AttributeSet attributeSet, int def) {
+ super(context, attributeSet, def);
+ }
+
+
+ @Override
+ public String getData() {
+
+ CharSequence charSequence = getText();
+ if (charSequence != null) {
+ String content = charSequence.toString();
+ return content;
+ }
+
+ return "";
+ }
+
+
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/BannerViewGroup.kt b/app/src/main/java/com/guiguzi/androidtest/customView/BannerViewGroup.kt
index 9e6c9c5f48830633cd936640773819b163c2dfc9..24a362415d32c8a34cc07a73369820d095d880f2 100644
--- a/app/src/main/java/com/guiguzi/androidtest/customView/BannerViewGroup.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/BannerViewGroup.kt
@@ -1,9 +1,18 @@
package com.guiguzi.androidtest.customView
import android.content.Context
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
import android.util.AttributeSet
+import android.view.View
import android.view.ViewGroup
import android.widget.TextView
+import android.widget.Toast
import com.guiguzi.androidtest.R
class BannerViewGroup : ViewGroup {
@@ -12,6 +21,8 @@ class BannerViewGroup : ViewGroup {
lateinit var mText2: TextView
lateinit var mText3: TextView
+ val mPaint = Paint()
+
constructor(context: Context) : super(context) {
init(context)
}
@@ -20,12 +31,22 @@ class BannerViewGroup : ViewGroup {
init(context)
}
+ constructor(context: Context, attrs: AttributeSet, def: Int) : super(context, attrs, def) {
+ init(context)
+ }
+
private fun init(content: Context) {
mText1 = TextView(context)
mText2 = TextView(context)
mText3 = TextView(context)
- mText1.text = "text1"
+ var content1 = "text1,好好学习,天天向上"
+ var spannableStringBuilder: SpannableStringBuilder = SpannableStringBuilder(content1)
+ var likeClickSpan: LikeClickSpan = LikeClickSpan()
+ spannableStringBuilder.setSpan(likeClickSpan, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+ mText1.setText(spannableStringBuilder)
+// mText1.movementMethod = LinkMovementMethod.getInstance()
+
mText2.text = "text2"
mText3.text = "text3"
@@ -38,6 +59,14 @@ class BannerViewGroup : ViewGroup {
addViewInLayout(mText2, i++, generateDefaultLayoutParams(), true)
addViewInLayout(mText3, i++, generateDefaultLayoutParams(), true)
+ mPaint.color = resources.getColor(android.R.color.holo_orange_dark)
+ mPaint.strokeWidth = 3f
+ mPaint.style = Paint.Style.FILL
+ mPaint.textSize = 50f
+ mPaint.isAntiAlias = true
+
+ setWillNotDraw(false)//onDraw默认是不回调,用于回调
+
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@@ -94,5 +123,16 @@ class BannerViewGroup : ViewGroup {
}
+ override fun onDraw(canvas: Canvas?) {
+
+ val content = "好好学习,天天向上"
+ canvas?.drawText(content, 200f, 100f, mPaint)
+ }
+
+ inner class LikeClickSpan : ClickableSpan() {
+ override fun onClick(widget: View) {
+ Toast.makeText(context, "like click", Toast.LENGTH_LONG).show()
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPager.java b/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPager.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed9a2c8c907c239d81b05787fd4aacbe97c8735a
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPager.java
@@ -0,0 +1,2516 @@
+package com.guiguzi.androidtest.customView;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.FocusFinder;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Interpolator;
+import android.widget.Gallery;
+import android.widget.Scroller;
+
+import androidx.core.os.ParcelableCompat;
+import androidx.core.os.ParcelableCompatCreatorCallbacks;
+import androidx.core.view.AccessibilityDelegateCompat;
+import androidx.core.view.MotionEventCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+import androidx.core.widget.EdgeEffectCompat;
+import androidx.viewpager.widget.PagerAdapter;
+
+import com.guiguzi.androidtest.R;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+@SuppressLint("RtlHardcoded")
+public class CenterViewPager extends ViewGroup {
+
+ private float mFirstPagePaddingLeft;
+
+ private float mLastPagePaddingRight;
+
+ /**
+ * specifies that how much space need to be left to show the other items(left & right sides) for the center locked item
+ */
+ private float mPageSpace = 0f;
+ /**
+ * specifies that centerLock enable status
+ */
+ private boolean mCenterLockEnabled = false;
+
+ private static final String TAG = "ViewPager";
+
+ private static final boolean USE_CACHE = false;
+
+ private static final int DEFAULT_OFFSCREEN_PAGES = 1;
+ private static final int MAX_SETTLE_DURATION = 600; // ms
+ private static final int MIN_DISTANCE_FOR_FLING = 25; // dips
+
+ private static final int DEFAULT_GUTTER_SIZE = 16; // dips
+ private boolean isForceWrapChild;
+
+ private static final int[] LAYOUT_ATTRS = new int[]{android.R.attr.layout_gravity};
+
+ static class ItemInfo {
+ Object object;
+ int position;
+ boolean scrolling;
+ float widthFactor;
+ float offset;
+ }
+
+ private static final Comparator COMPARATOR = new Comparator() {
+ @Override
+ public int compare(ItemInfo lhs, ItemInfo rhs) {
+ return lhs.position - rhs.position;
+ }
+ };
+
+ private static final Interpolator sInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float t) {
+ t -= 1.0f;
+ return t * t * t * t * t + 1.0f;
+ }
+ };
+
+ private final ArrayList mItems = new ArrayList();
+ private final ItemInfo mTempItem = new ItemInfo();
+
+ private final Rect mTempRect = new Rect();
+
+ private PagerAdapter mAdapter;
+ private int mCurItem; // Index of currently displayed page.
+ private int mRestoredCurItem = -1;
+ private Parcelable mRestoredAdapterState = null;
+ private ClassLoader mRestoredClassLoader = null;
+ private Scroller mScroller;
+ private PagerObserver mObserver;
+
+ private int mPageMargin;
+ private Drawable mMarginDrawable;
+ private int mTopPageBounds;
+ private int mBottomPageBounds;
+
+ private float mFirstOffset = -Float.MAX_VALUE;
+ private float mLastOffset = Float.MAX_VALUE;
+
+
+ private int mChildHeightMeasureSpec;
+ private boolean mInLayout;
+
+ private boolean mScrollingCacheEnabled;
+
+ private boolean mPopulatePending;
+ private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
+
+ private boolean mIsBeingDragged;
+ private boolean mIsUnableToDrag;
+ private int mDefaultGutterSize;
+ private int mGutterSize;
+ private int mTouchSlop;
+ private float mInitialMotionX;
+
+ private float mLastMotionX;
+ private float mLastMotionY;
+
+ private int mActivePointerId = INVALID_POINTER;
+ private static final int INVALID_POINTER = -1;
+ private VelocityTracker mVelocityTracker;
+ private int mMinimumVelocity;
+ private int mMaximumVelocity;
+ private int mFlingDistance;
+ private int mCloseEnough;
+ private int mSeenPositionMin;
+ private int mSeenPositionMax;
+
+ private static final int CLOSE_ENOUGH = 2; // dp
+
+ private boolean mFakeDragging;
+ private long mFakeDragBeginTime;
+
+ private EdgeEffectCompat mLeftEdge;
+ private EdgeEffectCompat mRightEdge;
+
+ private boolean mFirstLayout = true;
+ private boolean mCalledSuper;
+ private int mDecorChildCount;
+
+ private OnPageChangeListener mOnPageChangeListener;
+ private OnPageChangeListener mInternalPageChangeListener;
+ private OnAdapterChangeListener mAdapterChangeListener;
+ private PageTransformer mPageTransformer;
+ private Method mSetChildrenDrawingOrderEnabled;
+
+ private static final int DRAW_ORDER_DEFAULT = 0;
+ private static final int DRAW_ORDER_FORWARD = 1;
+ private static final int DRAW_ORDER_REVERSE = 2;
+ private int mDrawingOrder;
+ private ArrayList mDrawingOrderedChildren;
+ private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator();
+
+ public static final int SCROLL_STATE_IDLE = 0;
+
+ public static final int SCROLL_STATE_DRAGGING = 1;
+
+ public static final int SCROLL_STATE_SETTLING = 2;
+
+ private final Runnable mEndScrollRunnable = new Runnable() {
+ @Override
+ public void run() {
+ setScrollState(SCROLL_STATE_IDLE);
+ populate();
+ }
+ };
+
+ private boolean mMatchChildHeightToViewPager = true;
+
+ private int mScrollState = SCROLL_STATE_IDLE;
+
+ public interface OnPageChangeListener {
+
+ void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
+
+ void onPageSelected(int position);
+
+ void onPageScrollStateChanged(int state);
+ }
+
+ public interface PageTransformer {
+ void transformPage(View page, float position);
+ }
+
+
+ interface OnAdapterChangeListener {
+ void onAdapterChanged(PagerAdapter oldAdapter, PagerAdapter newAdapter);
+ }
+
+ interface Decor {
+ }
+
+ public CenterViewPager(Context context) {
+ super(context);
+ initViewPager();
+ }
+
+ public CenterViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ initViewPager();
+ }
+
+ void initViewPager() {
+ setWillNotDraw(false);
+ setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
+ setFocusable(true);
+ final Context context = getContext();
+ mScroller = new Scroller(context, sInterpolator);
+ final ViewConfiguration configuration = ViewConfiguration.get(context);
+ mTouchSlop = configuration.getScaledPagingTouchSlop();
+ mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+ mLeftEdge = new EdgeEffectCompat(context);
+ mRightEdge = new EdgeEffectCompat(context);
+
+ final float density = context.getResources().getDisplayMetrics().density;
+ mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);
+ mCloseEnough = (int) (CLOSE_ENOUGH * density);
+ mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density);
+
+ ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate());
+
+ if (ViewCompat.getImportantForAccessibility(this) == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+ }
+
+ private void init(AttributeSet attrs) {
+ TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CenterViewPager);
+ mFirstPagePaddingLeft = a.getDimension(R.styleable.CenterViewPager_first_page_padding_left, 0);
+ mLastPagePaddingRight = a.getDimension(R.styleable.CenterViewPager_last_page_padding_right, 0);
+ a.recycle();
+ }
+
+
+ @Override
+ protected void onDetachedFromWindow() {
+ removeCallbacks(mEndScrollRunnable);
+ super.onDetachedFromWindow();
+ }
+
+ private void setScrollState(int newState) {
+ if (mScrollState == newState) {
+ return;
+ }
+
+ mScrollState = newState;
+ if (newState == SCROLL_STATE_DRAGGING) {
+ mSeenPositionMin = mSeenPositionMax = -1;
+ }
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrollStateChanged(newState);
+ }
+ }
+
+
+ public void setAdapter(PagerAdapter adapter) {
+ if (mAdapter != null) {
+ mAdapter.unregisterDataSetObserver(mObserver);
+ mAdapter.startUpdate(this);
+ for (int i = 0; i < mItems.size(); i++) {
+ final ItemInfo ii = mItems.get(i);
+ mAdapter.destroyItem(this, ii.position, ii.object);
+ }
+ mAdapter.finishUpdate(this);
+ mItems.clear();
+ removeNonDecorViews();
+ mCurItem = 0;
+ scrollTo(0, 0);
+ }
+
+ final PagerAdapter oldAdapter = mAdapter;
+ mAdapter = adapter;
+
+ if (mAdapter != null) {
+ if (mObserver == null) {
+ mObserver = new PagerObserver();
+ }
+ mAdapter.registerDataSetObserver(mObserver);
+ mPopulatePending = false;
+ mFirstLayout = true;
+ if (mRestoredCurItem >= 0) {
+ mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
+ setCurrentItemInternal(mRestoredCurItem, false, true);
+ mRestoredCurItem = -1;
+ mRestoredAdapterState = null;
+ mRestoredClassLoader = null;
+ } else {
+ populate();
+ }
+ }
+
+ if (mAdapterChangeListener != null && oldAdapter != adapter) {
+ mAdapterChangeListener.onAdapterChanged(oldAdapter, adapter);
+ }
+
+ }
+
+ private void removeNonDecorViews() {
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) {
+ removeViewAt(i);
+ i--;
+ }
+ }
+ }
+
+ public PagerAdapter getAdapter() {
+ return mAdapter;
+ }
+
+ void setOnAdapterChangeListener(OnAdapterChangeListener listener) {
+ mAdapterChangeListener = listener;
+ }
+
+ private void setCurrentItem(int item) {
+ mPopulatePending = false;
+ setCurrentItemInternal(item, !mFirstLayout, false);
+ }
+
+
+ public void setCurrentItemInCenter(int item) {
+ setCurrentItem(item);
+ }
+
+ public void setCurrentItem(int item, boolean smoothScroll) {
+ mPopulatePending = false;
+ setCurrentItemInternal(item, smoothScroll, false);
+ }
+
+ public int getCurrentItem() {
+ return mCurItem;
+ }
+
+ public Object getCurrentItemView() {
+ ItemInfo ii = infoForPosition(mCurItem);
+ return ii != null ? ii.object : null;
+ }
+
+ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) {
+ setCurrentItemInternal(item, smoothScroll, always, 0);
+ }
+
+ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
+ if (mAdapter == null || mAdapter.getCount() <= 0) {
+ setScrollingCacheEnabled(false);
+ return;
+ }
+ if (!always && mCurItem == item && mItems.size() != 0) {
+ setScrollingCacheEnabled(false);
+ return;
+ }
+
+ if (item < 0) {
+ item = 0;
+ } else if (item >= mAdapter.getCount()) {
+ item = mAdapter.getCount() - 1;
+ }
+ final int pageLimit = mOffscreenPageLimit;
+ if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
+ // We are doing a jump by more than one page. To avoid
+ // glitches, we want to keep all current pages in the view
+ // until the scroll ends.
+ for (int i = 0; i < mItems.size(); i++) {
+ mItems.get(i).scrolling = true;
+ }
+ }
+ final boolean dispatchSelected = mCurItem != item;
+ populate(item);
+ scrollToItem(item, smoothScroll, velocity, dispatchSelected);
+ }
+
+ private void scrollToItem(final int item, boolean smoothScroll, int velocity, boolean dispatchSelected) {
+ final ItemInfo curInfo = infoForPosition(item);
+ int destX = 0;
+ if (curInfo != null) {
+ final int width = getWidth();
+
+ destX = (int) (width * Math.max(mFirstOffset, Math.min(curInfo.offset - mPageSpace, mLastOffset)));
+
+ if (item == 0 /*&& mAdapter.getCount() > 1*/) {
+ //the first page scroll to mFirstPagePaddingLeft.
+ destX -= (int) mFirstPagePaddingLeft;
+ } else if (item == mAdapter.getCount() - 1/* && mAdapter.getCount() > 1*/) {
+ //adding the last page padding from the distance it should move.
+ destX += mFirstOffset < mLastOffset ? (int) mLastPagePaddingRight : (int) -mLastPagePaddingRight;
+ }
+ //end
+
+ }
+ if (smoothScroll) {
+ smoothScrollTo(destX, 0, velocity);
+ if (dispatchSelected && mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(item);
+ }
+ if (dispatchSelected && mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(item);
+ }
+ } else {
+ if (dispatchSelected && mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(item);
+ }
+ if (dispatchSelected && mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageSelected(item);
+ }
+ completeScroll(false);
+
+ if (mCenterLockEnabled/* && mAdapter.getCount() > 1*/) {
+ final int destXX = destX;
+ //adjust the first and last view in center at very first time of the ViewPager creation.
+ if (item == mAdapter.getCount() - 1 || item == 0) {
+
+ post(new Runnable() {
+ @Override
+ public void run() {
+ if (destXX == 0) {
+ if (item == 0) {
+ scrollTo(-(int) mFirstPagePaddingLeft, 0);
+ } else {
+ scrollTo((int) (mLastPagePaddingRight - getPageSpace() * 2), 0);
+ }
+ } else {
+ scrollTo(destXX, 0);
+ }
+ }
+ });
+
+ } else {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ //FIXME: hack- we should not have destxx value to 0 at any case because center lock enabled. So removing the pagespace to align child item to center.
+ if (destXX == 0) scrollTo(destXX - (int) getPageSpace(), 0);
+ else scrollTo(destXX, 0);
+ }
+ });
+ }
+ } else {
+ //regular flow
+ scrollTo(destX, 0);
+ }
+ //end
+ }
+ }
+
+ public void setOnPageChangeListener(OnPageChangeListener listener) {
+ mOnPageChangeListener = listener;
+ }
+
+ public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
+ if (Build.VERSION.SDK_INT >= 11) {
+ final boolean hasTransformer = transformer != null;
+ final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
+ mPageTransformer = transformer;
+ setChildrenDrawingOrderEnabledCompat(hasTransformer);
+ if (hasTransformer) {
+ mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
+ } else {
+ mDrawingOrder = DRAW_ORDER_DEFAULT;
+ }
+ if (needsPopulate) populate();
+ }
+ }
+
+ void setChildrenDrawingOrderEnabledCompat(boolean enable) {
+ if (mSetChildrenDrawingOrderEnabled == null) {
+ try {
+ mSetChildrenDrawingOrderEnabled = ViewGroup.class.getDeclaredMethod("setChildrenDrawingOrderEnabled", new Class[]{Boolean.TYPE});
+ } catch (NoSuchMethodException e) {
+ Log.e(TAG, "Can't find setChildrenDrawingOrderEnabled", e);
+ }
+ }
+ try {
+ if (mSetChildrenDrawingOrderEnabled != null) {
+ mSetChildrenDrawingOrderEnabled.invoke(this, enable);
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Error changing children drawing order", e);
+ }
+ }
+
+ @Override
+ protected int getChildDrawingOrder(int childCount, int i) {
+ int result = 0;
+ final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
+ if (index < mDrawingOrderedChildren.size()) {
+ result = ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
+ }
+ return result;
+ }
+
+ OnPageChangeListener setInternalPageChangeListener(OnPageChangeListener listener) {
+ OnPageChangeListener oldListener = mInternalPageChangeListener;
+ mInternalPageChangeListener = listener;
+ return oldListener;
+ }
+
+ public int getOffscreenPageLimit() {
+ return mOffscreenPageLimit;
+ }
+
+ public void setOffscreenPageLimit(int limit) {
+ if (limit < DEFAULT_OFFSCREEN_PAGES) {
+ Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES);
+ limit = DEFAULT_OFFSCREEN_PAGES;
+ }
+ if (limit != mOffscreenPageLimit) {
+ mOffscreenPageLimit = limit;
+ populate();
+ }
+ }
+
+ public void setPageMargin(int marginPixels) {
+ final int oldMargin = mPageMargin;
+ mPageMargin = marginPixels;
+
+ final int width = getWidth();
+ recomputeScrollPosition(width, width, marginPixels, oldMargin);
+
+ requestLayout();
+ }
+
+ public int getPageMargin() {
+ return mPageMargin;
+ }
+
+ public void setPageMarginDrawable(Drawable d) {
+ mMarginDrawable = d;
+ if (d != null) refreshDrawableState();
+ setWillNotDraw(d == null);
+ invalidate();
+ }
+
+ @SuppressWarnings("deprecation")
+ public void setPageMarginDrawable(int resId) {
+ setPageMarginDrawable(getContext().getResources().getDrawable(resId));
+ }
+
+ @Override
+ protected boolean verifyDrawable(Drawable who) {
+ return super.verifyDrawable(who) || who == mMarginDrawable;
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ final Drawable d = mMarginDrawable;
+ if (d != null && d.isStateful()) {
+ d.setState(getDrawableState());
+ }
+ }
+
+ // We want the duration of the page snap animation to be influenced by the distance that
+ // the screen has to travel, however, we don't want this duration to be effected in a
+ // purely linear fashion. Instead, we use this method to moderate the effect that the distance
+ // of travel has on the overall snap duration.
+ float distanceInfluenceForSnapDuration(float f) {
+ f -= 0.5f; // center the values about 0.
+ f *= 0.3f * Math.PI / 2.0f;
+ return (float) Math.sin(f);
+ }
+
+ /**
+ * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+ *
+ * @param x the number of pixels to scroll by on the X axis
+ * @param y the number of pixels to scroll by on the Y axis
+ */
+ void smoothScrollTo(int x, int y) {
+ smoothScrollTo(x, y, 0);
+ }
+
+ /**
+ * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+ *
+ * @param x the number of pixels to scroll by on the X axis
+ * @param y the number of pixels to scroll by on the Y axis
+ * @param velocity the velocity associated with a fling, if applicable. (0 otherwise)
+ */
+ void smoothScrollTo(int x, int y, int velocity) {
+ if (getChildCount() == 0) {
+ // Nothing to do.
+ setScrollingCacheEnabled(false);
+ return;
+ }
+ int sx = getScrollX();
+ int sy = getScrollY();
+ int dx = x - sx;
+ int dy = y - sy;
+ if (dx == 0 && dy == 0) {
+ completeScroll(false);
+ populate();
+ setScrollState(SCROLL_STATE_IDLE);
+ return;
+ }
+
+ setScrollingCacheEnabled(true);
+ setScrollState(SCROLL_STATE_SETTLING);
+
+ final int width = getWidth();
+ final int halfWidth = width / 2;
+ final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / width);
+ final float distance = halfWidth + halfWidth * distanceInfluenceForSnapDuration(distanceRatio);
+
+ int duration = 0;
+ velocity = Math.abs(velocity);
+ if (velocity > 0) {
+ duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
+ } else {
+ final float pageWidth = width * mAdapter.getPageWidth(mCurItem);
+ final float pageDelta = (float) Math.abs(dx) / (pageWidth + mPageMargin);
+ duration = (int) ((pageDelta + 1) * 100);
+ }
+ duration = Math.min(duration, MAX_SETTLE_DURATION);
+
+ mScroller.startScroll(sx, sy, dx, dy, duration);
+
+
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+
+ ItemInfo addNewItem(int position, int index) {
+ ItemInfo ii = new ItemInfo();
+ ii.position = position;
+ ii.object = mAdapter.instantiateItem(this, position);
+ ii.widthFactor = mAdapter.getPageWidth(position);
+ if (index < 0 || index >= mItems.size()) {
+ mItems.add(ii);
+ } else {
+ mItems.add(index, ii);
+ }
+ return ii;
+ }
+
+ void dataSetChanged() {
+ // This method only gets called if our observer is attached, so mAdapter is non-null.
+
+ boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 && mItems.size() < mAdapter.getCount();
+ int newCurrItem = mCurItem;
+
+ boolean isUpdating = false;
+ for (int i = 0; i < mItems.size(); i++) {
+ final ItemInfo ii = mItems.get(i);
+ final int newPos = mAdapter.getItemPosition(ii.object);
+
+ if (newPos == PagerAdapter.POSITION_UNCHANGED) {
+ continue;
+ }
+
+ if (newPos == PagerAdapter.POSITION_NONE) {
+ mItems.remove(i);
+ i--;
+
+ if (!isUpdating) {
+ mAdapter.startUpdate(this);
+ isUpdating = true;
+ }
+
+ mAdapter.destroyItem(this, ii.position, ii.object);
+ needPopulate = true;
+
+ if (mCurItem == ii.position) {
+ // Keep the current item in the valid range
+ newCurrItem = Math.max(0, Math.min(mCurItem, mAdapter.getCount() - 1));
+// if(mCurItem > 0){
+// mCurItem--;
+// }
+ needPopulate = true;
+ }
+ continue;
+ }
+
+ if (ii.position != newPos) {
+ if (ii.position == mCurItem) {
+ // Our current item changed position. Follow it.
+ newCurrItem = newPos;
+ }
+
+ ii.position = newPos;
+ needPopulate = true;
+ }
+ }
+
+ if (isUpdating) {
+ mAdapter.finishUpdate(this);
+ }
+
+ Collections.sort(mItems, COMPARATOR);
+
+ if (needPopulate) {
+ // Reset our known page widths; populate will recompute them.
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) {
+ lp.widthFactor = 0.f;
+ }
+ }
+
+ final int currItem = newCurrItem;
+ mPopulatePending = false;
+ setCurrentItemInternal(currItem, true, true, 50);
+ requestLayout();
+
+ }
+ }
+
+ void populate() {
+ populate(mCurItem);
+ }
+
+ void populate(int newCurrentItem) {
+ ItemInfo oldCurInfo = null;
+ if (mCurItem != newCurrentItem) {
+ oldCurInfo = infoForPosition(mCurItem);
+ mCurItem = newCurrentItem;
+ }
+
+ if (mAdapter == null) {
+ return;
+ }
+
+ // Bail now if we are waiting to populate. This is to hold off
+ // on creating views from the time the user releases their finger to
+ // fling to a new position until we have finished the scroll to
+ // that position, avoiding glitches from happening at that point.
+ if (mPopulatePending) {
+ return;
+ }
+
+ // Also, don't populate until we are attached to a window. This is to
+ // avoid trying to populate before we have restored our view hierarchy
+ // state and conflicting with what is restored.
+ if (getWindowToken() == null) {
+ return;
+ }
+
+ mAdapter.startUpdate(this);
+
+ final int pageLimit = mOffscreenPageLimit;
+ final int startPos = Math.max(0, mCurItem - pageLimit);
+ final int N = mAdapter.getCount();
+ final int endPos = Math.min(N - 1, mCurItem + pageLimit);
+
+ // Locate the currently focused item or add it if needed.
+ int curIndex = -1;
+ ItemInfo curItem = null;
+ for (curIndex = 0; curIndex < mItems.size(); curIndex++) {
+ final ItemInfo ii = mItems.get(curIndex);
+ if (ii.position >= mCurItem) {
+ if (ii.position == mCurItem) curItem = ii;
+ break;
+ }
+ }
+
+ if (curItem == null && N > 0) {
+ curItem = addNewItem(mCurItem, curIndex);
+ }
+
+ // Fill 3x the available width or up to the number of offscreen
+ // pages requested to either side, whichever is larger.
+ // If we have no current item we have no work to do.
+ if (curItem != null) {
+ float extraWidthLeft = 0.f;
+ int itemIndex = curIndex - 1;
+ ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ final float leftWidthNeeded = 2.f - curItem.widthFactor;
+ for (int pos = mCurItem - 1; pos >= 0; pos--) {
+ if (extraWidthLeft >= leftWidthNeeded && pos < startPos) {
+ if (ii == null) {
+ break;
+ }
+ if (pos == ii.position && !ii.scrolling) {
+ mItems.remove(itemIndex);
+ mAdapter.destroyItem(this, pos, ii.object);
+ itemIndex--;
+ curIndex--;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ }
+ } else if (ii != null && pos == ii.position) {
+ extraWidthLeft += ii.widthFactor;
+ itemIndex--;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ } else {
+ ii = addNewItem(pos, itemIndex + 1);
+ extraWidthLeft += ii.widthFactor;
+ curIndex++;
+ ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+ }
+ }
+
+ float extraWidthRight = curItem.widthFactor;
+ itemIndex = curIndex + 1;
+ if (extraWidthRight < 2.f) {
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ for (int pos = mCurItem + 1; pos < N; pos++) {
+ if (extraWidthRight >= 2.f && pos > endPos) {
+ if (ii == null) {
+ break;
+ }
+ if (pos == ii.position && !ii.scrolling) {
+ mItems.remove(itemIndex);
+ mAdapter.destroyItem(this, pos, ii.object);
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ }
+ } else if (ii != null && pos == ii.position) {
+ extraWidthRight += ii.widthFactor;
+ itemIndex++;
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ } else {
+ ii = addNewItem(pos, itemIndex);
+ itemIndex++;
+ extraWidthRight += ii.widthFactor;
+ ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+ }
+ }
+ }
+
+ calculatePageOffsets(curItem, curIndex, oldCurInfo);
+ }
+
+ mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
+
+ mAdapter.finishUpdate(this);
+
+ // Check width measurement of current pages and drawing sort order.
+ // Update LayoutParams as needed.
+ final boolean sort = mDrawingOrder != DRAW_ORDER_DEFAULT;
+ if (sort) {
+ if (mDrawingOrderedChildren == null) {
+ mDrawingOrderedChildren = new ArrayList();
+ } else {
+ mDrawingOrderedChildren.clear();
+ }
+ }
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ lp.childIndex = i;
+ if (!lp.isDecor && lp.widthFactor == 0.f) {
+ // 0 means requery the adapter for this, it doesn't have a valid width.
+ final ItemInfo ii = infoForChild(child);
+ if (ii != null) {
+ lp.widthFactor = ii.widthFactor;
+ lp.position = ii.position;
+ }
+ }
+ if (sort) mDrawingOrderedChildren.add(child);
+ }
+ if (sort) {
+ Collections.sort(mDrawingOrderedChildren, sPositionComparator);
+ }
+
+ if (hasFocus()) {
+ View currentFocused = findFocus();
+ ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null;
+ if (ii == null || ii.position != mCurItem) {
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ if (child.requestFocus(FOCUS_FORWARD)) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void calculatePageOffsets(ItemInfo curItem, int curIndex, ItemInfo oldCurInfo) {
+ final int N = mAdapter.getCount();
+ final int width = getWidth();
+ final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+ // Fix up offsets for later layout.
+ if (oldCurInfo != null) {
+ final int oldCurPosition = oldCurInfo.position;
+ // Base offsets off of oldCurInfo.
+ if (oldCurPosition < curItem.position) {
+ int itemIndex = 0;
+ ItemInfo ii = null;
+ float offset = oldCurInfo.offset + oldCurInfo.widthFactor + marginOffset;
+ for (int pos = oldCurPosition + 1; pos <= curItem.position && itemIndex < mItems.size(); pos++) {
+ ii = mItems.get(itemIndex);
+ while (pos > ii.position && itemIndex < mItems.size() - 1) {
+ itemIndex++;
+ ii = mItems.get(itemIndex);
+ }
+ while (pos < ii.position) {
+ // We don't have an item populated for this,
+ // ask the adapter for an offset.
+ offset += mAdapter.getPageWidth(pos) + marginOffset;
+ pos++;
+ }
+ ii.offset = offset;
+ offset += ii.widthFactor + marginOffset;
+ }
+ } else if (oldCurPosition > curItem.position) {
+ int itemIndex = mItems.size() - 1;
+ ItemInfo ii = null;
+ float offset = oldCurInfo.offset;
+ for (int pos = oldCurPosition - 1; pos >= curItem.position && itemIndex >= 0; pos--) {
+ ii = mItems.get(itemIndex);
+ while (pos < ii.position && itemIndex > 0) {
+ itemIndex--;
+ ii = mItems.get(itemIndex);
+ }
+ while (pos > ii.position) {
+ // We don't have an item populated for this,
+ // ask the adapter for an offset.
+ offset -= mAdapter.getPageWidth(pos) + marginOffset;
+ pos--;
+ }
+ offset -= ii.widthFactor + marginOffset;
+ ii.offset = offset;
+ }
+ }
+ }
+
+ // Base all offsets off of curItem.
+ final int itemCount = mItems.size();
+ float offset = curItem.offset;
+ int pos = curItem.position - 1;
+ mFirstOffset = curItem.position == 0 ? curItem.offset : -Float.MAX_VALUE;
+ mLastOffset = curItem.position == N - 1 ? curItem.offset + curItem.widthFactor - 1 : Float.MAX_VALUE;
+ // Previous pages
+ for (int i = curIndex - 1; i >= 0; i--, pos--) {
+ final ItemInfo ii = mItems.get(i);
+ while (pos > ii.position) {
+ offset -= mAdapter.getPageWidth(pos--) + marginOffset;
+ }
+ offset -= ii.widthFactor + marginOffset;
+ ii.offset = offset;
+ if (ii.position == 0) mFirstOffset = offset;
+ }
+ offset = curItem.offset + curItem.widthFactor + marginOffset;
+ pos = curItem.position + 1;
+ // Next pages
+ for (int i = curIndex + 1; i < itemCount; i++, pos++) {
+ final ItemInfo ii = mItems.get(i);
+ while (pos < ii.position) {
+ offset += mAdapter.getPageWidth(pos++) + marginOffset;
+ }
+ if (ii.position == N - 1) {
+ mLastOffset = offset + ii.widthFactor - 1;
+ }
+ ii.offset = offset;
+ offset += ii.widthFactor + marginOffset;
+ }
+ }
+
+ /**
+ * This is the persistent state that is saved by ViewPager. Only needed
+ * if you are creating a sublass of ViewPager that must save its own
+ * state, in which case it should implement a subclass of this which
+ * contains that state.
+ */
+ public static class SavedState extends BaseSavedState {
+ int position;
+ Parcelable adapterState;
+ ClassLoader loader;
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ super.writeToParcel(out, flags);
+ out.writeInt(position);
+ out.writeParcelable(adapterState, flags);
+ }
+
+ @Override
+ public String toString() {
+ return "FragmentPager.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " position=" + position + "}";
+ }
+
+ public static final Parcelable.Creator CREATOR = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks() {
+ @Override
+ public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+ return new SavedState(in, loader);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ });
+
+ SavedState(Parcel in, ClassLoader loader) {
+ super(in);
+ if (loader == null) {
+ loader = getClass().getClassLoader();
+ }
+ position = in.readInt();
+ adapterState = in.readParcelable(loader);
+ this.loader = loader;
+ }
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ SavedState ss = new SavedState(superState);
+ ss.position = mCurItem;
+ if (mAdapter != null) {
+ ss.adapterState = mAdapter.saveState();
+ }
+ return ss;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if (!(state instanceof SavedState)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ SavedState ss = (SavedState) state;
+ super.onRestoreInstanceState(ss.getSuperState());
+
+ if (mAdapter != null) {
+ mAdapter.restoreState(ss.adapterState, ss.loader);
+ setCurrentItemInternal(ss.position, false, true);
+ } else {
+ mRestoredCurItem = ss.position;
+ mRestoredAdapterState = ss.adapterState;
+ mRestoredClassLoader = ss.loader;
+ }
+ }
+
+ @Override
+ public void addView(View child, int index, ViewGroup.LayoutParams params) {
+ if (!checkLayoutParams(params)) {
+ params = generateLayoutParams(params);
+ }
+ final LayoutParams lp = (LayoutParams) params;
+ lp.isDecor |= child instanceof Decor;
+ if (mInLayout) {
+ if (lp != null && lp.isDecor) {
+ throw new IllegalStateException("Cannot add pager decor view during layout");
+ }
+ lp.needsMeasure = true;
+ addViewInLayout(child, index, params);
+ } else {
+ super.addView(child, index, params);
+ }
+
+ if (USE_CACHE) {
+ if (child.getVisibility() != GONE) {
+ child.setDrawingCacheEnabled(mScrollingCacheEnabled);
+ } else {
+ child.setDrawingCacheEnabled(false);
+ }
+ }
+ }
+
+ ItemInfo infoForChild(View child) {
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (mAdapter.isViewFromObject(child, ii.object)) {
+ return ii;
+ }
+ }
+ return null;
+ }
+
+ ItemInfo infoForAnyChild(View child) {
+ ViewParent parent;
+ while ((parent = child.getParent()) != this) {
+ if (parent == null || !(parent instanceof View)) {
+ return null;
+ }
+ child = (View) parent;
+ }
+ return infoForChild(child);
+ }
+
+ ItemInfo infoForPosition(int position) {
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (ii.position == position) {
+ return ii;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mFirstLayout = true;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // For simple implementation, or internal size is always 0.
+ // We depend on the container to specify the layout size of
+ // our view. We can't really know what it is since we will be
+ // adding and removing different arbitrary views and do not
+ // want the layout to change as this happens.
+ int defaultWidth = getDefaultSize(0, widthMeasureSpec);
+ int defaultHeight = getDefaultSize(0, heightMeasureSpec);
+ if (isForceWrapChild) defaultHeight = 0;
+
+ final int measuredWidth = defaultWidth;
+ final int maxGutterSize = measuredWidth / 10;
+ mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
+
+ final int measuredHeight = defaultHeight;
+ // Children are just made to fill our space.
+ int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
+ int childHeightSize = 0;
+ if (measuredHeight > 0) {
+ childHeightSize = measuredHeight - getPaddingTop() - getPaddingBottom();
+ }
+
+ /*
+ * Make sure all children have been properly measured. Decor views first.
+ * Right now we cheat and make this less complicated by assuming decor
+ * views won't intersect. We will pin to edges based on gravity.
+ */
+ int size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (lp != null && lp.isDecor) {
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+ int widthMode = MeasureSpec.AT_MOST;
+ int heightMode = MeasureSpec.AT_MOST;
+ boolean consumeVertical = vgrav == Gravity.TOP || vgrav == Gravity.BOTTOM;
+ boolean consumeHorizontal = hgrav == Gravity.LEFT || hgrav == Gravity.RIGHT;
+
+ if (consumeVertical) {
+ widthMode = MeasureSpec.EXACTLY;
+ } else if (consumeHorizontal) {
+ heightMode = MeasureSpec.EXACTLY;
+ }
+
+ int widthSize = childWidthSize;
+ int heightSize = childHeightSize;
+ if (lp.width != LayoutParams.WRAP_CONTENT) {
+ widthMode = MeasureSpec.EXACTLY;
+ if (lp.width != LayoutParams.MATCH_PARENT) {
+ widthSize = lp.width;
+ }
+ }
+ if (lp.height != LayoutParams.WRAP_CONTENT) {
+ heightMode = MeasureSpec.EXACTLY;
+ if (lp.height != LayoutParams.MATCH_PARENT) {
+ heightSize = lp.height;
+ }
+ }
+ final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
+ final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
+ child.measure(widthSpec, heightSpec);
+
+ if (consumeVertical) {
+ if (childHeightSize > 0) {
+ childHeightSize -= child.getMeasuredHeight();
+ } else {
+ childHeightSize += child.getMeasuredHeight();
+ }
+ } else if (consumeHorizontal) {
+ childWidthSize -= child.getMeasuredWidth();
+ }
+ }
+ }
+ }
+
+ if (mMatchChildHeightToViewPager) {
+ //FIXME: sandeep: apply match_parent for each child
+ mChildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY);
+ } else {
+ //not doing anything, so child height will be based on its content
+ }
+
+ // Make sure we have created all fragments that we need to have shown.
+ mInLayout = true;
+ populate();
+ mInLayout = false;
+
+ // Page views next.
+ size = getChildCount();
+ int maxHeight = 0;
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (lp != null && !lp.isDecor) {
+ final int widthSpec = MeasureSpec.makeMeasureSpec((int) (childWidthSize * lp.widthFactor), MeasureSpec.EXACTLY);
+ child.measure(widthSpec, mChildHeightMeasureSpec);
+ if (maxHeight <= child.getMeasuredHeight()) {
+ maxHeight = child.getMeasuredHeight();
+ } else {
+ final int childHeight = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.EXACTLY);
+ child.measure(widthSpec, childHeight);
+ }
+ } else if (lp == null) {
+ final int widthSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);
+ child.measure(widthSpec, mChildHeightMeasureSpec);
+ if (maxHeight <= child.getMeasuredHeight()) {
+ maxHeight = child.getMeasuredHeight();
+ } else {
+ final int childHeight = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.EXACTLY);
+ child.measure(widthSpec, childHeight);
+ }
+ }
+ }
+ }
+ if (measuredHeight > 0) {
+ setMeasuredDimension(measuredWidth, measuredHeight);
+ } else {
+ childHeightSize += getPaddingBottom() + getPaddingTop() + maxHeight;
+ final int heightSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY);
+ setMeasuredDimension(measuredWidth, heightSpec);
+ }
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ // Make sure scroll position is set correctly.
+ if (w != oldw) {
+ recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
+ }
+ }
+
+ private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
+ if (oldWidth > 0 && !mItems.isEmpty()) {
+ final int widthWithMargin = width + margin;
+ final int oldWidthWithMargin = oldWidth + oldMargin;
+ final int xpos = getScrollX();
+ final float pageOffset = (float) xpos / oldWidthWithMargin;
+ final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
+
+ scrollTo(newOffsetPixels, getScrollY());
+ if (!mScroller.isFinished()) {
+ // We now return to your regularly scheduled scroll, already in progress.
+ final int newDuration = mScroller.getDuration() - mScroller.timePassed();
+ ItemInfo targetInfo = infoForPosition(mCurItem);
+ final float scrollOffset = targetInfo != null ? targetInfo.offset : 0;
+ mScroller.startScroll(newOffsetPixels, 0, (int) (scrollOffset * width), 0, newDuration);
+ }
+ } else {
+ final ItemInfo ii = infoForPosition(mCurItem);
+// final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0;
+ final float scrollOffset = ii != null ? ii.offset : 0;
+ /**** 修改mFirstPagePaddingLeft不起作用, 导致左边margin无法生效的问题 Modify By L.K@2016-07-25 ****/
+ final int scrollPos = (int) (scrollOffset * width - mFirstPagePaddingLeft);
+ if (scrollPos != getScrollX()) {
+ completeScroll(false);
+ scrollTo(scrollPos, getScrollY());
+ }
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ mInLayout = true;
+ populate();
+ mInLayout = false;
+
+ final int count = getChildCount();
+ int width = r - l;
+ int height = b - t;
+ int paddingLeft = getPaddingLeft();
+ int paddingTop = getPaddingTop();
+ int paddingRight = getPaddingRight();
+ int paddingBottom = getPaddingBottom();
+ final int scrollX = getScrollX();
+
+ int decorCount = 0;
+
+ // First pass - decor views. We need to do this in two passes so that
+ // we have the proper offsets for non-decor views later.
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ int childLeft = 0;
+ int childTop = 0;
+ if (lp.isDecor) {
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+ switch (hgrav) {
+ default:
+ childLeft = paddingLeft;
+ break;
+ case Gravity.LEFT:
+ childLeft = paddingLeft;
+ paddingLeft += child.getMeasuredWidth();
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ childLeft = Math.max((width - child.getMeasuredWidth()) / 2, paddingLeft);
+ break;
+ case Gravity.RIGHT:
+ childLeft = width - paddingRight - child.getMeasuredWidth();
+ paddingRight += child.getMeasuredWidth();
+ break;
+ }
+ switch (vgrav) {
+ default:
+ childTop = paddingTop;
+ break;
+ case Gravity.TOP:
+ childTop = paddingTop;
+ paddingTop += child.getMeasuredHeight();
+ break;
+ case Gravity.CENTER_VERTICAL:
+ childTop = Math.max((height - child.getMeasuredHeight()) / 2, paddingTop);
+ break;
+ case Gravity.BOTTOM:
+ childTop = height - paddingBottom - child.getMeasuredHeight();
+ paddingBottom += child.getMeasuredHeight();
+ break;
+ }
+ childLeft += scrollX;
+ child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(), childTop + child.getMeasuredHeight());
+ decorCount++;
+ }
+ }
+ }
+
+ // Page views. Do this once we have the right padding offsets from above.
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ ItemInfo ii;
+ if (!lp.isDecor && (ii = infoForChild(child)) != null) {
+ int loff = (int) (width * ii.offset);
+ int childLeft = paddingLeft + loff;
+ int childTop = paddingTop;
+ if (lp.needsMeasure) {
+ // This was added during layout and needs measurement.
+ // Do it now that we know what we're working with.
+ lp.needsMeasure = false;
+ final int widthSpec = MeasureSpec.makeMeasureSpec((int) ((width - paddingLeft - paddingRight) * lp.widthFactor), MeasureSpec.EXACTLY);
+ final int heightSpec = MeasureSpec.makeMeasureSpec((int) (height - paddingTop - paddingBottom), MeasureSpec.EXACTLY);
+ child.measure(widthSpec, heightSpec);
+ }
+ child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(), childTop + child.getMeasuredHeight());
+ }
+ }
+ }
+ mTopPageBounds = paddingTop;
+ mBottomPageBounds = height - paddingBottom;
+ mDecorChildCount = decorCount;
+ mFirstLayout = false;
+ }
+
+ @Override
+ public void computeScroll() {
+ if (!mScroller.isFinished() && mScroller.computeScrollOffset()) {
+ int oldX = getScrollX();
+ int oldY = getScrollY();
+ int x = mScroller.getCurrX();
+ int y = mScroller.getCurrY();
+
+ if (oldX != x || oldY != y) {
+ scrollTo(x, y);
+ if (!pageScrolled(x)) {
+ mScroller.abortAnimation();
+ scrollTo(0, y);
+ }
+ }
+
+ // Keep on drawing until the animation has finished.
+ ViewCompat.postInvalidateOnAnimation(this);
+ return;
+ }
+
+ // Done with scroll, clean up state.
+ completeScroll(true);
+ }
+
+ private boolean pageScrolled(int xpos) {
+ if (mItems.size() == 0) {
+ mCalledSuper = false;
+ onPageScrolled(0, 0, 0);
+ if (!mCalledSuper) {
+ throw new IllegalStateException("onPageScrolled did not call superclass implementation");
+ }
+ return false;
+ }
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int width = getWidth();
+ final int widthWithMargin = width + mPageMargin;
+ final float marginOffset = (float) mPageMargin / width;
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) xpos / width) - ii.offset) / (ii.widthFactor + marginOffset);
+ final int offsetPixels = (int) (pageOffset * widthWithMargin);
+
+ mCalledSuper = false;
+ onPageScrolled(currentPage, pageOffset, offsetPixels);
+ if (!mCalledSuper) {
+ throw new IllegalStateException("onPageScrolled did not call superclass implementation");
+ }
+ return true;
+ }
+
+ /**
+ * This method will be invoked when the current page is scrolled, either as part
+ * of a programmatically initiated smooth scroll or a user initiated touch scroll.
+ * If you override this method you must call through to the superclass implementation
+ * (e.g. super.onPageScrolled(position, offset, offsetPixels)) before onPageScrolled
+ * returns.
+ *
+ * @param position Position index of the first page currently being displayed.
+ * Page position+1 will be visible if positionOffset is nonzero.
+ * @param offset Value from [0, 1) indicating the offset from the page at position.
+ * @param offsetPixels Value in pixels indicating the offset from position.
+ */
+ protected void onPageScrolled(int position, float offset, int offsetPixels) {
+ if (mDecorChildCount > 0) {
+ final int scrollX = getScrollX();
+ int paddingLeft = getPaddingLeft();
+ int paddingRight = getPaddingRight();
+ final int width = getWidth();
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.isDecor) continue;
+
+ final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+ int childLeft = 0;
+ switch (hgrav) {
+ default:
+ childLeft = paddingLeft;
+ break;
+ case Gravity.LEFT:
+ childLeft = paddingLeft;
+ paddingLeft += child.getWidth();
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ childLeft = Math.max((width - child.getMeasuredWidth()) / 2, paddingLeft);
+ break;
+ case Gravity.RIGHT:
+ childLeft = width - paddingRight - child.getMeasuredWidth();
+ paddingRight += child.getMeasuredWidth();
+ break;
+ }
+ childLeft += scrollX;
+
+ final int childOffset = childLeft - child.getLeft();
+ if (childOffset != 0) {
+ child.offsetLeftAndRight(childOffset);
+ }
+ }
+ }
+
+ if (mSeenPositionMin < 0 || position < mSeenPositionMin) {
+ mSeenPositionMin = position;
+ }
+ if (mSeenPositionMax < 0 || (float) Math.ceil(position + offset) > mSeenPositionMax) {
+ mSeenPositionMax = position + 1;
+ }
+
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
+ if (mInternalPageChangeListener != null) {
+ mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+ }
+
+ if (mPageTransformer != null) {
+ final int scrollX = getScrollX();
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+ if (lp.isDecor) continue;
+
+ final float transformPos = (float) (child.getLeft() - scrollX) / getWidth();
+ mPageTransformer.transformPage(child, transformPos);
+ }
+ }
+
+ mCalledSuper = true;
+ }
+
+ protected void completeScroll(boolean postEvents) {
+ boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING;
+ if (needPopulate) {
+ // Done with scroll, no longer want to cache view drawing.
+ setScrollingCacheEnabled(false);
+ mScroller.abortAnimation();
+ int oldX = getScrollX();
+ int oldY = getScrollY();
+ int x = mScroller.getCurrX();
+ int y = mScroller.getCurrY();
+ if (oldX != x || oldY != y) {
+ scrollTo(x, y);
+ }
+ }
+ mPopulatePending = false;
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ if (ii.scrolling) {
+ needPopulate = true;
+ ii.scrolling = false;
+ }
+ }
+ if (needPopulate) {
+ if (postEvents) {
+ ViewCompat.postOnAnimation(this, mEndScrollRunnable);
+ } else {
+ mEndScrollRunnable.run();
+ }
+ }
+ }
+
+ private boolean isGutterDrag(float x, float dx) {
+ return (x < mGutterSize && dx > 0) || (x > getWidth() - mGutterSize && dx < 0);
+ }
+
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (mAdapter == null || mAdapter.getCount() == 0 || mAdapter.getCount() * mAdapter.getPageWidth(0) <= 1f) {
+ return false;
+ }
+
+ final int action = ev.getAction() & MotionEvent.ACTION_MASK;
+
+ if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+ endDrag();
+ return false;
+ }
+
+ if (action != MotionEvent.ACTION_DOWN) {
+ if (mIsBeingDragged) {
+ return true;
+ }
+ if (mIsUnableToDrag) {
+ return false;
+ }
+ }
+
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(ev);
+ switch (action) {
+ case MotionEvent.ACTION_MOVE: {
+ final int activePointerId = mActivePointerId;
+ if (activePointerId == INVALID_POINTER) {
+ break;
+ }
+
+ final int pointerIndex = ev.findPointerIndex(activePointerId);
+ final float x = ev.getX(pointerIndex);
+ final float dx = x - mLastMotionX;
+ final float xDiff = Math.abs(dx);
+ final float y = ev.getY(pointerIndex);
+ mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ final float vX = mVelocityTracker.getXVelocity(pointerIndex);
+ final float yDiff = Math.abs(y - mLastMotionY);
+ boolean canDrag = canStartDrag(xDiff, yDiff);
+
+ if (canDrag || checkVelocity(xDiff, vX)) {
+ mIsBeingDragged = true;
+ requestParentDisallowInterceptTouchEvent(true);
+ setScrollState(SCROLL_STATE_DRAGGING);
+ mLastMotionX = x;
+ setScrollingCacheEnabled(true);
+ } else {
+ if (yDiff > mTouchSlop) {
+ mIsUnableToDrag = true;
+ }
+ }
+
+ if (this.mIsBeingDragged && this.performDrag(x)) {
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ break;
+ }
+
+ case MotionEvent.ACTION_DOWN: {
+ mLastMotionX = mInitialMotionX = ev.getX();
+ mLastMotionY = ev.getY();
+ mActivePointerId = ev.getPointerId(0);
+ mIsUnableToDrag = false;
+
+ mScroller.computeScrollOffset();
+ if (mScrollState == SCROLL_STATE_SETTLING && Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) {
+ // Let the user 'catch' the pager as it animates.
+
+ mScroller.abortAnimation();
+ mPopulatePending = false;
+ populate();
+ mIsBeingDragged = true;
+ setScrollState(SCROLL_STATE_DRAGGING);
+ requestParentDisallowInterceptTouchEvent(true);
+ } else {
+ completeScroll(false);
+ mIsBeingDragged = false;
+ }
+
+ break;
+ }
+
+ case MotionEvent.ACTION_POINTER_UP:
+ onSecondaryPointerUp(ev);
+ break;
+ }
+
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(ev);
+ return mIsBeingDragged;
+ }
+
+ private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept) {
+ final ViewParent parent = getParent();
+ if (parent != null) {
+ parent.requestDisallowInterceptTouchEvent(disallowIntercept);
+ }
+ }
+
+ private boolean canStartDrag(float xDiff, float yDiff) {
+ return (xDiff >= (mTouchSlop >> 4) || yDiff >= (mTouchSlop >> 4)) && xDiff * 2 >= yDiff;
+ }
+
+ private boolean checkVelocity(float deltaX, float velocity) {
+ return Math.abs(deltaX * 2) > mFlingDistance && Math.abs(velocity * 2) > mMinimumVelocity;
+ }
+
+
+ @Override
+ public boolean canScrollHorizontally(int direction) {
+
+ if (direction < 0) {
+ // 手指向右滑动
+ if (0 == getCurrentItem()) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ // 手指向左滑动
+ if (null != mAdapter && mAdapter.getCount() - 1 > getCurrentItem()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ public boolean onTouchEvent(MotionEvent ev) {
+ if (mFakeDragging) {
+ return true;
+ }
+
+ if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
+ // Don't handle edge touches immediately -- they may actually belong to one of our
+ // descendants.
+ return false;
+ }
+
+ if (mAdapter == null || mAdapter.getCount() == 0) {
+ // Nothing to present or scroll; nothing to touch.
+ return false;
+ }
+
+ if (mVelocityTracker == null) {
+ mVelocityTracker = VelocityTracker.obtain();
+ }
+ mVelocityTracker.addMovement(ev);
+
+ final int action = ev.getAction();
+ boolean needsInvalidate = false;
+
+ switch (action & MotionEvent.ACTION_MASK) {
+ case MotionEvent.ACTION_DOWN: {
+ mScroller.abortAnimation();
+ mPopulatePending = false;
+ populate();
+ mIsBeingDragged = true;
+ setScrollState(SCROLL_STATE_DRAGGING);
+
+ // Remember where the motion event started
+ mLastMotionX = mInitialMotionX = ev.getX();
+ // Log.d(TAG, SUB_TAG+"mLastMotionX:"+mLastMotionX);
+ mActivePointerId = ev.getPointerId(0);
+ break;
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (!mIsBeingDragged) {
+ final int pointerIndex = ev.findPointerIndex(mActivePointerId);
+ final float x = ev.getX(pointerIndex);
+ final float xDiff = Math.abs(x - mLastMotionX);
+ final float y = ev.getY(pointerIndex);
+ final float yDiff = Math.abs(y - mLastMotionY);
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ if (canStartDrag(xDiff, yDiff) || checkVelocity(xDiff, velocityTracker.getXVelocity(pointerIndex))) {
+ mIsBeingDragged = true;
+ requestParentDisallowInterceptTouchEvent(true);
+ mLastMotionX = x;
+ setScrollState(SCROLL_STATE_DRAGGING);
+ setScrollingCacheEnabled(true);
+ }
+ }
+ // Not else! Note that mIsBeingDragged can be set above.
+ if (mIsBeingDragged) {
+ // Scroll to follow the motion event
+ final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+ final float x = ev.getX(activePointerIndex);
+ needsInvalidate |= performDrag(x);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mIsBeingDragged) {
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId);
+ mPopulatePending = true;
+ final int width = getWidth();
+ final int scrollX = getScrollX();
+ final ItemInfo ii = infoForCurrentScrollPosition();
+ final int currentPage = ii.position;
+ final float pageOffset = (((float) scrollX / width) - ii.offset) / ii.widthFactor;
+ final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+ final float x = MotionEventCompat.getX(ev, activePointerIndex);
+ final int totalDelta = (int) (x - mInitialMotionX);
+ int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity, totalDelta);
+ setCurrentItemInternal(nextPage, true, true, initialVelocity);
+ endDrag();
+ needsInvalidate = mLeftEdge.onRelease() | mRightEdge.onRelease();
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ if (mIsBeingDragged) {
+ scrollToItem(mCurItem, true, 0, false);
+ endDrag();
+ needsInvalidate = mLeftEdge.onRelease() | mRightEdge.onRelease();
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN: {
+ final int index = ev.getActionIndex();
+ final float x = ev.getX(index);
+ // Log.d(TAG, SUB_TAG+"x:"+x);
+ mLastMotionX = x;
+ mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+ break;
+ }
+ case MotionEvent.ACTION_POINTER_UP:
+ onSecondaryPointerUp(ev);
+ mLastMotionX = ev.getX(ev.findPointerIndex(mActivePointerId));
+ break;
+ }
+ if (needsInvalidate) {
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ return true;
+ }
+
+ @SuppressWarnings("deprecation")
+ protected boolean performDrag(float x) {
+ boolean needsInvalidate = false;
+ final float deltaX = mLastMotionX - x;
+ mLastMotionX = x;
+
+ float oldScrollX = getScrollX();
+ float scrollX = oldScrollX + deltaX;
+
+ final int width = getWidth();
+ float leftBound = width * mFirstOffset;
+ float rightBound = width * mLastOffset;
+
+ boolean leftAbsolute = true;
+ boolean rightAbsolute = true;
+
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+ if (firstItem.position != 0) {
+ leftAbsolute = false;
+ leftBound = firstItem.offset * width;
+ }
+ if (lastItem.position != mAdapter.getCount() - 1) {
+ rightAbsolute = false;
+ rightBound = lastItem.offset * width;
+ }
+
+ if (leftBound > rightBound) {
+ leftBound = firstItem.offset * width;
+ rightBound = leftBound;
+ }
+
+
+ /* adjust the left and right spaces for the first and last items.
+ So that we can see the first and last items in center of the ViewPager like other views(center lock).*/
+// Log.d(TAG, "ssssssssssssssssss::mCenterLockEnabled:"+mCenterLockEnabled);
+ if (mCenterLockEnabled /*&& mAdapter.getCount() > 1*/) {
+ if (mCurItem == 0) {
+ leftBound -= mFirstPagePaddingLeft;
+ }
+ if (mCurItem == mAdapter.getCount() - 1) {
+ rightBound += mLastPagePaddingRight;
+ }
+ }
+ //end
+
+ if (scrollX < leftBound) {
+ if (leftAbsolute) {
+ float over = leftBound - scrollX;
+ needsInvalidate = mLeftEdge.onPull(Math.abs(over) / width);
+ }
+ scrollX = leftBound;
+ } else if (scrollX > rightBound) {
+ if (rightAbsolute) {
+ float over = scrollX - rightBound;
+ needsInvalidate = mRightEdge.onPull(Math.abs(over) / width);
+ }
+ scrollX = rightBound;
+ }
+ // Don't lose the rounded component
+ mLastMotionX += scrollX - (int) scrollX;
+ scrollTo((int) scrollX, getScrollY());
+ pageScrolled((int) scrollX);
+
+ return needsInvalidate;
+ }
+
+ /**
+ * @return Info about the page at the current scroll position.
+ * This can be synthetic for a missing middle page; the 'object' field can be null.
+ */
+ private ItemInfo infoForCurrentScrollPosition() {
+ final int width = getWidth();
+ final float scrollOffset = width > 0 ? (float) (getScrollX() + getPageSpace()) / (width) : 0;
+ final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+ int lastPos = -1;
+ float lastOffset = 0.f;
+ float lastWidth = 0.f;
+ boolean first = true;
+
+ ItemInfo lastItem = null;
+ for (int i = 0; i < mItems.size(); i++) {
+ ItemInfo ii = mItems.get(i);
+ float offset;
+ if (!first && ii.position != lastPos + 1) {
+ // Create a synthetic item for a missing page.
+ ii = mTempItem;
+ ii.offset = lastOffset + lastWidth + marginOffset;
+ ii.position = lastPos + 1;
+ ii.widthFactor = mAdapter.getPageWidth(ii.position);
+ i--;
+ }
+ offset = ii.offset;
+
+ final float leftBound = offset;
+ final float rightBound = offset + ii.widthFactor + marginOffset;
+ if (first || scrollOffset >= leftBound) {
+ if (scrollOffset < rightBound || i == mItems.size() - 1) {
+ return ii;
+ }
+ } else {
+ return lastItem;
+ }
+ first = false;
+ lastPos = ii.position;
+ lastOffset = offset;
+ lastWidth = ii.widthFactor;
+ lastItem = ii;
+ }
+
+ return lastItem;
+ }
+
+ private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {
+ int targetPage;
+ if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
+ targetPage = velocity > 0 ? currentPage : currentPage + 1;
+ } else if (mSeenPositionMin >= 0 && mSeenPositionMin < currentPage && pageOffset < 0.5f) {
+ targetPage = currentPage + 1;
+ } else if (mSeenPositionMax >= 0 && mSeenPositionMax > currentPage + 1 && pageOffset >= 0.5f) {
+ targetPage = currentPage - 1;
+ } else {
+ targetPage = (int) (currentPage + pageOffset + 0.5f);
+ }
+
+ if (mItems.size() > 0) {
+ final ItemInfo firstItem = mItems.get(0);
+ final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+
+ // Only let the user target pages we have items for
+ targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
+ }
+
+ return targetPage;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ boolean needsInvalidate = false;
+
+ final int overScrollMode = ViewCompat.getOverScrollMode(this);
+ if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS || (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && mAdapter != null && mAdapter.getCount() > 1)) {
+ if (!mLeftEdge.isFinished()) {
+ final int restoreCount = canvas.save();
+ final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+ final int width = getWidth();
+
+ canvas.rotate(270);
+ canvas.translate(-height + getPaddingTop(), mFirstOffset * width);
+ mLeftEdge.setSize(height, width);
+ needsInvalidate |= mLeftEdge.draw(canvas);
+ canvas.restoreToCount(restoreCount);
+ }
+ if (!mRightEdge.isFinished()) {
+ final int restoreCount = canvas.save();
+ final int width = getWidth();
+ final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+
+ canvas.rotate(90);
+ canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width);
+ mRightEdge.setSize(height, width);
+ needsInvalidate |= mRightEdge.draw(canvas);
+ canvas.restoreToCount(restoreCount);
+ }
+ } else {
+ mLeftEdge.finish();
+ mRightEdge.finish();
+ }
+
+ if (needsInvalidate) {
+ // Keep animating
+ ViewCompat.postInvalidateOnAnimation(this);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Draw the margin drawable between pages if needed.
+ if (mPageMargin > 0 && mMarginDrawable != null && mItems.size() > 0 && mAdapter != null) {
+ final int scrollX = getScrollX();
+ final int width = getWidth();
+
+ final float marginOffset = (float) mPageMargin / width;
+ int itemIndex = 0;
+ ItemInfo ii = mItems.get(0);
+ float offset = ii.offset;
+ final int itemCount = mItems.size();
+ final int firstPos = ii.position;
+ final int lastPos = mItems.get(itemCount - 1).position;
+ for (int pos = firstPos; pos < lastPos; pos++) {
+ while (pos > ii.position && itemIndex < itemCount) {
+ ii = mItems.get(++itemIndex);
+ }
+
+ float drawAt;
+ if (pos == ii.position) {
+ drawAt = (ii.offset + ii.widthFactor) * width;
+ offset = ii.offset + ii.widthFactor + marginOffset;
+ } else {
+ float widthFactor = mAdapter.getPageWidth(pos);
+ drawAt = (offset + widthFactor) * width;
+ offset += widthFactor + marginOffset;
+ }
+
+ if (drawAt + mPageMargin > scrollX) {
+ mMarginDrawable.setBounds((int) drawAt, mTopPageBounds, (int) (drawAt + mPageMargin + 0.5f), mBottomPageBounds);
+ mMarginDrawable.draw(canvas);
+ }
+
+ if (drawAt > scrollX + width) {
+ break; // No more visible, no sense in continuing
+ }
+ }
+ }
+ }
+
+
+ private void onSecondaryPointerUp(MotionEvent ev) {
+ final int pointerIndex = ev.getActionIndex();
+ final int pointerId = ev.getPointerId(pointerIndex);
+ if (pointerId == mActivePointerId) {
+ // This was our active pointer going up. Choose a new
+ // active pointer and adjust accordingly.
+ final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+ mLastMotionX = ev.getX(newPointerIndex);
+ mActivePointerId = ev.getPointerId(newPointerIndex);
+ if (mVelocityTracker != null) {
+ mVelocityTracker.clear();
+ }
+ }
+ }
+
+ private void endDrag() {
+ mIsBeingDragged = false;
+ mIsUnableToDrag = false;
+ mActivePointerId = INVALID_POINTER;
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ }
+
+ private void setScrollingCacheEnabled(boolean enabled) {
+ if (mScrollingCacheEnabled != enabled) {
+ mScrollingCacheEnabled = enabled;
+ if (USE_CACHE) {
+ final int size = getChildCount();
+ for (int i = 0; i < size; ++i) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() != GONE) {
+ child.setDrawingCacheEnabled(enabled);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Tests scrollability within child views of v given a delta of dx.
+ *
+ * @param v View to test for horizontal scrollability
+ * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+ * or just its children (false).
+ * @param dx Delta scrolled in pixels
+ * @param x X coordinate of the active touch point
+ * @param y Y coordinate of the active touch point
+ * @return true if child views of v can be scrolled by delta of dx.
+ */
+ @SuppressWarnings("deprecation")
+ protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+ // To scroll the Gallery items in ViewPager. Some devices (below API 10) are not allowing to Gallery fling, so this solves the issue.
+ if (v instanceof Gallery) {
+ return true;
+ }
+
+ if (v instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) v;
+ final int scrollX = v.getScrollX();
+ final int scrollY = v.getScrollY();
+ final int count = group.getChildCount();
+ // Count backwards - let topmost views consume scroll distance first.
+ for (int i = count - 1; i >= 0; i--) {
+ // TODO: Add versioned support here for transformed views.
+ // This will not work for transformed views in Honeycomb+
+ final View child = group.getChildAt(i);
+ if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() && y + scrollY >= child.getTop() && y + scrollY < child.getBottom() && canScroll(child, true, dx, x + scrollX - child.getLeft(), y + scrollY - child.getTop())) {
+ return true;
+ }
+ }
+ }
+
+ return checkV && ViewCompat.canScrollHorizontally(v, -dx);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ // Let the focused view and/or our descendants get the key first
+ return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+ }
+
+ /**
+ * You can call this function yourself to have the scroll view perform
+ * scrolling from a key event, just as if the event had been dispatched to
+ * it by the view hierarchy.
+ *
+ * @param event The key event to execute.
+ * @return Return true if the event was handled, else false.
+ */
+ public boolean executeKeyEvent(KeyEvent event) {
+ boolean handled = false;
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ handled = arrowScroll(FOCUS_LEFT);
+ break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ handled = arrowScroll(FOCUS_RIGHT);
+ break;
+ case KeyEvent.KEYCODE_TAB:
+ if (Build.VERSION.SDK_INT >= 11) {
+ // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
+ // before Android 3.0. Ignore the tab key on those devices.
+ if (event.hasNoModifiers()) {
+ handled = arrowScroll(FOCUS_FORWARD);
+ } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+ handled = arrowScroll(FOCUS_BACKWARD);
+ }
+ }
+ break;
+ }
+ }
+ return handled;
+ }
+
+ public boolean arrowScroll(int direction) {
+ View currentFocused = findFocus();
+ if (currentFocused == this) currentFocused = null;
+
+ boolean handled = false;
+
+ View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction);
+ if (nextFocused != null && nextFocused != currentFocused) {
+ if (direction == View.FOCUS_LEFT) {
+ // If there is nothing to the left, or this is causing us to
+ // jump to the right, then what we really want to do is page left.
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft >= currLeft) {
+ handled = pageLeft();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ } else if (direction == View.FOCUS_RIGHT) {
+ // If there is nothing to the right, or this is causing us to
+ // jump to the left, then what we really want to do is page right.
+ final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+ final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+ if (currentFocused != null && nextLeft <= currLeft) {
+ handled = pageRight();
+ } else {
+ handled = nextFocused.requestFocus();
+ }
+ }
+ } else if (direction == FOCUS_LEFT || direction == FOCUS_BACKWARD) {
+ // Trying to move left and nothing there; try to page.
+ handled = pageLeft();
+ } else if (direction == FOCUS_RIGHT || direction == FOCUS_FORWARD) {
+ // Trying to move right and nothing there; try to page.
+ handled = pageRight();
+ }
+ if (handled) {
+ playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction));
+ }
+ return handled;
+ }
+
+ private Rect getChildRectInPagerCoordinates(Rect outRect, View child) {
+ if (outRect == null) {
+ outRect = new Rect();
+ }
+ if (child == null) {
+ outRect.set(0, 0, 0, 0);
+ return outRect;
+ }
+ outRect.left = child.getLeft();
+ outRect.right = child.getRight();
+ outRect.top = child.getTop();
+ outRect.bottom = child.getBottom();
+
+ ViewParent parent = child.getParent();
+ while (parent instanceof ViewGroup && parent != this) {
+ final ViewGroup group = (ViewGroup) parent;
+ outRect.left += group.getLeft();
+ outRect.right += group.getRight();
+ outRect.top += group.getTop();
+ outRect.bottom += group.getBottom();
+
+ parent = group.getParent();
+ }
+ return outRect;
+ }
+
+ boolean pageLeft() {
+ if (mCurItem > 0) {
+ setCurrentItem(mCurItem - 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ boolean pageRight() {
+ if (mAdapter != null && mCurItem < (mAdapter.getCount() - 1)) {
+ setCurrentItem(mCurItem + 1, true);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * We only want the current page that is being shown to be focusable.
+ */
+ @Override
+ public void addFocusables(ArrayList views, int direction, int focusableMode) {
+ final int focusableCount = views.size();
+
+ final int descendantFocusability = getDescendantFocusability();
+
+ if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) {
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ child.addFocusables(views, direction, focusableMode);
+ }
+ }
+ }
+ }
+
+ // we add ourselves (if focusable) in all cases except for when we are
+ // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable. this is
+ // to avoid the focus search finding layouts when a more precise search
+ // among the focusable children would be more interesting.
+ if (descendantFocusability != FOCUS_AFTER_DESCENDANTS ||
+ // No focusable descendants
+ (focusableCount == views.size())) {
+ // Note that we can't call the superclass here, because it will
+ // add all views in. So we need to do the same thing View does.
+ if (!isFocusable()) {
+ return;
+ }
+ if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE && isInTouchMode() && !isFocusableInTouchMode()) {
+ return;
+ }
+ if (views != null) {
+ views.add(this);
+ }
+ }
+ }
+
+ /**
+ * We only want the current page that is being shown to be touchable.
+ */
+ @Override
+ public void addTouchables(ArrayList views) {
+ // Note that we don't call super.addTouchables(), which means that
+ // we don't call View.addTouchables(). This is okay because a ViewPager
+ // is itself not touchable.
+ for (int i = 0; i < getChildCount(); i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ child.addTouchables(views);
+ }
+ }
+ }
+ }
+
+ /**
+ * We only want the current page that is being shown to be focusable.
+ */
+ @Override
+ protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
+ int index;
+ int increment;
+ int end;
+ int count = getChildCount();
+ if ((direction & FOCUS_FORWARD) != 0) {
+ index = 0;
+ increment = 1;
+ end = count;
+ } else {
+ index = count - 1;
+ increment = -1;
+ end = -1;
+ }
+ for (int i = index; i != end; i += increment) {
+ View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem) {
+ if (child.requestFocus(direction, previouslyFocusedRect)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ // ViewPagers should only report accessibility info for the current page,
+ // otherwise things get very confusing.
+
+ // TODO: Should this note something about the paging container?
+
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ if (child.getVisibility() == VISIBLE) {
+ final ItemInfo ii = infoForChild(child);
+ if (ii != null && ii.position == mCurItem && child.dispatchPopulateAccessibilityEvent(event)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams();
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+ return generateDefaultLayoutParams();
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams && super.checkLayoutParams(p);
+ }
+
+ @Override
+ public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ class MyAccessibilityDelegate extends AccessibilityDelegateCompat {
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(host, event);
+ event.setClassName(CenterViewPager.class.getName());
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setClassName(CenterViewPager.class.getName());
+ info.setScrollable(mAdapter != null && mAdapter.getCount() > 1);
+ if (mAdapter != null && mCurItem >= 0 && mCurItem < mAdapter.getCount() - 1) {
+ info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+ }
+ if (mAdapter != null && mCurItem > 0 && mCurItem < mAdapter.getCount()) {
+ info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
+ }
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (super.performAccessibilityAction(host, action, args)) {
+ return true;
+ }
+ switch (action) {
+ case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
+ if (mAdapter != null && mCurItem >= 0 && mCurItem < mAdapter.getCount() - 1) {
+ setCurrentItem(mCurItem + 1);
+ return true;
+ }
+ }
+ return false;
+ case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
+ if (mAdapter != null && mCurItem > 0 && mCurItem < mAdapter.getCount()) {
+ setCurrentItem(mCurItem - 1);
+ return true;
+ }
+ }
+ return false;
+ }
+ return false;
+ }
+ }
+
+ private class PagerObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ dataSetChanged();
+ }
+
+ @Override
+ public void onInvalidated() {
+ dataSetChanged();
+ }
+ }
+
+ /**
+ * Layout parameters that should be supplied for views added to a
+ * ViewPager.
+ */
+ public static class LayoutParams extends ViewGroup.LayoutParams {
+ /**
+ * true if this view is a decoration on the pager itself and not
+ * a view supplied by the adapter.
+ */
+ public boolean isDecor;
+
+ /**
+ * Gravity setting for use on decor views only:
+ * Where to position the view page within the overall ViewPager
+ * container; constants are defined in {@link android.view.Gravity}.
+ */
+ public int gravity;
+
+ /**
+ * Width as a 0-1 multiplier of the measured pager width
+ */
+ public float widthFactor = 0.f;
+
+ /**
+ * true if this view was added during layout and needs to be measured
+ * before being positioned.
+ */
+ boolean needsMeasure;
+
+ /**
+ * Adapter position this view is for if !isDecor
+ */
+ int position;
+
+ /**
+ * Current child index within the ViewPager that this view occupies
+ */
+ int childIndex;
+
+ public LayoutParams() {
+ super(MATCH_PARENT, MATCH_PARENT);
+ }
+
+ public LayoutParams(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+ gravity = a.getInteger(0, Gravity.TOP);
+ a.recycle();
+ }
+ }
+
+ static class ViewPositionComparator implements Comparator {
+ @Override
+ public int compare(View lhs, View rhs) {
+ final LayoutParams llp = (LayoutParams) lhs.getLayoutParams();
+ final LayoutParams rlp = (LayoutParams) rhs.getLayoutParams();
+ if (llp.isDecor != rlp.isDecor) {
+ return llp.isDecor ? 1 : -1;
+ }
+ return llp.position - rlp.position;
+ }
+ }
+
+
+ public void enableCenterLockOfChilds() {
+ mCenterLockEnabled = true;
+ //FIXME:sandeep: hack- width will be same for all childs, so taking the first child width
+ mPageSpace = (1 - mAdapter.getPageWidth(0)) / 2;
+
+ }
+
+ /**
+ * returns the space available based
+ */
+ private float getPageSpace() {
+ return getWidth() * mPageSpace;
+ }
+
+ /**
+ * @return the mMatchChildHeightToViewPager
+ * @author sandeep
+ */
+ public boolean ismMatchChildHeightToViewPager() {
+ return mMatchChildHeightToViewPager;
+ }
+
+ /**
+ * if true then each child height will be matched to {@link CenterViewPager} height otherwise child height will be wrap_content.
+ *
+ * @param mMatchChildHeightToViewPager true child height will match to cardListViewPager height, false child height will be based on its content
+ * @author sandeep
+ */
+ public void setmMatchChildHeightToViewPager(boolean mMatchChildHeightToViewPager) {
+ this.mMatchChildHeightToViewPager = mMatchChildHeightToViewPager;
+ }
+
+
+ public void setFirstPagePaddingLeft(int piexlPaddingLeft) {
+ this.mFirstPagePaddingLeft = piexlPaddingLeft;
+ }
+
+ public void setLastPagePaddingRight(int piexlPaddingRight) {
+ this.mLastPagePaddingRight = piexlPaddingRight;
+ }
+
+ public boolean isForceWrapChild() {
+ return isForceWrapChild;
+ }
+
+ public void setForceWrapChild(boolean forceWrapChild) {
+ isForceWrapChild = forceWrapChild;
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPagerCompat.java b/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPagerCompat.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ffe0fcd3d18d8051ac00d28e1a4583902906c29
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CenterViewPagerCompat.java
@@ -0,0 +1,131 @@
+package com.guiguzi.androidtest.customView;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by zhangfan10 on 2019/4/11.
+ *
+ * 类似 ViewPager 支持给 {@link CenterViewPager} 可以设置多个 {@link OnPageChangeListener}
+ */
+
+public class CenterViewPagerCompat extends CenterViewPager {
+
+ private OnPageChangeListenerDispatcher mDispatcher = new OnPageChangeListenerDispatcher();
+ private List mOnPageChangeListeners;
+ private OnPageChangeListener mOnPageChangeListener;
+
+ public CenterViewPagerCompat(Context context) {
+ super(context);
+ init();
+ }
+
+ public CenterViewPagerCompat(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ private void init() {
+ super.setOnPageChangeListener(mDispatcher);
+ }
+
+ @Override
+ public void setOnPageChangeListener(OnPageChangeListener listener) {
+ this.mOnPageChangeListener = listener;
+ }
+
+ // 查crash,让堆栈中可以显示view的名字
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ }
+
+ /**
+ * Add a listener that will be invoked whenever the page changes or is incrementally
+ * scrolled. See {@link OnPageChangeListener}.
+ *
+ *
Components that add a listener should take care to remove it when finished.
+ * Other components that take ownership of a view may call {@link #clearOnPageChangeListeners()}
+ * to remove all attached listeners.
+ *
+ * @param listener listener to add
+ */
+ public void addOnPageChangeListener(OnPageChangeListener listener) {
+ if (mOnPageChangeListeners == null) {
+ mOnPageChangeListeners = new ArrayList<>();
+ }
+ mOnPageChangeListeners.add(listener);
+ }
+
+ /**
+ * Remove a listener that was previously added via
+ * {@link #addOnPageChangeListener(OnPageChangeListener)}.
+ *
+ * @param listener listener to remove
+ */
+ public void removeOnPageChangeListener(OnPageChangeListener listener) {
+ if (mOnPageChangeListeners != null) {
+ mOnPageChangeListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Remove all listeners that are notified of any changes in scroll state or position.
+ */
+ public void clearOnPageChangeListeners() {
+ if (mOnPageChangeListeners != null) {
+ mOnPageChangeListeners.clear();
+ }
+ }
+
+ private class OnPageChangeListenerDispatcher implements OnPageChangeListener {
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+
+ if (mOnPageChangeListeners != null) {
+ for (OnPageChangeListener listener : mOnPageChangeListeners) {
+ if (listener != null) {
+ listener.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageSelected(position);
+ }
+ if (mOnPageChangeListeners != null) {
+ for (OnPageChangeListener listener : mOnPageChangeListeners) {
+ if (listener != null) {
+ listener.onPageSelected(position);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ if (mOnPageChangeListener != null) {
+ mOnPageChangeListener.onPageScrollStateChanged(state);
+ }
+ if (mOnPageChangeListeners != null) {
+ for (OnPageChangeListener listener : mOnPageChangeListeners) {
+ if (listener != null) {
+ listener.onPageScrollStateChanged(state);
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CircleView.kt b/app/src/main/java/com/guiguzi/androidtest/customView/CircleView.kt
index 2cce27bb4fc5248060cc3784068513330a986ab2..8167eec42b644919ff8a131cf3d2ec9e6b64befd 100644
--- a/app/src/main/java/com/guiguzi/androidtest/customView/CircleView.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CircleView.kt
@@ -1,9 +1,11 @@
package com.guiguzi.androidtest.customView
+import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
+import android.view.accessibility.AccessibilityEvent
import androidx.annotation.ColorInt
class CircleView : View {
@@ -14,13 +16,27 @@ class CircleView : View {
var mColor: Int = Color.RED
constructor(context: Context) : super(context) {
-
+ initView()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ initView()
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStleAttr: Int) : super(
+ context,
+ attrs,
+ defStleAttr
+ ) {
+ initView()
+ }
+ fun initView() {
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
+ contentDescription = "测试无障碍模式"
}
+ @SuppressLint("DrawAllocation")
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
mPaint = Paint()
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CommonButton.kt b/app/src/main/java/com/guiguzi/androidtest/customView/CommonButton.kt
new file mode 100644
index 0000000000000000000000000000000000000000..306ddef2db322cb979ca70a4303260d0ef891209
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CommonButton.kt
@@ -0,0 +1,118 @@
+package com.guiguzi.androidtest.customView
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.drawable.GradientDrawable
+import android.util.AttributeSet
+import android.util.Log
+import android.view.View
+import android.view.ViewTreeObserver
+import android.widget.Button
+import com.guiguzi.androidtest.R
+
+@SuppressLint("AppCompatCustomView")
+class CommonButton : Button {
+
+ companion object {
+ const val TAG = "commonButton"
+ }
+
+ val content: String = "关注"
+
+ val mGradientDrawable = GradientDrawable()
+ var mPostion: Int = -1
+
+ constructor(context: Context) : super(context) {
+ initView()
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ initView()
+ }
+
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec)
+ mGradientDrawable.cornerRadius = measuredHeight / 2.toFloat()
+ Log.d(TAG, "onMeasure(),go. position = $mPostion")
+ }
+
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+ super.onLayout(changed, left, top, right, bottom)
+ Log.d(TAG, "onLayout(),go. position = $mPostion")
+ }
+
+ override fun onDraw(canvas: Canvas?) {
+ super.onDraw(canvas)
+ Log.d(TAG, "onDraw(),go. position = $mPostion")
+ }
+
+ fun initView() {
+ text = content
+ background = mGradientDrawable
+ mGradientDrawable.setColor(context.resources.getColor(R.color.colorAccent))
+ Log.d(TAG, "initView(),go. position = $mPostion")
+
+ }
+
+ fun setPosition(position: Int){
+ this.mPostion = position
+ update(position)
+ }
+
+ fun update(position: Int) {
+ viewTreeObserver.addOnGlobalFocusChangeListener(object :
+ ViewTreeObserver.OnGlobalFocusChangeListener {
+ override fun onGlobalFocusChanged(oldFocus: View?, newFocus: View?) {
+ Log.d(TAG,"onGlobalFocusChanged(), position = $position; oldTag = ${oldFocus?.tag}, newTag = ${newFocus?.tag}")
+ }
+ })
+
+ viewTreeObserver.addOnGlobalLayoutListener(object :ViewTreeObserver.OnGlobalLayoutListener{
+ override fun onGlobalLayout() {
+ Log.d(TAG,"addOnGlobalLayoutListener(), position = $position;")
+ }
+ })
+
+ viewTreeObserver.addOnDrawListener(object :ViewTreeObserver.OnDrawListener{
+ override fun onDraw() {
+// Log.d(TAG,"addOnDrawListener(), position = $position;")
+ }
+ })
+
+ viewTreeObserver.addOnScrollChangedListener(object :ViewTreeObserver.OnScrollChangedListener{
+ override fun onScrollChanged() {
+// Log.d(TAG,"addOnScrollChangedListener(), position = $position;")
+ }
+ })
+
+ viewTreeObserver.addOnPreDrawListener(object :ViewTreeObserver.OnPreDrawListener{
+ override fun onPreDraw(): Boolean {
+// Log.d(TAG,"addOnPreDrawListener(), position = $position;")
+ return true
+ }
+ })
+
+ viewTreeObserver.addOnTouchModeChangeListener(object :ViewTreeObserver.OnTouchModeChangeListener{
+ override fun onTouchModeChanged(isInTouchMode: Boolean) {
+ Log.d(TAG,"addOnTouchModeChangeListener(), position = $position; isInTouchMode = $isInTouchMode")
+ }
+ })
+
+ viewTreeObserver.addOnWindowFocusChangeListener(object :ViewTreeObserver.OnWindowFocusChangeListener{
+ override fun onWindowFocusChanged(hasFocus: Boolean) {
+ Log.d(TAG,"onWindowFocusChanged(), position = $position; hasFocus = $hasFocus")
+ }
+ })
+
+ viewTreeObserver.addOnWindowAttachListener(object :ViewTreeObserver.OnWindowAttachListener{
+ override fun onWindowAttached() {
+ Log.d(TAG,"onWindowAttached(), position = $position;")
+ }
+
+ override fun onWindowDetached() {
+ Log.d(TAG,"onWindowDetached(), position = $position;")
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CustomActivity.kt b/app/src/main/java/com/guiguzi/androidtest/customView/CustomActivity.kt
index 5c21570f181d8a2e985cdc41890287446e332f56..02855ae2ec71dcd278b60f85c10b1b39d5eaa6c0 100644
--- a/app/src/main/java/com/guiguzi/androidtest/customView/CustomActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CustomActivity.kt
@@ -1,10 +1,12 @@
package com.guiguzi.androidtest.customView
+import android.annotation.SuppressLint
import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.util.SparseArray
import android.widget.Button
+import android.widget.LinearLayout
import com.guiguzi.androidtest.R
class CustomActivity : Activity() {
@@ -13,13 +15,16 @@ class CustomActivity : Activity() {
const val TAG = "CustomActivity"
}
+ lateinit var mBackgroundTestLinear: LinearLayout
lateinit var mStartButton: Button
lateinit var mSetColor: Button
lateinit var mLine: BrokenLineView
+ @SuppressLint("UseCompatLoadingForDrawables")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom)
+ mBackgroundTestLinear = findViewById(R.id.background_test_linear)
mStartButton = findViewById(R.id.start_animation)
mSetColor = findViewById(R.id.set_color)
mLine = findViewById(R.id.line)
@@ -38,9 +43,12 @@ class CustomActivity : Activity() {
Log.d(TAG, "index1 = ${index1}, index2 = $index2; index3 = $index3; index4 = $index4")
}
+
+// mBackgroundTestLinear.background = getDrawable(R.drawable.bg_doudle_comma)
+ mBackgroundTestLinear.setBackgroundResource(R.drawable.bg_doudle_comma)
}
- private fun initDataStore(){
+ private fun initDataStore() {
/*val dataStore = baseContext.createDataStore(name = "setting")*/
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewGroup.kt b/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewGroup.kt
index 9628418838f62625f381f9870b95d02df2d132b3..10e275d654509ae8690b9e06a529bf6064d67290 100644
--- a/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewGroup.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewGroup.kt
@@ -5,6 +5,7 @@ import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.view.ViewGroup
+import android.view.ViewTreeObserver
import com.guiguzi.androidtest.R
class CustomViewGroup : ViewGroup {
@@ -16,13 +17,21 @@ class CustomViewGroup : ViewGroup {
private var mSelfWight: Int = 0
private var mSelfHeight: Int = 0
+ private var mScrolledChangedListener = ViewTreeObserver.OnScrollChangedListener {
+ val visibleRect: android.graphics.Rect = android.graphics.Rect()
+ getLocalVisibleRect(visibleRect)
+ Log.d(
+ TAG,
+ "rect top = ${visibleRect.top}; rect bottom = ${visibleRect.bottom}; getTop = $top;" +
+ "getBottom = $bottom "
+ )
+ }
+
constructor(context: Context) : super(context) {
}
constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs) {
- val typeArray = context.obtainStyledAttributes(attrs, R.styleable.custom)
- mSelfWight = typeArray.getInt(R.styleable.custom_mWidth, 0)
- mSelfHeight = typeArray.getInt(R.styleable.custom_mHeight, 0)
+ initView(null)
Log.d(TAG, "CustomViewGroup(),mSelfWight = $mSelfWight, mSelfHeight = $mSelfHeight")
}
@@ -31,6 +40,16 @@ class CustomViewGroup : ViewGroup {
attrs,
str
) {
+ initView(attrs)
+ }
+
+ fun initView(attrs: AttributeSet?) {
+ val typeArray = context.obtainStyledAttributes(attrs, R.styleable.custom)
+ mSelfWight = typeArray.getInt(R.styleable.custom_mWidth, 0)
+ mSelfHeight = typeArray.getInt(R.styleable.custom_mHeight, 0)
+
+ contentDescription = "你好,智障模式父组建"
+
}
@@ -81,6 +100,17 @@ class CustomViewGroup : ViewGroup {
}
}
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ viewTreeObserver.addOnScrollChangedListener(mScrolledChangedListener)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ viewTreeObserver.removeOnScrollChangedListener(mScrolledChangedListener)
+ }
+
private fun getMaxWidth(): Int {
val count = childCount
var maxWidth = 0
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewPager.java b/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewPager.java
new file mode 100644
index 0000000000000000000000000000000000000000..941d282fc80b25c693ee8401c9283de48e67b9a3
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/CustomViewPager.java
@@ -0,0 +1,408 @@
+package com.guiguzi.androidtest.customView;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Camera;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Transformation;
+
+import androidx.core.view.MotionEventCompat;
+import androidx.core.view.ViewConfigurationCompat;
+import androidx.viewpager.widget.ViewPager;
+
+import com.guiguzi.androidtest.R;
+
+import java.lang.ref.WeakReference;
+
+public class CustomViewPager extends CenterViewPagerCompat {
+
+ /**
+ * maximum z distance to translate child view ---滚动平移量
+ */
+ final static int DEFAULT_OVERSCROLL_TRANSLATION = 150;
+
+ /**
+ * duration of overscroll animation in ms ---滚动平移时间
+ */
+ final private static int DEFAULT_OVERSCROLL_ANIMATION_DURATION = 400;
+
+ private boolean mCutOff = false;
+
+ final private OverscrollEffect mOverscrollEffect = new OverscrollEffect();
+ final private Camera mCamera = new Camera();
+
+ private OnPageChangeListener mScrollListener;
+ private float mLastMotionX;
+ private int mActivePointerId;
+ private int mScrollPosition;
+ private float mScrollPositionOffset;
+ final private int mTouchSlop;
+
+ private float mOverscrollTranslation;
+ private int mOverscrollAnimationDuration;
+
+ @SuppressWarnings("unused")
+ private final static String DEBUG_TAG = ViewPager.class.getSimpleName();
+ private final static int INVALID_POINTER_ID = -1;
+
+ private static final String TAG = "CustomViewPager";
+
+ /**
+ * @author renard, extended by Piotr Zawadzki
+ */
+ @SuppressLint("InnerClassError")
+ private class OverscrollEffect {
+ private float mOverscroll;
+ private Animator mAnimator;
+
+ /**
+ * @param deltaDistance [0..1] 0->no overscroll, 1>full overscroll
+ */
+ public void setPull(final float deltaDistance) {
+ mOverscroll = deltaDistance;
+ invalidateVisibleChilds(mLastPosition);
+ }
+
+ /**
+ * called when finger is released. starts to animate back to default
+ * position
+ */
+ private void onRelease() {
+ if (mAnimator != null && mAnimator.isRunning()) {
+ mAnimator.addListener(new AnimatorListener() {
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ startAnimation(0);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+ });
+ mAnimator.cancel();
+ } else {
+ startAnimation(0);
+ }
+ }
+
+ private void startAnimation(final float target) {
+ mAnimator = ObjectAnimator.ofFloat(this, "pull", mOverscroll, target);// 初始化pull动画
+ mAnimator.setInterpolator(new DecelerateInterpolator());
+ // The time interpolator used in calculating the elapsed fraction of
+ // the animation
+ final float scale = Math.abs(target - mOverscroll);
+ mAnimator.setDuration((long) (mOverscrollAnimationDuration * scale));// 持续时间
+ mAnimator.start();
+ }
+
+ private boolean isOverscrolling() {
+ if (mScrollPosition == 0 && mOverscroll < 0) {
+ return true;
+ }
+ final boolean isLast = (getAdapter().getCount() - 1) == mScrollPosition;
+ if (isLast && mOverscroll > 0) {
+ return true;
+
+ }
+ return false;
+ }
+
+ }
+
+ public CustomViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setStaticTransformationsEnabled(true);
+ final ViewConfiguration configuration = ViewConfiguration.get(context);
+ mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
+ super.setOnPageChangeListener(new MyOnPageChangeListener(this));
+ init(attrs);
+ }
+
+ private void init(AttributeSet attrs) {
+ TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomViewPager);
+ mOverscrollTranslation = a.getDimension(R.styleable.CustomViewPager_overscroll_translation, DEFAULT_OVERSCROLL_TRANSLATION);
+ mOverscrollAnimationDuration = a.getInt(R.styleable.CustomViewPager_overscroll_animation_duration, DEFAULT_OVERSCROLL_ANIMATION_DURATION);
+ a.recycle();
+ }
+
+ public int getOverscrollAnimationDuration() {
+ return mOverscrollAnimationDuration;
+ }
+
+ public void setOverscrollAnimationDuration(int mOverscrollAnimationDuration) {
+ this.mOverscrollAnimationDuration = mOverscrollAnimationDuration;
+ }
+
+ public float getOverscrollTranslation() {
+ return mOverscrollTranslation;
+ }
+
+ public void setOverscrollTranslation(int mOverscrollTranslation) {
+ this.mOverscrollTranslation = mOverscrollTranslation;
+ }
+
+ @Override
+ public void setOnPageChangeListener(OnPageChangeListener listener) {
+ mScrollListener = listener;
+ }
+
+ private void invalidateVisibleChilds(final int position) {
+ for (int i = 0; i < getChildCount(); i++) {
+ getChildAt(i).invalidate();// 刷新view视图的函数
+ }
+ }
+
+ private int mLastPosition = 0;
+
+ private static class MyOnPageChangeListener implements OnPageChangeListener {
+
+ private WeakReference mWrCustomViewPager;
+
+ public MyOnPageChangeListener(CustomViewPager mCustomViewPager) {
+ mWrCustomViewPager = new WeakReference<>(mCustomViewPager);
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ if (null != mWrCustomViewPager) {
+ CustomViewPager mCustomViewPager = mWrCustomViewPager.get();
+ if (null != mCustomViewPager) {
+ if (mCustomViewPager.mScrollListener != null) {
+ mCustomViewPager.mScrollListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+ mCustomViewPager.mScrollPosition = position;
+ mCustomViewPager.mScrollPositionOffset = positionOffset;
+ mCustomViewPager.mLastPosition = position;
+ mCustomViewPager.invalidateVisibleChilds(position);
+ }
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (null != mWrCustomViewPager) {
+ CustomViewPager mCustomViewPager = mWrCustomViewPager.get();
+ if (null != mCustomViewPager) {
+ if (mCustomViewPager.mScrollListener != null) {
+ mCustomViewPager.mScrollListener.onPageSelected(position);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(final int state) {
+ if (null != mWrCustomViewPager) {
+ CustomViewPager mCustomViewPager = mWrCustomViewPager.get();
+ if (null != mCustomViewPager) {
+ if (mCustomViewPager.mScrollListener != null) {
+ mCustomViewPager.mScrollListener.onPageScrollStateChanged(state);
+ }
+ if (state == SCROLL_STATE_IDLE) {
+ mCustomViewPager.mScrollPositionOffset = 0;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ try {
+ final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
+ switch (action) {
+ case MotionEvent.ACTION_DOWN: {
+ mLastMotionX = ev.getX();
+ Log.e("x1", "Set Error! " + mLastMotionX);
+ mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+ break;
+ }
+ case MotionEventCompat.ACTION_POINTER_DOWN: {
+ final int index = MotionEventCompat.getActionIndex(ev);
+ final float x = MotionEventCompat.getX(ev, index);
+ mLastMotionX = x;
+ Log.e("x2", "Set Error! " + mLastMotionX);
+ mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+ break;
+ }
+ }
+ return super.onInterceptTouchEvent(ev);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return false;
+ } catch (ArrayIndexOutOfBoundsException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ try {
+ return super.dispatchTouchEvent(ev);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return false;
+ } catch (ArrayIndexOutOfBoundsException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ boolean callSuper = false;
+
+ final int action = ev.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN: {
+ callSuper = true;
+ mLastMotionX = ev.getX();
+ Log.e("x3", "Set Error! " + mLastMotionX);
+ mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+ break;
+ }
+ case MotionEventCompat.ACTION_POINTER_DOWN: {
+ callSuper = true;
+ final int index = MotionEventCompat.getActionIndex(ev);
+ final float x = MotionEventCompat.getX(ev, index);
+ mLastMotionX = x;
+ Log.e("x4", "Set Error! " + mLastMotionX);
+ mActivePointerId = MotionEventCompat.getPointerId(ev, index);
+ break;
+ }
+ case MotionEvent.ACTION_MOVE: {
+ if (mActivePointerId != INVALID_POINTER_ID) {
+ // Scroll to follow the motion event
+ final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
+ final float x = MotionEventCompat.getX(ev, activePointerIndex);
+ final float deltaX = mLastMotionX - x;// 手指滑动的距离
+ Log.e("x", "Set Error! " + mLastMotionX + " " + x + " " + deltaX);
+ final float oldScrollX = getScrollX();
+ final int width = getWidth();
+ final int widthWithMargin = width + getPageMargin();
+ final int lastItemIndex = getAdapter().getCount() - 1;
+ final int currentItemIndex = getCurrentItem();
+ final float leftBound = Math.max(0, (currentItemIndex - 1) * widthWithMargin);
+ final float rightBound = Math.min(currentItemIndex + 1, lastItemIndex) * widthWithMargin;
+ final float scrollX = oldScrollX + deltaX;
+ if (mScrollPositionOffset == 0) {
+ if (scrollX < leftBound) {
+ if (leftBound == 0) {
+ final float over = deltaX + mTouchSlop;
+ Log.e("leftBound", "Set Error!" + leftBound + " " + deltaX);
+ mOverscrollEffect.setPull(over / width);
+ }
+ } else {
+ if (rightBound == lastItemIndex * widthWithMargin) {
+ final float over = deltaX + mTouchSlop;
+ Log.e("rightBound", "Set Error!" + rightBound + " " + deltaX);
+ mOverscrollEffect.setPull(over / width);
+
+ }
+ }
+ } else {
+ // mLastMotionX = x;
+ final float over = deltaX + mTouchSlop;
+ mOverscrollEffect.setPull(over / width);
+ Log.e("x5", "Set Error! " + mLastMotionX);
+ }
+ } else {
+ mOverscrollEffect.onRelease();
+ }
+ break;
+ }
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL: {
+ callSuper = true;
+ mActivePointerId = INVALID_POINTER_ID;
+ mOverscrollEffect.onRelease();
+ break;
+ }
+ case MotionEvent.ACTION_POINTER_UP: {
+ final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
+ final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
+ if (pointerId == mActivePointerId) {
+ // This was our active pointer going up. Choose a new
+ // active pointer and adjust accordingly.
+ final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+ mLastMotionX = ev.getX(newPointerIndex);
+ mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
+ callSuper = true;
+ }
+ break;
+ }
+ }
+
+ if (mOverscrollEffect.isOverscrolling() && !callSuper) {
+ return true;
+ } else {
+ return super.onTouchEvent(ev);
+ }
+ }
+
+ @Override
+ protected boolean getChildStaticTransformation(View child, Transformation t) {
+ if (child.getWidth() == 0) {
+ return false;
+ }
+
+ if (mCutOff) {
+ return false;
+ }
+
+ if (mOverscrollEffect.mOverscroll == 0) {
+ return false;
+ }
+ final float dx = getWidth() / 2;
+ final int dy = getHeight() / 2;
+ t.getMatrix().reset();
+ final float translateX = (float) mOverscrollTranslation * (mOverscrollEffect.mOverscroll > 0 ? Math.min(mOverscrollEffect.mOverscroll, 1) : Math.max(mOverscrollEffect.mOverscroll, -1));
+ Log.d(TAG, mOverscrollEffect.mOverscroll + "t");
+ mCamera.save();
+ mCamera.translate(-translateX, 0, 0);
+ mCamera.getMatrix(t.getMatrix());
+ mCamera.restore();
+ t.getMatrix().preTranslate(-dx, -dy);
+ t.getMatrix().postTranslate(dx, dy);
+ if (getChildCount() == 1) {
+ this.invalidate();
+ } else {
+ child.invalidate();
+ }
+ return true;
+ }
+
+ // 查crash,让堆栈中可以显示view的名字
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ }
+
+ public boolean isCutOff() {
+ return mCutOff;
+ }
+
+ public void setCutOff(boolean cutOff) {
+ this.mCutOff = cutOff;
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/HeadView.kt b/app/src/main/java/com/guiguzi/androidtest/customView/HeadView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1369f3a485359396fe5e2eb7bae0c44b2944f8f7
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/HeadView.kt
@@ -0,0 +1,42 @@
+package com.guiguzi.androidtest.customView
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.util.AttributeSet
+import android.view.View
+
+class HeadView : View {
+
+ val mPaint = Paint()
+
+ constructor(context: Context) : super(context) {
+ initView()
+ }
+
+ constructor(context: Context, attrSet: AttributeSet) : super(context, attrSet) {
+ initView()
+ }
+
+ constructor(context: Context, attrSet: AttributeSet, def: Int) : super(context, attrSet, def) {
+ initView()
+ }
+
+
+ fun initView() {
+ mPaint.color = resources.getColor(android.R.color.holo_orange_dark)
+ mPaint.strokeWidth = 3f
+ mPaint.style = Paint.Style.FILL
+ mPaint.textSize = 50f
+ mPaint.isAntiAlias = true
+ }
+
+ override fun onDraw(canvas: Canvas?) {
+
+ val content = "好好学习"
+ val content1 = "天天向上"
+ canvas?.drawText(content, 200f, 100f, mPaint)
+ canvas?.translate(0f, 100f)
+ canvas?.drawText(content1, 200f, 100f, mPaint)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/MyViewPager.kt b/app/src/main/java/com/guiguzi/androidtest/customView/MyViewPager.kt
deleted file mode 100644
index 931d8c629f05221e97ffb0af94bb9492e51e2961..0000000000000000000000000000000000000000
--- a/app/src/main/java/com/guiguzi/androidtest/customView/MyViewPager.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.guiguzi.androidtest.customView
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.MotionEvent
-import androidx.viewpager.widget.ViewPager
-
-class MyViewPager : ViewPager {
-
- private var isHorizontalSlip = true
-
- constructor(context: Context) : super(context) {
-
- }
-
- constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
-
- }
-
- override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
- return super.onInterceptTouchEvent(ev)
- }
-
- override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
- var startX: Float = 0f
- var startY: Float = 0f
-
- if (MotionEvent.ACTION_DOWN == ev?.action) {
- startX = ev?.x ?: 0f
- startY = ev?.y ?: 0f
-
- } else if (ev?.action == MotionEvent.ACTION_MOVE) {
-
-
-
- } else {
-
- }
-
- return super.dispatchTouchEvent(ev)
- }
-
- override fun onTouchEvent(ev: MotionEvent?): Boolean {
- return super.onTouchEvent(ev)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/customView/ScrollerLayout.java b/app/src/main/java/com/guiguzi/androidtest/customView/ScrollerLayout.java
new file mode 100644
index 0000000000000000000000000000000000000000..5682323e4298f24cc75084d3b1f32cac726f2eb6
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/customView/ScrollerLayout.java
@@ -0,0 +1,142 @@
+package com.guiguzi.androidtest.customView;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.widget.Scroller;
+
+import androidx.core.view.ViewConfigurationCompat;
+
+public class ScrollerLayout extends ViewGroup {
+
+ /**
+ * 用于完成滚动操作的实例
+ */
+ private Scroller mScroller;
+
+ /**
+ * 判定为拖动的最小移动像素数
+ */
+ private int mTouchSlop;
+
+ /**
+ * 手机按下时的屏幕坐标
+ */
+ private float mXDown;
+
+ /**
+ * 手机当时所处的屏幕坐标
+ */
+ private float mXMove;
+
+ /**
+ * 上次触发ACTION_MOVE事件时的屏幕坐标
+ */
+ private float mXLastMove;
+
+ /**
+ * 界面可滚动的左边界
+ */
+ private int leftBorder;
+
+ /**
+ * 界面可滚动的右边界
+ */
+ private int rightBorder;
+
+ public ScrollerLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ // 第一步,创建Scroller的实例
+ mScroller = new Scroller(context);
+ ViewConfiguration configuration = ViewConfiguration.get(context);
+ // 获取TouchSlop值
+ mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View childView = getChildAt(i);
+ // 为ScrollerLayout中的每一个子控件测量大小
+ measureChild(childView, widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ if (changed) {
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View childView = getChildAt(i);
+ // 为ScrollerLayout中的每一个子控件在水平方向上进行布局
+ childView.layout(i * childView.getMeasuredWidth(), 0, (i + 1) * childView.getMeasuredWidth(), childView.getMeasuredHeight());
+ }
+ // 初始化左右边界值
+ leftBorder = getChildAt(0).getLeft();
+ rightBorder = getChildAt(getChildCount() - 1).getRight();
+ }
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ switch (ev.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mXDown = ev.getRawX();
+ mXLastMove = mXDown;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ mXMove = ev.getRawX();
+ float diff = Math.abs(mXMove - mXDown);
+ mXLastMove = mXMove;
+ // 当手指拖动值大于TouchSlop值时,认为应该进行滚动,拦截子控件的事件
+ if (diff > mTouchSlop) {
+ return true;
+ }
+ break;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_MOVE:
+ mXMove = event.getRawX();
+ int scrolledX = (int) (mXLastMove - mXMove);
+ if (getScrollX() + scrolledX < leftBorder) {
+ scrollTo(leftBorder, 0);
+ return true;
+ } else if (getScrollX() + getWidth() + scrolledX > rightBorder) {
+ scrollTo(rightBorder - getWidth(), 0);
+ return true;
+ }
+ scrollBy(scrolledX, 0);
+ mXLastMove = mXMove;
+ break;
+ case MotionEvent.ACTION_UP:
+ // 当手指抬起时,根据当前的滚动值来判定应该滚动到哪个子控件的界面
+ int targetIndex = (getScrollX() + getWidth() / 2) / getWidth();
+ int dx = targetIndex * getWidth() - getScrollX();
+ // 第二步,调用startScroll()方法来初始化滚动数据并刷新界面
+ mScroller.startScroll(getScrollX(), 0, dx, 0);
+ invalidate();
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public void computeScroll() {
+ // 第三步,重写computeScroll()方法,并在其内部完成平滑滚动的逻辑
+ if (mScroller.computeScrollOffset()) {
+ scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
+ invalidate();
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/dialog/CustomDialog.kt b/app/src/main/java/com/guiguzi/androidtest/dialog/CustomDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..96ce5ccf2f7e4062290eeabb0b5dd05670646b36
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/dialog/CustomDialog.kt
@@ -0,0 +1,41 @@
+package com.guiguzi.androidtest.dialog
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.Point
+import android.os.Bundle
+import android.view.Display
+import android.view.Gravity
+import android.view.WindowManager
+import android.widget.TextView
+import com.guiguzi.androidtest.R
+
+class CustomDialog : Dialog {
+
+ lateinit var mText1: TextView
+ lateinit var mText2: TextView
+
+ constructor(context: Context) : super(context)
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.dialog_custom)
+ initView()
+ }
+
+ fun initView() {
+ mText1 = findViewById(R.id.text1)
+ mText2 = findViewById(R.id.text2)
+
+ //自定义Dialog宽度
+ val windowManager: WindowManager? = window?.windowManager
+ val display: Display? = windowManager?.getDefaultDisplay()
+ val windowLayoutParams: WindowManager.LayoutParams? = window?.attributes
+ val sizePoint: Point = Point()
+ display?.getSize(sizePoint)
+ windowLayoutParams?.width = ((sizePoint.x) * 0.8).toInt()//设置为屏幕的0.7倍宽度
+ window?.attributes = windowLayoutParams
+
+ window?.setGravity(Gravity.TOP)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/fragments/ErrorTestFragment.kt b/app/src/main/java/com/guiguzi/androidtest/fragments/ErrorTestFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2e76bc9de305145302d387d3d34601f0d6659397
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/fragments/ErrorTestFragment.kt
@@ -0,0 +1,33 @@
+package com.guiguzi.androidtest.fragments
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.guiguzi.androidtest.R
+import com.guiguzi.androidtest.activity.ErrorAActivity
+import com.guiguzi.androidtest.customView.CommonButton
+
+class ErrorTestFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.fragment_error_test, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ initView(view)
+ }
+
+ fun initView(rootView: View) {
+ rootView.findViewById(R.id.start_error_home_button).setOnClickListener {
+ val intent = Intent(context, ErrorAActivity::class.java)
+ context?.startActivity(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/fragments/HomeChannelFragment.kt b/app/src/main/java/com/guiguzi/androidtest/fragments/HomeChannelFragment.kt
index db0a315fd38bc7e37f91afcdb4168a15c183cfff..74247c71261511e2ed26b042f4add4eb7a36db5d 100644
--- a/app/src/main/java/com/guiguzi/androidtest/fragments/HomeChannelFragment.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/fragments/HomeChannelFragment.kt
@@ -71,6 +71,8 @@ class HomeChannelFragment : Fragment {
var dataList = ArrayList()
dataList.add("Jetpack学习")
dataList.add("Compose学习")
+ dataList.add("MVVM学习")
+ dataList.add("MVVM2学习")
dataList.add("RxJava学习")
dataList.add("WebView学习")
dataList.add("OkHttp学习")
@@ -86,6 +88,17 @@ class HomeChannelFragment : Fragment {
dataList.add("EventBus")
dataList.add("Lifecycle")
dataList.add("Glide")
+ dataList.add("GroupActivity")
+ dataList.add("长图分区加载")
+ dataList.add("JsonViewer")
+ dataList.add("Lottie")
+ dataList.add("MainJava")
+ dataList.add("自定义ViewPager")
+ dataList.add("Scroller学习")
+ dataList.add("Button学习")
+ dataList.add("TextView学习")
+ dataList.add("Permission学习")
+ dataList.add("Dialog学习")
val gridLayoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
mHomeRV.layoutManager = gridLayoutManager
diff --git a/app/src/main/java/com/guiguzi/androidtest/fragments/HomeTabFragment.kt b/app/src/main/java/com/guiguzi/androidtest/fragments/HomeTabFragment.kt
index 983383edc34fb7609aa95c0c42e15123cc2a1729..1bfc5217273a88b104de057cb652bc0e4478a32d 100644
--- a/app/src/main/java/com/guiguzi/androidtest/fragments/HomeTabFragment.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/fragments/HomeTabFragment.kt
@@ -14,7 +14,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.adapter.FragmentViewHolder
import androidx.viewpager2.widget.ViewPager2
import com.guiguzi.androidtest.R
-import com.guiguzi.androidtest.eventdispatch.ViewPager2Wrapper
class HomeTabFragment : Fragment {
@@ -161,6 +160,16 @@ class HomeTabFragment : Fragment {
channelFragment.arguments = bundle
mFragmentList.add(channelFragment)
}
+ 2 -> {
+ val channelFragment = RecyclerViewFragment()
+ channelFragment.arguments = bundle
+ mFragmentList.add(channelFragment)
+ }
+ 3 -> {
+ val channelFragment = ErrorTestFragment()
+ channelFragment.arguments = bundle
+ mFragmentList.add(channelFragment)
+ }
else -> {
val channelFragment = PersonTabFragment()
channelFragment.arguments = bundle
diff --git a/app/src/main/java/com/guiguzi/androidtest/fragments/ListViewFragment.kt b/app/src/main/java/com/guiguzi/androidtest/fragments/ListViewFragment.kt
index 732b8371650bacd0cb4f4d1b7fff4fc8838d6f6e..6fce4d61e485ff13a4549f95d870423ab3cd6c48 100644
--- a/app/src/main/java/com/guiguzi/androidtest/fragments/ListViewFragment.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/fragments/ListViewFragment.kt
@@ -45,7 +45,7 @@ class ListViewFragment : Fragment() {
override fun onResume() {
super.onResume()
- mListView?.adapter?.notifyAll()
+// mListView?.adapter?.notifyAll()
}
fun initData() {
@@ -100,7 +100,8 @@ class ListViewFragment : Fragment() {
.inflate(R.layout.item_list_view_user1, parent, false)
// 避免每次调用getView()时都要重新获取控件实例
viewHolder1 = ListViewHolder()
- viewHolder1.nameView = view.findViewById(R.id.user_name)//setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ viewHolder1.nameView =
+ view.findViewById(R.id.user_name)//setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
viewHolder1.nameView?.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
viewHolder1.ageView = view.findViewById(R.id.user_age)
@@ -134,9 +135,6 @@ class ListViewFragment : Fragment() {
}
}
-
-
-
return view as View
}
@@ -163,15 +161,11 @@ class ListViewFragment : Fragment() {
}
- inner class User {
+ inner class User(n: String?, a: Int?) {
- var name: String? = null
- var age: Int? = null
+ var name: String? = n
+ var age: Int? = a
- constructor(n: String?, a: Int?) {
- name = n
- age = a
- }
}
inner class ListViewHolder {
diff --git a/app/src/main/java/com/guiguzi/androidtest/fragments/RecyclerViewFragment.kt b/app/src/main/java/com/guiguzi/androidtest/fragments/RecyclerViewFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cef2994d00c9dd30b09c15314c3a759520870607
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/fragments/RecyclerViewFragment.kt
@@ -0,0 +1,134 @@
+package com.guiguzi.androidtest.fragments
+
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.guiguzi.androidtest.R
+import com.guiguzi.androidtest.customView.CommonButton
+
+class RecyclerViewFragment : Fragment() {
+
+ companion object {
+ const val TAG = "recyclerViewFragment"
+ }
+
+ private lateinit var mRecyclerView: RecyclerView
+ private val mDataList: MutableList = ArrayList()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ initData()
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.fragment_recycler_view_layout, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ initView(view)
+ }
+
+ fun initView(rootView: View) {
+ mRecyclerView = rootView.findViewById(R.id.recycler_view)
+ mRecyclerView.setItemViewCacheSize(8)
+
+ mRecyclerView.adapter = MyAdapter()
+ val gridLayoutManager =
+ LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
+ /* GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)*/
+ mRecyclerView.addItemDecoration(
+ DividerItemDecoration(
+ context,
+ DividerItemDecoration.VERTICAL
+ )
+ )
+ mRecyclerView.layoutManager = gridLayoutManager
+ }
+
+ private fun initData() {
+ for (i in 0 until 60) {
+ mDataList.add("index = $i")
+ }
+ }
+
+ inner class MyAdapter : RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ val itemView: View
+ return if (viewType == 1) {
+ itemView =
+ LayoutInflater.from(context)
+ .inflate(R.layout.item_recycler_test_a, parent, false)
+ MyViewHolder(itemView)
+ } else {
+ itemView = LayoutInflater.from(context)
+ .inflate(R.layout.item_recycler_test_b, parent, false)
+ val myViewHolderB = MyViewHolderB(itemView)
+ myViewHolderB
+ }
+ }
+
+ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+ if (getPositionToType(position) == 1) {
+ val myViewHolder = holder as MyViewHolder
+ myViewHolder.textView.text = mDataList[position]
+ } else {
+ val myViewHolderB = holder as MyViewHolderB
+ myViewHolderB.textView.text = mDataList[position]
+ myViewHolderB.commonButton.setPosition(position)
+ Log.d(TAG, "onBindViewHolder go, type = ${getPositionToType(position)}")
+ }
+
+ Log.d(TAG, "复用的itemview tag = ${holder.itemView.tag}; position = $position")
+ holder.itemView.tag = position
+ }
+
+ /* override fun onBindViewHolder(
+ holder: RecyclerView.ViewHolder,
+ position: Int,
+ payloads: MutableList
+ ) {
+ if (getPositionToType(position) == 1) {
+ val myViewHolder = holder as MyViewHolder
+ myViewHolder.textView.text = mDataList[position]
+ } else {
+ val myViewHolderB = holder as MyViewHolderB
+ myViewHolderB.textView.text = mDataList[position]
+ myViewHolderB.commonButton.update()
+ }
+ }*/
+
+ override fun getItemCount(): Int {
+ return mDataList.size
+ }
+
+ override fun getItemViewType(position: Int): Int {
+ return getPositionToType(position)
+ }
+
+ private fun getPositionToType(position: Int): Int {
+ return if (position == 18 || position == 15 || position == 30) 2 else 1
+ }
+ }
+
+ inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ var textView: TextView = itemView.findViewById(R.id.text_view)
+ }
+
+ inner class MyViewHolderB(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ var textView: TextView = itemView.findViewById(R.id.text_view)
+ var commonButton: CommonButton = itemView.findViewById(R.id.common_button)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/jetpack/ComposeActivity.kt b/app/src/main/java/com/guiguzi/androidtest/jetpack/ComposeActivity.kt
index 9801a16965aecd3e76e904c78db508d3e95fe8a1..3184221a4d4319e14fda55e1f1a0792e74a92e32 100644
--- a/app/src/main/java/com/guiguzi/androidtest/jetpack/ComposeActivity.kt
+++ b/app/src/main/java/com/guiguzi/androidtest/jetpack/ComposeActivity.kt
@@ -3,20 +3,123 @@ package com.guiguzi.androidtest.jetpack
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
-
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Button
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.guiguzi.androidtest.R
class ComposeActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
- Greeting("world")
+ NewsStory()
+ var strList: MutableList = ArrayList()
+ for (i in 0..60) {
+ strList.add("index = $i")
+ }
+// LazyColumnTest(strList)
+ StateFun()
+ }
+ }
+
+ @Composable
+ fun NewsStory() {
+ Column(modifier = Modifier.padding(16.dp)) {
+ var name = remember { mutableStateOf("") }
+ Image(
+ painter = painterResource(R.drawable.test),
+ contentDescription = null,
+ modifier = Modifier
+ .height(180.dp)
+ .width(180.dp)
+ .clip(shape = RoundedCornerShape(8.dp)),
+ contentScale = ContentScale.Crop
+ )
+ Spacer(modifier = Modifier.height(16.dp))
+ Text(
+ text = "Hello!",
+ modifier = Modifier.padding(bottom = 8.dp),
+ style = MaterialTheme.typography.h5
+ )
+ OutlinedTextField(
+ value = name.value,
+ onValueChange = { input: String -> name.value = input },
+ label = { Text("Name") }
+ )
}
+
+ /*Row(modifier = Modifier.padding(16.dp),verticalAlignment = Alignment.CenterVertically) {
+ Image(
+ painter = painterResource(R.drawable.test),
+ contentDescription = null,
+ modifier = Modifier
+ .height(100.dp)
+ .width(100.dp)
+ .clip(shape = RoundedCornerShape(8.dp)),
+ contentScale = ContentScale.Crop
+ )
+
+ Text("A day in Shark Fin Cove")
+ Text("Davenport, California")
+ Text("December 2018")
+ OutlinedTextField(
+ value = "",
+ onValueChange = { },
+ label = { Text("Name") }
+ )
+ }*/
}
@Composable
- fun Greeting(name: String) {
- Text(text = "Hello $name!")
+ fun LazyColumnTest(strings: List) {
+
+ LazyColumn(modifier = Modifier.padding(22.dp)) {
+ items(strings) { item ->
+ Text(
+ text = item,
+ style = MaterialTheme.typography.h5,
+ modifier = Modifier.fillMaxWidth()
+ )
+ }
+ }
+
+ }
+
+ @Composable
+ fun StateFun() {
+ val count = remember { mutableStateOf(0) }
+ Button(onClick = { count.value++ }) {
+ Text("I've been clicked ${count.value} times")
+ }
+ }
+
+ @Preview
+ @Composable
+ fun DefaultPreview() {
+ NewsStory()
+ var strList: MutableList = ArrayList()
+
+ for (i in 0..60) {
+ strList.add("index = $i")
+ }
+// LazyColumnTest(strList)
+ StateFun()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/mvvm/TestViewModel222.kt b/app/src/main/java/com/guiguzi/androidtest/mvvm/TestViewModel222.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ec35b3cb8fb98e6729b4e62d4aa110bbab68c171
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/mvvm/TestViewModel222.kt
@@ -0,0 +1,21 @@
+package com.guiguzi.androidtest.mvvm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class TestViewModel222:ViewModel() {
+
+ // 这边就不写Model直接更新数据
+ val weatherResult = MutableLiveData()
+
+ fun getWeather() {
+ // 获取网络数据或本地数据库数据等
+ weatherResult.postValue("晴天")
+ }
+
+ fun updateWeather(str: String) {
+ // 更新网络数据或本地数据库数据等
+ weatherResult.postValue(str)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/TestViewModel.kt b/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/TestViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..34a495f1f02555726df918d39b0d1796ddcea75c
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/TestViewModel.kt
@@ -0,0 +1,43 @@
+package com.guiguzi.androidtest.mvvm.viewmodel
+
+import android.app.Application
+import android.view.View
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.MutableLiveData
+
+
+class TestViewModel : AndroidViewModel {
+
+ var text1 = MutableLiveData()
+ var text2 = MutableLiveData()
+ var text3 = MutableLiveData()
+ var text4 = MutableLiveData()
+
+ constructor(app: Application) : super(app) {
+ text1.value = "text 111"
+ text2.value = "text 222"
+ text3.value = "text 333"
+ text4.value = "text 444"
+ }
+
+ fun updateText1(text: String) {
+ text1.value = text
+ }
+
+ fun updateText2(text: String) {
+ text2.value = text
+ }
+
+ fun updateText3(text: String) {
+ text3.value = text
+ }
+
+ fun updateText4(text: String) {
+ text4.value = text
+ }
+
+ fun button1Click(view: View) {
+ text1.value = text1.value + text1.value
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/ViewModelV2.kt b/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/ViewModelV2.kt
new file mode 100644
index 0000000000000000000000000000000000000000..bdaa8bd311a3c21e6ef3da7184975ca6978b9661
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/mvvm/viewmodel/ViewModelV2.kt
@@ -0,0 +1,29 @@
+package com.guiguzi.androidtest.mvvm.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class ViewModelV2 : ViewModel() {
+
+ var textLiveData1: MutableLiveData = MutableLiveData()
+ var textLiveData2: LiveData = MutableLiveData()
+ var textLiveData3: LiveData = MutableLiveData()
+ var textLiveData4: LiveData = MutableLiveData()
+
+ fun onAction1(text: String) {
+ textLiveData1.value += text
+ }
+
+ fun onAction2(text: String) {
+// textLiveData2.value = text
+ }
+
+ fun onAction3(text: String) {
+// textLiveData3.value = text
+ }
+
+ fun onAction4(text: String) {
+// textLiveData4.value = text
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/guiguzi/androidtest/snwb/ButtonRelativeLayout.java b/app/src/main/java/com/guiguzi/androidtest/snwb/ButtonRelativeLayout.java
new file mode 100644
index 0000000000000000000000000000000000000000..677b3374b41d20b3fe4f1337a940eb0e48adc863
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/snwb/ButtonRelativeLayout.java
@@ -0,0 +1,58 @@
+package com.guiguzi.androidtest.snwb;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.guiguzi.androidtest.R;
+
+public class ButtonRelativeLayout extends RelativeLayout {
+
+ private ImageView mIcon;
+ private TextView mTitle;
+ private Button mOpenBtn;
+
+ public ButtonRelativeLayout(Context context) {
+ super(context);
+ init();
+ }
+
+ public ButtonRelativeLayout(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public ButtonRelativeLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ private void init() {
+ LayoutInflater.from(getContext()).inflate(R.layout.activity_snwb_button_layout, this);
+ setBackgroundColor(getResources().getColor(R.color.color_grey));
+ mIcon = findViewById(R.id.sp_push_icon);
+ mTitle = findViewById(R.id.sp_push_tv);
+ mOpenBtn = findViewById(R.id.sp_push_button);
+ mOpenBtn.setClickable(false);
+ }
+
+ /*public void update(SpecialFollowPushInfo info) {
+ if (info == null) return;
+ if (!TextUtils.isEmpty(info.icon)) {
+ ImageLoader.getInstance().displayImage(info.icon, mIcon);
+ } else {
+ mIcon.setImageDrawable(null);
+ }
+ mTitle.setText(info.title);
+ mOpenBtn.setText(info.buttonTitle);
+
+ LogUtil.d("WzqTag", "defaultButtonSize = ");
+ }*/
+
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/snwb/SnwbButtonActivity.java b/app/src/main/java/com/guiguzi/androidtest/snwb/SnwbButtonActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..a83231baf0f85abbdcb67972e1ea8d26418b4f89
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/snwb/SnwbButtonActivity.java
@@ -0,0 +1,24 @@
+package com.guiguzi.androidtest.snwb;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+
+public class SnwbButtonActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ButtonRelativeLayout buttonRelativeLayout = new ButtonRelativeLayout(getBaseContext());
+ LinearLayout linearLayout = new LinearLayout(getBaseContext());
+ LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT);
+ llParams.gravity = Gravity.CENTER_VERTICAL;
+ linearLayout.addView(buttonRelativeLayout, llParams);
+ //Button由于在初始化方法里面有设置style,最低高度为56dp
+ setContentView(linearLayout);
+ }
+}
diff --git a/app/src/main/java/com/guiguzi/androidtest/ui/MyAdapter.java b/app/src/main/java/com/guiguzi/androidtest/ui/MyAdapter.java
index 017706e4d83b2d935893da5070744749b7b9d4c6..7c1e87d3ea8465174506f2b1a7b4e92327d15aa6 100644
--- a/app/src/main/java/com/guiguzi/androidtest/ui/MyAdapter.java
+++ b/app/src/main/java/com/guiguzi/androidtest/ui/MyAdapter.java
@@ -1,5 +1,9 @@
package com.guiguzi.androidtest.ui;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.SUBCLASSES;
+
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
@@ -19,25 +23,34 @@ import androidx.recyclerview.widget.RecyclerView;
import com.guiguzi.androidtest.R;
import com.guiguzi.androidtest.activity.AActivity;
import com.guiguzi.androidtest.activity.ButtonsActivity;
+import com.guiguzi.androidtest.activity.CustomViewPagerActivity;
+import com.guiguzi.androidtest.activity.DialogActivity;
import com.guiguzi.androidtest.activity.EventBusActivity;
+import com.guiguzi.androidtest.activity.GGroupActivity;
import com.guiguzi.androidtest.activity.GlideActivity;
+import com.guiguzi.androidtest.activity.JsonViewActivity;
import com.guiguzi.androidtest.activity.LifecycleActivity;
+import com.guiguzi.androidtest.activity.LongImageActivity;
+import com.guiguzi.androidtest.activity.LottieActivity;
import com.guiguzi.androidtest.activity.MainActivity;
import com.guiguzi.androidtest.activity.MediaPlayerActivity;
+import com.guiguzi.androidtest.activity.Mvvm2Activity;
+import com.guiguzi.androidtest.activity.MvvmActivity;
+import com.guiguzi.androidtest.activity.PermissionActivity;
+import com.guiguzi.androidtest.activity.ScrollerActivity;
+import com.guiguzi.androidtest.activity.TextViewActivity;
import com.guiguzi.androidtest.activity.ViewPageActivity;
+import com.guiguzi.androidtest.activityJava.MainJavaActivity;
import com.guiguzi.androidtest.customView.CustomActivity;
import com.guiguzi.androidtest.eventdispatch.MyActivity;
import com.guiguzi.androidtest.h5.H5Activity;
import com.guiguzi.androidtest.jetpack.ComposeActivity;
import com.guiguzi.androidtest.jetpack.JetpackMainActivity;
import com.guiguzi.androidtest.rxJavaTest.RxJavaActivity;
+import com.guiguzi.androidtest.snwb.SnwbButtonActivity;
import java.util.List;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static androidx.annotation.RestrictTo.Scope.SUBCLASSES;
-
public class MyAdapter extends RecyclerView.Adapter {
private final static String TAG = "MyAdapter";
@@ -109,6 +122,37 @@ public class MyAdapter extends RecyclerView.Adapter {
}
});
break;
+
+ case "MVVM学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, MvvmActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "MVVM2学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, Mvvm2Activity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
case "RxJava学习":
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
@@ -302,6 +346,168 @@ public class MyAdapter extends RecyclerView.Adapter {
}
});
break;
+
+ case "GroupActivity":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, GGroupActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+ case "长图分区加载":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, LongImageActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "JsonViewer":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, JsonViewActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "MainJava":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, MainJavaActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "Lottie":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, LottieActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "自定义ViewPager":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, CustomViewPagerActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "Scroller学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, ScrollerActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "Button学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, SnwbButtonActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+ case "TextView学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, TextViewActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+ case "Permission学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, PermissionActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
+
+ case "Dialog学习":
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent();
+ if (mContext instanceof Activity) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ ComponentName componentName = new ComponentName(mContext, DialogActivity.class);
+ intent.setComponent(componentName);
+ mContext.startActivity(intent);
+ }
+ });
+ break;
}
}
diff --git a/app/src/main/java/com/guiguzi/androidtest/uitils/ActivityUtils.kt b/app/src/main/java/com/guiguzi/androidtest/uitils/ActivityUtils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ed1721c7a98db31b17ed13cc9bf00930ecc50f46
--- /dev/null
+++ b/app/src/main/java/com/guiguzi/androidtest/uitils/ActivityUtils.kt
@@ -0,0 +1,7 @@
+package com.guiguzi.androidtest.uitils
+
+object ActivityUtils {
+
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/double_comma.png b/app/src/main/res/drawable-xhdpi/double_comma.png
new file mode 100644
index 0000000000000000000000000000000000000000..30a108957166d8f8daeea7c505b125d569a23cd5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/double_comma.png differ
diff --git a/app/src/main/res/drawable-xhdpi/test.png b/app/src/main/res/drawable-xhdpi/test.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5ed46597ea8447d91ab1786a34e30f1c26b18bd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/test.png differ
diff --git a/app/src/main/res/drawable/bg_doudle_comma.xml b/app/src/main/res/drawable/bg_doudle_comma.xml
new file mode 100644
index 0000000000000000000000000000000000000000..52f5430a47059e4865ff9eff80d50d6779c45bda
--- /dev/null
+++ b/app/src/main/res/drawable/bg_doudle_comma.xml
@@ -0,0 +1,52 @@
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
diff --git a/app/src/main/res/drawable/shape_circle.xml b/app/src/main/res/drawable/shape_circle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..742a700ce4b34eed85475059219df460af415ff1
--- /dev/null
+++ b/app/src/main/res/drawable/shape_circle.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_custom.xml b/app/src/main/res/layout/activity_custom.xml
index e0c53c57e192b8625215f469cac3eb2837476f50..146d3b8ba70776b034afc9dd4b8f77945f697b3c 100644
--- a/app/src/main/res/layout/activity_custom.xml
+++ b/app/src/main/res/layout/activity_custom.xml
@@ -9,6 +9,30 @@
android:layout_height="match_parent"
android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
@@ -33,7 +57,7 @@
@@ -59,6 +83,7 @@
+
@@ -72,5 +97,10 @@
android:layout_width="300dp"
android:layout_height="100dp" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_error_a.xml b/app/src/main/res/layout/activity_error_a.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aaee29ab0fcd6d614825dd3fded2a56ff114e43e
--- /dev/null
+++ b/app/src/main/res/layout/activity_error_a.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_group_layout.xml b/app/src/main/res/layout/activity_group_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0008150ca350ebb83e792d91630084b688627f5
--- /dev/null
+++ b/app/src/main/res/layout/activity_group_layout.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_json_view_layout.xml b/app/src/main/res/layout/activity_json_view_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5b15c3b836234ab0a481e776836102fef4d82b1e
--- /dev/null
+++ b/app/src/main/res/layout/activity_json_view_layout.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_mvvm.xml b/app/src/main/res/layout/activity_mvvm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..385f0e264f6583e5f21363e4a9ef9e8029205c70
--- /dev/null
+++ b/app/src/main/res/layout/activity_mvvm.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_mvvm_v2.xml b/app/src/main/res/layout/activity_mvvm_v2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..89cb81dc5dc02a7496b6078a0209c494c277fc3c
--- /dev/null
+++ b/app/src/main/res/layout/activity_mvvm_v2.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_scroller_layout.xml b/app/src/main/res/layout/activity_scroller_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..916d349f29b3699ac076b27cce6572767c74c679
--- /dev/null
+++ b/app/src/main/res/layout/activity_scroller_layout.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_snwb_button_layout.xml b/app/src/main/res/layout/activity_snwb_button_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..add3e08d7db5fd8d4fdb70ca5bc095e6cdbf9524
--- /dev/null
+++ b/app/src/main/res/layout/activity_snwb_button_layout.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_custom.xml b/app/src/main/res/layout/dialog_custom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f3a9f6e80637d9cb2367f388438e77c2a59889c8
--- /dev/null
+++ b/app/src/main/res/layout/dialog_custom.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_error_test.xml b/app/src/main/res/layout/fragment_error_test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d1e9d5c38f0333e6f9868e8c04bf4b267dad9e6
--- /dev/null
+++ b/app/src/main/res/layout/fragment_error_test.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_recycler_view_layout.xml b/app/src/main/res/layout/fragment_recycler_view_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d410b4973a0bfef4ca2f3ffca8d79521e9a7e787
--- /dev/null
+++ b/app/src/main/res/layout/fragment_recycler_view_layout.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_recycler_test_a.xml b/app/src/main/res/layout/item_recycler_test_a.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afd10c9a2f400f9c28e749f91c392995de1541a5
--- /dev/null
+++ b/app/src/main/res/layout/item_recycler_test_a.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_recycler_test_b.xml b/app/src/main/res/layout/item_recycler_test_b.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d0790cf60fe08bfdf15035bb5dff13db800a51f2
--- /dev/null
+++ b/app/src/main/res/layout/item_recycler_test_b.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-xhdpi/image_01.webp b/app/src/main/res/mipmap-xhdpi/image_01.webp
new file mode 100644
index 0000000000000000000000000000000000000000..058a8bfa9c26ae7a330c1c1960c088c4d6adabe0
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/image_01.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/image_02.webp b/app/src/main/res/mipmap-xhdpi/image_02.webp
new file mode 100644
index 0000000000000000000000000000000000000000..6fc3217df3666a54b8e9eb13cf992b21569a65a8
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/image_02.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/image_03.webp b/app/src/main/res/mipmap-xhdpi/image_03.webp
new file mode 100644
index 0000000000000000000000000000000000000000..82e4d218b4ab4b86b761ae7eeb2dc7bcaeefaab7
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/image_03.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/image_04.webp b/app/src/main/res/mipmap-xhdpi/image_04.webp
new file mode 100644
index 0000000000000000000000000000000000000000..8bdf53f4475cd3bcc8cb6788930eeb10678af85b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/image_04.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/image_05.webp b/app/src/main/res/mipmap-xhdpi/image_05.webp
new file mode 100644
index 0000000000000000000000000000000000000000..7b57c82c0d9cfa937dea87b68dc98706b6b840d6
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/image_05.webp differ
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index b80efbd8541a9e858a333765b84bc459066948e5..5009fe11cb7cbcb527448044700e730492c26891 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -2,8 +2,18 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 016ab8f225d42f821db29694db0a8b6bd556d028..89a1b3ee7ed1fc72ce73b23b14b45994bd93c03d 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,4 +7,5 @@
#D81B60
#141417
#A9A9A9
+ #00ffffff
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ed3ba647c7e1d7337f7f9ca982469b84278c4624..31de1fef97c194a72e58db06f13d7c74576a8d64 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -37,4 +37,9 @@
Form
+
+
+ 一个Tash栈中有两个SingleTash模式的activity
+ 跳转到错误界面
+
diff --git a/app/src/test/java/com/guiguzi/androidtest/JavaMain.java b/app/src/test/java/com/guiguzi/androidtest/JavaMain.java
new file mode 100644
index 0000000000000000000000000000000000000000..2dc67c84ab4558da82d4d9e808232b6b024a26c2
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/JavaMain.java
@@ -0,0 +1,63 @@
+package com.guiguzi.androidtest;
+
+import com.guiguzi.androidtest.extendTest.A1;
+import com.guiguzi.androidtest.extendTest.A1Extend1Son;
+import com.guiguzi.androidtest.extendTest.B1;
+import com.guiguzi.androidtest.extendTest.GrandParent1;
+import com.guiguzi.androidtest.extendTest.Parent1;
+
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class JavaMain {
+
+ @Test
+ public void test() {
+ AtomicInteger atomicInteger = new AtomicInteger(0);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < 5; i++) {
+ atomicInteger.compareAndSet(i, ++i);
+ int result = atomicInteger.get();
+ System.out.println("thread1 result = " + result);
+ try {
+ Thread.sleep(3000L);
+ } catch (Exception e) {
+ System.out.println("thread1 e = " + e);
+ }
+ }
+ }
+ }).start();
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < 5; i++) {
+ atomicInteger.compareAndSet(i, ++i);
+ int result = atomicInteger.get();
+ System.out.println("thread2 result = " + result);
+ }
+ }
+ }).start();
+
+
+ /*测试继承相关问题代码, 开始*/
+ A1 a1 = new GrandParent1();
+ a1.funTest1();
+
+ B1 b1 = new Parent1();
+ b1.funTest1();
+
+ A1 a1Extend1Son1 = new A1Extend1Son();
+ a1Extend1Son1.funTest1();
+
+ A1 a1Extend1Son2 = new A1Extend1Son();
+ a1Extend1Son2.funDefault();
+
+ /*测试继承相关问题代码, 结束*/
+
+ }
+
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/A1.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd998de0d598aa74ee0100740213a57c787129d8
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1.java
@@ -0,0 +1,15 @@
+package com.guiguzi.androidtest.extendTest;
+
+public interface A1 {
+
+ /**
+ * 和A2接口中的funTest1()方法签名一样但是返回类型不同,没法被其他接口、类、枚举同时继承或实现
+ */
+ String funTest1();
+
+ void funTest2();
+
+ default void funDefault() {
+ System.out.println("A1 simple name = " + A1.class.getSimpleName());
+ }
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1.java
new file mode 100644
index 0000000000000000000000000000000000000000..0513f4ead2f758154d179e333dc9af937913950b
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1.java
@@ -0,0 +1,21 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class A1Extend1 implements A1 {
+
+ @Override
+ public String funTest1() {
+ String str = A1Extend1.class.getSimpleName();
+ System.out.println("A1Extend1 str = " + str);
+ return str;
+ }
+
+ @Override
+ public void funTest2() {
+
+ }
+
+ @Override
+ public void funDefault() {
+ System.out.println("A1Extend1 simple name = " + A1Extend1.class.getSimpleName());
+ }
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1Son.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1Son.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4698b82866d3e35b28ae981c2adc3565bdde491
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend1Son.java
@@ -0,0 +1,4 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class A1Extend1Son extends A1Extend1 implements A1 {
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend2.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend2.java
new file mode 100644
index 0000000000000000000000000000000000000000..303f5bad56e083b702e16f55c7fb0fd5a7c4b444
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/A1Extend2.java
@@ -0,0 +1,16 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class A1Extend2 implements A1 {
+
+ @Override
+ public String funTest1() {
+ String str = A1Extend2.class.getSimpleName();
+ System.out.println("A1Extend2 str = " + str);
+ return str;
+ }
+
+ @Override
+ public void funTest2() {
+
+ }
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/A2.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/A2.java
new file mode 100644
index 0000000000000000000000000000000000000000..b744c51de938a8e77d4d710e179a09fff06c3aeb
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/A2.java
@@ -0,0 +1,14 @@
+package com.guiguzi.androidtest.extendTest;
+
+public interface A2 {
+
+ /**
+ * 和A1接口中的funTest1()方法签名一样但是返回类型不同,没法被其他接口、类、枚举同时继承或实现
+ */
+// void funTest1();
+ default void funTest2() {
+ String result = A1.class.getSimpleName();
+ System.out.println("A1 funTest2() result = " + result);
+ }
+
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/B1.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/B1.java
new file mode 100644
index 0000000000000000000000000000000000000000..e00bee2f4a4dfb1c863742bf75a9a246f1070181
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/B1.java
@@ -0,0 +1,17 @@
+package com.guiguzi.androidtest.extendTest;
+
+public interface B1 extends A1, A2 {
+
+ @Override
+ default String funTest1() {
+ String result = B1.class.getSimpleName();
+ System.out.println("B1 funTest1() result = " + result);
+ return result;
+ }
+
+ @Override
+ default void funTest2() {
+
+ }
+
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent1.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent1.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c926102189e292ed68e979dadd2e1660d0c729a
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent1.java
@@ -0,0 +1,19 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class GrandParent1 implements A1, A2, B1 {
+
+
+ @Override
+ public String funTest1() {
+ String result = GrandParent1.class.getSimpleName();
+ System.out.println("ExtendTest1 funTest1() result = " + result);
+ return result;
+ }
+
+ /* @Override
+ public void funTest2() {
+
+ String result = GrandParent1.class.getSimpleName();
+ System.out.println("ExtendTest1 funTest2() result = " + result);
+ }*/
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent2.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent2.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f6ca644d55a7f0dada6d33721243894edf39b6d
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/GrandParent2.java
@@ -0,0 +1,4 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class GrandParent2 {
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/Parent1.java b/app/src/test/java/com/guiguzi/androidtest/extendTest/Parent1.java
new file mode 100644
index 0000000000000000000000000000000000000000..99c61909d85dfa25d5d84d53502089348103f1c1
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/Parent1.java
@@ -0,0 +1,9 @@
+package com.guiguzi.androidtest.extendTest;
+
+public class Parent1 extends GrandParent1 {
+
+ @Override
+ public String funTest1() {
+ return super.funTest1();
+ }
+}
diff --git a/app/src/test/java/com/guiguzi/androidtest/extendTest/readme.md b/app/src/test/java/com/guiguzi/androidtest/extendTest/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..7148531dd3bce915bd56e8be7215a2c99889a69e
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/extendTest/readme.md
@@ -0,0 +1,12 @@
+# 主要讲解java中继承相关知识
+
+#### 多接口实现错乱问题
+
+
+#### 总结
+1. A1、A2两个接口有相同的方法签名funTest1(),但是返回参数不同,不能被同时被其他接口继承或者被类同时实现。
+2. A1、A2两个接口有相同的方法签名相同和返回参数类型相同的方法funTest2(),其中一个接口或两个接口都有default修饰的默认实现时候,继承或实现A1、A2的接口或类需要覆盖funTest2()方法。
+3. B1接口继承A1接口时候,B1接口有A1接口相同签名的funTest1()方法时候默认继承。
+4. 实体类实现接口时候,没法通过super关键字调用接口中default修饰的默认实现的接口方法,需要加上接口名加上super关键字调用方法。正确形式:接口名.super.方法名()
+5. A1Extend1类实现A1接口,A1Extend1Son继承A1Extend1类并实现A1接口,此时A1Extend1Son不需要实现A1接口方法。原理A1Extend1Son继承A1Extend1时候默认"拷贝"父类的funTest1()实现方法。
+6. A1Extend1类实Markdown Navigator现A1接口,A1Extend1Son继承A1Extend1类并实现A1接口。此时接口A1中默认实现方法funDefault()在类 A1Extend1覆盖,A1Extend1Son继承A1Extend1时候继承funDefault方法实现。
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/kotlintest/FunTest.kt b/app/src/test/java/com/guiguzi/androidtest/kotlintest/FunTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1fb86ca218c1761f60167ade99c8476b0c3dacb3
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/kotlintest/FunTest.kt
@@ -0,0 +1,142 @@
+package com.guiguzi.androidtest.kotlintest
+
+import com.guiguzi.androidtest.kotlintest.interfacetest.MyInterfaceImp
+
+
+public inline fun T.myLet(block: (T) -> R): R {
+ return block(this)
+}
+
+class Dpp(val value: Float) {
+
+}
+
+class FunTest {
+
+ /***********高阶函数。*****************/
+ // 函数作为参数
+ fun paramFun() {
+ val list = listOf(1, 2)
+ list.forEach(::println)
+ }
+
+ // 函数作为返回值
+ fun returnFun(): (Int, Int) -> Int {
+ return { j, i -> j + i }
+ }
+
+ fun paramFun1(funParam111: (aInt: Int) -> Unit): Unit {
+ funParam111(111)
+ }
+
+
+ /***********高阶函数。*****************/
+
+ /***********闭包函数***************/
+ fun closureMethod(i: Int): () -> Int {
+ var memoryValue = 1
+ return fun(): Int {
+ return i + memoryValue++
+ }
+ }
+ /***********闭包函数***************/
+
+ /***********匿名函数****************/
+ val stringLengthFunc: (String) -> Int = { input ->
+ input.length
+ }
+ /***********匿名函数****************/
+
+ /***********Lambda表达式**********************/
+ // 无参: val/var 变量名: () -> 返回值类型 = { 代码块 },
+ val a: () -> Int = { 10 }
+
+ // 有参: val/var 变量名: (变量类型...) -> 返回值类型 = { 参数1,参数2, ... -> 操作参数的代码 }
+ val b: (Int, Int) -> Int = { x, y -> x + y }
+
+ // 推导: val/var 变量名 = { 参数1: 类型, 参数2: 类型, ... -> 操作参数的代码 }
+ val c = { x: Int, y: Int -> x + y }
+
+ //lambda表达式调用方式
+ //a.invoke()
+ /***********Lambda表达式**********************/
+
+ /**********内联扩展函数 let、with、run、apply、also**********/
+
+ fun letFun() {
+ this.let {
+
+ }
+
+ this.myLet {
+ println("let fun test")
+ }
+ }
+ /**********内联扩展函数 let、with、run、apply、also**********/
+
+}
+
+/***********扩展函数*******************************/
+fun Int.extensionFun(i: Int): Int {
+ return this + i
+}
+
+inline val Int.dpp: Dpp get() = Dpp(value = this.toFloat())
+
+/***********扩展函数*******************************/
+
+fun funParam111(aInt: Int) {
+ println(aInt)
+}
+
+fun T.letTest(block: (T) -> R): R {
+ return block(this)
+}
+
+/**********测试接口***********/
+fun testInterface() {
+ MyInterfaceImp().test {
+ println("SAM 函数式接口")
+ }
+}
+
+fun main() {
+ val funTest = FunTest()
+ println(funTest.returnFun().invoke(1, 2))
+ funTest.paramFun()
+
+ funTest.let {
+
+ }
+
+ var cc = funTest.c(2, 3)
+ println("cc = $cc")
+
+ println("c fun = ${funTest.c.invoke(2, 3)}")
+
+ var obj: FunTest? = null
+ obj.letTest {
+ println("hello world")
+ }
+
+ var block: (FunTest?) -> Any? = { funTest: FunTest? ->
+ funTest
+ println("hello world")
+ }
+ obj.letTest(block)
+
+ println(10.dpp)
+
+ funTest.paramFun1(::funParam111)
+
+ println(funTest.closureMethod(10)())
+
+ println(funTest.c(1, 2))
+
+ println(10.extensionFun(1))
+
+ println("测试dpp")
+ println(10.dpp.value)
+
+ funTest.letFun()
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/IMyInterface.kt b/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/IMyInterface.kt
new file mode 100644
index 0000000000000000000000000000000000000000..98f57bcb2ce255a321020b76d885ce06f0694f38
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/IMyInterface.kt
@@ -0,0 +1,5 @@
+package com.guiguzi.androidtest.kotlintest.interfacetest
+
+ fun interface IMyInterface {
+ fun function1();
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/MyInterfaceImp.kt b/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/MyInterfaceImp.kt
new file mode 100644
index 0000000000000000000000000000000000000000..93087f37d806246932f75538cd99801efb49f2e5
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/kotlintest/interfacetest/MyInterfaceImp.kt
@@ -0,0 +1,7 @@
+package com.guiguzi.androidtest.kotlintest.interfacetest
+
+class MyInterfaceImp {
+ fun test(myInterface: IMyInterface) {
+ myInterface.function1()
+ }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/lock/MyLock.kt b/app/src/test/java/com/guiguzi/androidtest/lock/MyLock.kt
new file mode 100644
index 0000000000000000000000000000000000000000..869d06db4b95d65f880b80e1a03b134d2909fe8c
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/lock/MyLock.kt
@@ -0,0 +1,62 @@
+package com.guiguzi.androidtest.lock
+
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.locks.AbstractQueuedSynchronizer
+import java.util.concurrent.locks.Condition
+import java.util.concurrent.locks.Lock
+
+class MyLock : Lock {
+
+ private val mSync = Sync()
+
+ override fun lock() {
+ mSync.acquire(1)
+ }
+
+ override fun unlock() {
+ mSync.release(1)
+ }
+
+ override fun lockInterruptibly() {
+ mSync.acquireSharedInterruptibly(1);
+ }
+
+ override fun tryLock(): Boolean {
+ return mSync.tryAcquire(1)
+ }
+
+ override fun tryLock(time: Long, unit: TimeUnit?): Boolean {
+ return unit?.toNanos(time)?.let { mSync.tryAcquireNanos(1, it) } ?: false
+ }
+
+
+ override fun newCondition(): Condition? {
+ return null
+ }
+
+ inner class Sync : AbstractQueuedSynchronizer() {
+ override fun isHeldExclusively(): Boolean {
+ return state == 1
+ }
+
+ public override fun tryAcquire(arg: Int): Boolean {
+ assert(arg == 1)
+ if (compareAndSetState(0, 1)) {
+ exclusiveOwnerThread = Thread.currentThread() //设置当前线程为独占线程
+ return true
+ }
+
+ return false
+ }
+
+ override fun tryRelease(arg: Int): Boolean {
+ assert(arg == 1)
+ if (state == 1) {
+ exclusiveOwnerThread = null
+ state = 0
+ return true
+ }
+ return false
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/lock/MyShareLock.kt b/app/src/test/java/com/guiguzi/androidtest/lock/MyShareLock.kt
new file mode 100644
index 0000000000000000000000000000000000000000..de80b6ea11032a8e5c54038d2de664d1b2c1d1ce
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/lock/MyShareLock.kt
@@ -0,0 +1,56 @@
+package com.guiguzi.androidtest.lock
+
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.locks.AbstractQueuedSynchronizer
+import java.util.concurrent.locks.Condition
+import java.util.concurrent.locks.Lock
+
+class MyShareLock : Lock {
+
+ override fun lock() {
+ TODO("Not yet implemented")
+ }
+
+ override fun tryLock(): Boolean {
+ TODO("Not yet implemented")
+ }
+
+ override fun tryLock(time: Long, unit: TimeUnit?): Boolean {
+ TODO("Not yet implemented")
+ }
+
+ override fun unlock() {
+ TODO("Not yet implemented")
+ }
+
+ override fun lockInterruptibly() {
+ TODO("Not yet implemented")
+ }
+
+ override fun newCondition(): Condition {
+ TODO("Not yet implemented")
+ }
+
+ inner class ShareSync : AbstractQueuedSynchronizer() {
+
+ override fun isHeldExclusively(): Boolean {
+ return state == 1
+ }
+
+ override fun tryAcquireShared(arg: Int): Int {
+
+ assert(arg == 1)
+ if (compareAndSetState(0,1)){
+ exclusiveOwnerThread = Thread.currentThread()
+ return 1
+ }
+
+ return super.tryAcquireShared(arg)
+ }
+
+ override fun tryReleaseShared(arg: Int): Boolean {
+ return super.tryReleaseShared(arg)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/guiguzi/androidtest/time/TimeUtils.java b/app/src/test/java/com/guiguzi/androidtest/time/TimeUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..581afc08d409b7d7fab396e30d519466d230de20
--- /dev/null
+++ b/app/src/test/java/com/guiguzi/androidtest/time/TimeUtils.java
@@ -0,0 +1,25 @@
+package com.guiguzi.androidtest.time;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+public class TimeUtils {
+
+ public static boolean isThisYear(long timestamp) {
+ long time = System.currentTimeMillis();
+ Date date = new Date(time);
+ date.getYear();
+ GregorianCalendar gregorianCalendar = new GregorianCalendar();
+ System.out.println("年 = " + gregorianCalendar.getWeekYear());
+ GregorianCalendar gc = new GregorianCalendar();
+ gc.setTimeInMillis(1833685478000L);
+ System.out.println("target年 = " + gc.getWeekYear());
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日");
+ String dateTime = simpleDateFormat.format(new Date(1833685478000L));
+ System.out.println(dateTime);
+ return false;
+ }
+
+}
diff --git a/apt/build.gradle b/apt/build.gradle
index 5839caf3d30e889a90cd48e90e25c322794194fc..3682b751478a1a4ea8ffb9c6e825a582edcdc25c 100644
--- a/apt/build.gradle
+++ b/apt/build.gradle
@@ -3,12 +3,12 @@ plugins {
}
java {
- sourceCompatibility = JavaVersion.VERSION_1_7
- targetCompatibility = JavaVersion.VERSION_1_7
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
}
dependencies {
- annotationProcessor 'com.google.auto.service:auto-service:1.0'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
implementation project(':annotation')
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 4d421c1b37104b9d458f0f276df12d78c53bb514..747a968d47aa40dc653f8ca52f48138dd6e0136c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,38 +3,84 @@
buildscript {
ext {
- kotlin_version = '1.4.32'
+ /*gralde tool de 版本号*/
+ gradle_tool_version = '7.0.0'
+ kotlin_version = '1.5.31'
+ kotlin_gradle_version = '1.5.31'
appCompatVersion = "1.1.0"
- recyclerVersion = "1.1.0-rc01"
+ recyclerVersion = "1.2.1"
materialVersion = "1.1.0-beta01"
navigationVersion = "2.1.0"
constraintLayoutVersion = "2.0.0-beta3"
+ appcompat = "1.3.1"
+
+ swiperefreshlayout = "1.1.0"
+ viewpager2 = '1.0.0'
+
/*navagiton版本号*/
- navagition_version = "2.3.2"
- /*compose版本号*/
- compose_version = '1.0.0-beta07'
+ navagition_version = "2.3.5"
+ /*compose版本号*/
+ compose_version = '1.0.5'
+ compose_activity_version = '1.3.1'
+
+ data_store = '1.0.0'
+
+ /*RxJava*/
+ rxjava_java = '3.1.3'
+ rxjava_android = '3.0.0'
+
+ /*Gson*/
+ gson = '2.8.9'
+
+ /*kotlin*/
+ kotlinx_coroutines_android = '1.5.1'
+
+
+ glide = '4.12.0'
+ eventbus = '3.3.1'
+ greendao = '3.3.0'
+ protobuf = '3.15.6'
+ okhttp = '5.0.0-alpha.2'
+
+ /*AspectJ*/
+ aspectj = '1.9.7'
+
+ /*DoKit*/
+ doKit = '3.5.0'
+
+ /*Lottie*/
+ lottie = '4.2.2'
+
}
repositories {
- maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
- maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
+// maven { url 'https://jitpack.io' }
google()
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.0.0-alpha15'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "com.android.tools.build:gradle:$gradle_tool_version"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_gradle_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navagition_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
+
+ classpath "org.aspectj:aspectjtools:$aspectj"
+ classpath "org.aspectj:aspectjweaver:$aspectj"
+
+// classpath "io.github.didi.dokit:dokitx-plugin:$doKit"
}
}
allprojects {
repositories {
- maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
- maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
}
diff --git a/code_h264/build.gradle b/code_h264/build.gradle
index 68569a9689153866bf6998d56d104960cae76117..628b0226e1ed4ba6d6c668f947d70e9ea3852689 100644
--- a/code_h264/build.gradle
+++ b/code_h264/build.gradle
@@ -10,8 +10,6 @@ android {
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
@@ -35,8 +33,8 @@ android {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.1'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index c5342b0a95c5635597f1f9cc009c88ce863f0b2a..d4163ba0d4839291db256e4cb3b09f6dc5e9f43b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -28,3 +28,21 @@ android.enableR8.fullMode=true
org.gradle.configureondemand=true
org.gradle.caching=true
org.gradle.parallel=true
+
+#??DoKit
+# dokit????
+# ????
+DOKIT_PLUGIN_SWITCH=true
+# DOKIT???????booster?? ???????????booster ???????false
+DOKIT_THIRD_LIB_SWITCH=true
+# ????
+DOKIT_LOG_SWITCH=true
+# ???Webview????? ??????h5 js?????mock
+DOKIT_WEBVIEW_CLASS_NAME=com/didichuxing/doraemonkit/widget/webview/MyWebView
+# dokit ?????
+DOKIT_METHOD_SWITCH=true
+# dokit ???????
+DOKIT_METHOD_STACK_LEVEL=4
+# 0:???? ??????? ??????? ???application onCreate ?attachBaseContext
+# 1:???? ???????????? ??????????
+DOKIT_METHOD_STRATEGY=0
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 622c709b5fa4b7c8d61831c4f07ea531b4f8925c..6e0b249ba0829a01c00184537d7678328c65e17e 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu May 13 19:27:58 CST 2021
+#Thu Sep 30 00:52:23 CST 2021
distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlescript/config.gradle b/gradlescript/config.gradle
index 7a962fcb77c670e4ffdbf8cd8e75d2d42c5df46a..f1ff693c5f98bbbfbed1840d5576d7b689481708 100755
--- a/gradlescript/config.gradle
+++ b/gradlescript/config.gradle
@@ -1,6 +1,6 @@
ext {
android = [compileSdkVersion : 30
- , buildToolsVersion: "30.0.0"
+ , buildToolsVersion: "30.0.2"
, minSdkVersion : 24
, targetSdkVersion : 30
, versionCode : 1
diff --git a/network/build.gradle b/network/build.gradle
index cf4d23ed6d0de8ec046b6cd62697e240ac678e6d..9bb5db904400dd39842bee5ee1fafe2991c70cb5 100644
--- a/network/build.gradle
+++ b/network/build.gradle
@@ -1,15 +1,15 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
+plugins {
+ id 'com.android.library'
+ id 'kotlin-android'
+}
android {
compileSdkVersion 30
- buildToolsVersion "30.0.0"
+ buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -26,10 +26,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'androidx.core:core-ktx:1.3.2'
- testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+// implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'androidx.core:core-ktx:1.6.0'
}
diff --git a/network/src/main/java/com/guiguzi/network/test/NetListener.kt b/network/src/main/java/com/guiguzi/network/test/NetListener.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5eb002b605170c38169f9d42f7da221455a65001
--- /dev/null
+++ b/network/src/main/java/com/guiguzi/network/test/NetListener.kt
@@ -0,0 +1,10 @@
+package com.guiguzi.network.test
+
+import java.lang.Exception
+
+interface NetListener {
+
+ fun onFinish(content: String?)
+
+ fun onError(e: Exception)
+}
\ No newline at end of file
diff --git a/network/src/main/java/com/guiguzi/network/test/NetTest.kt b/network/src/main/java/com/guiguzi/network/test/NetTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b0f86b951a5c620e5bf39c2520a827f94e2c580d
--- /dev/null
+++ b/network/src/main/java/com/guiguzi/network/test/NetTest.kt
@@ -0,0 +1,64 @@
+package com.guiguzi.network.test
+
+import android.net.Uri
+import java.io.BufferedReader
+import java.io.IOException
+import java.io.InputStream
+import java.io.InputStreamReader
+import java.net.HttpURLConnection
+import java.net.URL
+
+object NetTest {
+
+ private const val CONNECT_TIMEOUT = 5 * 1000
+ private const val READ_TIMEOUT = 5 * 1000;
+
+ @Throws(IOException::class)
+ fun funHttpURLConnection(url: String, extra: String): InputStream? {
+ val httpUrlConnection = createConnection(url, extra)
+ return httpUrlConnection.inputStream
+ }
+
+ @Throws(IOException::class)
+ private fun createConnection(url: String?, extra: Any?): HttpURLConnection {
+// val encodedUrl: String = Uri.encode(url, "@#&=*+-_.,:!?()/~'%")
+ val encodedUrl: String = Uri.encode(url)
+ val conn = URL(encodedUrl).openConnection() as HttpURLConnection
+ conn.connectTimeout = CONNECT_TIMEOUT
+ conn.readTimeout = READ_TIMEOUT
+ return conn
+ }
+
+ fun sendHttpRequest(address: String, listener: NetListener) {
+ Thread {
+ var connection: HttpURLConnection? = null
+
+ try {
+ val url = URL(address)
+ connection = url.openConnection() as HttpURLConnection
+ connection.requestMethod = "GET"
+ connection.readTimeout = 2000
+ connection.connectTimeout = 2000
+ connection.doInput = true
+ connection.doOutput = true
+ val inputStream: InputStream = connection.inputStream
+
+ val reader = BufferedReader(InputStreamReader(inputStream))
+ val response: StringBuilder = StringBuilder()
+ var line: String? = ""
+
+ while (line != null) {
+ line = reader.readLine()
+ response.append(line)
+ }
+
+ listener.onFinish(response.toString())
+ } catch (e: IOException) {
+ listener.onError(e)
+ } finally {
+ connection?.disconnect()
+ }
+ }.start()
+
+ }
+}
\ No newline at end of file
diff --git a/network/src/main/java/com/guiguzi/network/test/PicUrls.kt b/network/src/main/java/com/guiguzi/network/test/PicUrls.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5935989812427827159898593315258a8af46f09
--- /dev/null
+++ b/network/src/main/java/com/guiguzi/network/test/PicUrls.kt
@@ -0,0 +1,12 @@
+package com.guiguzi.network.test
+
+class PicUrls {
+
+ companion object {
+
+ const val baiduUrl = "https://www.baidu.com"
+
+ const val picUrl1: String =
+ "http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg"
+ }
+}
diff --git a/network/src/test/java/com/guiguzi/network/ExampleUnitTest.kt b/network/src/test/java/com/guiguzi/network/ExampleUnitTest.kt
index e76dd69e0f6605aba7325486e2eabcbbaef41bf0..48e9ef790d9df105e99eeb970f429408a2ed83e4 100644
--- a/network/src/test/java/com/guiguzi/network/ExampleUnitTest.kt
+++ b/network/src/test/java/com/guiguzi/network/ExampleUnitTest.kt
@@ -1,8 +1,12 @@
package com.guiguzi.network
+import com.guiguzi.network.test.NetListener
+import com.guiguzi.network.test.NetTest
+import com.guiguzi.network.test.PicUrls
import org.junit.Test
import org.junit.Assert.*
+import java.lang.Exception
/**
* Example local unit test, which will execute on the development machine (host).
@@ -14,4 +18,23 @@ class ExampleUnitTest {
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
+
+ @Test
+ fun testMain() {
+ /* var baiduIO = NetTest.funHttpURLConnection(PicUrls.baiduUrl, "")
+
+ var picIO = NetTest.funHttpURLConnection(PicUrls.picUrl1, "")
+ println("baiduIO = ${baiduIO.toString()},picIO = ${picIO.toString()}")*/
+ val url = "http://www.baidu.com"
+ NetTest.sendHttpRequest(url, object : NetListener {
+ override fun onFinish(content: String?) {
+ println("onFinish(), content = $content")
+ }
+
+ override fun onError(e: Exception) {
+ println("onError = ${e.toString()}")
+ }
+ })
+
+ }
}
diff --git a/player/build/generated/source/buildConfig/debug/com/ggz/player/BuildConfig.java b/player/build/generated/source/buildConfig/debug/com/ggz/player/BuildConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e32fb3754111534f96cd40f6e5b75ee79c10e54
--- /dev/null
+++ b/player/build/generated/source/buildConfig/debug/com/ggz/player/BuildConfig.java
@@ -0,0 +1,10 @@
+/**
+ * Automatically generated file. DO NOT MODIFY
+ */
+package com.ggz.player;
+
+public final class BuildConfig {
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
+ public static final String LIBRARY_PACKAGE_NAME = "com.ggz.player";
+ public static final String BUILD_TYPE = "debug";
+}
diff --git a/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml b/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e279984a98ff69f211f5b90874ee4b94bddb34d5
--- /dev/null
+++ b/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json b/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a07459dff2e71d08e17bff34a98af026ad346c9
--- /dev/null
+++ b/player/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.ggz.player",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/player/build/intermediates/aar_main_jar/debug/classes.jar b/player/build/intermediates/aar_main_jar/debug/classes.jar
new file mode 100644
index 0000000000000000000000000000000000000000..6532a03f2920f0777f1a1aef3591c5bc004d39f0
Binary files /dev/null and b/player/build/intermediates/aar_main_jar/debug/classes.jar differ
diff --git a/player/build/intermediates/aar_metadata/debug/aar-metadata.properties b/player/build/intermediates/aar_metadata/debug/aar-metadata.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8c9c6997a33bb9da672e8e423470e724a66b23bc
--- /dev/null
+++ b/player/build/intermediates/aar_metadata/debug/aar-metadata.properties
@@ -0,0 +1,4 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minAndroidGradlePluginVersion=1.0.0
diff --git a/player/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/player/build/intermediates/annotation_processor_list/debug/annotationProcessors.json
new file mode 100644
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/player/build/intermediates/annotation_processor_list/debug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/player/build/intermediates/annotations_typedef_file/debug/typedefs.txt b/player/build/intermediates/annotations_typedef_file/debug/typedefs.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/player/build/intermediates/compile_r_class_jar/debug/R.jar b/player/build/intermediates/compile_r_class_jar/debug/R.jar
new file mode 100644
index 0000000000000000000000000000000000000000..2b9c02c6845a02be903dae54e18a14d5493e3098
Binary files /dev/null and b/player/build/intermediates/compile_r_class_jar/debug/R.jar differ
diff --git a/player/build/intermediates/compile_symbol_list/debug/R.txt b/player/build/intermediates/compile_symbol_list/debug/R.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0f8ff918dd29f20fb0e8bfcc224ddb1c8e29f4b7
--- /dev/null
+++ b/player/build/intermediates/compile_symbol_list/debug/R.txt
@@ -0,0 +1,4710 @@
+int anim abc_fade_in 0x0
+int anim abc_fade_out 0x0
+int anim abc_grow_fade_in_from_bottom 0x0
+int anim abc_popup_enter 0x0
+int anim abc_popup_exit 0x0
+int anim abc_shrink_fade_out_from_bottom 0x0
+int anim abc_slide_in_bottom 0x0
+int anim abc_slide_in_top 0x0
+int anim abc_slide_out_bottom 0x0
+int anim abc_slide_out_top 0x0
+int anim abc_tooltip_enter 0x0
+int anim abc_tooltip_exit 0x0
+int anim btn_checkbox_to_checked_box_inner_merged_animation 0x0
+int anim btn_checkbox_to_checked_box_outer_merged_animation 0x0
+int anim btn_checkbox_to_checked_icon_null_animation 0x0
+int anim btn_checkbox_to_unchecked_box_inner_merged_animation 0x0
+int anim btn_checkbox_to_unchecked_check_path_merged_animation 0x0
+int anim btn_checkbox_to_unchecked_icon_null_animation 0x0
+int anim btn_radio_to_off_mtrl_dot_group_animation 0x0
+int anim btn_radio_to_off_mtrl_ring_outer_animation 0x0
+int anim btn_radio_to_off_mtrl_ring_outer_path_animation 0x0
+int anim btn_radio_to_on_mtrl_dot_group_animation 0x0
+int anim btn_radio_to_on_mtrl_ring_outer_animation 0x0
+int anim btn_radio_to_on_mtrl_ring_outer_path_animation 0x0
+int anim design_bottom_sheet_slide_in 0x0
+int anim design_bottom_sheet_slide_out 0x0
+int anim design_snackbar_in 0x0
+int anim design_snackbar_out 0x0
+int anim fragment_fast_out_extra_slow_in 0x0
+int anim mtrl_bottom_sheet_slide_in 0x0
+int anim mtrl_bottom_sheet_slide_out 0x0
+int anim mtrl_card_lowers_interpolator 0x0
+int animator design_appbar_state_list_animator 0x0
+int animator design_fab_hide_motion_spec 0x0
+int animator design_fab_show_motion_spec 0x0
+int animator fragment_close_enter 0x0
+int animator fragment_close_exit 0x0
+int animator fragment_fade_enter 0x0
+int animator fragment_fade_exit 0x0
+int animator fragment_open_enter 0x0
+int animator fragment_open_exit 0x0
+int animator linear_indeterminate_line1_head_interpolator 0x0
+int animator linear_indeterminate_line1_tail_interpolator 0x0
+int animator linear_indeterminate_line2_head_interpolator 0x0
+int animator linear_indeterminate_line2_tail_interpolator 0x0
+int animator mtrl_btn_state_list_anim 0x0
+int animator mtrl_btn_unelevated_state_list_anim 0x0
+int animator mtrl_card_state_list_anim 0x0
+int animator mtrl_chip_state_list_anim 0x0
+int animator mtrl_extended_fab_change_size_collapse_motion_spec 0x0
+int animator mtrl_extended_fab_change_size_expand_motion_spec 0x0
+int animator mtrl_extended_fab_hide_motion_spec 0x0
+int animator mtrl_extended_fab_show_motion_spec 0x0
+int animator mtrl_extended_fab_state_list_animator 0x0
+int animator mtrl_fab_hide_motion_spec 0x0
+int animator mtrl_fab_show_motion_spec 0x0
+int animator mtrl_fab_transformation_sheet_collapse_spec 0x0
+int animator mtrl_fab_transformation_sheet_expand_spec 0x0
+int attr actionBarDivider 0x0
+int attr actionBarItemBackground 0x0
+int attr actionBarPopupTheme 0x0
+int attr actionBarSize 0x0
+int attr actionBarSplitStyle 0x0
+int attr actionBarStyle 0x0
+int attr actionBarTabBarStyle 0x0
+int attr actionBarTabStyle 0x0
+int attr actionBarTabTextStyle 0x0
+int attr actionBarTheme 0x0
+int attr actionBarWidgetTheme 0x0
+int attr actionButtonStyle 0x0
+int attr actionDropDownStyle 0x0
+int attr actionLayout 0x0
+int attr actionMenuTextAppearance 0x0
+int attr actionMenuTextColor 0x0
+int attr actionModeBackground 0x0
+int attr actionModeCloseButtonStyle 0x0
+int attr actionModeCloseContentDescription 0x0
+int attr actionModeCloseDrawable 0x0
+int attr actionModeCopyDrawable 0x0
+int attr actionModeCutDrawable 0x0
+int attr actionModeFindDrawable 0x0
+int attr actionModePasteDrawable 0x0
+int attr actionModePopupWindowStyle 0x0
+int attr actionModeSelectAllDrawable 0x0
+int attr actionModeShareDrawable 0x0
+int attr actionModeSplitBackground 0x0
+int attr actionModeStyle 0x0
+int attr actionModeTheme 0x0
+int attr actionModeWebSearchDrawable 0x0
+int attr actionOverflowButtonStyle 0x0
+int attr actionOverflowMenuStyle 0x0
+int attr actionProviderClass 0x0
+int attr actionTextColorAlpha 0x0
+int attr actionViewClass 0x0
+int attr activityChooserViewStyle 0x0
+int attr alertDialogButtonGroupStyle 0x0
+int attr alertDialogCenterButtons 0x0
+int attr alertDialogStyle 0x0
+int attr alertDialogTheme 0x0
+int attr allowStacking 0x0
+int attr alpha 0x0
+int attr alphabeticModifiers 0x0
+int attr altSrc 0x0
+int attr animate_relativeTo 0x0
+int attr animationMode 0x0
+int attr appBarLayoutStyle 0x0
+int attr applyMotionScene 0x0
+int attr arcMode 0x0
+int attr arrowHeadLength 0x0
+int attr arrowShaftLength 0x0
+int attr attributeName 0x0
+int attr autoCompleteTextViewStyle 0x0
+int attr autoSizeMaxTextSize 0x0
+int attr autoSizeMinTextSize 0x0
+int attr autoSizePresetSizes 0x0
+int attr autoSizeStepGranularity 0x0
+int attr autoSizeTextType 0x0
+int attr autoTransition 0x0
+int attr background 0x0
+int attr backgroundColor 0x0
+int attr backgroundInsetBottom 0x0
+int attr backgroundInsetEnd 0x0
+int attr backgroundInsetStart 0x0
+int attr backgroundInsetTop 0x0
+int attr backgroundOverlayColorAlpha 0x0
+int attr backgroundSplit 0x0
+int attr backgroundStacked 0x0
+int attr backgroundTint 0x0
+int attr backgroundTintMode 0x0
+int attr badgeGravity 0x0
+int attr badgeStyle 0x0
+int attr badgeTextColor 0x0
+int attr barLength 0x0
+int attr barrierAllowsGoneWidgets 0x0
+int attr barrierDirection 0x0
+int attr barrierMargin 0x0
+int attr behavior_autoHide 0x0
+int attr behavior_autoShrink 0x0
+int attr behavior_draggable 0x0
+int attr behavior_expandedOffset 0x0
+int attr behavior_fitToContents 0x0
+int attr behavior_halfExpandedRatio 0x0
+int attr behavior_hideable 0x0
+int attr behavior_overlapTop 0x0
+int attr behavior_peekHeight 0x0
+int attr behavior_saveFlags 0x0
+int attr behavior_skipCollapsed 0x0
+int attr borderWidth 0x0
+int attr borderlessButtonStyle 0x0
+int attr bottomAppBarStyle 0x0
+int attr bottomNavigationStyle 0x0
+int attr bottomSheetDialogTheme 0x0
+int attr bottomSheetStyle 0x0
+int attr boxBackgroundColor 0x0
+int attr boxBackgroundMode 0x0
+int attr boxCollapsedPaddingTop 0x0
+int attr boxCornerRadiusBottomEnd 0x0
+int attr boxCornerRadiusBottomStart 0x0
+int attr boxCornerRadiusTopEnd 0x0
+int attr boxCornerRadiusTopStart 0x0
+int attr boxStrokeColor 0x0
+int attr boxStrokeErrorColor 0x0
+int attr boxStrokeWidth 0x0
+int attr boxStrokeWidthFocused 0x0
+int attr brightness 0x0
+int attr buttonBarButtonStyle 0x0
+int attr buttonBarNegativeButtonStyle 0x0
+int attr buttonBarNeutralButtonStyle 0x0
+int attr buttonBarPositiveButtonStyle 0x0
+int attr buttonBarStyle 0x0
+int attr buttonCompat 0x0
+int attr buttonGravity 0x0
+int attr buttonIconDimen 0x0
+int attr buttonPanelSideLayout 0x0
+int attr buttonStyle 0x0
+int attr buttonStyleSmall 0x0
+int attr buttonTint 0x0
+int attr buttonTintMode 0x0
+int attr cardBackgroundColor 0x0
+int attr cardCornerRadius 0x0
+int attr cardElevation 0x0
+int attr cardForegroundColor 0x0
+int attr cardMaxElevation 0x0
+int attr cardPreventCornerOverlap 0x0
+int attr cardUseCompatPadding 0x0
+int attr cardViewStyle 0x0
+int attr chainUseRtl 0x0
+int attr checkboxStyle 0x0
+int attr checkedButton 0x0
+int attr checkedChip 0x0
+int attr checkedIcon 0x0
+int attr checkedIconEnabled 0x0
+int attr checkedIconMargin 0x0
+int attr checkedIconSize 0x0
+int attr checkedIconTint 0x0
+int attr checkedIconVisible 0x0
+int attr checkedTextViewStyle 0x0
+int attr chipBackgroundColor 0x0
+int attr chipCornerRadius 0x0
+int attr chipEndPadding 0x0
+int attr chipGroupStyle 0x0
+int attr chipIcon 0x0
+int attr chipIconEnabled 0x0
+int attr chipIconSize 0x0
+int attr chipIconTint 0x0
+int attr chipIconVisible 0x0
+int attr chipMinHeight 0x0
+int attr chipMinTouchTargetSize 0x0
+int attr chipSpacing 0x0
+int attr chipSpacingHorizontal 0x0
+int attr chipSpacingVertical 0x0
+int attr chipStandaloneStyle 0x0
+int attr chipStartPadding 0x0
+int attr chipStrokeColor 0x0
+int attr chipStrokeWidth 0x0
+int attr chipStyle 0x0
+int attr chipSurfaceColor 0x0
+int attr circleRadius 0x0
+int attr circularProgressIndicatorStyle 0x0
+int attr clickAction 0x0
+int attr clockFaceBackgroundColor 0x0
+int attr clockHandColor 0x0
+int attr clockIcon 0x0
+int attr clockNumberTextColor 0x0
+int attr closeIcon 0x0
+int attr closeIconEnabled 0x0
+int attr closeIconEndPadding 0x0
+int attr closeIconSize 0x0
+int attr closeIconStartPadding 0x0
+int attr closeIconTint 0x0
+int attr closeIconVisible 0x0
+int attr closeItemLayout 0x0
+int attr collapseContentDescription 0x0
+int attr collapseIcon 0x0
+int attr collapsedSize 0x0
+int attr collapsedTitleGravity 0x0
+int attr collapsedTitleTextAppearance 0x0
+int attr collapsingToolbarLayoutStyle 0x0
+int attr color 0x0
+int attr colorAccent 0x0
+int attr colorBackgroundFloating 0x0
+int attr colorButtonNormal 0x0
+int attr colorControlActivated 0x0
+int attr colorControlHighlight 0x0
+int attr colorControlNormal 0x0
+int attr colorError 0x0
+int attr colorOnBackground 0x0
+int attr colorOnError 0x0
+int attr colorOnPrimary 0x0
+int attr colorOnPrimarySurface 0x0
+int attr colorOnSecondary 0x0
+int attr colorOnSurface 0x0
+int attr colorPrimary 0x0
+int attr colorPrimaryDark 0x0
+int attr colorPrimarySurface 0x0
+int attr colorPrimaryVariant 0x0
+int attr colorSecondary 0x0
+int attr colorSecondaryVariant 0x0
+int attr colorSurface 0x0
+int attr colorSwitchThumbNormal 0x0
+int attr commitIcon 0x0
+int attr constraintSet 0x0
+int attr constraintSetEnd 0x0
+int attr constraintSetStart 0x0
+int attr constraint_referenced_ids 0x0
+int attr constraints 0x0
+int attr content 0x0
+int attr contentDescription 0x0
+int attr contentInsetEnd 0x0
+int attr contentInsetEndWithActions 0x0
+int attr contentInsetLeft 0x0
+int attr contentInsetRight 0x0
+int attr contentInsetStart 0x0
+int attr contentInsetStartWithNavigation 0x0
+int attr contentPadding 0x0
+int attr contentPaddingBottom 0x0
+int attr contentPaddingEnd 0x0
+int attr contentPaddingLeft 0x0
+int attr contentPaddingRight 0x0
+int attr contentPaddingStart 0x0
+int attr contentPaddingTop 0x0
+int attr contentScrim 0x0
+int attr contrast 0x0
+int attr controlBackground 0x0
+int attr coordinatorLayoutStyle 0x0
+int attr cornerFamily 0x0
+int attr cornerFamilyBottomLeft 0x0
+int attr cornerFamilyBottomRight 0x0
+int attr cornerFamilyTopLeft 0x0
+int attr cornerFamilyTopRight 0x0
+int attr cornerRadius 0x0
+int attr cornerSize 0x0
+int attr cornerSizeBottomLeft 0x0
+int attr cornerSizeBottomRight 0x0
+int attr cornerSizeTopLeft 0x0
+int attr cornerSizeTopRight 0x0
+int attr counterEnabled 0x0
+int attr counterMaxLength 0x0
+int attr counterOverflowTextAppearance 0x0
+int attr counterOverflowTextColor 0x0
+int attr counterTextAppearance 0x0
+int attr counterTextColor 0x0
+int attr crossfade 0x0
+int attr currentState 0x0
+int attr curveFit 0x0
+int attr customBoolean 0x0
+int attr customColorDrawableValue 0x0
+int attr customColorValue 0x0
+int attr customDimension 0x0
+int attr customFloatValue 0x0
+int attr customIntegerValue 0x0
+int attr customNavigationLayout 0x0
+int attr customPixelDimension 0x0
+int attr customStringValue 0x0
+int attr dayInvalidStyle 0x0
+int attr daySelectedStyle 0x0
+int attr dayStyle 0x0
+int attr dayTodayStyle 0x0
+int attr defaultDuration 0x0
+int attr defaultQueryHint 0x0
+int attr defaultState 0x0
+int attr deltaPolarAngle 0x0
+int attr deltaPolarRadius 0x0
+int attr deriveConstraintsFrom 0x0
+int attr dialogCornerRadius 0x0
+int attr dialogPreferredPadding 0x0
+int attr dialogTheme 0x0
+int attr displayOptions 0x0
+int attr divider 0x0
+int attr dividerHorizontal 0x0
+int attr dividerPadding 0x0
+int attr dividerVertical 0x0
+int attr dragDirection 0x0
+int attr dragScale 0x0
+int attr dragThreshold 0x0
+int attr drawPath 0x0
+int attr drawableBottomCompat 0x0
+int attr drawableEndCompat 0x0
+int attr drawableLeftCompat 0x0
+int attr drawableRightCompat 0x0
+int attr drawableSize 0x0
+int attr drawableStartCompat 0x0
+int attr drawableTint 0x0
+int attr drawableTintMode 0x0
+int attr drawableTopCompat 0x0
+int attr drawerArrowStyle 0x0
+int attr dropDownListViewStyle 0x0
+int attr dropdownListPreferredItemHeight 0x0
+int attr duration 0x0
+int attr editTextBackground 0x0
+int attr editTextColor 0x0
+int attr editTextStyle 0x0
+int attr elevation 0x0
+int attr elevationOverlayColor 0x0
+int attr elevationOverlayEnabled 0x0
+int attr enableEdgeToEdge 0x0
+int attr endIconCheckable 0x0
+int attr endIconContentDescription 0x0
+int attr endIconDrawable 0x0
+int attr endIconMode 0x0
+int attr endIconTint 0x0
+int attr endIconTintMode 0x0
+int attr enforceMaterialTheme 0x0
+int attr enforceTextAppearance 0x0
+int attr ensureMinTouchTargetSize 0x0
+int attr errorContentDescription 0x0
+int attr errorEnabled 0x0
+int attr errorIconDrawable 0x0
+int attr errorIconTint 0x0
+int attr errorIconTintMode 0x0
+int attr errorTextAppearance 0x0
+int attr errorTextColor 0x0
+int attr expandActivityOverflowButtonDrawable 0x0
+int attr expanded 0x0
+int attr expandedHintEnabled 0x0
+int attr expandedTitleGravity 0x0
+int attr expandedTitleMargin 0x0
+int attr expandedTitleMarginBottom 0x0
+int attr expandedTitleMarginEnd 0x0
+int attr expandedTitleMarginStart 0x0
+int attr expandedTitleMarginTop 0x0
+int attr expandedTitleTextAppearance 0x0
+int attr extendMotionSpec 0x0
+int attr extendedFloatingActionButtonStyle 0x0
+int attr extraMultilineHeightEnabled 0x0
+int attr fabAlignmentMode 0x0
+int attr fabAnimationMode 0x0
+int attr fabCradleMargin 0x0
+int attr fabCradleRoundedCornerRadius 0x0
+int attr fabCradleVerticalOffset 0x0
+int attr fabCustomSize 0x0
+int attr fabSize 0x0
+int attr fastScrollEnabled 0x0
+int attr fastScrollHorizontalThumbDrawable 0x0
+int attr fastScrollHorizontalTrackDrawable 0x0
+int attr fastScrollVerticalThumbDrawable 0x0
+int attr fastScrollVerticalTrackDrawable 0x0
+int attr firstBaselineToTopHeight 0x0
+int attr floatingActionButtonStyle 0x0
+int attr flow_firstHorizontalBias 0x0
+int attr flow_firstHorizontalStyle 0x0
+int attr flow_firstVerticalBias 0x0
+int attr flow_firstVerticalStyle 0x0
+int attr flow_horizontalAlign 0x0
+int attr flow_horizontalBias 0x0
+int attr flow_horizontalGap 0x0
+int attr flow_horizontalStyle 0x0
+int attr flow_lastHorizontalBias 0x0
+int attr flow_lastHorizontalStyle 0x0
+int attr flow_lastVerticalBias 0x0
+int attr flow_lastVerticalStyle 0x0
+int attr flow_maxElementsWrap 0x0
+int attr flow_padding 0x0
+int attr flow_verticalAlign 0x0
+int attr flow_verticalBias 0x0
+int attr flow_verticalGap 0x0
+int attr flow_verticalStyle 0x0
+int attr flow_wrapMode 0x0
+int attr font 0x0
+int attr fontFamily 0x0
+int attr fontProviderAuthority 0x0
+int attr fontProviderCerts 0x0
+int attr fontProviderFetchStrategy 0x0
+int attr fontProviderFetchTimeout 0x0
+int attr fontProviderPackage 0x0
+int attr fontProviderQuery 0x0
+int attr fontProviderSystemFontFamily 0x0
+int attr fontStyle 0x0
+int attr fontVariationSettings 0x0
+int attr fontWeight 0x0
+int attr forceApplySystemWindowInsetTop 0x0
+int attr foregroundInsidePadding 0x0
+int attr framePosition 0x0
+int attr gapBetweenBars 0x0
+int attr gestureInsetBottomIgnored 0x0
+int attr goIcon 0x0
+int attr haloColor 0x0
+int attr haloRadius 0x0
+int attr headerLayout 0x0
+int attr height 0x0
+int attr helperText 0x0
+int attr helperTextEnabled 0x0
+int attr helperTextTextAppearance 0x0
+int attr helperTextTextColor 0x0
+int attr hideAnimationBehavior 0x0
+int attr hideMotionSpec 0x0
+int attr hideOnContentScroll 0x0
+int attr hideOnScroll 0x0
+int attr hintAnimationEnabled 0x0
+int attr hintEnabled 0x0
+int attr hintTextAppearance 0x0
+int attr hintTextColor 0x0
+int attr homeAsUpIndicator 0x0
+int attr homeLayout 0x0
+int attr horizontalOffset 0x0
+int attr hoveredFocusedTranslationZ 0x0
+int attr icon 0x0
+int attr iconEndPadding 0x0
+int attr iconGravity 0x0
+int attr iconPadding 0x0
+int attr iconSize 0x0
+int attr iconStartPadding 0x0
+int attr iconTint 0x0
+int attr iconTintMode 0x0
+int attr iconifiedByDefault 0x0
+int attr imageButtonStyle 0x0
+int attr indeterminateAnimationType 0x0
+int attr indeterminateProgressStyle 0x0
+int attr indicatorColor 0x0
+int attr indicatorDirectionCircular 0x0
+int attr indicatorDirectionLinear 0x0
+int attr indicatorInset 0x0
+int attr indicatorSize 0x0
+int attr initialActivityCount 0x0
+int attr insetForeground 0x0
+int attr isLightTheme 0x0
+int attr isMaterialTheme 0x0
+int attr itemBackground 0x0
+int attr itemFillColor 0x0
+int attr itemHorizontalPadding 0x0
+int attr itemHorizontalTranslationEnabled 0x0
+int attr itemIconPadding 0x0
+int attr itemIconSize 0x0
+int attr itemIconTint 0x0
+int attr itemMaxLines 0x0
+int attr itemPadding 0x0
+int attr itemRippleColor 0x0
+int attr itemShapeAppearance 0x0
+int attr itemShapeAppearanceOverlay 0x0
+int attr itemShapeFillColor 0x0
+int attr itemShapeInsetBottom 0x0
+int attr itemShapeInsetEnd 0x0
+int attr itemShapeInsetStart 0x0
+int attr itemShapeInsetTop 0x0
+int attr itemSpacing 0x0
+int attr itemStrokeColor 0x0
+int attr itemStrokeWidth 0x0
+int attr itemTextAppearance 0x0
+int attr itemTextAppearanceActive 0x0
+int attr itemTextAppearanceInactive 0x0
+int attr itemTextColor 0x0
+int attr keyPositionType 0x0
+int attr keyboardIcon 0x0
+int attr keylines 0x0
+int attr labelBehavior 0x0
+int attr labelStyle 0x0
+int attr labelVisibilityMode 0x0
+int attr lastBaselineToBottomHeight 0x0
+int attr layout 0x0
+int attr layoutDescription 0x0
+int attr layoutDuringTransition 0x0
+int attr layoutManager 0x0
+int attr layout_anchor 0x0
+int attr layout_anchorGravity 0x0
+int attr layout_behavior 0x0
+int attr layout_collapseMode 0x0
+int attr layout_collapseParallaxMultiplier 0x0
+int attr layout_constrainedHeight 0x0
+int attr layout_constrainedWidth 0x0
+int attr layout_constraintBaseline_creator 0x0
+int attr layout_constraintBaseline_toBaselineOf 0x0
+int attr layout_constraintBottom_creator 0x0
+int attr layout_constraintBottom_toBottomOf 0x0
+int attr layout_constraintBottom_toTopOf 0x0
+int attr layout_constraintCircle 0x0
+int attr layout_constraintCircleAngle 0x0
+int attr layout_constraintCircleRadius 0x0
+int attr layout_constraintDimensionRatio 0x0
+int attr layout_constraintEnd_toEndOf 0x0
+int attr layout_constraintEnd_toStartOf 0x0
+int attr layout_constraintGuide_begin 0x0
+int attr layout_constraintGuide_end 0x0
+int attr layout_constraintGuide_percent 0x0
+int attr layout_constraintHeight_default 0x0
+int attr layout_constraintHeight_max 0x0
+int attr layout_constraintHeight_min 0x0
+int attr layout_constraintHeight_percent 0x0
+int attr layout_constraintHorizontal_bias 0x0
+int attr layout_constraintHorizontal_chainStyle 0x0
+int attr layout_constraintHorizontal_weight 0x0
+int attr layout_constraintLeft_creator 0x0
+int attr layout_constraintLeft_toLeftOf 0x0
+int attr layout_constraintLeft_toRightOf 0x0
+int attr layout_constraintRight_creator 0x0
+int attr layout_constraintRight_toLeftOf 0x0
+int attr layout_constraintRight_toRightOf 0x0
+int attr layout_constraintStart_toEndOf 0x0
+int attr layout_constraintStart_toStartOf 0x0
+int attr layout_constraintTag 0x0
+int attr layout_constraintTop_creator 0x0
+int attr layout_constraintTop_toBottomOf 0x0
+int attr layout_constraintTop_toTopOf 0x0
+int attr layout_constraintVertical_bias 0x0
+int attr layout_constraintVertical_chainStyle 0x0
+int attr layout_constraintVertical_weight 0x0
+int attr layout_constraintWidth_default 0x0
+int attr layout_constraintWidth_max 0x0
+int attr layout_constraintWidth_min 0x0
+int attr layout_constraintWidth_percent 0x0
+int attr layout_dodgeInsetEdges 0x0
+int attr layout_editor_absoluteX 0x0
+int attr layout_editor_absoluteY 0x0
+int attr layout_goneMarginBottom 0x0
+int attr layout_goneMarginEnd 0x0
+int attr layout_goneMarginLeft 0x0
+int attr layout_goneMarginRight 0x0
+int attr layout_goneMarginStart 0x0
+int attr layout_goneMarginTop 0x0
+int attr layout_insetEdge 0x0
+int attr layout_keyline 0x0
+int attr layout_optimizationLevel 0x0
+int attr layout_scrollFlags 0x0
+int attr layout_scrollInterpolator 0x0
+int attr liftOnScroll 0x0
+int attr liftOnScrollTargetViewId 0x0
+int attr limitBoundsTo 0x0
+int attr lineHeight 0x0
+int attr lineSpacing 0x0
+int attr linearProgressIndicatorStyle 0x0
+int attr listChoiceBackgroundIndicator 0x0
+int attr listChoiceIndicatorMultipleAnimated 0x0
+int attr listChoiceIndicatorSingleAnimated 0x0
+int attr listDividerAlertDialog 0x0
+int attr listItemLayout 0x0
+int attr listLayout 0x0
+int attr listMenuViewStyle 0x0
+int attr listPopupWindowStyle 0x0
+int attr listPreferredItemHeight 0x0
+int attr listPreferredItemHeightLarge 0x0
+int attr listPreferredItemHeightSmall 0x0
+int attr listPreferredItemPaddingEnd 0x0
+int attr listPreferredItemPaddingLeft 0x0
+int attr listPreferredItemPaddingRight 0x0
+int attr listPreferredItemPaddingStart 0x0
+int attr logo 0x0
+int attr logoDescription 0x0
+int attr materialAlertDialogBodyTextStyle 0x0
+int attr materialAlertDialogTheme 0x0
+int attr materialAlertDialogTitleIconStyle 0x0
+int attr materialAlertDialogTitlePanelStyle 0x0
+int attr materialAlertDialogTitleTextStyle 0x0
+int attr materialButtonOutlinedStyle 0x0
+int attr materialButtonStyle 0x0
+int attr materialButtonToggleGroupStyle 0x0
+int attr materialCalendarDay 0x0
+int attr materialCalendarFullscreenTheme 0x0
+int attr materialCalendarHeaderCancelButton 0x0
+int attr materialCalendarHeaderConfirmButton 0x0
+int attr materialCalendarHeaderDivider 0x0
+int attr materialCalendarHeaderLayout 0x0
+int attr materialCalendarHeaderSelection 0x0
+int attr materialCalendarHeaderTitle 0x0
+int attr materialCalendarHeaderToggleButton 0x0
+int attr materialCalendarMonth 0x0
+int attr materialCalendarMonthNavigationButton 0x0
+int attr materialCalendarStyle 0x0
+int attr materialCalendarTheme 0x0
+int attr materialCalendarYearNavigationButton 0x0
+int attr materialCardViewStyle 0x0
+int attr materialCircleRadius 0x0
+int attr materialClockStyle 0x0
+int attr materialThemeOverlay 0x0
+int attr materialTimePickerStyle 0x0
+int attr materialTimePickerTheme 0x0
+int attr maxAcceleration 0x0
+int attr maxActionInlineWidth 0x0
+int attr maxButtonHeight 0x0
+int attr maxCharacterCount 0x0
+int attr maxHeight 0x0
+int attr maxImageSize 0x0
+int attr maxLines 0x0
+int attr maxVelocity 0x0
+int attr maxWidth 0x0
+int attr measureWithLargestChild 0x0
+int attr menu 0x0
+int attr menuGravity 0x0
+int attr minHeight 0x0
+int attr minHideDelay 0x0
+int attr minSeparation 0x0
+int attr minTouchTargetSize 0x0
+int attr minWidth 0x0
+int attr mock_diagonalsColor 0x0
+int attr mock_label 0x0
+int attr mock_labelBackgroundColor 0x0
+int attr mock_labelColor 0x0
+int attr mock_showDiagonals 0x0
+int attr mock_showLabel 0x0
+int attr motionDebug 0x0
+int attr motionDurationLong1 0x0
+int attr motionDurationLong2 0x0
+int attr motionDurationMedium1 0x0
+int attr motionDurationMedium2 0x0
+int attr motionDurationShort1 0x0
+int attr motionDurationShort2 0x0
+int attr motionEasingAccelerated 0x0
+int attr motionEasingDecelerated 0x0
+int attr motionEasingEmphasized 0x0
+int attr motionEasingLinear 0x0
+int attr motionEasingStandard 0x0
+int attr motionInterpolator 0x0
+int attr motionPath 0x0
+int attr motionPathRotate 0x0
+int attr motionProgress 0x0
+int attr motionStagger 0x0
+int attr motionTarget 0x0
+int attr motion_postLayoutCollision 0x0
+int attr motion_triggerOnCollision 0x0
+int attr moveWhenScrollAtTop 0x0
+int attr multiChoiceItemLayout 0x0
+int attr navigationContentDescription 0x0
+int attr navigationIcon 0x0
+int attr navigationIconTint 0x0
+int attr navigationMode 0x0
+int attr navigationRailStyle 0x0
+int attr navigationViewStyle 0x0
+int attr nestedScrollFlags 0x0
+int attr nestedScrollViewStyle 0x0
+int attr nestedScrollable 0x0
+int attr number 0x0
+int attr numericModifiers 0x0
+int attr onCross 0x0
+int attr onHide 0x0
+int attr onNegativeCross 0x0
+int attr onPositiveCross 0x0
+int attr onShow 0x0
+int attr onTouchUp 0x0
+int attr overlapAnchor 0x0
+int attr overlay 0x0
+int attr paddingBottomNoButtons 0x0
+int attr paddingBottomSystemWindowInsets 0x0
+int attr paddingEnd 0x0
+int attr paddingLeftSystemWindowInsets 0x0
+int attr paddingRightSystemWindowInsets 0x0
+int attr paddingStart 0x0
+int attr paddingTopNoTitle 0x0
+int attr paddingTopSystemWindowInsets 0x0
+int attr panelBackground 0x0
+int attr panelMenuListTheme 0x0
+int attr panelMenuListWidth 0x0
+int attr passwordToggleContentDescription 0x0
+int attr passwordToggleDrawable 0x0
+int attr passwordToggleEnabled 0x0
+int attr passwordToggleTint 0x0
+int attr passwordToggleTintMode 0x0
+int attr pathMotionArc 0x0
+int attr path_percent 0x0
+int attr percentHeight 0x0
+int attr percentWidth 0x0
+int attr percentX 0x0
+int attr percentY 0x0
+int attr perpendicularPath_percent 0x0
+int attr pivotAnchor 0x0
+int attr placeholderText 0x0
+int attr placeholderTextAppearance 0x0
+int attr placeholderTextColor 0x0
+int attr placeholder_emptyVisibility 0x0
+int attr popupMenuBackground 0x0
+int attr popupMenuStyle 0x0
+int attr popupTheme 0x0
+int attr popupWindowStyle 0x0
+int attr prefixText 0x0
+int attr prefixTextAppearance 0x0
+int attr prefixTextColor 0x0
+int attr preserveIconSpacing 0x0
+int attr pressedTranslationZ 0x0
+int attr progressBarPadding 0x0
+int attr progressBarStyle 0x0
+int attr queryBackground 0x0
+int attr queryHint 0x0
+int attr queryPatterns 0x0
+int attr radioButtonStyle 0x0
+int attr rangeFillColor 0x0
+int attr ratingBarStyle 0x0
+int attr ratingBarStyleIndicator 0x0
+int attr ratingBarStyleSmall 0x0
+int attr recyclerViewStyle 0x0
+int attr region_heightLessThan 0x0
+int attr region_heightMoreThan 0x0
+int attr region_widthLessThan 0x0
+int attr region_widthMoreThan 0x0
+int attr reverseLayout 0x0
+int attr rippleColor 0x0
+int attr round 0x0
+int attr roundPercent 0x0
+int attr saturation 0x0
+int attr scrimAnimationDuration 0x0
+int attr scrimBackground 0x0
+int attr scrimVisibleHeightTrigger 0x0
+int attr searchHintIcon 0x0
+int attr searchIcon 0x0
+int attr searchViewStyle 0x0
+int attr seekBarStyle 0x0
+int attr selectableItemBackground 0x0
+int attr selectableItemBackgroundBorderless 0x0
+int attr selectionRequired 0x0
+int attr selectorSize 0x0
+int attr shapeAppearance 0x0
+int attr shapeAppearanceLargeComponent 0x0
+int attr shapeAppearanceMediumComponent 0x0
+int attr shapeAppearanceOverlay 0x0
+int attr shapeAppearanceSmallComponent 0x0
+int attr shortcutMatchRequired 0x0
+int attr showAnimationBehavior 0x0
+int attr showAsAction 0x0
+int attr showDelay 0x0
+int attr showDividers 0x0
+int attr showMotionSpec 0x0
+int attr showPaths 0x0
+int attr showText 0x0
+int attr showTitle 0x0
+int attr shrinkMotionSpec 0x0
+int attr singleChoiceItemLayout 0x0
+int attr singleLine 0x0
+int attr singleSelection 0x0
+int attr sizePercent 0x0
+int attr sliderStyle 0x0
+int attr snackbarButtonStyle 0x0
+int attr snackbarStyle 0x0
+int attr snackbarTextViewStyle 0x0
+int attr spanCount 0x0
+int attr spinBars 0x0
+int attr spinnerDropDownItemStyle 0x0
+int attr spinnerStyle 0x0
+int attr splitTrack 0x0
+int attr srcCompat 0x0
+int attr stackFromEnd 0x0
+int attr staggered 0x0
+int attr startIconCheckable 0x0
+int attr startIconContentDescription 0x0
+int attr startIconDrawable 0x0
+int attr startIconTint 0x0
+int attr startIconTintMode 0x0
+int attr state_above_anchor 0x0
+int attr state_collapsed 0x0
+int attr state_collapsible 0x0
+int attr state_dragged 0x0
+int attr state_liftable 0x0
+int attr state_lifted 0x0
+int attr statusBarBackground 0x0
+int attr statusBarForeground 0x0
+int attr statusBarScrim 0x0
+int attr strokeColor 0x0
+int attr strokeWidth 0x0
+int attr subMenuArrow 0x0
+int attr submitBackground 0x0
+int attr subtitle 0x0
+int attr subtitleCentered 0x0
+int attr subtitleTextAppearance 0x0
+int attr subtitleTextColor 0x0
+int attr subtitleTextStyle 0x0
+int attr suffixText 0x0
+int attr suffixTextAppearance 0x0
+int attr suffixTextColor 0x0
+int attr suggestionRowLayout 0x0
+int attr switchMinWidth 0x0
+int attr switchPadding 0x0
+int attr switchStyle 0x0
+int attr switchTextAppearance 0x0
+int attr tabBackground 0x0
+int attr tabContentStart 0x0
+int attr tabGravity 0x0
+int attr tabIconTint 0x0
+int attr tabIconTintMode 0x0
+int attr tabIndicator 0x0
+int attr tabIndicatorAnimationDuration 0x0
+int attr tabIndicatorAnimationMode 0x0
+int attr tabIndicatorColor 0x0
+int attr tabIndicatorFullWidth 0x0
+int attr tabIndicatorGravity 0x0
+int attr tabIndicatorHeight 0x0
+int attr tabInlineLabel 0x0
+int attr tabMaxWidth 0x0
+int attr tabMinWidth 0x0
+int attr tabMode 0x0
+int attr tabPadding 0x0
+int attr tabPaddingBottom 0x0
+int attr tabPaddingEnd 0x0
+int attr tabPaddingStart 0x0
+int attr tabPaddingTop 0x0
+int attr tabRippleColor 0x0
+int attr tabSelectedTextColor 0x0
+int attr tabStyle 0x0
+int attr tabTextAppearance 0x0
+int attr tabTextColor 0x0
+int attr tabUnboundedRipple 0x0
+int attr targetId 0x0
+int attr telltales_tailColor 0x0
+int attr telltales_tailScale 0x0
+int attr telltales_velocityMode 0x0
+int attr textAllCaps 0x0
+int attr textAppearanceBody1 0x0
+int attr textAppearanceBody2 0x0
+int attr textAppearanceButton 0x0
+int attr textAppearanceCaption 0x0
+int attr textAppearanceHeadline1 0x0
+int attr textAppearanceHeadline2 0x0
+int attr textAppearanceHeadline3 0x0
+int attr textAppearanceHeadline4 0x0
+int attr textAppearanceHeadline5 0x0
+int attr textAppearanceHeadline6 0x0
+int attr textAppearanceLargePopupMenu 0x0
+int attr textAppearanceLineHeightEnabled 0x0
+int attr textAppearanceListItem 0x0
+int attr textAppearanceListItemSecondary 0x0
+int attr textAppearanceListItemSmall 0x0
+int attr textAppearanceOverline 0x0
+int attr textAppearancePopupMenuHeader 0x0
+int attr textAppearanceSearchResultSubtitle 0x0
+int attr textAppearanceSearchResultTitle 0x0
+int attr textAppearanceSmallPopupMenu 0x0
+int attr textAppearanceSubtitle1 0x0
+int attr textAppearanceSubtitle2 0x0
+int attr textColorAlertDialogListItem 0x0
+int attr textColorSearchUrl 0x0
+int attr textEndPadding 0x0
+int attr textInputLayoutFocusedRectEnabled 0x0
+int attr textInputStyle 0x0
+int attr textLocale 0x0
+int attr textStartPadding 0x0
+int attr theme 0x0
+int attr themeLineHeight 0x0
+int attr thickness 0x0
+int attr thumbColor 0x0
+int attr thumbElevation 0x0
+int attr thumbRadius 0x0
+int attr thumbStrokeColor 0x0
+int attr thumbStrokeWidth 0x0
+int attr thumbTextPadding 0x0
+int attr thumbTint 0x0
+int attr thumbTintMode 0x0
+int attr tickColor 0x0
+int attr tickColorActive 0x0
+int attr tickColorInactive 0x0
+int attr tickMark 0x0
+int attr tickMarkTint 0x0
+int attr tickMarkTintMode 0x0
+int attr tickVisible 0x0
+int attr tint 0x0
+int attr tintMode 0x0
+int attr title 0x0
+int attr titleCentered 0x0
+int attr titleCollapseMode 0x0
+int attr titleEnabled 0x0
+int attr titleMargin 0x0
+int attr titleMarginBottom 0x0
+int attr titleMarginEnd 0x0
+int attr titleMarginStart 0x0
+int attr titleMarginTop 0x0
+int attr titleMargins 0x0
+int attr titleTextAppearance 0x0
+int attr titleTextColor 0x0
+int attr titleTextStyle 0x0
+int attr toolbarId 0x0
+int attr toolbarNavigationButtonStyle 0x0
+int attr toolbarStyle 0x0
+int attr tooltipForegroundColor 0x0
+int attr tooltipFrameBackground 0x0
+int attr tooltipStyle 0x0
+int attr tooltipText 0x0
+int attr touchAnchorId 0x0
+int attr touchAnchorSide 0x0
+int attr touchRegionId 0x0
+int attr track 0x0
+int attr trackColor 0x0
+int attr trackColorActive 0x0
+int attr trackColorInactive 0x0
+int attr trackCornerRadius 0x0
+int attr trackHeight 0x0
+int attr trackThickness 0x0
+int attr trackTint 0x0
+int attr trackTintMode 0x0
+int attr transitionDisable 0x0
+int attr transitionEasing 0x0
+int attr transitionFlags 0x0
+int attr transitionPathRotate 0x0
+int attr transitionShapeAppearance 0x0
+int attr triggerId 0x0
+int attr triggerReceiver 0x0
+int attr triggerSlack 0x0
+int attr ttcIndex 0x0
+int attr useCompatPadding 0x0
+int attr useMaterialThemeColors 0x0
+int attr values 0x0
+int attr verticalOffset 0x0
+int attr viewInflaterClass 0x0
+int attr visibilityMode 0x0
+int attr voiceIcon 0x0
+int attr warmth 0x0
+int attr waveDecay 0x0
+int attr waveOffset 0x0
+int attr wavePeriod 0x0
+int attr waveShape 0x0
+int attr waveVariesBy 0x0
+int attr windowActionBar 0x0
+int attr windowActionBarOverlay 0x0
+int attr windowActionModeOverlay 0x0
+int attr windowFixedHeightMajor 0x0
+int attr windowFixedHeightMinor 0x0
+int attr windowFixedWidthMajor 0x0
+int attr windowFixedWidthMinor 0x0
+int attr windowMinWidthMajor 0x0
+int attr windowMinWidthMinor 0x0
+int attr windowNoTitle 0x0
+int attr yearSelectedStyle 0x0
+int attr yearStyle 0x0
+int attr yearTodayStyle 0x0
+int bool abc_action_bar_embed_tabs 0x0
+int bool abc_allow_stacked_button_bar 0x0
+int bool abc_config_actionMenuItemAllCaps 0x0
+int bool mtrl_btn_textappearance_all_caps 0x0
+int color abc_background_cache_hint_selector_material_dark 0x0
+int color abc_background_cache_hint_selector_material_light 0x0
+int color abc_btn_colored_borderless_text_material 0x0
+int color abc_btn_colored_text_material 0x0
+int color abc_color_highlight_material 0x0
+int color abc_decor_view_status_guard 0x0
+int color abc_decor_view_status_guard_light 0x0
+int color abc_hint_foreground_material_dark 0x0
+int color abc_hint_foreground_material_light 0x0
+int color abc_primary_text_disable_only_material_dark 0x0
+int color abc_primary_text_disable_only_material_light 0x0
+int color abc_primary_text_material_dark 0x0
+int color abc_primary_text_material_light 0x0
+int color abc_search_url_text 0x0
+int color abc_search_url_text_normal 0x0
+int color abc_search_url_text_pressed 0x0
+int color abc_search_url_text_selected 0x0
+int color abc_secondary_text_material_dark 0x0
+int color abc_secondary_text_material_light 0x0
+int color abc_tint_btn_checkable 0x0
+int color abc_tint_default 0x0
+int color abc_tint_edittext 0x0
+int color abc_tint_seek_thumb 0x0
+int color abc_tint_spinner 0x0
+int color abc_tint_switch_track 0x0
+int color accent_material_dark 0x0
+int color accent_material_light 0x0
+int color androidx_core_ripple_material_light 0x0
+int color androidx_core_secondary_text_default_material_light 0x0
+int color background_floating_material_dark 0x0
+int color background_floating_material_light 0x0
+int color background_material_dark 0x0
+int color background_material_light 0x0
+int color bright_foreground_disabled_material_dark 0x0
+int color bright_foreground_disabled_material_light 0x0
+int color bright_foreground_inverse_material_dark 0x0
+int color bright_foreground_inverse_material_light 0x0
+int color bright_foreground_material_dark 0x0
+int color bright_foreground_material_light 0x0
+int color button_material_dark 0x0
+int color button_material_light 0x0
+int color cardview_dark_background 0x0
+int color cardview_light_background 0x0
+int color cardview_shadow_end_color 0x0
+int color cardview_shadow_start_color 0x0
+int color checkbox_themeable_attribute_color 0x0
+int color design_bottom_navigation_shadow_color 0x0
+int color design_box_stroke_color 0x0
+int color design_dark_default_color_background 0x0
+int color design_dark_default_color_error 0x0
+int color design_dark_default_color_on_background 0x0
+int color design_dark_default_color_on_error 0x0
+int color design_dark_default_color_on_primary 0x0
+int color design_dark_default_color_on_secondary 0x0
+int color design_dark_default_color_on_surface 0x0
+int color design_dark_default_color_primary 0x0
+int color design_dark_default_color_primary_dark 0x0
+int color design_dark_default_color_primary_variant 0x0
+int color design_dark_default_color_secondary 0x0
+int color design_dark_default_color_secondary_variant 0x0
+int color design_dark_default_color_surface 0x0
+int color design_default_color_background 0x0
+int color design_default_color_error 0x0
+int color design_default_color_on_background 0x0
+int color design_default_color_on_error 0x0
+int color design_default_color_on_primary 0x0
+int color design_default_color_on_secondary 0x0
+int color design_default_color_on_surface 0x0
+int color design_default_color_primary 0x0
+int color design_default_color_primary_dark 0x0
+int color design_default_color_primary_variant 0x0
+int color design_default_color_secondary 0x0
+int color design_default_color_secondary_variant 0x0
+int color design_default_color_surface 0x0
+int color design_error 0x0
+int color design_fab_shadow_end_color 0x0
+int color design_fab_shadow_mid_color 0x0
+int color design_fab_shadow_start_color 0x0
+int color design_fab_stroke_end_inner_color 0x0
+int color design_fab_stroke_end_outer_color 0x0
+int color design_fab_stroke_top_inner_color 0x0
+int color design_fab_stroke_top_outer_color 0x0
+int color design_icon_tint 0x0
+int color design_snackbar_background_color 0x0
+int color dim_foreground_disabled_material_dark 0x0
+int color dim_foreground_disabled_material_light 0x0
+int color dim_foreground_material_dark 0x0
+int color dim_foreground_material_light 0x0
+int color error_color_material_dark 0x0
+int color error_color_material_light 0x0
+int color foreground_material_dark 0x0
+int color foreground_material_light 0x0
+int color highlighted_text_material_dark 0x0
+int color highlighted_text_material_light 0x0
+int color material_blue_grey_800 0x0
+int color material_blue_grey_900 0x0
+int color material_blue_grey_950 0x0
+int color material_cursor_color 0x0
+int color material_deep_teal_200 0x0
+int color material_deep_teal_500 0x0
+int color material_grey_100 0x0
+int color material_grey_300 0x0
+int color material_grey_50 0x0
+int color material_grey_600 0x0
+int color material_grey_800 0x0
+int color material_grey_850 0x0
+int color material_grey_900 0x0
+int color material_on_background_disabled 0x0
+int color material_on_background_emphasis_high_type 0x0
+int color material_on_background_emphasis_medium 0x0
+int color material_on_primary_disabled 0x0
+int color material_on_primary_emphasis_high_type 0x0
+int color material_on_primary_emphasis_medium 0x0
+int color material_on_surface_disabled 0x0
+int color material_on_surface_emphasis_high_type 0x0
+int color material_on_surface_emphasis_medium 0x0
+int color material_on_surface_stroke 0x0
+int color material_slider_active_tick_marks_color 0x0
+int color material_slider_active_track_color 0x0
+int color material_slider_halo_color 0x0
+int color material_slider_inactive_tick_marks_color 0x0
+int color material_slider_inactive_track_color 0x0
+int color material_slider_thumb_color 0x0
+int color material_timepicker_button_background 0x0
+int color material_timepicker_button_stroke 0x0
+int color material_timepicker_clock_text_color 0x0
+int color material_timepicker_clockface 0x0
+int color material_timepicker_modebutton_tint 0x0
+int color mtrl_btn_bg_color_selector 0x0
+int color mtrl_btn_ripple_color 0x0
+int color mtrl_btn_stroke_color_selector 0x0
+int color mtrl_btn_text_btn_bg_color_selector 0x0
+int color mtrl_btn_text_btn_ripple_color 0x0
+int color mtrl_btn_text_color_disabled 0x0
+int color mtrl_btn_text_color_selector 0x0
+int color mtrl_btn_transparent_bg_color 0x0
+int color mtrl_calendar_item_stroke_color 0x0
+int color mtrl_calendar_selected_range 0x0
+int color mtrl_card_view_foreground 0x0
+int color mtrl_card_view_ripple 0x0
+int color mtrl_chip_background_color 0x0
+int color mtrl_chip_close_icon_tint 0x0
+int color mtrl_chip_surface_color 0x0
+int color mtrl_chip_text_color 0x0
+int color mtrl_choice_chip_background_color 0x0
+int color mtrl_choice_chip_ripple_color 0x0
+int color mtrl_choice_chip_text_color 0x0
+int color mtrl_error 0x0
+int color mtrl_fab_bg_color_selector 0x0
+int color mtrl_fab_icon_text_color_selector 0x0
+int color mtrl_fab_ripple_color 0x0
+int color mtrl_filled_background_color 0x0
+int color mtrl_filled_icon_tint 0x0
+int color mtrl_filled_stroke_color 0x0
+int color mtrl_indicator_text_color 0x0
+int color mtrl_navigation_bar_colored_item_tint 0x0
+int color mtrl_navigation_bar_colored_ripple_color 0x0
+int color mtrl_navigation_bar_item_tint 0x0
+int color mtrl_navigation_bar_ripple_color 0x0
+int color mtrl_navigation_item_background_color 0x0
+int color mtrl_navigation_item_icon_tint 0x0
+int color mtrl_navigation_item_text_color 0x0
+int color mtrl_on_primary_text_btn_text_color_selector 0x0
+int color mtrl_on_surface_ripple_color 0x0
+int color mtrl_outlined_icon_tint 0x0
+int color mtrl_outlined_stroke_color 0x0
+int color mtrl_popupmenu_overlay_color 0x0
+int color mtrl_scrim_color 0x0
+int color mtrl_tabs_colored_ripple_color 0x0
+int color mtrl_tabs_icon_color_selector 0x0
+int color mtrl_tabs_icon_color_selector_colored 0x0
+int color mtrl_tabs_legacy_text_color_selector 0x0
+int color mtrl_tabs_ripple_color 0x0
+int color mtrl_text_btn_text_color_selector 0x0
+int color mtrl_textinput_default_box_stroke_color 0x0
+int color mtrl_textinput_disabled_color 0x0
+int color mtrl_textinput_filled_box_default_background_color 0x0
+int color mtrl_textinput_focused_box_stroke_color 0x0
+int color mtrl_textinput_hovered_box_stroke_color 0x0
+int color notification_action_color_filter 0x0
+int color notification_icon_bg_color 0x0
+int color primary_dark_material_dark 0x0
+int color primary_dark_material_light 0x0
+int color primary_material_dark 0x0
+int color primary_material_light 0x0
+int color primary_text_default_material_dark 0x0
+int color primary_text_default_material_light 0x0
+int color primary_text_disabled_material_dark 0x0
+int color primary_text_disabled_material_light 0x0
+int color radiobutton_themeable_attribute_color 0x0
+int color ripple_material_dark 0x0
+int color ripple_material_light 0x0
+int color secondary_text_default_material_dark 0x0
+int color secondary_text_default_material_light 0x0
+int color secondary_text_disabled_material_dark 0x0
+int color secondary_text_disabled_material_light 0x0
+int color switch_thumb_disabled_material_dark 0x0
+int color switch_thumb_disabled_material_light 0x0
+int color switch_thumb_material_dark 0x0
+int color switch_thumb_material_light 0x0
+int color switch_thumb_normal_material_dark 0x0
+int color switch_thumb_normal_material_light 0x0
+int color test_mtrl_calendar_day 0x0
+int color test_mtrl_calendar_day_selected 0x0
+int color tooltip_background_dark 0x0
+int color tooltip_background_light 0x0
+int dimen abc_action_bar_content_inset_material 0x0
+int dimen abc_action_bar_content_inset_with_nav 0x0
+int dimen abc_action_bar_default_height_material 0x0
+int dimen abc_action_bar_default_padding_end_material 0x0
+int dimen abc_action_bar_default_padding_start_material 0x0
+int dimen abc_action_bar_elevation_material 0x0
+int dimen abc_action_bar_icon_vertical_padding_material 0x0
+int dimen abc_action_bar_overflow_padding_end_material 0x0
+int dimen abc_action_bar_overflow_padding_start_material 0x0
+int dimen abc_action_bar_stacked_max_height 0x0
+int dimen abc_action_bar_stacked_tab_max_width 0x0
+int dimen abc_action_bar_subtitle_bottom_margin_material 0x0
+int dimen abc_action_bar_subtitle_top_margin_material 0x0
+int dimen abc_action_button_min_height_material 0x0
+int dimen abc_action_button_min_width_material 0x0
+int dimen abc_action_button_min_width_overflow_material 0x0
+int dimen abc_alert_dialog_button_bar_height 0x0
+int dimen abc_alert_dialog_button_dimen 0x0
+int dimen abc_button_inset_horizontal_material 0x0
+int dimen abc_button_inset_vertical_material 0x0
+int dimen abc_button_padding_horizontal_material 0x0
+int dimen abc_button_padding_vertical_material 0x0
+int dimen abc_cascading_menus_min_smallest_width 0x0
+int dimen abc_config_prefDialogWidth 0x0
+int dimen abc_control_corner_material 0x0
+int dimen abc_control_inset_material 0x0
+int dimen abc_control_padding_material 0x0
+int dimen abc_dialog_corner_radius_material 0x0
+int dimen abc_dialog_fixed_height_major 0x0
+int dimen abc_dialog_fixed_height_minor 0x0
+int dimen abc_dialog_fixed_width_major 0x0
+int dimen abc_dialog_fixed_width_minor 0x0
+int dimen abc_dialog_list_padding_bottom_no_buttons 0x0
+int dimen abc_dialog_list_padding_top_no_title 0x0
+int dimen abc_dialog_min_width_major 0x0
+int dimen abc_dialog_min_width_minor 0x0
+int dimen abc_dialog_padding_material 0x0
+int dimen abc_dialog_padding_top_material 0x0
+int dimen abc_dialog_title_divider_material 0x0
+int dimen abc_disabled_alpha_material_dark 0x0
+int dimen abc_disabled_alpha_material_light 0x0
+int dimen abc_dropdownitem_icon_width 0x0
+int dimen abc_dropdownitem_text_padding_left 0x0
+int dimen abc_dropdownitem_text_padding_right 0x0
+int dimen abc_edit_text_inset_bottom_material 0x0
+int dimen abc_edit_text_inset_horizontal_material 0x0
+int dimen abc_edit_text_inset_top_material 0x0
+int dimen abc_floating_window_z 0x0
+int dimen abc_list_item_height_large_material 0x0
+int dimen abc_list_item_height_material 0x0
+int dimen abc_list_item_height_small_material 0x0
+int dimen abc_list_item_padding_horizontal_material 0x0
+int dimen abc_panel_menu_list_width 0x0
+int dimen abc_progress_bar_height_material 0x0
+int dimen abc_search_view_preferred_height 0x0
+int dimen abc_search_view_preferred_width 0x0
+int dimen abc_seekbar_track_background_height_material 0x0
+int dimen abc_seekbar_track_progress_height_material 0x0
+int dimen abc_select_dialog_padding_start_material 0x0
+int dimen abc_star_big 0x0
+int dimen abc_star_medium 0x0
+int dimen abc_star_small 0x0
+int dimen abc_switch_padding 0x0
+int dimen abc_text_size_body_1_material 0x0
+int dimen abc_text_size_body_2_material 0x0
+int dimen abc_text_size_button_material 0x0
+int dimen abc_text_size_caption_material 0x0
+int dimen abc_text_size_display_1_material 0x0
+int dimen abc_text_size_display_2_material 0x0
+int dimen abc_text_size_display_3_material 0x0
+int dimen abc_text_size_display_4_material 0x0
+int dimen abc_text_size_headline_material 0x0
+int dimen abc_text_size_large_material 0x0
+int dimen abc_text_size_medium_material 0x0
+int dimen abc_text_size_menu_header_material 0x0
+int dimen abc_text_size_menu_material 0x0
+int dimen abc_text_size_small_material 0x0
+int dimen abc_text_size_subhead_material 0x0
+int dimen abc_text_size_subtitle_material_toolbar 0x0
+int dimen abc_text_size_title_material 0x0
+int dimen abc_text_size_title_material_toolbar 0x0
+int dimen action_bar_size 0x0
+int dimen appcompat_dialog_background_inset 0x0
+int dimen cardview_compat_inset_shadow 0x0
+int dimen cardview_default_elevation 0x0
+int dimen cardview_default_radius 0x0
+int dimen clock_face_margin_start 0x0
+int dimen compat_button_inset_horizontal_material 0x0
+int dimen compat_button_inset_vertical_material 0x0
+int dimen compat_button_padding_horizontal_material 0x0
+int dimen compat_button_padding_vertical_material 0x0
+int dimen compat_control_corner_material 0x0
+int dimen compat_notification_large_icon_max_height 0x0
+int dimen compat_notification_large_icon_max_width 0x0
+int dimen default_dimension 0x0
+int dimen design_appbar_elevation 0x0
+int dimen design_bottom_navigation_active_item_max_width 0x0
+int dimen design_bottom_navigation_active_item_min_width 0x0
+int dimen design_bottom_navigation_active_text_size 0x0
+int dimen design_bottom_navigation_elevation 0x0
+int dimen design_bottom_navigation_height 0x0
+int dimen design_bottom_navigation_icon_size 0x0
+int dimen design_bottom_navigation_item_max_width 0x0
+int dimen design_bottom_navigation_item_min_width 0x0
+int dimen design_bottom_navigation_label_padding 0x0
+int dimen design_bottom_navigation_margin 0x0
+int dimen design_bottom_navigation_shadow_height 0x0
+int dimen design_bottom_navigation_text_size 0x0
+int dimen design_bottom_sheet_elevation 0x0
+int dimen design_bottom_sheet_modal_elevation 0x0
+int dimen design_bottom_sheet_peek_height_min 0x0
+int dimen design_fab_border_width 0x0
+int dimen design_fab_elevation 0x0
+int dimen design_fab_image_size 0x0
+int dimen design_fab_size_mini 0x0
+int dimen design_fab_size_normal 0x0
+int dimen design_fab_translation_z_hovered_focused 0x0
+int dimen design_fab_translation_z_pressed 0x0
+int dimen design_navigation_elevation 0x0
+int dimen design_navigation_icon_padding 0x0
+int dimen design_navigation_icon_size 0x0
+int dimen design_navigation_item_horizontal_padding 0x0
+int dimen design_navigation_item_icon_padding 0x0
+int dimen design_navigation_max_width 0x0
+int dimen design_navigation_padding_bottom 0x0
+int dimen design_navigation_separator_vertical_padding 0x0
+int dimen design_snackbar_action_inline_max_width 0x0
+int dimen design_snackbar_action_text_color_alpha 0x0
+int dimen design_snackbar_background_corner_radius 0x0
+int dimen design_snackbar_elevation 0x0
+int dimen design_snackbar_extra_spacing_horizontal 0x0
+int dimen design_snackbar_max_width 0x0
+int dimen design_snackbar_min_width 0x0
+int dimen design_snackbar_padding_horizontal 0x0
+int dimen design_snackbar_padding_vertical 0x0
+int dimen design_snackbar_padding_vertical_2lines 0x0
+int dimen design_snackbar_text_size 0x0
+int dimen design_tab_max_width 0x0
+int dimen design_tab_scrollable_min_width 0x0
+int dimen design_tab_text_size 0x0
+int dimen design_tab_text_size_2line 0x0
+int dimen design_textinput_caption_translate_y 0x0
+int dimen disabled_alpha_material_dark 0x0
+int dimen disabled_alpha_material_light 0x0
+int dimen fastscroll_default_thickness 0x0
+int dimen fastscroll_margin 0x0
+int dimen fastscroll_minimum_range 0x0
+int dimen highlight_alpha_material_colored 0x0
+int dimen highlight_alpha_material_dark 0x0
+int dimen highlight_alpha_material_light 0x0
+int dimen hint_alpha_material_dark 0x0
+int dimen hint_alpha_material_light 0x0
+int dimen hint_pressed_alpha_material_dark 0x0
+int dimen hint_pressed_alpha_material_light 0x0
+int dimen item_touch_helper_max_drag_scroll_per_frame 0x0
+int dimen item_touch_helper_swipe_escape_max_velocity 0x0
+int dimen item_touch_helper_swipe_escape_velocity 0x0
+int dimen material_bottom_sheet_max_width 0x0
+int dimen material_clock_display_padding 0x0
+int dimen material_clock_face_margin_top 0x0
+int dimen material_clock_hand_center_dot_radius 0x0
+int dimen material_clock_hand_padding 0x0
+int dimen material_clock_hand_stroke_width 0x0
+int dimen material_clock_number_text_size 0x0
+int dimen material_clock_period_toggle_height 0x0
+int dimen material_clock_period_toggle_margin_left 0x0
+int dimen material_clock_period_toggle_width 0x0
+int dimen material_clock_size 0x0
+int dimen material_cursor_inset_bottom 0x0
+int dimen material_cursor_inset_top 0x0
+int dimen material_cursor_width 0x0
+int dimen material_emphasis_disabled 0x0
+int dimen material_emphasis_high_type 0x0
+int dimen material_emphasis_medium 0x0
+int dimen material_filled_edittext_font_1_3_padding_bottom 0x0
+int dimen material_filled_edittext_font_1_3_padding_top 0x0
+int dimen material_filled_edittext_font_2_0_padding_bottom 0x0
+int dimen material_filled_edittext_font_2_0_padding_top 0x0
+int dimen material_font_1_3_box_collapsed_padding_top 0x0
+int dimen material_font_2_0_box_collapsed_padding_top 0x0
+int dimen material_helper_text_default_padding_top 0x0
+int dimen material_helper_text_font_1_3_padding_horizontal 0x0
+int dimen material_helper_text_font_1_3_padding_top 0x0
+int dimen material_input_text_to_prefix_suffix_padding 0x0
+int dimen material_text_view_test_line_height 0x0
+int dimen material_text_view_test_line_height_override 0x0
+int dimen material_textinput_default_width 0x0
+int dimen material_textinput_max_width 0x0
+int dimen material_textinput_min_width 0x0
+int dimen material_time_picker_minimum_screen_height 0x0
+int dimen material_time_picker_minimum_screen_width 0x0
+int dimen material_timepicker_dialog_buttons_margin_top 0x0
+int dimen mtrl_alert_dialog_background_inset_bottom 0x0
+int dimen mtrl_alert_dialog_background_inset_end 0x0
+int dimen mtrl_alert_dialog_background_inset_start 0x0
+int dimen mtrl_alert_dialog_background_inset_top 0x0
+int dimen mtrl_alert_dialog_picker_background_inset 0x0
+int dimen mtrl_badge_horizontal_edge_offset 0x0
+int dimen mtrl_badge_long_text_horizontal_padding 0x0
+int dimen mtrl_badge_radius 0x0
+int dimen mtrl_badge_text_horizontal_edge_offset 0x0
+int dimen mtrl_badge_text_size 0x0
+int dimen mtrl_badge_toolbar_action_menu_item_horizontal_offset 0x0
+int dimen mtrl_badge_toolbar_action_menu_item_vertical_offset 0x0
+int dimen mtrl_badge_with_text_radius 0x0
+int dimen mtrl_bottomappbar_fabOffsetEndMode 0x0
+int dimen mtrl_bottomappbar_fab_bottom_margin 0x0
+int dimen mtrl_bottomappbar_fab_cradle_margin 0x0
+int dimen mtrl_bottomappbar_fab_cradle_rounded_corner_radius 0x0
+int dimen mtrl_bottomappbar_fab_cradle_vertical_offset 0x0
+int dimen mtrl_bottomappbar_height 0x0
+int dimen mtrl_btn_corner_radius 0x0
+int dimen mtrl_btn_dialog_btn_min_width 0x0
+int dimen mtrl_btn_disabled_elevation 0x0
+int dimen mtrl_btn_disabled_z 0x0
+int dimen mtrl_btn_elevation 0x0
+int dimen mtrl_btn_focused_z 0x0
+int dimen mtrl_btn_hovered_z 0x0
+int dimen mtrl_btn_icon_btn_padding_left 0x0
+int dimen mtrl_btn_icon_padding 0x0
+int dimen mtrl_btn_inset 0x0
+int dimen mtrl_btn_letter_spacing 0x0
+int dimen mtrl_btn_max_width 0x0
+int dimen mtrl_btn_padding_bottom 0x0
+int dimen mtrl_btn_padding_left 0x0
+int dimen mtrl_btn_padding_right 0x0
+int dimen mtrl_btn_padding_top 0x0
+int dimen mtrl_btn_pressed_z 0x0
+int dimen mtrl_btn_snackbar_margin_horizontal 0x0
+int dimen mtrl_btn_stroke_size 0x0
+int dimen mtrl_btn_text_btn_icon_padding 0x0
+int dimen mtrl_btn_text_btn_padding_left 0x0
+int dimen mtrl_btn_text_btn_padding_right 0x0
+int dimen mtrl_btn_text_size 0x0
+int dimen mtrl_btn_z 0x0
+int dimen mtrl_calendar_action_confirm_button_min_width 0x0
+int dimen mtrl_calendar_action_height 0x0
+int dimen mtrl_calendar_action_padding 0x0
+int dimen mtrl_calendar_bottom_padding 0x0
+int dimen mtrl_calendar_content_padding 0x0
+int dimen mtrl_calendar_day_corner 0x0
+int dimen mtrl_calendar_day_height 0x0
+int dimen mtrl_calendar_day_horizontal_padding 0x0
+int dimen mtrl_calendar_day_today_stroke 0x0
+int dimen mtrl_calendar_day_vertical_padding 0x0
+int dimen mtrl_calendar_day_width 0x0
+int dimen mtrl_calendar_days_of_week_height 0x0
+int dimen mtrl_calendar_dialog_background_inset 0x0
+int dimen mtrl_calendar_header_content_padding 0x0
+int dimen mtrl_calendar_header_content_padding_fullscreen 0x0
+int dimen mtrl_calendar_header_divider_thickness 0x0
+int dimen mtrl_calendar_header_height 0x0
+int dimen mtrl_calendar_header_height_fullscreen 0x0
+int dimen mtrl_calendar_header_selection_line_height 0x0
+int dimen mtrl_calendar_header_text_padding 0x0
+int dimen mtrl_calendar_header_toggle_margin_bottom 0x0
+int dimen mtrl_calendar_header_toggle_margin_top 0x0
+int dimen mtrl_calendar_landscape_header_width 0x0
+int dimen mtrl_calendar_maximum_default_fullscreen_minor_axis 0x0
+int dimen mtrl_calendar_month_horizontal_padding 0x0
+int dimen mtrl_calendar_month_vertical_padding 0x0
+int dimen mtrl_calendar_navigation_bottom_padding 0x0
+int dimen mtrl_calendar_navigation_height 0x0
+int dimen mtrl_calendar_navigation_top_padding 0x0
+int dimen mtrl_calendar_pre_l_text_clip_padding 0x0
+int dimen mtrl_calendar_selection_baseline_to_top_fullscreen 0x0
+int dimen mtrl_calendar_selection_text_baseline_to_bottom 0x0
+int dimen mtrl_calendar_selection_text_baseline_to_bottom_fullscreen 0x0
+int dimen mtrl_calendar_selection_text_baseline_to_top 0x0
+int dimen mtrl_calendar_text_input_padding_top 0x0
+int dimen mtrl_calendar_title_baseline_to_top 0x0
+int dimen mtrl_calendar_title_baseline_to_top_fullscreen 0x0
+int dimen mtrl_calendar_year_corner 0x0
+int dimen mtrl_calendar_year_height 0x0
+int dimen mtrl_calendar_year_horizontal_padding 0x0
+int dimen mtrl_calendar_year_vertical_padding 0x0
+int dimen mtrl_calendar_year_width 0x0
+int dimen mtrl_card_checked_icon_margin 0x0
+int dimen mtrl_card_checked_icon_size 0x0
+int dimen mtrl_card_corner_radius 0x0
+int dimen mtrl_card_dragged_z 0x0
+int dimen mtrl_card_elevation 0x0
+int dimen mtrl_card_spacing 0x0
+int dimen mtrl_chip_pressed_translation_z 0x0
+int dimen mtrl_chip_text_size 0x0
+int dimen mtrl_edittext_rectangle_top_offset 0x0
+int dimen mtrl_exposed_dropdown_menu_popup_elevation 0x0
+int dimen mtrl_exposed_dropdown_menu_popup_vertical_offset 0x0
+int dimen mtrl_exposed_dropdown_menu_popup_vertical_padding 0x0
+int dimen mtrl_extended_fab_bottom_padding 0x0
+int dimen mtrl_extended_fab_corner_radius 0x0
+int dimen mtrl_extended_fab_disabled_elevation 0x0
+int dimen mtrl_extended_fab_disabled_translation_z 0x0
+int dimen mtrl_extended_fab_elevation 0x0
+int dimen mtrl_extended_fab_end_padding 0x0
+int dimen mtrl_extended_fab_end_padding_icon 0x0
+int dimen mtrl_extended_fab_icon_size 0x0
+int dimen mtrl_extended_fab_icon_text_spacing 0x0
+int dimen mtrl_extended_fab_min_height 0x0
+int dimen mtrl_extended_fab_min_width 0x0
+int dimen mtrl_extended_fab_start_padding 0x0
+int dimen mtrl_extended_fab_start_padding_icon 0x0
+int dimen mtrl_extended_fab_top_padding 0x0
+int dimen mtrl_extended_fab_translation_z_base 0x0
+int dimen mtrl_extended_fab_translation_z_hovered_focused 0x0
+int dimen mtrl_extended_fab_translation_z_pressed 0x0
+int dimen mtrl_fab_elevation 0x0
+int dimen mtrl_fab_min_touch_target 0x0
+int dimen mtrl_fab_translation_z_hovered_focused 0x0
+int dimen mtrl_fab_translation_z_pressed 0x0
+int dimen mtrl_high_ripple_default_alpha 0x0
+int dimen mtrl_high_ripple_focused_alpha 0x0
+int dimen mtrl_high_ripple_hovered_alpha 0x0
+int dimen mtrl_high_ripple_pressed_alpha 0x0
+int dimen mtrl_large_touch_target 0x0
+int dimen mtrl_low_ripple_default_alpha 0x0
+int dimen mtrl_low_ripple_focused_alpha 0x0
+int dimen mtrl_low_ripple_hovered_alpha 0x0
+int dimen mtrl_low_ripple_pressed_alpha 0x0
+int dimen mtrl_min_touch_target_size 0x0
+int dimen mtrl_navigation_bar_item_default_icon_size 0x0
+int dimen mtrl_navigation_bar_item_default_margin 0x0
+int dimen mtrl_navigation_elevation 0x0
+int dimen mtrl_navigation_item_horizontal_padding 0x0
+int dimen mtrl_navigation_item_icon_padding 0x0
+int dimen mtrl_navigation_item_icon_size 0x0
+int dimen mtrl_navigation_item_shape_horizontal_margin 0x0
+int dimen mtrl_navigation_item_shape_vertical_margin 0x0
+int dimen mtrl_navigation_rail_active_text_size 0x0
+int dimen mtrl_navigation_rail_compact_width 0x0
+int dimen mtrl_navigation_rail_default_width 0x0
+int dimen mtrl_navigation_rail_elevation 0x0
+int dimen mtrl_navigation_rail_icon_margin 0x0
+int dimen mtrl_navigation_rail_icon_size 0x0
+int dimen mtrl_navigation_rail_margin 0x0
+int dimen mtrl_navigation_rail_text_bottom_margin 0x0
+int dimen mtrl_navigation_rail_text_size 0x0
+int dimen mtrl_progress_circular_inset 0x0
+int dimen mtrl_progress_circular_inset_extra_small 0x0
+int dimen mtrl_progress_circular_inset_medium 0x0
+int dimen mtrl_progress_circular_inset_small 0x0
+int dimen mtrl_progress_circular_radius 0x0
+int dimen mtrl_progress_circular_size 0x0
+int dimen mtrl_progress_circular_size_extra_small 0x0
+int dimen mtrl_progress_circular_size_medium 0x0
+int dimen mtrl_progress_circular_size_small 0x0
+int dimen mtrl_progress_circular_track_thickness_extra_small 0x0
+int dimen mtrl_progress_circular_track_thickness_medium 0x0
+int dimen mtrl_progress_circular_track_thickness_small 0x0
+int dimen mtrl_progress_indicator_full_rounded_corner_radius 0x0
+int dimen mtrl_progress_track_thickness 0x0
+int dimen mtrl_shape_corner_size_large_component 0x0
+int dimen mtrl_shape_corner_size_medium_component 0x0
+int dimen mtrl_shape_corner_size_small_component 0x0
+int dimen mtrl_slider_halo_radius 0x0
+int dimen mtrl_slider_label_padding 0x0
+int dimen mtrl_slider_label_radius 0x0
+int dimen mtrl_slider_label_square_side 0x0
+int dimen mtrl_slider_thumb_elevation 0x0
+int dimen mtrl_slider_thumb_radius 0x0
+int dimen mtrl_slider_track_height 0x0
+int dimen mtrl_slider_track_side_padding 0x0
+int dimen mtrl_slider_track_top 0x0
+int dimen mtrl_slider_widget_height 0x0
+int dimen mtrl_snackbar_action_text_color_alpha 0x0
+int dimen mtrl_snackbar_background_corner_radius 0x0
+int dimen mtrl_snackbar_background_overlay_color_alpha 0x0
+int dimen mtrl_snackbar_margin 0x0
+int dimen mtrl_snackbar_message_margin_horizontal 0x0
+int dimen mtrl_snackbar_padding_horizontal 0x0
+int dimen mtrl_switch_thumb_elevation 0x0
+int dimen mtrl_textinput_box_corner_radius_medium 0x0
+int dimen mtrl_textinput_box_corner_radius_small 0x0
+int dimen mtrl_textinput_box_label_cutout_padding 0x0
+int dimen mtrl_textinput_box_stroke_width_default 0x0
+int dimen mtrl_textinput_box_stroke_width_focused 0x0
+int dimen mtrl_textinput_counter_margin_start 0x0
+int dimen mtrl_textinput_end_icon_margin_start 0x0
+int dimen mtrl_textinput_outline_box_expanded_padding 0x0
+int dimen mtrl_textinput_start_icon_margin_end 0x0
+int dimen mtrl_toolbar_default_height 0x0
+int dimen mtrl_tooltip_arrowSize 0x0
+int dimen mtrl_tooltip_cornerSize 0x0
+int dimen mtrl_tooltip_minHeight 0x0
+int dimen mtrl_tooltip_minWidth 0x0
+int dimen mtrl_tooltip_padding 0x0
+int dimen mtrl_transition_shared_axis_slide_distance 0x0
+int dimen notification_action_icon_size 0x0
+int dimen notification_action_text_size 0x0
+int dimen notification_big_circle_margin 0x0
+int dimen notification_content_margin_start 0x0
+int dimen notification_large_icon_height 0x0
+int dimen notification_large_icon_width 0x0
+int dimen notification_main_column_padding_top 0x0
+int dimen notification_media_narrow_margin 0x0
+int dimen notification_right_icon_size 0x0
+int dimen notification_right_side_padding_top 0x0
+int dimen notification_small_icon_background_padding 0x0
+int dimen notification_small_icon_size_as_large 0x0
+int dimen notification_subtext_size 0x0
+int dimen notification_top_pad 0x0
+int dimen notification_top_pad_large_text 0x0
+int dimen test_mtrl_calendar_day_cornerSize 0x0
+int dimen test_navigation_bar_active_item_max_width 0x0
+int dimen test_navigation_bar_active_item_min_width 0x0
+int dimen test_navigation_bar_active_text_size 0x0
+int dimen test_navigation_bar_elevation 0x0
+int dimen test_navigation_bar_height 0x0
+int dimen test_navigation_bar_icon_size 0x0
+int dimen test_navigation_bar_item_max_width 0x0
+int dimen test_navigation_bar_item_min_width 0x0
+int dimen test_navigation_bar_label_padding 0x0
+int dimen test_navigation_bar_shadow_height 0x0
+int dimen test_navigation_bar_text_size 0x0
+int dimen tooltip_corner_radius 0x0
+int dimen tooltip_horizontal_padding 0x0
+int dimen tooltip_margin 0x0
+int dimen tooltip_precise_anchor_extra_offset 0x0
+int dimen tooltip_precise_anchor_threshold 0x0
+int dimen tooltip_vertical_padding 0x0
+int dimen tooltip_y_offset_non_touch 0x0
+int dimen tooltip_y_offset_touch 0x0
+int drawable abc_ab_share_pack_mtrl_alpha 0x0
+int drawable abc_action_bar_item_background_material 0x0
+int drawable abc_btn_borderless_material 0x0
+int drawable abc_btn_check_material 0x0
+int drawable abc_btn_check_material_anim 0x0
+int drawable abc_btn_check_to_on_mtrl_000 0x0
+int drawable abc_btn_check_to_on_mtrl_015 0x0
+int drawable abc_btn_colored_material 0x0
+int drawable abc_btn_default_mtrl_shape 0x0
+int drawable abc_btn_radio_material 0x0
+int drawable abc_btn_radio_material_anim 0x0
+int drawable abc_btn_radio_to_on_mtrl_000 0x0
+int drawable abc_btn_radio_to_on_mtrl_015 0x0
+int drawable abc_btn_switch_to_on_mtrl_00001 0x0
+int drawable abc_btn_switch_to_on_mtrl_00012 0x0
+int drawable abc_cab_background_internal_bg 0x0
+int drawable abc_cab_background_top_material 0x0
+int drawable abc_cab_background_top_mtrl_alpha 0x0
+int drawable abc_control_background_material 0x0
+int drawable abc_dialog_material_background 0x0
+int drawable abc_edit_text_material 0x0
+int drawable abc_ic_ab_back_material 0x0
+int drawable abc_ic_arrow_drop_right_black_24dp 0x0
+int drawable abc_ic_clear_material 0x0
+int drawable abc_ic_commit_search_api_mtrl_alpha 0x0
+int drawable abc_ic_go_search_api_material 0x0
+int drawable abc_ic_menu_copy_mtrl_am_alpha 0x0
+int drawable abc_ic_menu_cut_mtrl_alpha 0x0
+int drawable abc_ic_menu_overflow_material 0x0
+int drawable abc_ic_menu_paste_mtrl_am_alpha 0x0
+int drawable abc_ic_menu_selectall_mtrl_alpha 0x0
+int drawable abc_ic_menu_share_mtrl_alpha 0x0
+int drawable abc_ic_search_api_material 0x0
+int drawable abc_ic_star_black_16dp 0x0
+int drawable abc_ic_star_black_36dp 0x0
+int drawable abc_ic_star_black_48dp 0x0
+int drawable abc_ic_star_half_black_16dp 0x0
+int drawable abc_ic_star_half_black_36dp 0x0
+int drawable abc_ic_star_half_black_48dp 0x0
+int drawable abc_ic_voice_search_api_material 0x0
+int drawable abc_item_background_holo_dark 0x0
+int drawable abc_item_background_holo_light 0x0
+int drawable abc_list_divider_material 0x0
+int drawable abc_list_divider_mtrl_alpha 0x0
+int drawable abc_list_focused_holo 0x0
+int drawable abc_list_longpressed_holo 0x0
+int drawable abc_list_pressed_holo_dark 0x0
+int drawable abc_list_pressed_holo_light 0x0
+int drawable abc_list_selector_background_transition_holo_dark 0x0
+int drawable abc_list_selector_background_transition_holo_light 0x0
+int drawable abc_list_selector_disabled_holo_dark 0x0
+int drawable abc_list_selector_disabled_holo_light 0x0
+int drawable abc_list_selector_holo_dark 0x0
+int drawable abc_list_selector_holo_light 0x0
+int drawable abc_menu_hardkey_panel_mtrl_mult 0x0
+int drawable abc_popup_background_mtrl_mult 0x0
+int drawable abc_ratingbar_indicator_material 0x0
+int drawable abc_ratingbar_material 0x0
+int drawable abc_ratingbar_small_material 0x0
+int drawable abc_scrubber_control_off_mtrl_alpha 0x0
+int drawable abc_scrubber_control_to_pressed_mtrl_000 0x0
+int drawable abc_scrubber_control_to_pressed_mtrl_005 0x0
+int drawable abc_scrubber_primary_mtrl_alpha 0x0
+int drawable abc_scrubber_track_mtrl_alpha 0x0
+int drawable abc_seekbar_thumb_material 0x0
+int drawable abc_seekbar_tick_mark_material 0x0
+int drawable abc_seekbar_track_material 0x0
+int drawable abc_spinner_mtrl_am_alpha 0x0
+int drawable abc_spinner_textfield_background_material 0x0
+int drawable abc_star_black_48dp 0x0
+int drawable abc_star_half_black_48dp 0x0
+int drawable abc_switch_thumb_material 0x0
+int drawable abc_switch_track_mtrl_alpha 0x0
+int drawable abc_tab_indicator_material 0x0
+int drawable abc_tab_indicator_mtrl_alpha 0x0
+int drawable abc_text_cursor_material 0x0
+int drawable abc_text_select_handle_left_mtrl 0x0
+int drawable abc_text_select_handle_left_mtrl_dark 0x0
+int drawable abc_text_select_handle_left_mtrl_light 0x0
+int drawable abc_text_select_handle_middle_mtrl 0x0
+int drawable abc_text_select_handle_middle_mtrl_dark 0x0
+int drawable abc_text_select_handle_middle_mtrl_light 0x0
+int drawable abc_text_select_handle_right_mtrl 0x0
+int drawable abc_text_select_handle_right_mtrl_dark 0x0
+int drawable abc_text_select_handle_right_mtrl_light 0x0
+int drawable abc_textfield_activated_mtrl_alpha 0x0
+int drawable abc_textfield_default_mtrl_alpha 0x0
+int drawable abc_textfield_search_activated_mtrl_alpha 0x0
+int drawable abc_textfield_search_default_mtrl_alpha 0x0
+int drawable abc_textfield_search_material 0x0
+int drawable abc_vector_test 0x0
+int drawable avd_hide_password 0x0
+int drawable avd_show_password 0x0
+int drawable btn_checkbox_checked_mtrl 0x0
+int drawable btn_checkbox_checked_to_unchecked_mtrl_animation 0x0
+int drawable btn_checkbox_unchecked_mtrl 0x0
+int drawable btn_checkbox_unchecked_to_checked_mtrl_animation 0x0
+int drawable btn_radio_off_mtrl 0x0
+int drawable btn_radio_off_to_on_mtrl_animation 0x0
+int drawable btn_radio_on_mtrl 0x0
+int drawable btn_radio_on_to_off_mtrl_animation 0x0
+int drawable design_fab_background 0x0
+int drawable design_ic_visibility 0x0
+int drawable design_ic_visibility_off 0x0
+int drawable design_password_eye 0x0
+int drawable design_snackbar_background 0x0
+int drawable ic_clock_black_24dp 0x0
+int drawable ic_keyboard_black_24dp 0x0
+int drawable ic_mtrl_checked_circle 0x0
+int drawable ic_mtrl_chip_checked_black 0x0
+int drawable ic_mtrl_chip_checked_circle 0x0
+int drawable ic_mtrl_chip_close_circle 0x0
+int drawable material_cursor_drawable 0x0
+int drawable material_ic_calendar_black_24dp 0x0
+int drawable material_ic_clear_black_24dp 0x0
+int drawable material_ic_edit_black_24dp 0x0
+int drawable material_ic_keyboard_arrow_left_black_24dp 0x0
+int drawable material_ic_keyboard_arrow_next_black_24dp 0x0
+int drawable material_ic_keyboard_arrow_previous_black_24dp 0x0
+int drawable material_ic_keyboard_arrow_right_black_24dp 0x0
+int drawable material_ic_menu_arrow_down_black_24dp 0x0
+int drawable material_ic_menu_arrow_up_black_24dp 0x0
+int drawable mtrl_dialog_background 0x0
+int drawable mtrl_dropdown_arrow 0x0
+int drawable mtrl_ic_arrow_drop_down 0x0
+int drawable mtrl_ic_arrow_drop_up 0x0
+int drawable mtrl_ic_cancel 0x0
+int drawable mtrl_ic_error 0x0
+int drawable mtrl_navigation_bar_item_background 0x0
+int drawable mtrl_popupmenu_background 0x0
+int drawable mtrl_popupmenu_background_dark 0x0
+int drawable mtrl_tabs_default_indicator 0x0
+int drawable navigation_empty_icon 0x0
+int drawable notification_action_background 0x0
+int drawable notification_bg 0x0
+int drawable notification_bg_low 0x0
+int drawable notification_bg_low_normal 0x0
+int drawable notification_bg_low_pressed 0x0
+int drawable notification_bg_normal 0x0
+int drawable notification_bg_normal_pressed 0x0
+int drawable notification_icon_background 0x0
+int drawable notification_template_icon_bg 0x0
+int drawable notification_template_icon_low_bg 0x0
+int drawable notification_tile_bg 0x0
+int drawable notify_panel_notification_icon_bg 0x0
+int drawable test_custom_background 0x0
+int drawable tooltip_frame_dark 0x0
+int drawable tooltip_frame_light 0x0
+int id BOTTOM_END 0x0
+int id BOTTOM_START 0x0
+int id NO_DEBUG 0x0
+int id SHOW_ALL 0x0
+int id SHOW_PATH 0x0
+int id SHOW_PROGRESS 0x0
+int id TOP_END 0x0
+int id TOP_START 0x0
+int id accelerate 0x0
+int id accessibility_action_clickable_span 0x0
+int id accessibility_custom_action_0 0x0
+int id accessibility_custom_action_1 0x0
+int id accessibility_custom_action_10 0x0
+int id accessibility_custom_action_11 0x0
+int id accessibility_custom_action_12 0x0
+int id accessibility_custom_action_13 0x0
+int id accessibility_custom_action_14 0x0
+int id accessibility_custom_action_15 0x0
+int id accessibility_custom_action_16 0x0
+int id accessibility_custom_action_17 0x0
+int id accessibility_custom_action_18 0x0
+int id accessibility_custom_action_19 0x0
+int id accessibility_custom_action_2 0x0
+int id accessibility_custom_action_20 0x0
+int id accessibility_custom_action_21 0x0
+int id accessibility_custom_action_22 0x0
+int id accessibility_custom_action_23 0x0
+int id accessibility_custom_action_24 0x0
+int id accessibility_custom_action_25 0x0
+int id accessibility_custom_action_26 0x0
+int id accessibility_custom_action_27 0x0
+int id accessibility_custom_action_28 0x0
+int id accessibility_custom_action_29 0x0
+int id accessibility_custom_action_3 0x0
+int id accessibility_custom_action_30 0x0
+int id accessibility_custom_action_31 0x0
+int id accessibility_custom_action_4 0x0
+int id accessibility_custom_action_5 0x0
+int id accessibility_custom_action_6 0x0
+int id accessibility_custom_action_7 0x0
+int id accessibility_custom_action_8 0x0
+int id accessibility_custom_action_9 0x0
+int id action_bar 0x0
+int id action_bar_activity_content 0x0
+int id action_bar_container 0x0
+int id action_bar_root 0x0
+int id action_bar_spinner 0x0
+int id action_bar_subtitle 0x0
+int id action_bar_title 0x0
+int id action_container 0x0
+int id action_context_bar 0x0
+int id action_divider 0x0
+int id action_image 0x0
+int id action_menu_divider 0x0
+int id action_menu_presenter 0x0
+int id action_mode_bar 0x0
+int id action_mode_bar_stub 0x0
+int id action_mode_close_button 0x0
+int id action_text 0x0
+int id actions 0x0
+int id activity_chooser_view_content 0x0
+int id add 0x0
+int id alertTitle 0x0
+int id aligned 0x0
+int id animateToEnd 0x0
+int id animateToStart 0x0
+int id arc 0x0
+int id asConfigured 0x0
+int id async 0x0
+int id auto 0x0
+int id autoComplete 0x0
+int id autoCompleteToEnd 0x0
+int id autoCompleteToStart 0x0
+int id barrier 0x0
+int id baseline 0x0
+int id blocking 0x0
+int id bottom 0x0
+int id bounce 0x0
+int id buttonPanel 0x0
+int id cancel_button 0x0
+int id center 0x0
+int id chain 0x0
+int id checkbox 0x0
+int id checked 0x0
+int id chip 0x0
+int id chip1 0x0
+int id chip2 0x0
+int id chip3 0x0
+int id chip_group 0x0
+int id chronometer 0x0
+int id circle_center 0x0
+int id clear_text 0x0
+int id clockwise 0x0
+int id confirm_button 0x0
+int id container 0x0
+int id content 0x0
+int id contentPanel 0x0
+int id contiguous 0x0
+int id coordinator 0x0
+int id cos 0x0
+int id counterclockwise 0x0
+int id custom 0x0
+int id customPanel 0x0
+int id cut 0x0
+int id date_picker_actions 0x0
+int id decelerate 0x0
+int id decelerateAndComplete 0x0
+int id decor_content_parent 0x0
+int id default_activity_button 0x0
+int id deltaRelative 0x0
+int id design_bottom_sheet 0x0
+int id design_menu_item_action_area 0x0
+int id design_menu_item_action_area_stub 0x0
+int id design_menu_item_text 0x0
+int id design_navigation_view 0x0
+int id dialog_button 0x0
+int id disjoint 0x0
+int id dragDown 0x0
+int id dragEnd 0x0
+int id dragLeft 0x0
+int id dragRight 0x0
+int id dragStart 0x0
+int id dragUp 0x0
+int id dropdown_menu 0x0
+int id easeIn 0x0
+int id easeInOut 0x0
+int id easeOut 0x0
+int id edit_query 0x0
+int id elastic 0x0
+int id end 0x0
+int id endToStart 0x0
+int id expand_activities_button 0x0
+int id expanded_menu 0x0
+int id fade 0x0
+int id fill 0x0
+int id filled 0x0
+int id fixed 0x0
+int id flip 0x0
+int id floating 0x0
+int id forever 0x0
+int id fragment_container_view_tag 0x0
+int id ghost_view 0x0
+int id ghost_view_holder 0x0
+int id gone 0x0
+int id group_divider 0x0
+int id guideline 0x0
+int id header_title 0x0
+int id home 0x0
+int id honorRequest 0x0
+int id icon 0x0
+int id icon_group 0x0
+int id ignore 0x0
+int id ignoreRequest 0x0
+int id image 0x0
+int id info 0x0
+int id invisible 0x0
+int id inward 0x0
+int id italic 0x0
+int id item_touch_helper_previous_elevation 0x0
+int id jumpToEnd 0x0
+int id jumpToStart 0x0
+int id labeled 0x0
+int id layout 0x0
+int id left 0x0
+int id leftToRight 0x0
+int id line1 0x0
+int id line3 0x0
+int id linear 0x0
+int id listMode 0x0
+int id list_item 0x0
+int id masked 0x0
+int id material_clock_display 0x0
+int id material_clock_face 0x0
+int id material_clock_hand 0x0
+int id material_clock_period_am_button 0x0
+int id material_clock_period_pm_button 0x0
+int id material_clock_period_toggle 0x0
+int id material_hour_text_input 0x0
+int id material_hour_tv 0x0
+int id material_label 0x0
+int id material_minute_text_input 0x0
+int id material_minute_tv 0x0
+int id material_textinput_timepicker 0x0
+int id material_timepicker_cancel_button 0x0
+int id material_timepicker_container 0x0
+int id material_timepicker_edit_text 0x0
+int id material_timepicker_mode_button 0x0
+int id material_timepicker_ok_button 0x0
+int id material_timepicker_view 0x0
+int id material_value_index 0x0
+int id message 0x0
+int id middle 0x0
+int id mini 0x0
+int id month_grid 0x0
+int id month_navigation_bar 0x0
+int id month_navigation_fragment_toggle 0x0
+int id month_navigation_next 0x0
+int id month_navigation_previous 0x0
+int id month_title 0x0
+int id motion_base 0x0
+int id mtrl_anchor_parent 0x0
+int id mtrl_calendar_day_selector_frame 0x0
+int id mtrl_calendar_days_of_week 0x0
+int id mtrl_calendar_frame 0x0
+int id mtrl_calendar_main_pane 0x0
+int id mtrl_calendar_months 0x0
+int id mtrl_calendar_selection_frame 0x0
+int id mtrl_calendar_text_input_frame 0x0
+int id mtrl_calendar_year_selector_frame 0x0
+int id mtrl_card_checked_layer_id 0x0
+int id mtrl_child_content_container 0x0
+int id mtrl_internal_children_alpha_tag 0x0
+int id mtrl_motion_snapshot_view 0x0
+int id mtrl_picker_fullscreen 0x0
+int id mtrl_picker_header 0x0
+int id mtrl_picker_header_selection_text 0x0
+int id mtrl_picker_header_title_and_selection 0x0
+int id mtrl_picker_header_toggle 0x0
+int id mtrl_picker_text_input_date 0x0
+int id mtrl_picker_text_input_range_end 0x0
+int id mtrl_picker_text_input_range_start 0x0
+int id mtrl_picker_title_text 0x0
+int id mtrl_view_tag_bottom_padding 0x0
+int id multiply 0x0
+int id navigation_bar_item_icon_view 0x0
+int id navigation_bar_item_labels_group 0x0
+int id navigation_bar_item_large_label_view 0x0
+int id navigation_bar_item_small_label_view 0x0
+int id navigation_header_container 0x0
+int id none 0x0
+int id normal 0x0
+int id notification_background 0x0
+int id notification_main_column 0x0
+int id notification_main_column_container 0x0
+int id off 0x0
+int id on 0x0
+int id outline 0x0
+int id outward 0x0
+int id packed 0x0
+int id parallax 0x0
+int id parent 0x0
+int id parentPanel 0x0
+int id parentRelative 0x0
+int id parent_matrix 0x0
+int id password_toggle 0x0
+int id path 0x0
+int id pathRelative 0x0
+int id percent 0x0
+int id pin 0x0
+int id position 0x0
+int id postLayout 0x0
+int id progress_circular 0x0
+int id progress_horizontal 0x0
+int id radio 0x0
+int id rectangles 0x0
+int id reverseSawtooth 0x0
+int id right 0x0
+int id rightToLeft 0x0
+int id right_icon 0x0
+int id right_side 0x0
+int id rounded 0x0
+int id row_index_key 0x0
+int id save_non_transition_alpha 0x0
+int id save_overlay_view 0x0
+int id sawtooth 0x0
+int id scale 0x0
+int id screen 0x0
+int id scrollIndicatorDown 0x0
+int id scrollIndicatorUp 0x0
+int id scrollView 0x0
+int id scrollable 0x0
+int id search_badge 0x0
+int id search_bar 0x0
+int id search_button 0x0
+int id search_close_btn 0x0
+int id search_edit_frame 0x0
+int id search_go_btn 0x0
+int id search_mag_icon 0x0
+int id search_plate 0x0
+int id search_src_text 0x0
+int id search_voice_btn 0x0
+int id select_dialog_listview 0x0
+int id selected 0x0
+int id selection_type 0x0
+int id shortcut 0x0
+int id sin 0x0
+int id slide 0x0
+int id snackbar_action 0x0
+int id snackbar_text 0x0
+int id spacer 0x0
+int id special_effects_controller_view_tag 0x0
+int id spline 0x0
+int id split_action_bar 0x0
+int id spread 0x0
+int id spread_inside 0x0
+int id square 0x0
+int id src_atop 0x0
+int id src_in 0x0
+int id src_over 0x0
+int id standard 0x0
+int id start 0x0
+int id startHorizontal 0x0
+int id startToEnd 0x0
+int id startVertical 0x0
+int id staticLayout 0x0
+int id staticPostLayout 0x0
+int id stop 0x0
+int id stretch 0x0
+int id submenuarrow 0x0
+int id submit_area 0x0
+int id tabMode 0x0
+int id tag_accessibility_actions 0x0
+int id tag_accessibility_clickable_spans 0x0
+int id tag_accessibility_heading 0x0
+int id tag_accessibility_pane_title 0x0
+int id tag_on_apply_window_listener 0x0
+int id tag_on_receive_content_listener 0x0
+int id tag_on_receive_content_mime_types 0x0
+int id tag_screen_reader_focusable 0x0
+int id tag_state_description 0x0
+int id tag_transition_group 0x0
+int id tag_unhandled_key_event_manager 0x0
+int id tag_unhandled_key_listeners 0x0
+int id tag_window_insets_animation_callback 0x0
+int id test_checkbox_android_button_tint 0x0
+int id test_checkbox_app_button_tint 0x0
+int id test_radiobutton_android_button_tint 0x0
+int id test_radiobutton_app_button_tint 0x0
+int id text 0x0
+int id text2 0x0
+int id textSpacerNoButtons 0x0
+int id textSpacerNoTitle 0x0
+int id text_input_end_icon 0x0
+int id text_input_error_icon 0x0
+int id text_input_start_icon 0x0
+int id textinput_counter 0x0
+int id textinput_error 0x0
+int id textinput_helper_text 0x0
+int id textinput_placeholder 0x0
+int id textinput_prefix_text 0x0
+int id textinput_suffix_text 0x0
+int id time 0x0
+int id title 0x0
+int id titleDividerNoCustom 0x0
+int id title_template 0x0
+int id top 0x0
+int id topPanel 0x0
+int id touch_outside 0x0
+int id transition_current_scene 0x0
+int id transition_layout_save 0x0
+int id transition_position 0x0
+int id transition_scene_layoutid_cache 0x0
+int id transition_transform 0x0
+int id triangle 0x0
+int id unchecked 0x0
+int id uniform 0x0
+int id unlabeled 0x0
+int id up 0x0
+int id view_offset_helper 0x0
+int id view_tree_lifecycle_owner 0x0
+int id view_tree_saved_state_registry_owner 0x0
+int id view_tree_view_model_store_owner 0x0
+int id visible 0x0
+int id visible_removing_fragment_view_tag 0x0
+int id withinBounds 0x0
+int id wrap 0x0
+int id wrap_content 0x0
+int id zero_corner_chip 0x0
+int integer abc_config_activityDefaultDur 0x0
+int integer abc_config_activityShortDur 0x0
+int integer app_bar_elevation_anim_duration 0x0
+int integer bottom_sheet_slide_duration 0x0
+int integer cancel_button_image_alpha 0x0
+int integer config_tooltipAnimTime 0x0
+int integer design_snackbar_text_max_lines 0x0
+int integer design_tab_indicator_anim_duration_ms 0x0
+int integer hide_password_duration 0x0
+int integer material_motion_duration_long_1 0x0
+int integer material_motion_duration_long_2 0x0
+int integer material_motion_duration_medium_1 0x0
+int integer material_motion_duration_medium_2 0x0
+int integer material_motion_duration_short_1 0x0
+int integer material_motion_duration_short_2 0x0
+int integer material_motion_path 0x0
+int integer mtrl_badge_max_character_count 0x0
+int integer mtrl_btn_anim_delay_ms 0x0
+int integer mtrl_btn_anim_duration_ms 0x0
+int integer mtrl_calendar_header_orientation 0x0
+int integer mtrl_calendar_selection_text_lines 0x0
+int integer mtrl_calendar_year_selector_span 0x0
+int integer mtrl_card_anim_delay_ms 0x0
+int integer mtrl_card_anim_duration_ms 0x0
+int integer mtrl_chip_anim_duration 0x0
+int integer mtrl_tab_indicator_anim_duration_ms 0x0
+int integer show_password_duration 0x0
+int integer status_bar_notification_info_maxnum 0x0
+int interpolator btn_checkbox_checked_mtrl_animation_interpolator_0 0x0
+int interpolator btn_checkbox_checked_mtrl_animation_interpolator_1 0x0
+int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0 0x0
+int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1 0x0
+int interpolator btn_radio_to_off_mtrl_animation_interpolator_0 0x0
+int interpolator btn_radio_to_on_mtrl_animation_interpolator_0 0x0
+int interpolator fast_out_slow_in 0x0
+int interpolator mtrl_fast_out_linear_in 0x0
+int interpolator mtrl_fast_out_slow_in 0x0
+int interpolator mtrl_linear 0x0
+int interpolator mtrl_linear_out_slow_in 0x0
+int layout abc_action_bar_title_item 0x0
+int layout abc_action_bar_up_container 0x0
+int layout abc_action_menu_item_layout 0x0
+int layout abc_action_menu_layout 0x0
+int layout abc_action_mode_bar 0x0
+int layout abc_action_mode_close_item_material 0x0
+int layout abc_activity_chooser_view 0x0
+int layout abc_activity_chooser_view_list_item 0x0
+int layout abc_alert_dialog_button_bar_material 0x0
+int layout abc_alert_dialog_material 0x0
+int layout abc_alert_dialog_title_material 0x0
+int layout abc_cascading_menu_item_layout 0x0
+int layout abc_dialog_title_material 0x0
+int layout abc_expanded_menu_layout 0x0
+int layout abc_list_menu_item_checkbox 0x0
+int layout abc_list_menu_item_icon 0x0
+int layout abc_list_menu_item_layout 0x0
+int layout abc_list_menu_item_radio 0x0
+int layout abc_popup_menu_header_item_layout 0x0
+int layout abc_popup_menu_item_layout 0x0
+int layout abc_screen_content_include 0x0
+int layout abc_screen_simple 0x0
+int layout abc_screen_simple_overlay_action_mode 0x0
+int layout abc_screen_toolbar 0x0
+int layout abc_search_dropdown_item_icons_2line 0x0
+int layout abc_search_view 0x0
+int layout abc_select_dialog_material 0x0
+int layout abc_tooltip 0x0
+int layout custom_dialog 0x0
+int layout design_bottom_navigation_item 0x0
+int layout design_bottom_sheet_dialog 0x0
+int layout design_layout_snackbar 0x0
+int layout design_layout_snackbar_include 0x0
+int layout design_layout_tab_icon 0x0
+int layout design_layout_tab_text 0x0
+int layout design_menu_item_action_area 0x0
+int layout design_navigation_item 0x0
+int layout design_navigation_item_header 0x0
+int layout design_navigation_item_separator 0x0
+int layout design_navigation_item_subheader 0x0
+int layout design_navigation_menu 0x0
+int layout design_navigation_menu_item 0x0
+int layout design_text_input_end_icon 0x0
+int layout design_text_input_start_icon 0x0
+int layout material_chip_input_combo 0x0
+int layout material_clock_display 0x0
+int layout material_clock_display_divider 0x0
+int layout material_clock_period_toggle 0x0
+int layout material_clock_period_toggle_land 0x0
+int layout material_clockface_textview 0x0
+int layout material_clockface_view 0x0
+int layout material_radial_view_group 0x0
+int layout material_textinput_timepicker 0x0
+int layout material_time_chip 0x0
+int layout material_time_input 0x0
+int layout material_timepicker 0x0
+int layout material_timepicker_dialog 0x0
+int layout material_timepicker_textinput_display 0x0
+int layout mtrl_alert_dialog 0x0
+int layout mtrl_alert_dialog_actions 0x0
+int layout mtrl_alert_dialog_title 0x0
+int layout mtrl_alert_select_dialog_item 0x0
+int layout mtrl_alert_select_dialog_multichoice 0x0
+int layout mtrl_alert_select_dialog_singlechoice 0x0
+int layout mtrl_calendar_day 0x0
+int layout mtrl_calendar_day_of_week 0x0
+int layout mtrl_calendar_days_of_week 0x0
+int layout mtrl_calendar_horizontal 0x0
+int layout mtrl_calendar_month 0x0
+int layout mtrl_calendar_month_labeled 0x0
+int layout mtrl_calendar_month_navigation 0x0
+int layout mtrl_calendar_months 0x0
+int layout mtrl_calendar_vertical 0x0
+int layout mtrl_calendar_year 0x0
+int layout mtrl_layout_snackbar 0x0
+int layout mtrl_layout_snackbar_include 0x0
+int layout mtrl_navigation_rail_item 0x0
+int layout mtrl_picker_actions 0x0
+int layout mtrl_picker_dialog 0x0
+int layout mtrl_picker_fullscreen 0x0
+int layout mtrl_picker_header_dialog 0x0
+int layout mtrl_picker_header_fullscreen 0x0
+int layout mtrl_picker_header_selection_text 0x0
+int layout mtrl_picker_header_title_text 0x0
+int layout mtrl_picker_header_toggle 0x0
+int layout mtrl_picker_text_input_date 0x0
+int layout mtrl_picker_text_input_date_range 0x0
+int layout notification_action 0x0
+int layout notification_action_tombstone 0x0
+int layout notification_template_custom_big 0x0
+int layout notification_template_icon_group 0x0
+int layout notification_template_part_chronometer 0x0
+int layout notification_template_part_time 0x0
+int layout select_dialog_item_material 0x0
+int layout select_dialog_multichoice_material 0x0
+int layout select_dialog_singlechoice_material 0x0
+int layout support_simple_spinner_dropdown_item 0x0
+int layout test_action_chip 0x0
+int layout test_chip_zero_corner_radius 0x0
+int layout test_design_checkbox 0x0
+int layout test_design_radiobutton 0x0
+int layout test_navigation_bar_item_layout 0x0
+int layout test_reflow_chipgroup 0x0
+int layout test_toolbar 0x0
+int layout test_toolbar_custom_background 0x0
+int layout test_toolbar_elevation 0x0
+int layout test_toolbar_surface 0x0
+int layout text_view_with_line_height_from_appearance 0x0
+int layout text_view_with_line_height_from_layout 0x0
+int layout text_view_with_line_height_from_style 0x0
+int layout text_view_with_theme_line_height 0x0
+int layout text_view_without_line_height 0x0
+int plurals mtrl_badge_content_description 0x0
+int string abc_action_bar_home_description 0x0
+int string abc_action_bar_up_description 0x0
+int string abc_action_menu_overflow_description 0x0
+int string abc_action_mode_done 0x0
+int string abc_activity_chooser_view_see_all 0x0
+int string abc_activitychooserview_choose_application 0x0
+int string abc_capital_off 0x0
+int string abc_capital_on 0x0
+int string abc_menu_alt_shortcut_label 0x0
+int string abc_menu_ctrl_shortcut_label 0x0
+int string abc_menu_delete_shortcut_label 0x0
+int string abc_menu_enter_shortcut_label 0x0
+int string abc_menu_function_shortcut_label 0x0
+int string abc_menu_meta_shortcut_label 0x0
+int string abc_menu_shift_shortcut_label 0x0
+int string abc_menu_space_shortcut_label 0x0
+int string abc_menu_sym_shortcut_label 0x0
+int string abc_prepend_shortcut_label 0x0
+int string abc_search_hint 0x0
+int string abc_searchview_description_clear 0x0
+int string abc_searchview_description_query 0x0
+int string abc_searchview_description_search 0x0
+int string abc_searchview_description_submit 0x0
+int string abc_searchview_description_voice 0x0
+int string abc_shareactionprovider_share_with 0x0
+int string abc_shareactionprovider_share_with_application 0x0
+int string abc_toolbar_collapse_description 0x0
+int string appbar_scrolling_view_behavior 0x0
+int string bottom_sheet_behavior 0x0
+int string bottomsheet_action_expand_halfway 0x0
+int string character_counter_content_description 0x0
+int string character_counter_overflowed_content_description 0x0
+int string character_counter_pattern 0x0
+int string chip_text 0x0
+int string clear_text_end_icon_content_description 0x0
+int string error_icon_content_description 0x0
+int string exposed_dropdown_menu_content_description 0x0
+int string fab_transformation_scrim_behavior 0x0
+int string fab_transformation_sheet_behavior 0x0
+int string hide_bottom_view_on_scroll_behavior 0x0
+int string icon_content_description 0x0
+int string item_view_role_description 0x0
+int string material_clock_display_divider 0x0
+int string material_clock_toggle_content_description 0x0
+int string material_hour_selection 0x0
+int string material_hour_suffix 0x0
+int string material_minute_selection 0x0
+int string material_minute_suffix 0x0
+int string material_motion_easing_accelerated 0x0
+int string material_motion_easing_decelerated 0x0
+int string material_motion_easing_emphasized 0x0
+int string material_motion_easing_linear 0x0
+int string material_motion_easing_standard 0x0
+int string material_slider_range_end 0x0
+int string material_slider_range_start 0x0
+int string material_timepicker_am 0x0
+int string material_timepicker_clock_mode_description 0x0
+int string material_timepicker_hour 0x0
+int string material_timepicker_minute 0x0
+int string material_timepicker_pm 0x0
+int string material_timepicker_select_time 0x0
+int string material_timepicker_text_input_mode_description 0x0
+int string mtrl_badge_numberless_content_description 0x0
+int string mtrl_chip_close_icon_content_description 0x0
+int string mtrl_exceed_max_badge_number_content_description 0x0
+int string mtrl_exceed_max_badge_number_suffix 0x0
+int string mtrl_picker_a11y_next_month 0x0
+int string mtrl_picker_a11y_prev_month 0x0
+int string mtrl_picker_announce_current_selection 0x0
+int string mtrl_picker_cancel 0x0
+int string mtrl_picker_confirm 0x0
+int string mtrl_picker_date_header_selected 0x0
+int string mtrl_picker_date_header_title 0x0
+int string mtrl_picker_date_header_unselected 0x0
+int string mtrl_picker_day_of_week_column_header 0x0
+int string mtrl_picker_invalid_format 0x0
+int string mtrl_picker_invalid_format_example 0x0
+int string mtrl_picker_invalid_format_use 0x0
+int string mtrl_picker_invalid_range 0x0
+int string mtrl_picker_navigate_to_year_description 0x0
+int string mtrl_picker_out_of_range 0x0
+int string mtrl_picker_range_header_only_end_selected 0x0
+int string mtrl_picker_range_header_only_start_selected 0x0
+int string mtrl_picker_range_header_selected 0x0
+int string mtrl_picker_range_header_title 0x0
+int string mtrl_picker_range_header_unselected 0x0
+int string mtrl_picker_save 0x0
+int string mtrl_picker_text_input_date_hint 0x0
+int string mtrl_picker_text_input_date_range_end_hint 0x0
+int string mtrl_picker_text_input_date_range_start_hint 0x0
+int string mtrl_picker_text_input_day_abbr 0x0
+int string mtrl_picker_text_input_month_abbr 0x0
+int string mtrl_picker_text_input_year_abbr 0x0
+int string mtrl_picker_toggle_to_calendar_input_mode 0x0
+int string mtrl_picker_toggle_to_day_selection 0x0
+int string mtrl_picker_toggle_to_text_input_mode 0x0
+int string mtrl_picker_toggle_to_year_selection 0x0
+int string password_toggle_content_description 0x0
+int string path_password_eye 0x0
+int string path_password_eye_mask_strike_through 0x0
+int string path_password_eye_mask_visible 0x0
+int string path_password_strike_through 0x0
+int string search_menu_title 0x0
+int string status_bar_notification_info_overflow 0x0
+int style AlertDialog_AppCompat 0x0
+int style AlertDialog_AppCompat_Light 0x0
+int style AndroidThemeColorAccentYellow 0x0
+int style Animation_AppCompat_Dialog 0x0
+int style Animation_AppCompat_DropDownUp 0x0
+int style Animation_AppCompat_Tooltip 0x0
+int style Animation_Design_BottomSheetDialog 0x0
+int style Animation_MaterialComponents_BottomSheetDialog 0x0
+int style Base_AlertDialog_AppCompat 0x0
+int style Base_AlertDialog_AppCompat_Light 0x0
+int style Base_Animation_AppCompat_Dialog 0x0
+int style Base_Animation_AppCompat_DropDownUp 0x0
+int style Base_Animation_AppCompat_Tooltip 0x0
+int style Base_CardView 0x0
+int style Base_DialogWindowTitleBackground_AppCompat 0x0
+int style Base_DialogWindowTitle_AppCompat 0x0
+int style Base_MaterialAlertDialog_MaterialComponents_Title_Icon 0x0
+int style Base_MaterialAlertDialog_MaterialComponents_Title_Panel 0x0
+int style Base_MaterialAlertDialog_MaterialComponents_Title_Text 0x0
+int style Base_TextAppearance_AppCompat 0x0
+int style Base_TextAppearance_AppCompat_Body1 0x0
+int style Base_TextAppearance_AppCompat_Body2 0x0
+int style Base_TextAppearance_AppCompat_Button 0x0
+int style Base_TextAppearance_AppCompat_Caption 0x0
+int style Base_TextAppearance_AppCompat_Display1 0x0
+int style Base_TextAppearance_AppCompat_Display2 0x0
+int style Base_TextAppearance_AppCompat_Display3 0x0
+int style Base_TextAppearance_AppCompat_Display4 0x0
+int style Base_TextAppearance_AppCompat_Headline 0x0
+int style Base_TextAppearance_AppCompat_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Large 0x0
+int style Base_TextAppearance_AppCompat_Large_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0
+int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0
+int style Base_TextAppearance_AppCompat_Medium 0x0
+int style Base_TextAppearance_AppCompat_Medium_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Menu 0x0
+int style Base_TextAppearance_AppCompat_SearchResult 0x0
+int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x0
+int style Base_TextAppearance_AppCompat_SearchResult_Title 0x0
+int style Base_TextAppearance_AppCompat_Small 0x0
+int style Base_TextAppearance_AppCompat_Small_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Subhead 0x0
+int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Title 0x0
+int style Base_TextAppearance_AppCompat_Title_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Tooltip 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0
+int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x0
+int style Base_TextAppearance_AppCompat_Widget_Button 0x0
+int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0
+int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x0
+int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x0
+int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x0
+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0
+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0
+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0
+int style Base_TextAppearance_AppCompat_Widget_Switch 0x0
+int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0
+int style Base_TextAppearance_MaterialComponents_Badge 0x0
+int style Base_TextAppearance_MaterialComponents_Button 0x0
+int style Base_TextAppearance_MaterialComponents_Headline6 0x0
+int style Base_TextAppearance_MaterialComponents_Subtitle2 0x0
+int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0
+int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0
+int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x0
+int style Base_ThemeOverlay_AppCompat 0x0
+int style Base_ThemeOverlay_AppCompat_ActionBar 0x0
+int style Base_ThemeOverlay_AppCompat_Dark 0x0
+int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x0
+int style Base_ThemeOverlay_AppCompat_Dialog 0x0
+int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x0
+int style Base_ThemeOverlay_AppCompat_Light 0x0
+int style Base_ThemeOverlay_MaterialComponents_Dialog 0x0
+int style Base_ThemeOverlay_MaterialComponents_Dialog_Alert 0x0
+int style Base_ThemeOverlay_MaterialComponents_Dialog_Alert_Framework 0x0
+int style Base_ThemeOverlay_MaterialComponents_Light_Dialog_Alert_Framework 0x0
+int style Base_ThemeOverlay_MaterialComponents_MaterialAlertDialog 0x0
+int style Base_Theme_AppCompat 0x0
+int style Base_Theme_AppCompat_CompactMenu 0x0
+int style Base_Theme_AppCompat_Dialog 0x0
+int style Base_Theme_AppCompat_DialogWhenLarge 0x0
+int style Base_Theme_AppCompat_Dialog_Alert 0x0
+int style Base_Theme_AppCompat_Dialog_FixedSize 0x0
+int style Base_Theme_AppCompat_Dialog_MinWidth 0x0
+int style Base_Theme_AppCompat_Light 0x0
+int style Base_Theme_AppCompat_Light_DarkActionBar 0x0
+int style Base_Theme_AppCompat_Light_Dialog 0x0
+int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x0
+int style Base_Theme_AppCompat_Light_Dialog_Alert 0x0
+int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x0
+int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x0
+int style Base_Theme_MaterialComponents 0x0
+int style Base_Theme_MaterialComponents_Bridge 0x0
+int style Base_Theme_MaterialComponents_CompactMenu 0x0
+int style Base_Theme_MaterialComponents_Dialog 0x0
+int style Base_Theme_MaterialComponents_DialogWhenLarge 0x0
+int style Base_Theme_MaterialComponents_Dialog_Alert 0x0
+int style Base_Theme_MaterialComponents_Dialog_Bridge 0x0
+int style Base_Theme_MaterialComponents_Dialog_FixedSize 0x0
+int style Base_Theme_MaterialComponents_Dialog_MinWidth 0x0
+int style Base_Theme_MaterialComponents_Light 0x0
+int style Base_Theme_MaterialComponents_Light_Bridge 0x0
+int style Base_Theme_MaterialComponents_Light_DarkActionBar 0x0
+int style Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x0
+int style Base_Theme_MaterialComponents_Light_Dialog 0x0
+int style Base_Theme_MaterialComponents_Light_DialogWhenLarge 0x0
+int style Base_Theme_MaterialComponents_Light_Dialog_Alert 0x0
+int style Base_Theme_MaterialComponents_Light_Dialog_Bridge 0x0
+int style Base_Theme_MaterialComponents_Light_Dialog_FixedSize 0x0
+int style Base_Theme_MaterialComponents_Light_Dialog_MinWidth 0x0
+int style Base_V14_ThemeOverlay_MaterialComponents_BottomSheetDialog 0x0
+int style Base_V14_ThemeOverlay_MaterialComponents_Dialog 0x0
+int style Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert 0x0
+int style Base_V14_ThemeOverlay_MaterialComponents_MaterialAlertDialog 0x0
+int style Base_V14_Theme_MaterialComponents 0x0
+int style Base_V14_Theme_MaterialComponents_Bridge 0x0
+int style Base_V14_Theme_MaterialComponents_Dialog 0x0
+int style Base_V14_Theme_MaterialComponents_Dialog_Bridge 0x0
+int style Base_V14_Theme_MaterialComponents_Light 0x0
+int style Base_V14_Theme_MaterialComponents_Light_Bridge 0x0
+int style Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x0
+int style Base_V14_Theme_MaterialComponents_Light_Dialog 0x0
+int style Base_V14_Theme_MaterialComponents_Light_Dialog_Bridge 0x0
+int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x0
+int style Base_V21_ThemeOverlay_MaterialComponents_BottomSheetDialog 0x0
+int style Base_V21_Theme_AppCompat 0x0
+int style Base_V21_Theme_AppCompat_Dialog 0x0
+int style Base_V21_Theme_AppCompat_Light 0x0
+int style Base_V21_Theme_AppCompat_Light_Dialog 0x0
+int style Base_V21_Theme_MaterialComponents 0x0
+int style Base_V21_Theme_MaterialComponents_Dialog 0x0
+int style Base_V21_Theme_MaterialComponents_Light 0x0
+int style Base_V21_Theme_MaterialComponents_Light_Dialog 0x0
+int style Base_V22_Theme_AppCompat 0x0
+int style Base_V22_Theme_AppCompat_Light 0x0
+int style Base_V23_Theme_AppCompat 0x0
+int style Base_V23_Theme_AppCompat_Light 0x0
+int style Base_V26_Theme_AppCompat 0x0
+int style Base_V26_Theme_AppCompat_Light 0x0
+int style Base_V26_Widget_AppCompat_Toolbar 0x0
+int style Base_V28_Theme_AppCompat 0x0
+int style Base_V28_Theme_AppCompat_Light 0x0
+int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x0
+int style Base_V7_Theme_AppCompat 0x0
+int style Base_V7_Theme_AppCompat_Dialog 0x0
+int style Base_V7_Theme_AppCompat_Light 0x0
+int style Base_V7_Theme_AppCompat_Light_Dialog 0x0
+int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x0
+int style Base_V7_Widget_AppCompat_EditText 0x0
+int style Base_V7_Widget_AppCompat_Toolbar 0x0
+int style Base_Widget_AppCompat_ActionBar 0x0
+int style Base_Widget_AppCompat_ActionBar_Solid 0x0
+int style Base_Widget_AppCompat_ActionBar_TabBar 0x0
+int style Base_Widget_AppCompat_ActionBar_TabText 0x0
+int style Base_Widget_AppCompat_ActionBar_TabView 0x0
+int style Base_Widget_AppCompat_ActionButton 0x0
+int style Base_Widget_AppCompat_ActionButton_CloseMode 0x0
+int style Base_Widget_AppCompat_ActionButton_Overflow 0x0
+int style Base_Widget_AppCompat_ActionMode 0x0
+int style Base_Widget_AppCompat_ActivityChooserView 0x0
+int style Base_Widget_AppCompat_AutoCompleteTextView 0x0
+int style Base_Widget_AppCompat_Button 0x0
+int style Base_Widget_AppCompat_ButtonBar 0x0
+int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x0
+int style Base_Widget_AppCompat_Button_Borderless 0x0
+int style Base_Widget_AppCompat_Button_Borderless_Colored 0x0
+int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0
+int style Base_Widget_AppCompat_Button_Colored 0x0
+int style Base_Widget_AppCompat_Button_Small 0x0
+int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x0
+int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x0
+int style Base_Widget_AppCompat_CompoundButton_Switch 0x0
+int style Base_Widget_AppCompat_DrawerArrowToggle 0x0
+int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x0
+int style Base_Widget_AppCompat_DropDownItem_Spinner 0x0
+int style Base_Widget_AppCompat_EditText 0x0
+int style Base_Widget_AppCompat_ImageButton 0x0
+int style Base_Widget_AppCompat_Light_ActionBar 0x0
+int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x0
+int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x0
+int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x0
+int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0
+int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x0
+int style Base_Widget_AppCompat_Light_PopupMenu 0x0
+int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x0
+int style Base_Widget_AppCompat_ListMenuView 0x0
+int style Base_Widget_AppCompat_ListPopupWindow 0x0
+int style Base_Widget_AppCompat_ListView 0x0
+int style Base_Widget_AppCompat_ListView_DropDown 0x0
+int style Base_Widget_AppCompat_ListView_Menu 0x0
+int style Base_Widget_AppCompat_PopupMenu 0x0
+int style Base_Widget_AppCompat_PopupMenu_Overflow 0x0
+int style Base_Widget_AppCompat_PopupWindow 0x0
+int style Base_Widget_AppCompat_ProgressBar 0x0
+int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x0
+int style Base_Widget_AppCompat_RatingBar 0x0
+int style Base_Widget_AppCompat_RatingBar_Indicator 0x0
+int style Base_Widget_AppCompat_RatingBar_Small 0x0
+int style Base_Widget_AppCompat_SearchView 0x0
+int style Base_Widget_AppCompat_SearchView_ActionBar 0x0
+int style Base_Widget_AppCompat_SeekBar 0x0
+int style Base_Widget_AppCompat_SeekBar_Discrete 0x0
+int style Base_Widget_AppCompat_Spinner 0x0
+int style Base_Widget_AppCompat_Spinner_Underlined 0x0
+int style Base_Widget_AppCompat_TextView 0x0
+int style Base_Widget_AppCompat_TextView_SpinnerItem 0x0
+int style Base_Widget_AppCompat_Toolbar 0x0
+int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x0
+int style Base_Widget_Design_TabLayout 0x0
+int style Base_Widget_MaterialComponents_AutoCompleteTextView 0x0
+int style Base_Widget_MaterialComponents_CheckedTextView 0x0
+int style Base_Widget_MaterialComponents_Chip 0x0
+int style Base_Widget_MaterialComponents_MaterialCalendar_NavigationButton 0x0
+int style Base_Widget_MaterialComponents_PopupMenu 0x0
+int style Base_Widget_MaterialComponents_PopupMenu_ContextMenu 0x0
+int style Base_Widget_MaterialComponents_PopupMenu_ListPopupWindow 0x0
+int style Base_Widget_MaterialComponents_PopupMenu_Overflow 0x0
+int style Base_Widget_MaterialComponents_Slider 0x0
+int style Base_Widget_MaterialComponents_Snackbar 0x0
+int style Base_Widget_MaterialComponents_TextInputEditText 0x0
+int style Base_Widget_MaterialComponents_TextInputLayout 0x0
+int style Base_Widget_MaterialComponents_TextView 0x0
+int style CardView 0x0
+int style CardView_Dark 0x0
+int style CardView_Light 0x0
+int style EmptyTheme 0x0
+int style MaterialAlertDialog_MaterialComponents 0x0
+int style MaterialAlertDialog_MaterialComponents_Body_Text 0x0
+int style MaterialAlertDialog_MaterialComponents_Picker_Date_Calendar 0x0
+int style MaterialAlertDialog_MaterialComponents_Picker_Date_Spinner 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Icon 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Icon_CenterStacked 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Panel 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Panel_CenterStacked 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Text 0x0
+int style MaterialAlertDialog_MaterialComponents_Title_Text_CenterStacked 0x0
+int style Platform_AppCompat 0x0
+int style Platform_AppCompat_Light 0x0
+int style Platform_MaterialComponents 0x0
+int style Platform_MaterialComponents_Dialog 0x0
+int style Platform_MaterialComponents_Light 0x0
+int style Platform_MaterialComponents_Light_Dialog 0x0
+int style Platform_ThemeOverlay_AppCompat 0x0
+int style Platform_ThemeOverlay_AppCompat_Dark 0x0
+int style Platform_ThemeOverlay_AppCompat_Light 0x0
+int style Platform_V21_AppCompat 0x0
+int style Platform_V21_AppCompat_Light 0x0
+int style Platform_V25_AppCompat 0x0
+int style Platform_V25_AppCompat_Light 0x0
+int style Platform_Widget_AppCompat_Spinner 0x0
+int style RtlOverlay_DialogWindowTitle_AppCompat 0x0
+int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x0
+int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x0
+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x0
+int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x0
+int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x0
+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x0
+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x0
+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x0
+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x0
+int style RtlUnderlay_Widget_AppCompat_ActionButton 0x0
+int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x0
+int style ShapeAppearanceOverlay 0x0
+int style ShapeAppearanceOverlay_BottomLeftDifferentCornerSize 0x0
+int style ShapeAppearanceOverlay_BottomRightCut 0x0
+int style ShapeAppearanceOverlay_Cut 0x0
+int style ShapeAppearanceOverlay_DifferentCornerSize 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_BottomSheet 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_Chip 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_ExtendedFloatingActionButton 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_FloatingActionButton 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Day 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Window_Fullscreen 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Year 0x0
+int style ShapeAppearanceOverlay_MaterialComponents_TextInputLayout_FilledBox 0x0
+int style ShapeAppearanceOverlay_TopLeftCut 0x0
+int style ShapeAppearanceOverlay_TopRightDifferentCornerSize 0x0
+int style ShapeAppearance_MaterialComponents 0x0
+int style ShapeAppearance_MaterialComponents_LargeComponent 0x0
+int style ShapeAppearance_MaterialComponents_MediumComponent 0x0
+int style ShapeAppearance_MaterialComponents_SmallComponent 0x0
+int style ShapeAppearance_MaterialComponents_Test 0x0
+int style ShapeAppearance_MaterialComponents_Tooltip 0x0
+int style TestStyleWithLineHeight 0x0
+int style TestStyleWithLineHeightAppearance 0x0
+int style TestStyleWithThemeLineHeightAttribute 0x0
+int style TestStyleWithoutLineHeight 0x0
+int style TestThemeWithLineHeight 0x0
+int style TestThemeWithLineHeightDisabled 0x0
+int style Test_ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Day 0x0
+int style Test_Theme_MaterialComponents_MaterialCalendar 0x0
+int style Test_Widget_MaterialComponents_MaterialCalendar 0x0
+int style Test_Widget_MaterialComponents_MaterialCalendar_Day 0x0
+int style Test_Widget_MaterialComponents_MaterialCalendar_Day_Selected 0x0
+int style TextAppearance_AppCompat 0x0
+int style TextAppearance_AppCompat_Body1 0x0
+int style TextAppearance_AppCompat_Body2 0x0
+int style TextAppearance_AppCompat_Button 0x0
+int style TextAppearance_AppCompat_Caption 0x0
+int style TextAppearance_AppCompat_Display1 0x0
+int style TextAppearance_AppCompat_Display2 0x0
+int style TextAppearance_AppCompat_Display3 0x0
+int style TextAppearance_AppCompat_Display4 0x0
+int style TextAppearance_AppCompat_Headline 0x0
+int style TextAppearance_AppCompat_Inverse 0x0
+int style TextAppearance_AppCompat_Large 0x0
+int style TextAppearance_AppCompat_Large_Inverse 0x0
+int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x0
+int style TextAppearance_AppCompat_Light_SearchResult_Title 0x0
+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0
+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0
+int style TextAppearance_AppCompat_Medium 0x0
+int style TextAppearance_AppCompat_Medium_Inverse 0x0
+int style TextAppearance_AppCompat_Menu 0x0
+int style TextAppearance_AppCompat_SearchResult_Subtitle 0x0
+int style TextAppearance_AppCompat_SearchResult_Title 0x0
+int style TextAppearance_AppCompat_Small 0x0
+int style TextAppearance_AppCompat_Small_Inverse 0x0
+int style TextAppearance_AppCompat_Subhead 0x0
+int style TextAppearance_AppCompat_Subhead_Inverse 0x0
+int style TextAppearance_AppCompat_Title 0x0
+int style TextAppearance_AppCompat_Title_Inverse 0x0
+int style TextAppearance_AppCompat_Tooltip 0x0
+int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0
+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0
+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0
+int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x0
+int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0
+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0
+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x0
+int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x0
+int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x0
+int style TextAppearance_AppCompat_Widget_Button 0x0
+int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0
+int style TextAppearance_AppCompat_Widget_Button_Colored 0x0
+int style TextAppearance_AppCompat_Widget_Button_Inverse 0x0
+int style TextAppearance_AppCompat_Widget_DropDownItem 0x0
+int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0
+int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0
+int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0
+int style TextAppearance_AppCompat_Widget_Switch 0x0
+int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0
+int style TextAppearance_Compat_Notification 0x0
+int style TextAppearance_Compat_Notification_Info 0x0
+int style TextAppearance_Compat_Notification_Line2 0x0
+int style TextAppearance_Compat_Notification_Time 0x0
+int style TextAppearance_Compat_Notification_Title 0x0
+int style TextAppearance_Design_CollapsingToolbar_Expanded 0x0
+int style TextAppearance_Design_Counter 0x0
+int style TextAppearance_Design_Counter_Overflow 0x0
+int style TextAppearance_Design_Error 0x0
+int style TextAppearance_Design_HelperText 0x0
+int style TextAppearance_Design_Hint 0x0
+int style TextAppearance_Design_Placeholder 0x0
+int style TextAppearance_Design_Prefix 0x0
+int style TextAppearance_Design_Snackbar_Message 0x0
+int style TextAppearance_Design_Suffix 0x0
+int style TextAppearance_Design_Tab 0x0
+int style TextAppearance_MaterialComponents_Badge 0x0
+int style TextAppearance_MaterialComponents_Body1 0x0
+int style TextAppearance_MaterialComponents_Body2 0x0
+int style TextAppearance_MaterialComponents_Button 0x0
+int style TextAppearance_MaterialComponents_Caption 0x0
+int style TextAppearance_MaterialComponents_Chip 0x0
+int style TextAppearance_MaterialComponents_Headline1 0x0
+int style TextAppearance_MaterialComponents_Headline2 0x0
+int style TextAppearance_MaterialComponents_Headline3 0x0
+int style TextAppearance_MaterialComponents_Headline4 0x0
+int style TextAppearance_MaterialComponents_Headline5 0x0
+int style TextAppearance_MaterialComponents_Headline6 0x0
+int style TextAppearance_MaterialComponents_Overline 0x0
+int style TextAppearance_MaterialComponents_Subtitle1 0x0
+int style TextAppearance_MaterialComponents_Subtitle2 0x0
+int style TextAppearance_MaterialComponents_TimePicker_Title 0x0
+int style TextAppearance_MaterialComponents_Tooltip 0x0
+int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0
+int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0
+int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x0
+int style ThemeOverlayColorAccentRed 0x0
+int style ThemeOverlay_AppCompat 0x0
+int style ThemeOverlay_AppCompat_ActionBar 0x0
+int style ThemeOverlay_AppCompat_Dark 0x0
+int style ThemeOverlay_AppCompat_Dark_ActionBar 0x0
+int style ThemeOverlay_AppCompat_DayNight 0x0
+int style ThemeOverlay_AppCompat_DayNight_ActionBar 0x0
+int style ThemeOverlay_AppCompat_Dialog 0x0
+int style ThemeOverlay_AppCompat_Dialog_Alert 0x0
+int style ThemeOverlay_AppCompat_Light 0x0
+int style ThemeOverlay_Design_TextInputEditText 0x0
+int style ThemeOverlay_MaterialComponents 0x0
+int style ThemeOverlay_MaterialComponents_ActionBar 0x0
+int style ThemeOverlay_MaterialComponents_ActionBar_Primary 0x0
+int style ThemeOverlay_MaterialComponents_ActionBar_Surface 0x0
+int style ThemeOverlay_MaterialComponents_AutoCompleteTextView 0x0
+int style ThemeOverlay_MaterialComponents_AutoCompleteTextView_FilledBox 0x0
+int style ThemeOverlay_MaterialComponents_AutoCompleteTextView_FilledBox_Dense 0x0
+int style ThemeOverlay_MaterialComponents_AutoCompleteTextView_OutlinedBox 0x0
+int style ThemeOverlay_MaterialComponents_AutoCompleteTextView_OutlinedBox_Dense 0x0
+int style ThemeOverlay_MaterialComponents_BottomAppBar_Primary 0x0
+int style ThemeOverlay_MaterialComponents_BottomAppBar_Surface 0x0
+int style ThemeOverlay_MaterialComponents_BottomSheetDialog 0x0
+int style ThemeOverlay_MaterialComponents_Dark 0x0
+int style ThemeOverlay_MaterialComponents_Dark_ActionBar 0x0
+int style ThemeOverlay_MaterialComponents_DayNight_BottomSheetDialog 0x0
+int style ThemeOverlay_MaterialComponents_Dialog 0x0
+int style ThemeOverlay_MaterialComponents_Dialog_Alert 0x0
+int style ThemeOverlay_MaterialComponents_Dialog_Alert_Framework 0x0
+int style ThemeOverlay_MaterialComponents_Light 0x0
+int style ThemeOverlay_MaterialComponents_Light_Dialog_Alert_Framework 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Centered 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Calendar 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Header_Text 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Header_Text_Day 0x0
+int style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Spinner 0x0
+int style ThemeOverlay_MaterialComponents_MaterialCalendar 0x0
+int style ThemeOverlay_MaterialComponents_MaterialCalendar_Fullscreen 0x0
+int style ThemeOverlay_MaterialComponents_TextInputEditText 0x0
+int style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox 0x0
+int style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense 0x0
+int style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox 0x0
+int style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense 0x0
+int style ThemeOverlay_MaterialComponents_TimePicker 0x0
+int style ThemeOverlay_MaterialComponents_TimePicker_Display 0x0
+int style ThemeOverlay_MaterialComponents_Toolbar_Primary 0x0
+int style ThemeOverlay_MaterialComponents_Toolbar_Surface 0x0
+int style Theme_AppCompat 0x0
+int style Theme_AppCompat_CompactMenu 0x0
+int style Theme_AppCompat_DayNight 0x0
+int style Theme_AppCompat_DayNight_DarkActionBar 0x0
+int style Theme_AppCompat_DayNight_Dialog 0x0
+int style Theme_AppCompat_DayNight_DialogWhenLarge 0x0
+int style Theme_AppCompat_DayNight_Dialog_Alert 0x0
+int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x0
+int style Theme_AppCompat_DayNight_NoActionBar 0x0
+int style Theme_AppCompat_Dialog 0x0
+int style Theme_AppCompat_DialogWhenLarge 0x0
+int style Theme_AppCompat_Dialog_Alert 0x0
+int style Theme_AppCompat_Dialog_MinWidth 0x0
+int style Theme_AppCompat_Empty 0x0
+int style Theme_AppCompat_Light 0x0
+int style Theme_AppCompat_Light_DarkActionBar 0x0
+int style Theme_AppCompat_Light_Dialog 0x0
+int style Theme_AppCompat_Light_DialogWhenLarge 0x0
+int style Theme_AppCompat_Light_Dialog_Alert 0x0
+int style Theme_AppCompat_Light_Dialog_MinWidth 0x0
+int style Theme_AppCompat_Light_NoActionBar 0x0
+int style Theme_AppCompat_NoActionBar 0x0
+int style Theme_Design 0x0
+int style Theme_Design_BottomSheetDialog 0x0
+int style Theme_Design_Light 0x0
+int style Theme_Design_Light_BottomSheetDialog 0x0
+int style Theme_Design_Light_NoActionBar 0x0
+int style Theme_Design_NoActionBar 0x0
+int style Theme_MaterialComponents 0x0
+int style Theme_MaterialComponents_BottomSheetDialog 0x0
+int style Theme_MaterialComponents_Bridge 0x0
+int style Theme_MaterialComponents_CompactMenu 0x0
+int style Theme_MaterialComponents_DayNight 0x0
+int style Theme_MaterialComponents_DayNight_BottomSheetDialog 0x0
+int style Theme_MaterialComponents_DayNight_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_DarkActionBar 0x0
+int style Theme_MaterialComponents_DayNight_DarkActionBar_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_Dialog 0x0
+int style Theme_MaterialComponents_DayNight_DialogWhenLarge 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_Alert 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_Alert_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_FixedSize 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_FixedSize_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_MinWidth 0x0
+int style Theme_MaterialComponents_DayNight_Dialog_MinWidth_Bridge 0x0
+int style Theme_MaterialComponents_DayNight_NoActionBar 0x0
+int style Theme_MaterialComponents_DayNight_NoActionBar_Bridge 0x0
+int style Theme_MaterialComponents_Dialog 0x0
+int style Theme_MaterialComponents_DialogWhenLarge 0x0
+int style Theme_MaterialComponents_Dialog_Alert 0x0
+int style Theme_MaterialComponents_Dialog_Alert_Bridge 0x0
+int style Theme_MaterialComponents_Dialog_Bridge 0x0
+int style Theme_MaterialComponents_Dialog_FixedSize 0x0
+int style Theme_MaterialComponents_Dialog_FixedSize_Bridge 0x0
+int style Theme_MaterialComponents_Dialog_MinWidth 0x0
+int style Theme_MaterialComponents_Dialog_MinWidth_Bridge 0x0
+int style Theme_MaterialComponents_Light 0x0
+int style Theme_MaterialComponents_Light_BarSize 0x0
+int style Theme_MaterialComponents_Light_BottomSheetDialog 0x0
+int style Theme_MaterialComponents_Light_Bridge 0x0
+int style Theme_MaterialComponents_Light_DarkActionBar 0x0
+int style Theme_MaterialComponents_Light_DarkActionBar_Bridge 0x0
+int style Theme_MaterialComponents_Light_Dialog 0x0
+int style Theme_MaterialComponents_Light_DialogWhenLarge 0x0
+int style Theme_MaterialComponents_Light_Dialog_Alert 0x0
+int style Theme_MaterialComponents_Light_Dialog_Alert_Bridge 0x0
+int style Theme_MaterialComponents_Light_Dialog_Bridge 0x0
+int style Theme_MaterialComponents_Light_Dialog_FixedSize 0x0
+int style Theme_MaterialComponents_Light_Dialog_FixedSize_Bridge 0x0
+int style Theme_MaterialComponents_Light_Dialog_MinWidth 0x0
+int style Theme_MaterialComponents_Light_Dialog_MinWidth_Bridge 0x0
+int style Theme_MaterialComponents_Light_LargeTouch 0x0
+int style Theme_MaterialComponents_Light_NoActionBar 0x0
+int style Theme_MaterialComponents_Light_NoActionBar_Bridge 0x0
+int style Theme_MaterialComponents_NoActionBar 0x0
+int style Theme_MaterialComponents_NoActionBar_Bridge 0x0
+int style Widget_AppCompat_ActionBar 0x0
+int style Widget_AppCompat_ActionBar_Solid 0x0
+int style Widget_AppCompat_ActionBar_TabBar 0x0
+int style Widget_AppCompat_ActionBar_TabText 0x0
+int style Widget_AppCompat_ActionBar_TabView 0x0
+int style Widget_AppCompat_ActionButton 0x0
+int style Widget_AppCompat_ActionButton_CloseMode 0x0
+int style Widget_AppCompat_ActionButton_Overflow 0x0
+int style Widget_AppCompat_ActionMode 0x0
+int style Widget_AppCompat_ActivityChooserView 0x0
+int style Widget_AppCompat_AutoCompleteTextView 0x0
+int style Widget_AppCompat_Button 0x0
+int style Widget_AppCompat_ButtonBar 0x0
+int style Widget_AppCompat_ButtonBar_AlertDialog 0x0
+int style Widget_AppCompat_Button_Borderless 0x0
+int style Widget_AppCompat_Button_Borderless_Colored 0x0
+int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0
+int style Widget_AppCompat_Button_Colored 0x0
+int style Widget_AppCompat_Button_Small 0x0
+int style Widget_AppCompat_CompoundButton_CheckBox 0x0
+int style Widget_AppCompat_CompoundButton_RadioButton 0x0
+int style Widget_AppCompat_CompoundButton_Switch 0x0
+int style Widget_AppCompat_DrawerArrowToggle 0x0
+int style Widget_AppCompat_DropDownItem_Spinner 0x0
+int style Widget_AppCompat_EditText 0x0
+int style Widget_AppCompat_ImageButton 0x0
+int style Widget_AppCompat_Light_ActionBar 0x0
+int style Widget_AppCompat_Light_ActionBar_Solid 0x0
+int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x0
+int style Widget_AppCompat_Light_ActionBar_TabBar 0x0
+int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x0
+int style Widget_AppCompat_Light_ActionBar_TabText 0x0
+int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0
+int style Widget_AppCompat_Light_ActionBar_TabView 0x0
+int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x0
+int style Widget_AppCompat_Light_ActionButton 0x0
+int style Widget_AppCompat_Light_ActionButton_CloseMode 0x0
+int style Widget_AppCompat_Light_ActionButton_Overflow 0x0
+int style Widget_AppCompat_Light_ActionMode_Inverse 0x0
+int style Widget_AppCompat_Light_ActivityChooserView 0x0
+int style Widget_AppCompat_Light_AutoCompleteTextView 0x0
+int style Widget_AppCompat_Light_DropDownItem_Spinner 0x0
+int style Widget_AppCompat_Light_ListPopupWindow 0x0
+int style Widget_AppCompat_Light_ListView_DropDown 0x0
+int style Widget_AppCompat_Light_PopupMenu 0x0
+int style Widget_AppCompat_Light_PopupMenu_Overflow 0x0
+int style Widget_AppCompat_Light_SearchView 0x0
+int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x0
+int style Widget_AppCompat_ListMenuView 0x0
+int style Widget_AppCompat_ListPopupWindow 0x0
+int style Widget_AppCompat_ListView 0x0
+int style Widget_AppCompat_ListView_DropDown 0x0
+int style Widget_AppCompat_ListView_Menu 0x0
+int style Widget_AppCompat_PopupMenu 0x0
+int style Widget_AppCompat_PopupMenu_Overflow 0x0
+int style Widget_AppCompat_PopupWindow 0x0
+int style Widget_AppCompat_ProgressBar 0x0
+int style Widget_AppCompat_ProgressBar_Horizontal 0x0
+int style Widget_AppCompat_RatingBar 0x0
+int style Widget_AppCompat_RatingBar_Indicator 0x0
+int style Widget_AppCompat_RatingBar_Small 0x0
+int style Widget_AppCompat_SearchView 0x0
+int style Widget_AppCompat_SearchView_ActionBar 0x0
+int style Widget_AppCompat_SeekBar 0x0
+int style Widget_AppCompat_SeekBar_Discrete 0x0
+int style Widget_AppCompat_Spinner 0x0
+int style Widget_AppCompat_Spinner_DropDown 0x0
+int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x0
+int style Widget_AppCompat_Spinner_Underlined 0x0
+int style Widget_AppCompat_TextView 0x0
+int style Widget_AppCompat_TextView_SpinnerItem 0x0
+int style Widget_AppCompat_Toolbar 0x0
+int style Widget_AppCompat_Toolbar_Button_Navigation 0x0
+int style Widget_Compat_NotificationActionContainer 0x0
+int style Widget_Compat_NotificationActionText 0x0
+int style Widget_Design_AppBarLayout 0x0
+int style Widget_Design_BottomNavigationView 0x0
+int style Widget_Design_BottomSheet_Modal 0x0
+int style Widget_Design_CollapsingToolbar 0x0
+int style Widget_Design_FloatingActionButton 0x0
+int style Widget_Design_NavigationView 0x0
+int style Widget_Design_ScrimInsetsFrameLayout 0x0
+int style Widget_Design_Snackbar 0x0
+int style Widget_Design_TabLayout 0x0
+int style Widget_Design_TextInputEditText 0x0
+int style Widget_Design_TextInputLayout 0x0
+int style Widget_MaterialComponents_ActionBar_Primary 0x0
+int style Widget_MaterialComponents_ActionBar_PrimarySurface 0x0
+int style Widget_MaterialComponents_ActionBar_Solid 0x0
+int style Widget_MaterialComponents_ActionBar_Surface 0x0
+int style Widget_MaterialComponents_AppBarLayout_Primary 0x0
+int style Widget_MaterialComponents_AppBarLayout_PrimarySurface 0x0
+int style Widget_MaterialComponents_AppBarLayout_Surface 0x0
+int style Widget_MaterialComponents_AutoCompleteTextView_FilledBox 0x0
+int style Widget_MaterialComponents_AutoCompleteTextView_FilledBox_Dense 0x0
+int style Widget_MaterialComponents_AutoCompleteTextView_OutlinedBox 0x0
+int style Widget_MaterialComponents_AutoCompleteTextView_OutlinedBox_Dense 0x0
+int style Widget_MaterialComponents_Badge 0x0
+int style Widget_MaterialComponents_BottomAppBar 0x0
+int style Widget_MaterialComponents_BottomAppBar_Colored 0x0
+int style Widget_MaterialComponents_BottomAppBar_PrimarySurface 0x0
+int style Widget_MaterialComponents_BottomNavigationView 0x0
+int style Widget_MaterialComponents_BottomNavigationView_Colored 0x0
+int style Widget_MaterialComponents_BottomNavigationView_PrimarySurface 0x0
+int style Widget_MaterialComponents_BottomSheet 0x0
+int style Widget_MaterialComponents_BottomSheet_Modal 0x0
+int style Widget_MaterialComponents_Button 0x0
+int style Widget_MaterialComponents_Button_Icon 0x0
+int style Widget_MaterialComponents_Button_OutlinedButton 0x0
+int style Widget_MaterialComponents_Button_OutlinedButton_Icon 0x0
+int style Widget_MaterialComponents_Button_TextButton 0x0
+int style Widget_MaterialComponents_Button_TextButton_Dialog 0x0
+int style Widget_MaterialComponents_Button_TextButton_Dialog_Flush 0x0
+int style Widget_MaterialComponents_Button_TextButton_Dialog_Icon 0x0
+int style Widget_MaterialComponents_Button_TextButton_Icon 0x0
+int style Widget_MaterialComponents_Button_TextButton_Snackbar 0x0
+int style Widget_MaterialComponents_Button_UnelevatedButton 0x0
+int style Widget_MaterialComponents_Button_UnelevatedButton_Icon 0x0
+int style Widget_MaterialComponents_CardView 0x0
+int style Widget_MaterialComponents_CheckedTextView 0x0
+int style Widget_MaterialComponents_ChipGroup 0x0
+int style Widget_MaterialComponents_Chip_Action 0x0
+int style Widget_MaterialComponents_Chip_Choice 0x0
+int style Widget_MaterialComponents_Chip_Entry 0x0
+int style Widget_MaterialComponents_Chip_Filter 0x0
+int style Widget_MaterialComponents_CircularProgressIndicator 0x0
+int style Widget_MaterialComponents_CircularProgressIndicator_ExtraSmall 0x0
+int style Widget_MaterialComponents_CircularProgressIndicator_Medium 0x0
+int style Widget_MaterialComponents_CircularProgressIndicator_Small 0x0
+int style Widget_MaterialComponents_CollapsingToolbar 0x0
+int style Widget_MaterialComponents_CompoundButton_CheckBox 0x0
+int style Widget_MaterialComponents_CompoundButton_RadioButton 0x0
+int style Widget_MaterialComponents_CompoundButton_Switch 0x0
+int style Widget_MaterialComponents_ExtendedFloatingActionButton 0x0
+int style Widget_MaterialComponents_ExtendedFloatingActionButton_Icon 0x0
+int style Widget_MaterialComponents_FloatingActionButton 0x0
+int style Widget_MaterialComponents_Light_ActionBar_Solid 0x0
+int style Widget_MaterialComponents_LinearProgressIndicator 0x0
+int style Widget_MaterialComponents_MaterialButtonToggleGroup 0x0
+int style Widget_MaterialComponents_MaterialCalendar 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Day 0x0
+int style Widget_MaterialComponents_MaterialCalendar_DayTextView 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Day_Invalid 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Day_Selected 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Day_Today 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Fullscreen 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderCancelButton 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderConfirmButton 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderDivider 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderLayout 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderSelection 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderSelection_Fullscreen 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderTitle 0x0
+int style Widget_MaterialComponents_MaterialCalendar_HeaderToggleButton 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Item 0x0
+int style Widget_MaterialComponents_MaterialCalendar_MonthNavigationButton 0x0
+int style Widget_MaterialComponents_MaterialCalendar_MonthTextView 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Year 0x0
+int style Widget_MaterialComponents_MaterialCalendar_YearNavigationButton 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Year_Selected 0x0
+int style Widget_MaterialComponents_MaterialCalendar_Year_Today 0x0
+int style Widget_MaterialComponents_NavigationRailView 0x0
+int style Widget_MaterialComponents_NavigationRailView_Colored 0x0
+int style Widget_MaterialComponents_NavigationRailView_Colored_Compact 0x0
+int style Widget_MaterialComponents_NavigationRailView_Compact 0x0
+int style Widget_MaterialComponents_NavigationRailView_PrimarySurface 0x0
+int style Widget_MaterialComponents_NavigationView 0x0
+int style Widget_MaterialComponents_PopupMenu 0x0
+int style Widget_MaterialComponents_PopupMenu_ContextMenu 0x0
+int style Widget_MaterialComponents_PopupMenu_ListPopupWindow 0x0
+int style Widget_MaterialComponents_PopupMenu_Overflow 0x0
+int style Widget_MaterialComponents_ProgressIndicator 0x0
+int style Widget_MaterialComponents_ShapeableImageView 0x0
+int style Widget_MaterialComponents_Slider 0x0
+int style Widget_MaterialComponents_Snackbar 0x0
+int style Widget_MaterialComponents_Snackbar_FullWidth 0x0
+int style Widget_MaterialComponents_Snackbar_TextView 0x0
+int style Widget_MaterialComponents_TabLayout 0x0
+int style Widget_MaterialComponents_TabLayout_Colored 0x0
+int style Widget_MaterialComponents_TabLayout_PrimarySurface 0x0
+int style Widget_MaterialComponents_TextInputEditText_FilledBox 0x0
+int style Widget_MaterialComponents_TextInputEditText_FilledBox_Dense 0x0
+int style Widget_MaterialComponents_TextInputEditText_OutlinedBox 0x0
+int style Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense 0x0
+int style Widget_MaterialComponents_TextInputLayout_FilledBox 0x0
+int style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense 0x0
+int style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense_ExposedDropdownMenu 0x0
+int style Widget_MaterialComponents_TextInputLayout_FilledBox_ExposedDropdownMenu 0x0
+int style Widget_MaterialComponents_TextInputLayout_OutlinedBox 0x0
+int style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense 0x0
+int style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense_ExposedDropdownMenu 0x0
+int style Widget_MaterialComponents_TextInputLayout_OutlinedBox_ExposedDropdownMenu 0x0
+int style Widget_MaterialComponents_TextView 0x0
+int style Widget_MaterialComponents_TimePicker 0x0
+int style Widget_MaterialComponents_TimePicker_Button 0x0
+int style Widget_MaterialComponents_TimePicker_Clock 0x0
+int style Widget_MaterialComponents_TimePicker_Display 0x0
+int style Widget_MaterialComponents_TimePicker_Display_TextInputEditText 0x0
+int style Widget_MaterialComponents_TimePicker_ImageButton 0x0
+int style Widget_MaterialComponents_TimePicker_ImageButton_ShapeAppearance 0x0
+int style Widget_MaterialComponents_Toolbar 0x0
+int style Widget_MaterialComponents_Toolbar_Primary 0x0
+int style Widget_MaterialComponents_Toolbar_PrimarySurface 0x0
+int style Widget_MaterialComponents_Toolbar_Surface 0x0
+int style Widget_MaterialComponents_Tooltip 0x0
+int style Widget_Support_CoordinatorLayout 0x0
+int[] styleable ActionBar { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ActionBar_background 0
+int styleable ActionBar_backgroundSplit 1
+int styleable ActionBar_backgroundStacked 2
+int styleable ActionBar_contentInsetEnd 3
+int styleable ActionBar_contentInsetEndWithActions 4
+int styleable ActionBar_contentInsetLeft 5
+int styleable ActionBar_contentInsetRight 6
+int styleable ActionBar_contentInsetStart 7
+int styleable ActionBar_contentInsetStartWithNavigation 8
+int styleable ActionBar_customNavigationLayout 9
+int styleable ActionBar_displayOptions 10
+int styleable ActionBar_divider 11
+int styleable ActionBar_elevation 12
+int styleable ActionBar_height 13
+int styleable ActionBar_hideOnContentScroll 14
+int styleable ActionBar_homeAsUpIndicator 15
+int styleable ActionBar_homeLayout 16
+int styleable ActionBar_icon 17
+int styleable ActionBar_indeterminateProgressStyle 18
+int styleable ActionBar_itemPadding 19
+int styleable ActionBar_logo 20
+int styleable ActionBar_navigationMode 21
+int styleable ActionBar_popupTheme 22
+int styleable ActionBar_progressBarPadding 23
+int styleable ActionBar_progressBarStyle 24
+int styleable ActionBar_subtitle 25
+int styleable ActionBar_subtitleTextStyle 26
+int styleable ActionBar_title 27
+int styleable ActionBar_titleTextStyle 28
+int[] styleable ActionBarLayout { 0x10100b3 }
+int styleable ActionBarLayout_android_layout_gravity 0
+int[] styleable ActionMenuItemView { 0x101013f }
+int styleable ActionMenuItemView_android_minWidth 0
+int[] styleable ActionMenuView { }
+int[] styleable ActionMode { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ActionMode_background 0
+int styleable ActionMode_backgroundSplit 1
+int styleable ActionMode_closeItemLayout 2
+int styleable ActionMode_height 3
+int styleable ActionMode_subtitleTextStyle 4
+int styleable ActionMode_titleTextStyle 5
+int[] styleable ActivityChooserView { 0x0, 0x0 }
+int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0
+int styleable ActivityChooserView_initialActivityCount 1
+int[] styleable AlertDialog { 0x10100f2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable AlertDialog_android_layout 0
+int styleable AlertDialog_buttonIconDimen 1
+int styleable AlertDialog_buttonPanelSideLayout 2
+int styleable AlertDialog_listItemLayout 3
+int styleable AlertDialog_listLayout 4
+int styleable AlertDialog_multiChoiceItemLayout 5
+int styleable AlertDialog_showTitle 6
+int styleable AlertDialog_singleChoiceItemLayout 7
+int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
+int styleable AnimatedStateListDrawableCompat_android_constantSize 0
+int styleable AnimatedStateListDrawableCompat_android_dither 1
+int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2
+int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3
+int styleable AnimatedStateListDrawableCompat_android_variablePadding 4
+int styleable AnimatedStateListDrawableCompat_android_visible 5
+int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 }
+int styleable AnimatedStateListDrawableItem_android_drawable 0
+int styleable AnimatedStateListDrawableItem_android_id 1
+int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 }
+int styleable AnimatedStateListDrawableTransition_android_drawable 0
+int styleable AnimatedStateListDrawableTransition_android_fromId 1
+int styleable AnimatedStateListDrawableTransition_android_reversible 2
+int styleable AnimatedStateListDrawableTransition_android_toId 3
+int[] styleable AppBarLayout { 0x10100d4, 0x1010540, 0x101048f, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable AppBarLayout_android_background 0
+int styleable AppBarLayout_android_keyboardNavigationCluster 1
+int styleable AppBarLayout_android_touchscreenBlocksFocus 2
+int styleable AppBarLayout_elevation 3
+int styleable AppBarLayout_expanded 4
+int styleable AppBarLayout_liftOnScroll 5
+int styleable AppBarLayout_liftOnScrollTargetViewId 6
+int styleable AppBarLayout_statusBarForeground 7
+int[] styleable AppBarLayoutStates { 0x0, 0x0, 0x0, 0x0 }
+int styleable AppBarLayoutStates_state_collapsed 0
+int styleable AppBarLayoutStates_state_collapsible 1
+int styleable AppBarLayoutStates_state_liftable 2
+int styleable AppBarLayoutStates_state_lifted 3
+int[] styleable AppBarLayout_Layout { 0x0, 0x0 }
+int styleable AppBarLayout_Layout_layout_scrollFlags 0
+int styleable AppBarLayout_Layout_layout_scrollInterpolator 1
+int[] styleable AppCompatImageView { 0x1010119, 0x0, 0x0, 0x0 }
+int styleable AppCompatImageView_android_src 0
+int styleable AppCompatImageView_srcCompat 1
+int styleable AppCompatImageView_tint 2
+int styleable AppCompatImageView_tintMode 3
+int[] styleable AppCompatSeekBar { 0x1010142, 0x0, 0x0, 0x0 }
+int styleable AppCompatSeekBar_android_thumb 0
+int styleable AppCompatSeekBar_tickMark 1
+int styleable AppCompatSeekBar_tickMarkTint 2
+int styleable AppCompatSeekBar_tickMarkTintMode 3
+int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 }
+int styleable AppCompatTextHelper_android_drawableBottom 0
+int styleable AppCompatTextHelper_android_drawableEnd 1
+int styleable AppCompatTextHelper_android_drawableLeft 2
+int styleable AppCompatTextHelper_android_drawableRight 3
+int styleable AppCompatTextHelper_android_drawableStart 4
+int styleable AppCompatTextHelper_android_drawableTop 5
+int styleable AppCompatTextHelper_android_textAppearance 6
+int[] styleable AppCompatTextView { 0x1010034, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable AppCompatTextView_android_textAppearance 0
+int styleable AppCompatTextView_autoSizeMaxTextSize 1
+int styleable AppCompatTextView_autoSizeMinTextSize 2
+int styleable AppCompatTextView_autoSizePresetSizes 3
+int styleable AppCompatTextView_autoSizeStepGranularity 4
+int styleable AppCompatTextView_autoSizeTextType 5
+int styleable AppCompatTextView_drawableBottomCompat 6
+int styleable AppCompatTextView_drawableEndCompat 7
+int styleable AppCompatTextView_drawableLeftCompat 8
+int styleable AppCompatTextView_drawableRightCompat 9
+int styleable AppCompatTextView_drawableStartCompat 10
+int styleable AppCompatTextView_drawableTint 11
+int styleable AppCompatTextView_drawableTintMode 12
+int styleable AppCompatTextView_drawableTopCompat 13
+int styleable AppCompatTextView_firstBaselineToTopHeight 14
+int styleable AppCompatTextView_fontFamily 15
+int styleable AppCompatTextView_fontVariationSettings 16
+int styleable AppCompatTextView_lastBaselineToBottomHeight 17
+int styleable AppCompatTextView_lineHeight 18
+int styleable AppCompatTextView_textAllCaps 19
+int styleable AppCompatTextView_textLocale 20
+int[] styleable AppCompatTheme { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10100ae, 0x1010057, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable AppCompatTheme_actionBarDivider 0
+int styleable AppCompatTheme_actionBarItemBackground 1
+int styleable AppCompatTheme_actionBarPopupTheme 2
+int styleable AppCompatTheme_actionBarSize 3
+int styleable AppCompatTheme_actionBarSplitStyle 4
+int styleable AppCompatTheme_actionBarStyle 5
+int styleable AppCompatTheme_actionBarTabBarStyle 6
+int styleable AppCompatTheme_actionBarTabStyle 7
+int styleable AppCompatTheme_actionBarTabTextStyle 8
+int styleable AppCompatTheme_actionBarTheme 9
+int styleable AppCompatTheme_actionBarWidgetTheme 10
+int styleable AppCompatTheme_actionButtonStyle 11
+int styleable AppCompatTheme_actionDropDownStyle 12
+int styleable AppCompatTheme_actionMenuTextAppearance 13
+int styleable AppCompatTheme_actionMenuTextColor 14
+int styleable AppCompatTheme_actionModeBackground 15
+int styleable AppCompatTheme_actionModeCloseButtonStyle 16
+int styleable AppCompatTheme_actionModeCloseContentDescription 17
+int styleable AppCompatTheme_actionModeCloseDrawable 18
+int styleable AppCompatTheme_actionModeCopyDrawable 19
+int styleable AppCompatTheme_actionModeCutDrawable 20
+int styleable AppCompatTheme_actionModeFindDrawable 21
+int styleable AppCompatTheme_actionModePasteDrawable 22
+int styleable AppCompatTheme_actionModePopupWindowStyle 23
+int styleable AppCompatTheme_actionModeSelectAllDrawable 24
+int styleable AppCompatTheme_actionModeShareDrawable 25
+int styleable AppCompatTheme_actionModeSplitBackground 26
+int styleable AppCompatTheme_actionModeStyle 27
+int styleable AppCompatTheme_actionModeTheme 28
+int styleable AppCompatTheme_actionModeWebSearchDrawable 29
+int styleable AppCompatTheme_actionOverflowButtonStyle 30
+int styleable AppCompatTheme_actionOverflowMenuStyle 31
+int styleable AppCompatTheme_activityChooserViewStyle 32
+int styleable AppCompatTheme_alertDialogButtonGroupStyle 33
+int styleable AppCompatTheme_alertDialogCenterButtons 34
+int styleable AppCompatTheme_alertDialogStyle 35
+int styleable AppCompatTheme_alertDialogTheme 36
+int styleable AppCompatTheme_android_windowAnimationStyle 37
+int styleable AppCompatTheme_android_windowIsFloating 38
+int styleable AppCompatTheme_autoCompleteTextViewStyle 39
+int styleable AppCompatTheme_borderlessButtonStyle 40
+int styleable AppCompatTheme_buttonBarButtonStyle 41
+int styleable AppCompatTheme_buttonBarNegativeButtonStyle 42
+int styleable AppCompatTheme_buttonBarNeutralButtonStyle 43
+int styleable AppCompatTheme_buttonBarPositiveButtonStyle 44
+int styleable AppCompatTheme_buttonBarStyle 45
+int styleable AppCompatTheme_buttonStyle 46
+int styleable AppCompatTheme_buttonStyleSmall 47
+int styleable AppCompatTheme_checkboxStyle 48
+int styleable AppCompatTheme_checkedTextViewStyle 49
+int styleable AppCompatTheme_colorAccent 50
+int styleable AppCompatTheme_colorBackgroundFloating 51
+int styleable AppCompatTheme_colorButtonNormal 52
+int styleable AppCompatTheme_colorControlActivated 53
+int styleable AppCompatTheme_colorControlHighlight 54
+int styleable AppCompatTheme_colorControlNormal 55
+int styleable AppCompatTheme_colorError 56
+int styleable AppCompatTheme_colorPrimary 57
+int styleable AppCompatTheme_colorPrimaryDark 58
+int styleable AppCompatTheme_colorSwitchThumbNormal 59
+int styleable AppCompatTheme_controlBackground 60
+int styleable AppCompatTheme_dialogCornerRadius 61
+int styleable AppCompatTheme_dialogPreferredPadding 62
+int styleable AppCompatTheme_dialogTheme 63
+int styleable AppCompatTheme_dividerHorizontal 64
+int styleable AppCompatTheme_dividerVertical 65
+int styleable AppCompatTheme_dropDownListViewStyle 66
+int styleable AppCompatTheme_dropdownListPreferredItemHeight 67
+int styleable AppCompatTheme_editTextBackground 68
+int styleable AppCompatTheme_editTextColor 69
+int styleable AppCompatTheme_editTextStyle 70
+int styleable AppCompatTheme_homeAsUpIndicator 71
+int styleable AppCompatTheme_imageButtonStyle 72
+int styleable AppCompatTheme_listChoiceBackgroundIndicator 73
+int styleable AppCompatTheme_listChoiceIndicatorMultipleAnimated 74
+int styleable AppCompatTheme_listChoiceIndicatorSingleAnimated 75
+int styleable AppCompatTheme_listDividerAlertDialog 76
+int styleable AppCompatTheme_listMenuViewStyle 77
+int styleable AppCompatTheme_listPopupWindowStyle 78
+int styleable AppCompatTheme_listPreferredItemHeight 79
+int styleable AppCompatTheme_listPreferredItemHeightLarge 80
+int styleable AppCompatTheme_listPreferredItemHeightSmall 81
+int styleable AppCompatTheme_listPreferredItemPaddingEnd 82
+int styleable AppCompatTheme_listPreferredItemPaddingLeft 83
+int styleable AppCompatTheme_listPreferredItemPaddingRight 84
+int styleable AppCompatTheme_listPreferredItemPaddingStart 85
+int styleable AppCompatTheme_panelBackground 86
+int styleable AppCompatTheme_panelMenuListTheme 87
+int styleable AppCompatTheme_panelMenuListWidth 88
+int styleable AppCompatTheme_popupMenuStyle 89
+int styleable AppCompatTheme_popupWindowStyle 90
+int styleable AppCompatTheme_radioButtonStyle 91
+int styleable AppCompatTheme_ratingBarStyle 92
+int styleable AppCompatTheme_ratingBarStyleIndicator 93
+int styleable AppCompatTheme_ratingBarStyleSmall 94
+int styleable AppCompatTheme_searchViewStyle 95
+int styleable AppCompatTheme_seekBarStyle 96
+int styleable AppCompatTheme_selectableItemBackground 97
+int styleable AppCompatTheme_selectableItemBackgroundBorderless 98
+int styleable AppCompatTheme_spinnerDropDownItemStyle 99
+int styleable AppCompatTheme_spinnerStyle 100
+int styleable AppCompatTheme_switchStyle 101
+int styleable AppCompatTheme_textAppearanceLargePopupMenu 102
+int styleable AppCompatTheme_textAppearanceListItem 103
+int styleable AppCompatTheme_textAppearanceListItemSecondary 104
+int styleable AppCompatTheme_textAppearanceListItemSmall 105
+int styleable AppCompatTheme_textAppearancePopupMenuHeader 106
+int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 107
+int styleable AppCompatTheme_textAppearanceSearchResultTitle 108
+int styleable AppCompatTheme_textAppearanceSmallPopupMenu 109
+int styleable AppCompatTheme_textColorAlertDialogListItem 110
+int styleable AppCompatTheme_textColorSearchUrl 111
+int styleable AppCompatTheme_toolbarNavigationButtonStyle 112
+int styleable AppCompatTheme_toolbarStyle 113
+int styleable AppCompatTheme_tooltipForegroundColor 114
+int styleable AppCompatTheme_tooltipFrameBackground 115
+int styleable AppCompatTheme_viewInflaterClass 116
+int styleable AppCompatTheme_windowActionBar 117
+int styleable AppCompatTheme_windowActionBarOverlay 118
+int styleable AppCompatTheme_windowActionModeOverlay 119
+int styleable AppCompatTheme_windowFixedHeightMajor 120
+int styleable AppCompatTheme_windowFixedHeightMinor 121
+int styleable AppCompatTheme_windowFixedWidthMajor 122
+int styleable AppCompatTheme_windowFixedWidthMinor 123
+int styleable AppCompatTheme_windowMinWidthMajor 124
+int styleable AppCompatTheme_windowMinWidthMinor 125
+int styleable AppCompatTheme_windowNoTitle 126
+int[] styleable Badge { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Badge_backgroundColor 0
+int styleable Badge_badgeGravity 1
+int styleable Badge_badgeTextColor 2
+int styleable Badge_horizontalOffset 3
+int styleable Badge_maxCharacterCount 4
+int styleable Badge_number 5
+int styleable Badge_verticalOffset 6
+int[] styleable BaseProgressIndicator { 0x1010139, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable BaseProgressIndicator_android_indeterminate 0
+int styleable BaseProgressIndicator_hideAnimationBehavior 1
+int styleable BaseProgressIndicator_indicatorColor 2
+int styleable BaseProgressIndicator_minHideDelay 3
+int styleable BaseProgressIndicator_showAnimationBehavior 4
+int styleable BaseProgressIndicator_showDelay 5
+int styleable BaseProgressIndicator_trackColor 6
+int styleable BaseProgressIndicator_trackCornerRadius 7
+int styleable BaseProgressIndicator_trackThickness 8
+int[] styleable BottomAppBar { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable BottomAppBar_backgroundTint 0
+int styleable BottomAppBar_elevation 1
+int styleable BottomAppBar_fabAlignmentMode 2
+int styleable BottomAppBar_fabAnimationMode 3
+int styleable BottomAppBar_fabCradleMargin 4
+int styleable BottomAppBar_fabCradleRoundedCornerRadius 5
+int styleable BottomAppBar_fabCradleVerticalOffset 6
+int styleable BottomAppBar_hideOnScroll 7
+int styleable BottomAppBar_paddingBottomSystemWindowInsets 8
+int styleable BottomAppBar_paddingLeftSystemWindowInsets 9
+int styleable BottomAppBar_paddingRightSystemWindowInsets 10
+int[] styleable BottomNavigationView { 0x0 }
+int styleable BottomNavigationView_itemHorizontalTranslationEnabled 0
+int[] styleable BottomSheetBehavior_Layout { 0x1010440, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable BottomSheetBehavior_Layout_android_elevation 0
+int styleable BottomSheetBehavior_Layout_android_maxWidth 1
+int styleable BottomSheetBehavior_Layout_backgroundTint 2
+int styleable BottomSheetBehavior_Layout_behavior_draggable 3
+int styleable BottomSheetBehavior_Layout_behavior_expandedOffset 4
+int styleable BottomSheetBehavior_Layout_behavior_fitToContents 5
+int styleable BottomSheetBehavior_Layout_behavior_halfExpandedRatio 6
+int styleable BottomSheetBehavior_Layout_behavior_hideable 7
+int styleable BottomSheetBehavior_Layout_behavior_peekHeight 8
+int styleable BottomSheetBehavior_Layout_behavior_saveFlags 9
+int styleable BottomSheetBehavior_Layout_behavior_skipCollapsed 10
+int styleable BottomSheetBehavior_Layout_gestureInsetBottomIgnored 11
+int styleable BottomSheetBehavior_Layout_paddingBottomSystemWindowInsets 12
+int styleable BottomSheetBehavior_Layout_paddingLeftSystemWindowInsets 13
+int styleable BottomSheetBehavior_Layout_paddingRightSystemWindowInsets 14
+int styleable BottomSheetBehavior_Layout_paddingTopSystemWindowInsets 15
+int styleable BottomSheetBehavior_Layout_shapeAppearance 16
+int styleable BottomSheetBehavior_Layout_shapeAppearanceOverlay 17
+int[] styleable ButtonBarLayout { 0x0 }
+int styleable ButtonBarLayout_allowStacking 0
+int[] styleable Capability { 0x0, 0x0 }
+int styleable Capability_queryPatterns 0
+int styleable Capability_shortcutMatchRequired 1
+int[] styleable CardView { 0x1010140, 0x101013f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable CardView_android_minHeight 0
+int styleable CardView_android_minWidth 1
+int styleable CardView_cardBackgroundColor 2
+int styleable CardView_cardCornerRadius 3
+int styleable CardView_cardElevation 4
+int styleable CardView_cardMaxElevation 5
+int styleable CardView_cardPreventCornerOverlap 6
+int styleable CardView_cardUseCompatPadding 7
+int styleable CardView_contentPadding 8
+int styleable CardView_contentPaddingBottom 9
+int styleable CardView_contentPaddingLeft 10
+int styleable CardView_contentPaddingRight 11
+int styleable CardView_contentPaddingTop 12
+int[] styleable Chip { 0x10101e5, 0x10100ab, 0x101011f, 0x101014f, 0x1010034, 0x1010098, 0x1010095, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Chip_android_checkable 0
+int styleable Chip_android_ellipsize 1
+int styleable Chip_android_maxWidth 2
+int styleable Chip_android_text 3
+int styleable Chip_android_textAppearance 4
+int styleable Chip_android_textColor 5
+int styleable Chip_android_textSize 6
+int styleable Chip_checkedIcon 7
+int styleable Chip_checkedIconEnabled 8
+int styleable Chip_checkedIconTint 9
+int styleable Chip_checkedIconVisible 10
+int styleable Chip_chipBackgroundColor 11
+int styleable Chip_chipCornerRadius 12
+int styleable Chip_chipEndPadding 13
+int styleable Chip_chipIcon 14
+int styleable Chip_chipIconEnabled 15
+int styleable Chip_chipIconSize 16
+int styleable Chip_chipIconTint 17
+int styleable Chip_chipIconVisible 18
+int styleable Chip_chipMinHeight 19
+int styleable Chip_chipMinTouchTargetSize 20
+int styleable Chip_chipStartPadding 21
+int styleable Chip_chipStrokeColor 22
+int styleable Chip_chipStrokeWidth 23
+int styleable Chip_chipSurfaceColor 24
+int styleable Chip_closeIcon 25
+int styleable Chip_closeIconEnabled 26
+int styleable Chip_closeIconEndPadding 27
+int styleable Chip_closeIconSize 28
+int styleable Chip_closeIconStartPadding 29
+int styleable Chip_closeIconTint 30
+int styleable Chip_closeIconVisible 31
+int styleable Chip_ensureMinTouchTargetSize 32
+int styleable Chip_hideMotionSpec 33
+int styleable Chip_iconEndPadding 34
+int styleable Chip_iconStartPadding 35
+int styleable Chip_rippleColor 36
+int styleable Chip_shapeAppearance 37
+int styleable Chip_shapeAppearanceOverlay 38
+int styleable Chip_showMotionSpec 39
+int styleable Chip_textEndPadding 40
+int styleable Chip_textStartPadding 41
+int[] styleable ChipGroup { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ChipGroup_checkedChip 0
+int styleable ChipGroup_chipSpacing 1
+int styleable ChipGroup_chipSpacingHorizontal 2
+int styleable ChipGroup_chipSpacingVertical 3
+int styleable ChipGroup_selectionRequired 4
+int styleable ChipGroup_singleLine 5
+int styleable ChipGroup_singleSelection 6
+int[] styleable CircularProgressIndicator { 0x0, 0x0, 0x0 }
+int styleable CircularProgressIndicator_indicatorDirectionCircular 0
+int styleable CircularProgressIndicator_indicatorInset 1
+int styleable CircularProgressIndicator_indicatorSize 2
+int[] styleable ClockFaceView { 0x0, 0x0 }
+int styleable ClockFaceView_clockFaceBackgroundColor 0
+int styleable ClockFaceView_clockNumberTextColor 1
+int[] styleable ClockHandView { 0x0, 0x0, 0x0 }
+int styleable ClockHandView_clockHandColor 0
+int styleable ClockHandView_materialCircleRadius 1
+int styleable ClockHandView_selectorSize 2
+int[] styleable CollapsingToolbarLayout { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable CollapsingToolbarLayout_collapsedTitleGravity 0
+int styleable CollapsingToolbarLayout_collapsedTitleTextAppearance 1
+int styleable CollapsingToolbarLayout_contentScrim 2
+int styleable CollapsingToolbarLayout_expandedTitleGravity 3
+int styleable CollapsingToolbarLayout_expandedTitleMargin 4
+int styleable CollapsingToolbarLayout_expandedTitleMarginBottom 5
+int styleable CollapsingToolbarLayout_expandedTitleMarginEnd 6
+int styleable CollapsingToolbarLayout_expandedTitleMarginStart 7
+int styleable CollapsingToolbarLayout_expandedTitleMarginTop 8
+int styleable CollapsingToolbarLayout_expandedTitleTextAppearance 9
+int styleable CollapsingToolbarLayout_extraMultilineHeightEnabled 10
+int styleable CollapsingToolbarLayout_forceApplySystemWindowInsetTop 11
+int styleable CollapsingToolbarLayout_maxLines 12
+int styleable CollapsingToolbarLayout_scrimAnimationDuration 13
+int styleable CollapsingToolbarLayout_scrimVisibleHeightTrigger 14
+int styleable CollapsingToolbarLayout_statusBarScrim 15
+int styleable CollapsingToolbarLayout_title 16
+int styleable CollapsingToolbarLayout_titleCollapseMode 17
+int styleable CollapsingToolbarLayout_titleEnabled 18
+int styleable CollapsingToolbarLayout_toolbarId 19
+int[] styleable CollapsingToolbarLayout_Layout { 0x0, 0x0 }
+int styleable CollapsingToolbarLayout_Layout_layout_collapseMode 0
+int styleable CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier 1
+int[] styleable ColorStateListItem { 0x0, 0x101031f, 0x10101a5 }
+int styleable ColorStateListItem_alpha 0
+int styleable ColorStateListItem_android_alpha 1
+int styleable ColorStateListItem_android_color 2
+int[] styleable CompoundButton { 0x1010107, 0x0, 0x0, 0x0 }
+int styleable CompoundButton_android_button 0
+int styleable CompoundButton_buttonCompat 1
+int styleable CompoundButton_buttonTint 2
+int styleable CompoundButton_buttonTintMode 3
+int[] styleable Constraint { 0x101031f, 0x1010440, 0x10100d0, 0x10100f5, 0x10100fa, 0x10103b6, 0x10100f7, 0x10100f9, 0x10103b5, 0x10100f8, 0x10100f4, 0x1010120, 0x101011f, 0x1010140, 0x101013f, 0x10100c4, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010320, 0x1010321, 0x1010322, 0x1010323, 0x10103fa, 0x10100dc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Constraint_android_alpha 0
+int styleable Constraint_android_elevation 1
+int styleable Constraint_android_id 2
+int styleable Constraint_android_layout_height 3
+int styleable Constraint_android_layout_marginBottom 4
+int styleable Constraint_android_layout_marginEnd 5
+int styleable Constraint_android_layout_marginLeft 6
+int styleable Constraint_android_layout_marginRight 7
+int styleable Constraint_android_layout_marginStart 8
+int styleable Constraint_android_layout_marginTop 9
+int styleable Constraint_android_layout_width 10
+int styleable Constraint_android_maxHeight 11
+int styleable Constraint_android_maxWidth 12
+int styleable Constraint_android_minHeight 13
+int styleable Constraint_android_minWidth 14
+int styleable Constraint_android_orientation 15
+int styleable Constraint_android_rotation 16
+int styleable Constraint_android_rotationX 17
+int styleable Constraint_android_rotationY 18
+int styleable Constraint_android_scaleX 19
+int styleable Constraint_android_scaleY 20
+int styleable Constraint_android_transformPivotX 21
+int styleable Constraint_android_transformPivotY 22
+int styleable Constraint_android_translationX 23
+int styleable Constraint_android_translationY 24
+int styleable Constraint_android_translationZ 25
+int styleable Constraint_android_visibility 26
+int styleable Constraint_animate_relativeTo 27
+int styleable Constraint_barrierAllowsGoneWidgets 28
+int styleable Constraint_barrierDirection 29
+int styleable Constraint_barrierMargin 30
+int styleable Constraint_chainUseRtl 31
+int styleable Constraint_constraint_referenced_ids 32
+int styleable Constraint_drawPath 33
+int styleable Constraint_flow_firstHorizontalBias 34
+int styleable Constraint_flow_firstHorizontalStyle 35
+int styleable Constraint_flow_firstVerticalBias 36
+int styleable Constraint_flow_firstVerticalStyle 37
+int styleable Constraint_flow_horizontalAlign 38
+int styleable Constraint_flow_horizontalBias 39
+int styleable Constraint_flow_horizontalGap 40
+int styleable Constraint_flow_horizontalStyle 41
+int styleable Constraint_flow_lastHorizontalBias 42
+int styleable Constraint_flow_lastHorizontalStyle 43
+int styleable Constraint_flow_lastVerticalBias 44
+int styleable Constraint_flow_lastVerticalStyle 45
+int styleable Constraint_flow_maxElementsWrap 46
+int styleable Constraint_flow_verticalAlign 47
+int styleable Constraint_flow_verticalBias 48
+int styleable Constraint_flow_verticalGap 49
+int styleable Constraint_flow_verticalStyle 50
+int styleable Constraint_flow_wrapMode 51
+int styleable Constraint_layout_constrainedHeight 52
+int styleable Constraint_layout_constrainedWidth 53
+int styleable Constraint_layout_constraintBaseline_creator 54
+int styleable Constraint_layout_constraintBaseline_toBaselineOf 55
+int styleable Constraint_layout_constraintBottom_creator 56
+int styleable Constraint_layout_constraintBottom_toBottomOf 57
+int styleable Constraint_layout_constraintBottom_toTopOf 58
+int styleable Constraint_layout_constraintCircle 59
+int styleable Constraint_layout_constraintCircleAngle 60
+int styleable Constraint_layout_constraintCircleRadius 61
+int styleable Constraint_layout_constraintDimensionRatio 62
+int styleable Constraint_layout_constraintEnd_toEndOf 63
+int styleable Constraint_layout_constraintEnd_toStartOf 64
+int styleable Constraint_layout_constraintGuide_begin 65
+int styleable Constraint_layout_constraintGuide_end 66
+int styleable Constraint_layout_constraintGuide_percent 67
+int styleable Constraint_layout_constraintHeight_default 68
+int styleable Constraint_layout_constraintHeight_max 69
+int styleable Constraint_layout_constraintHeight_min 70
+int styleable Constraint_layout_constraintHeight_percent 71
+int styleable Constraint_layout_constraintHorizontal_bias 72
+int styleable Constraint_layout_constraintHorizontal_chainStyle 73
+int styleable Constraint_layout_constraintHorizontal_weight 74
+int styleable Constraint_layout_constraintLeft_creator 75
+int styleable Constraint_layout_constraintLeft_toLeftOf 76
+int styleable Constraint_layout_constraintLeft_toRightOf 77
+int styleable Constraint_layout_constraintRight_creator 78
+int styleable Constraint_layout_constraintRight_toLeftOf 79
+int styleable Constraint_layout_constraintRight_toRightOf 80
+int styleable Constraint_layout_constraintStart_toEndOf 81
+int styleable Constraint_layout_constraintStart_toStartOf 82
+int styleable Constraint_layout_constraintTag 83
+int styleable Constraint_layout_constraintTop_creator 84
+int styleable Constraint_layout_constraintTop_toBottomOf 85
+int styleable Constraint_layout_constraintTop_toTopOf 86
+int styleable Constraint_layout_constraintVertical_bias 87
+int styleable Constraint_layout_constraintVertical_chainStyle 88
+int styleable Constraint_layout_constraintVertical_weight 89
+int styleable Constraint_layout_constraintWidth_default 90
+int styleable Constraint_layout_constraintWidth_max 91
+int styleable Constraint_layout_constraintWidth_min 92
+int styleable Constraint_layout_constraintWidth_percent 93
+int styleable Constraint_layout_editor_absoluteX 94
+int styleable Constraint_layout_editor_absoluteY 95
+int styleable Constraint_layout_goneMarginBottom 96
+int styleable Constraint_layout_goneMarginEnd 97
+int styleable Constraint_layout_goneMarginLeft 98
+int styleable Constraint_layout_goneMarginRight 99
+int styleable Constraint_layout_goneMarginStart 100
+int styleable Constraint_layout_goneMarginTop 101
+int styleable Constraint_motionProgress 102
+int styleable Constraint_motionStagger 103
+int styleable Constraint_pathMotionArc 104
+int styleable Constraint_pivotAnchor 105
+int styleable Constraint_transitionEasing 106
+int styleable Constraint_transitionPathRotate 107
+int styleable Constraint_visibilityMode 108
+int[] styleable ConstraintLayout_Layout { 0x1010440, 0x1010120, 0x101011f, 0x1010140, 0x101013f, 0x10100c4, 0x10100d5, 0x10100d9, 0x10103b4, 0x10100d6, 0x10100d8, 0x10103b3, 0x10100d7, 0x10100dc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ConstraintLayout_Layout_android_elevation 0
+int styleable ConstraintLayout_Layout_android_maxHeight 1
+int styleable ConstraintLayout_Layout_android_maxWidth 2
+int styleable ConstraintLayout_Layout_android_minHeight 3
+int styleable ConstraintLayout_Layout_android_minWidth 4
+int styleable ConstraintLayout_Layout_android_orientation 5
+int styleable ConstraintLayout_Layout_android_padding 6
+int styleable ConstraintLayout_Layout_android_paddingBottom 7
+int styleable ConstraintLayout_Layout_android_paddingEnd 8
+int styleable ConstraintLayout_Layout_android_paddingLeft 9
+int styleable ConstraintLayout_Layout_android_paddingRight 10
+int styleable ConstraintLayout_Layout_android_paddingStart 11
+int styleable ConstraintLayout_Layout_android_paddingTop 12
+int styleable ConstraintLayout_Layout_android_visibility 13
+int styleable ConstraintLayout_Layout_barrierAllowsGoneWidgets 14
+int styleable ConstraintLayout_Layout_barrierDirection 15
+int styleable ConstraintLayout_Layout_barrierMargin 16
+int styleable ConstraintLayout_Layout_chainUseRtl 17
+int styleable ConstraintLayout_Layout_constraintSet 18
+int styleable ConstraintLayout_Layout_constraint_referenced_ids 19
+int styleable ConstraintLayout_Layout_flow_firstHorizontalBias 20
+int styleable ConstraintLayout_Layout_flow_firstHorizontalStyle 21
+int styleable ConstraintLayout_Layout_flow_firstVerticalBias 22
+int styleable ConstraintLayout_Layout_flow_firstVerticalStyle 23
+int styleable ConstraintLayout_Layout_flow_horizontalAlign 24
+int styleable ConstraintLayout_Layout_flow_horizontalBias 25
+int styleable ConstraintLayout_Layout_flow_horizontalGap 26
+int styleable ConstraintLayout_Layout_flow_horizontalStyle 27
+int styleable ConstraintLayout_Layout_flow_lastHorizontalBias 28
+int styleable ConstraintLayout_Layout_flow_lastHorizontalStyle 29
+int styleable ConstraintLayout_Layout_flow_lastVerticalBias 30
+int styleable ConstraintLayout_Layout_flow_lastVerticalStyle 31
+int styleable ConstraintLayout_Layout_flow_maxElementsWrap 32
+int styleable ConstraintLayout_Layout_flow_verticalAlign 33
+int styleable ConstraintLayout_Layout_flow_verticalBias 34
+int styleable ConstraintLayout_Layout_flow_verticalGap 35
+int styleable ConstraintLayout_Layout_flow_verticalStyle 36
+int styleable ConstraintLayout_Layout_flow_wrapMode 37
+int styleable ConstraintLayout_Layout_layoutDescription 38
+int styleable ConstraintLayout_Layout_layout_constrainedHeight 39
+int styleable ConstraintLayout_Layout_layout_constrainedWidth 40
+int styleable ConstraintLayout_Layout_layout_constraintBaseline_creator 41
+int styleable ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf 42
+int styleable ConstraintLayout_Layout_layout_constraintBottom_creator 43
+int styleable ConstraintLayout_Layout_layout_constraintBottom_toBottomOf 44
+int styleable ConstraintLayout_Layout_layout_constraintBottom_toTopOf 45
+int styleable ConstraintLayout_Layout_layout_constraintCircle 46
+int styleable ConstraintLayout_Layout_layout_constraintCircleAngle 47
+int styleable ConstraintLayout_Layout_layout_constraintCircleRadius 48
+int styleable ConstraintLayout_Layout_layout_constraintDimensionRatio 49
+int styleable ConstraintLayout_Layout_layout_constraintEnd_toEndOf 50
+int styleable ConstraintLayout_Layout_layout_constraintEnd_toStartOf 51
+int styleable ConstraintLayout_Layout_layout_constraintGuide_begin 52
+int styleable ConstraintLayout_Layout_layout_constraintGuide_end 53
+int styleable ConstraintLayout_Layout_layout_constraintGuide_percent 54
+int styleable ConstraintLayout_Layout_layout_constraintHeight_default 55
+int styleable ConstraintLayout_Layout_layout_constraintHeight_max 56
+int styleable ConstraintLayout_Layout_layout_constraintHeight_min 57
+int styleable ConstraintLayout_Layout_layout_constraintHeight_percent 58
+int styleable ConstraintLayout_Layout_layout_constraintHorizontal_bias 59
+int styleable ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle 60
+int styleable ConstraintLayout_Layout_layout_constraintHorizontal_weight 61
+int styleable ConstraintLayout_Layout_layout_constraintLeft_creator 62
+int styleable ConstraintLayout_Layout_layout_constraintLeft_toLeftOf 63
+int styleable ConstraintLayout_Layout_layout_constraintLeft_toRightOf 64
+int styleable ConstraintLayout_Layout_layout_constraintRight_creator 65
+int styleable ConstraintLayout_Layout_layout_constraintRight_toLeftOf 66
+int styleable ConstraintLayout_Layout_layout_constraintRight_toRightOf 67
+int styleable ConstraintLayout_Layout_layout_constraintStart_toEndOf 68
+int styleable ConstraintLayout_Layout_layout_constraintStart_toStartOf 69
+int styleable ConstraintLayout_Layout_layout_constraintTag 70
+int styleable ConstraintLayout_Layout_layout_constraintTop_creator 71
+int styleable ConstraintLayout_Layout_layout_constraintTop_toBottomOf 72
+int styleable ConstraintLayout_Layout_layout_constraintTop_toTopOf 73
+int styleable ConstraintLayout_Layout_layout_constraintVertical_bias 74
+int styleable ConstraintLayout_Layout_layout_constraintVertical_chainStyle 75
+int styleable ConstraintLayout_Layout_layout_constraintVertical_weight 76
+int styleable ConstraintLayout_Layout_layout_constraintWidth_default 77
+int styleable ConstraintLayout_Layout_layout_constraintWidth_max 78
+int styleable ConstraintLayout_Layout_layout_constraintWidth_min 79
+int styleable ConstraintLayout_Layout_layout_constraintWidth_percent 80
+int styleable ConstraintLayout_Layout_layout_editor_absoluteX 81
+int styleable ConstraintLayout_Layout_layout_editor_absoluteY 82
+int styleable ConstraintLayout_Layout_layout_goneMarginBottom 83
+int styleable ConstraintLayout_Layout_layout_goneMarginEnd 84
+int styleable ConstraintLayout_Layout_layout_goneMarginLeft 85
+int styleable ConstraintLayout_Layout_layout_goneMarginRight 86
+int styleable ConstraintLayout_Layout_layout_goneMarginStart 87
+int styleable ConstraintLayout_Layout_layout_goneMarginTop 88
+int styleable ConstraintLayout_Layout_layout_optimizationLevel 89
+int[] styleable ConstraintLayout_placeholder { 0x0, 0x0 }
+int styleable ConstraintLayout_placeholder_content 0
+int styleable ConstraintLayout_placeholder_placeholder_emptyVisibility 1
+int[] styleable ConstraintSet { 0x101031f, 0x1010440, 0x10100d0, 0x10100f5, 0x10100fa, 0x10103b6, 0x10100f7, 0x10100f9, 0x10103b5, 0x10100f8, 0x10100f4, 0x1010120, 0x101011f, 0x1010140, 0x101013f, 0x10100c4, 0x10101b5, 0x10101b6, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010320, 0x1010321, 0x1010322, 0x1010323, 0x10103fa, 0x10100dc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ConstraintSet_android_alpha 0
+int styleable ConstraintSet_android_elevation 1
+int styleable ConstraintSet_android_id 2
+int styleable ConstraintSet_android_layout_height 3
+int styleable ConstraintSet_android_layout_marginBottom 4
+int styleable ConstraintSet_android_layout_marginEnd 5
+int styleable ConstraintSet_android_layout_marginLeft 6
+int styleable ConstraintSet_android_layout_marginRight 7
+int styleable ConstraintSet_android_layout_marginStart 8
+int styleable ConstraintSet_android_layout_marginTop 9
+int styleable ConstraintSet_android_layout_width 10
+int styleable ConstraintSet_android_maxHeight 11
+int styleable ConstraintSet_android_maxWidth 12
+int styleable ConstraintSet_android_minHeight 13
+int styleable ConstraintSet_android_minWidth 14
+int styleable ConstraintSet_android_orientation 15
+int styleable ConstraintSet_android_pivotX 16
+int styleable ConstraintSet_android_pivotY 17
+int styleable ConstraintSet_android_rotation 18
+int styleable ConstraintSet_android_rotationX 19
+int styleable ConstraintSet_android_rotationY 20
+int styleable ConstraintSet_android_scaleX 21
+int styleable ConstraintSet_android_scaleY 22
+int styleable ConstraintSet_android_transformPivotX 23
+int styleable ConstraintSet_android_transformPivotY 24
+int styleable ConstraintSet_android_translationX 25
+int styleable ConstraintSet_android_translationY 26
+int styleable ConstraintSet_android_translationZ 27
+int styleable ConstraintSet_android_visibility 28
+int styleable ConstraintSet_animate_relativeTo 29
+int styleable ConstraintSet_barrierAllowsGoneWidgets 30
+int styleable ConstraintSet_barrierDirection 31
+int styleable ConstraintSet_barrierMargin 32
+int styleable ConstraintSet_chainUseRtl 33
+int styleable ConstraintSet_constraint_referenced_ids 34
+int styleable ConstraintSet_deriveConstraintsFrom 35
+int styleable ConstraintSet_drawPath 36
+int styleable ConstraintSet_flow_firstHorizontalBias 37
+int styleable ConstraintSet_flow_firstHorizontalStyle 38
+int styleable ConstraintSet_flow_firstVerticalBias 39
+int styleable ConstraintSet_flow_firstVerticalStyle 40
+int styleable ConstraintSet_flow_horizontalAlign 41
+int styleable ConstraintSet_flow_horizontalBias 42
+int styleable ConstraintSet_flow_horizontalGap 43
+int styleable ConstraintSet_flow_horizontalStyle 44
+int styleable ConstraintSet_flow_lastHorizontalBias 45
+int styleable ConstraintSet_flow_lastHorizontalStyle 46
+int styleable ConstraintSet_flow_lastVerticalBias 47
+int styleable ConstraintSet_flow_lastVerticalStyle 48
+int styleable ConstraintSet_flow_maxElementsWrap 49
+int styleable ConstraintSet_flow_verticalAlign 50
+int styleable ConstraintSet_flow_verticalBias 51
+int styleable ConstraintSet_flow_verticalGap 52
+int styleable ConstraintSet_flow_verticalStyle 53
+int styleable ConstraintSet_flow_wrapMode 54
+int styleable ConstraintSet_layout_constrainedHeight 55
+int styleable ConstraintSet_layout_constrainedWidth 56
+int styleable ConstraintSet_layout_constraintBaseline_creator 57
+int styleable ConstraintSet_layout_constraintBaseline_toBaselineOf 58
+int styleable ConstraintSet_layout_constraintBottom_creator 59
+int styleable ConstraintSet_layout_constraintBottom_toBottomOf 60
+int styleable ConstraintSet_layout_constraintBottom_toTopOf 61
+int styleable ConstraintSet_layout_constraintCircle 62
+int styleable ConstraintSet_layout_constraintCircleAngle 63
+int styleable ConstraintSet_layout_constraintCircleRadius 64
+int styleable ConstraintSet_layout_constraintDimensionRatio 65
+int styleable ConstraintSet_layout_constraintEnd_toEndOf 66
+int styleable ConstraintSet_layout_constraintEnd_toStartOf 67
+int styleable ConstraintSet_layout_constraintGuide_begin 68
+int styleable ConstraintSet_layout_constraintGuide_end 69
+int styleable ConstraintSet_layout_constraintGuide_percent 70
+int styleable ConstraintSet_layout_constraintHeight_default 71
+int styleable ConstraintSet_layout_constraintHeight_max 72
+int styleable ConstraintSet_layout_constraintHeight_min 73
+int styleable ConstraintSet_layout_constraintHeight_percent 74
+int styleable ConstraintSet_layout_constraintHorizontal_bias 75
+int styleable ConstraintSet_layout_constraintHorizontal_chainStyle 76
+int styleable ConstraintSet_layout_constraintHorizontal_weight 77
+int styleable ConstraintSet_layout_constraintLeft_creator 78
+int styleable ConstraintSet_layout_constraintLeft_toLeftOf 79
+int styleable ConstraintSet_layout_constraintLeft_toRightOf 80
+int styleable ConstraintSet_layout_constraintRight_creator 81
+int styleable ConstraintSet_layout_constraintRight_toLeftOf 82
+int styleable ConstraintSet_layout_constraintRight_toRightOf 83
+int styleable ConstraintSet_layout_constraintStart_toEndOf 84
+int styleable ConstraintSet_layout_constraintStart_toStartOf 85
+int styleable ConstraintSet_layout_constraintTag 86
+int styleable ConstraintSet_layout_constraintTop_creator 87
+int styleable ConstraintSet_layout_constraintTop_toBottomOf 88
+int styleable ConstraintSet_layout_constraintTop_toTopOf 89
+int styleable ConstraintSet_layout_constraintVertical_bias 90
+int styleable ConstraintSet_layout_constraintVertical_chainStyle 91
+int styleable ConstraintSet_layout_constraintVertical_weight 92
+int styleable ConstraintSet_layout_constraintWidth_default 93
+int styleable ConstraintSet_layout_constraintWidth_max 94
+int styleable ConstraintSet_layout_constraintWidth_min 95
+int styleable ConstraintSet_layout_constraintWidth_percent 96
+int styleable ConstraintSet_layout_editor_absoluteX 97
+int styleable ConstraintSet_layout_editor_absoluteY 98
+int styleable ConstraintSet_layout_goneMarginBottom 99
+int styleable ConstraintSet_layout_goneMarginEnd 100
+int styleable ConstraintSet_layout_goneMarginLeft 101
+int styleable ConstraintSet_layout_goneMarginRight 102
+int styleable ConstraintSet_layout_goneMarginStart 103
+int styleable ConstraintSet_layout_goneMarginTop 104
+int styleable ConstraintSet_motionProgress 105
+int styleable ConstraintSet_motionStagger 106
+int styleable ConstraintSet_pathMotionArc 107
+int styleable ConstraintSet_pivotAnchor 108
+int styleable ConstraintSet_transitionEasing 109
+int styleable ConstraintSet_transitionPathRotate 110
+int[] styleable CoordinatorLayout { 0x0, 0x0 }
+int styleable CoordinatorLayout_keylines 0
+int styleable CoordinatorLayout_statusBarBackground 1
+int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable CoordinatorLayout_Layout_android_layout_gravity 0
+int styleable CoordinatorLayout_Layout_layout_anchor 1
+int styleable CoordinatorLayout_Layout_layout_anchorGravity 2
+int styleable CoordinatorLayout_Layout_layout_behavior 3
+int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4
+int styleable CoordinatorLayout_Layout_layout_insetEdge 5
+int styleable CoordinatorLayout_Layout_layout_keyline 6
+int[] styleable CustomAttribute { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable CustomAttribute_attributeName 0
+int styleable CustomAttribute_customBoolean 1
+int styleable CustomAttribute_customColorDrawableValue 2
+int styleable CustomAttribute_customColorValue 3
+int styleable CustomAttribute_customDimension 4
+int styleable CustomAttribute_customFloatValue 5
+int styleable CustomAttribute_customIntegerValue 6
+int styleable CustomAttribute_customPixelDimension 7
+int styleable CustomAttribute_customStringValue 8
+int[] styleable DrawerArrowToggle { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable DrawerArrowToggle_arrowHeadLength 0
+int styleable DrawerArrowToggle_arrowShaftLength 1
+int styleable DrawerArrowToggle_barLength 2
+int styleable DrawerArrowToggle_color 3
+int styleable DrawerArrowToggle_drawableSize 4
+int styleable DrawerArrowToggle_gapBetweenBars 5
+int styleable DrawerArrowToggle_spinBars 6
+int styleable DrawerArrowToggle_thickness 7
+int[] styleable ExtendedFloatingActionButton { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ExtendedFloatingActionButton_collapsedSize 0
+int styleable ExtendedFloatingActionButton_elevation 1
+int styleable ExtendedFloatingActionButton_extendMotionSpec 2
+int styleable ExtendedFloatingActionButton_hideMotionSpec 3
+int styleable ExtendedFloatingActionButton_showMotionSpec 4
+int styleable ExtendedFloatingActionButton_shrinkMotionSpec 5
+int[] styleable ExtendedFloatingActionButton_Behavior_Layout { 0x0, 0x0 }
+int styleable ExtendedFloatingActionButton_Behavior_Layout_behavior_autoHide 0
+int styleable ExtendedFloatingActionButton_Behavior_Layout_behavior_autoShrink 1
+int[] styleable FloatingActionButton { 0x101000e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable FloatingActionButton_android_enabled 0
+int styleable FloatingActionButton_backgroundTint 1
+int styleable FloatingActionButton_backgroundTintMode 2
+int styleable FloatingActionButton_borderWidth 3
+int styleable FloatingActionButton_elevation 4
+int styleable FloatingActionButton_ensureMinTouchTargetSize 5
+int styleable FloatingActionButton_fabCustomSize 6
+int styleable FloatingActionButton_fabSize 7
+int styleable FloatingActionButton_hideMotionSpec 8
+int styleable FloatingActionButton_hoveredFocusedTranslationZ 9
+int styleable FloatingActionButton_maxImageSize 10
+int styleable FloatingActionButton_pressedTranslationZ 11
+int styleable FloatingActionButton_rippleColor 12
+int styleable FloatingActionButton_shapeAppearance 13
+int styleable FloatingActionButton_shapeAppearanceOverlay 14
+int styleable FloatingActionButton_showMotionSpec 15
+int styleable FloatingActionButton_useCompatPadding 16
+int[] styleable FloatingActionButton_Behavior_Layout { 0x0 }
+int styleable FloatingActionButton_Behavior_Layout_behavior_autoHide 0
+int[] styleable FlowLayout { 0x0, 0x0 }
+int styleable FlowLayout_itemSpacing 0
+int styleable FlowLayout_lineSpacing 1
+int[] styleable FontFamily { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable FontFamily_fontProviderAuthority 0
+int styleable FontFamily_fontProviderCerts 1
+int styleable FontFamily_fontProviderFetchStrategy 2
+int styleable FontFamily_fontProviderFetchTimeout 3
+int styleable FontFamily_fontProviderPackage 4
+int styleable FontFamily_fontProviderQuery 5
+int styleable FontFamily_fontProviderSystemFontFamily 6
+int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable FontFamilyFont_android_font 0
+int styleable FontFamilyFont_android_fontStyle 1
+int styleable FontFamilyFont_android_fontVariationSettings 2
+int styleable FontFamilyFont_android_fontWeight 3
+int styleable FontFamilyFont_android_ttcIndex 4
+int styleable FontFamilyFont_font 5
+int styleable FontFamilyFont_fontStyle 6
+int styleable FontFamilyFont_fontVariationSettings 7
+int styleable FontFamilyFont_fontWeight 8
+int styleable FontFamilyFont_ttcIndex 9
+int[] styleable ForegroundLinearLayout { 0x1010109, 0x1010200, 0x0 }
+int styleable ForegroundLinearLayout_android_foreground 0
+int styleable ForegroundLinearLayout_android_foregroundGravity 1
+int styleable ForegroundLinearLayout_foregroundInsidePadding 2
+int[] styleable Fragment { 0x10100d0, 0x1010003, 0x10100d1 }
+int styleable Fragment_android_id 0
+int styleable Fragment_android_name 1
+int styleable Fragment_android_tag 2
+int[] styleable FragmentContainerView { 0x1010003, 0x10100d1 }
+int styleable FragmentContainerView_android_name 0
+int styleable FragmentContainerView_android_tag 1
+int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 }
+int styleable GradientColor_android_centerColor 0
+int styleable GradientColor_android_centerX 1
+int styleable GradientColor_android_centerY 2
+int styleable GradientColor_android_endColor 3
+int styleable GradientColor_android_endX 4
+int styleable GradientColor_android_endY 5
+int styleable GradientColor_android_gradientRadius 6
+int styleable GradientColor_android_startColor 7
+int styleable GradientColor_android_startX 8
+int styleable GradientColor_android_startY 9
+int styleable GradientColor_android_tileMode 10
+int styleable GradientColor_android_type 11
+int[] styleable GradientColorItem { 0x10101a5, 0x1010514 }
+int styleable GradientColorItem_android_color 0
+int styleable GradientColorItem_android_offset 1
+int[] styleable ImageFilterView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ImageFilterView_altSrc 0
+int styleable ImageFilterView_brightness 1
+int styleable ImageFilterView_contrast 2
+int styleable ImageFilterView_crossfade 3
+int styleable ImageFilterView_overlay 4
+int styleable ImageFilterView_round 5
+int styleable ImageFilterView_roundPercent 6
+int styleable ImageFilterView_saturation 7
+int styleable ImageFilterView_warmth 8
+int[] styleable Insets { 0x0, 0x0, 0x0, 0x0 }
+int styleable Insets_paddingBottomSystemWindowInsets 0
+int styleable Insets_paddingLeftSystemWindowInsets 1
+int styleable Insets_paddingRightSystemWindowInsets 2
+int styleable Insets_paddingTopSystemWindowInsets 3
+int[] styleable KeyAttribute { 0x101031f, 0x1010440, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010320, 0x1010321, 0x1010322, 0x1010323, 0x10103fa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable KeyAttribute_android_alpha 0
+int styleable KeyAttribute_android_elevation 1
+int styleable KeyAttribute_android_rotation 2
+int styleable KeyAttribute_android_rotationX 3
+int styleable KeyAttribute_android_rotationY 4
+int styleable KeyAttribute_android_scaleX 5
+int styleable KeyAttribute_android_scaleY 6
+int styleable KeyAttribute_android_transformPivotX 7
+int styleable KeyAttribute_android_transformPivotY 8
+int styleable KeyAttribute_android_translationX 9
+int styleable KeyAttribute_android_translationY 10
+int styleable KeyAttribute_android_translationZ 11
+int styleable KeyAttribute_curveFit 12
+int styleable KeyAttribute_framePosition 13
+int styleable KeyAttribute_motionProgress 14
+int styleable KeyAttribute_motionTarget 15
+int styleable KeyAttribute_transitionEasing 16
+int styleable KeyAttribute_transitionPathRotate 17
+int[] styleable KeyCycle { 0x101031f, 0x1010440, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010322, 0x1010323, 0x10103fa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable KeyCycle_android_alpha 0
+int styleable KeyCycle_android_elevation 1
+int styleable KeyCycle_android_rotation 2
+int styleable KeyCycle_android_rotationX 3
+int styleable KeyCycle_android_rotationY 4
+int styleable KeyCycle_android_scaleX 5
+int styleable KeyCycle_android_scaleY 6
+int styleable KeyCycle_android_translationX 7
+int styleable KeyCycle_android_translationY 8
+int styleable KeyCycle_android_translationZ 9
+int styleable KeyCycle_curveFit 10
+int styleable KeyCycle_framePosition 11
+int styleable KeyCycle_motionProgress 12
+int styleable KeyCycle_motionTarget 13
+int styleable KeyCycle_transitionEasing 14
+int styleable KeyCycle_transitionPathRotate 15
+int styleable KeyCycle_waveOffset 16
+int styleable KeyCycle_wavePeriod 17
+int styleable KeyCycle_waveShape 18
+int styleable KeyCycle_waveVariesBy 19
+int[] styleable KeyPosition { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable KeyPosition_curveFit 0
+int styleable KeyPosition_drawPath 1
+int styleable KeyPosition_framePosition 2
+int styleable KeyPosition_keyPositionType 3
+int styleable KeyPosition_motionTarget 4
+int styleable KeyPosition_pathMotionArc 5
+int styleable KeyPosition_percentHeight 6
+int styleable KeyPosition_percentWidth 7
+int styleable KeyPosition_percentX 8
+int styleable KeyPosition_percentY 9
+int styleable KeyPosition_sizePercent 10
+int styleable KeyPosition_transitionEasing 11
+int[] styleable KeyTimeCycle { 0x101031f, 0x1010440, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010322, 0x1010323, 0x10103fa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable KeyTimeCycle_android_alpha 0
+int styleable KeyTimeCycle_android_elevation 1
+int styleable KeyTimeCycle_android_rotation 2
+int styleable KeyTimeCycle_android_rotationX 3
+int styleable KeyTimeCycle_android_rotationY 4
+int styleable KeyTimeCycle_android_scaleX 5
+int styleable KeyTimeCycle_android_scaleY 6
+int styleable KeyTimeCycle_android_translationX 7
+int styleable KeyTimeCycle_android_translationY 8
+int styleable KeyTimeCycle_android_translationZ 9
+int styleable KeyTimeCycle_curveFit 10
+int styleable KeyTimeCycle_framePosition 11
+int styleable KeyTimeCycle_motionProgress 12
+int styleable KeyTimeCycle_motionTarget 13
+int styleable KeyTimeCycle_transitionEasing 14
+int styleable KeyTimeCycle_transitionPathRotate 15
+int styleable KeyTimeCycle_waveDecay 16
+int styleable KeyTimeCycle_waveOffset 17
+int styleable KeyTimeCycle_wavePeriod 18
+int styleable KeyTimeCycle_waveShape 19
+int[] styleable KeyTrigger { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable KeyTrigger_framePosition 0
+int styleable KeyTrigger_motionTarget 1
+int styleable KeyTrigger_motion_postLayoutCollision 2
+int styleable KeyTrigger_motion_triggerOnCollision 3
+int styleable KeyTrigger_onCross 4
+int styleable KeyTrigger_onNegativeCross 5
+int styleable KeyTrigger_onPositiveCross 6
+int styleable KeyTrigger_triggerId 7
+int styleable KeyTrigger_triggerReceiver 8
+int styleable KeyTrigger_triggerSlack 9
+int[] styleable Layout { 0x10100f5, 0x10100fa, 0x10103b6, 0x10100f7, 0x10100f9, 0x10103b5, 0x10100f8, 0x10100f4, 0x10100c4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Layout_android_layout_height 0
+int styleable Layout_android_layout_marginBottom 1
+int styleable Layout_android_layout_marginEnd 2
+int styleable Layout_android_layout_marginLeft 3
+int styleable Layout_android_layout_marginRight 4
+int styleable Layout_android_layout_marginStart 5
+int styleable Layout_android_layout_marginTop 6
+int styleable Layout_android_layout_width 7
+int styleable Layout_android_orientation 8
+int styleable Layout_barrierAllowsGoneWidgets 9
+int styleable Layout_barrierDirection 10
+int styleable Layout_barrierMargin 11
+int styleable Layout_chainUseRtl 12
+int styleable Layout_constraint_referenced_ids 13
+int styleable Layout_layout_constrainedHeight 14
+int styleable Layout_layout_constrainedWidth 15
+int styleable Layout_layout_constraintBaseline_creator 16
+int styleable Layout_layout_constraintBaseline_toBaselineOf 17
+int styleable Layout_layout_constraintBottom_creator 18
+int styleable Layout_layout_constraintBottom_toBottomOf 19
+int styleable Layout_layout_constraintBottom_toTopOf 20
+int styleable Layout_layout_constraintCircle 21
+int styleable Layout_layout_constraintCircleAngle 22
+int styleable Layout_layout_constraintCircleRadius 23
+int styleable Layout_layout_constraintDimensionRatio 24
+int styleable Layout_layout_constraintEnd_toEndOf 25
+int styleable Layout_layout_constraintEnd_toStartOf 26
+int styleable Layout_layout_constraintGuide_begin 27
+int styleable Layout_layout_constraintGuide_end 28
+int styleable Layout_layout_constraintGuide_percent 29
+int styleable Layout_layout_constraintHeight_default 30
+int styleable Layout_layout_constraintHeight_max 31
+int styleable Layout_layout_constraintHeight_min 32
+int styleable Layout_layout_constraintHeight_percent 33
+int styleable Layout_layout_constraintHorizontal_bias 34
+int styleable Layout_layout_constraintHorizontal_chainStyle 35
+int styleable Layout_layout_constraintHorizontal_weight 36
+int styleable Layout_layout_constraintLeft_creator 37
+int styleable Layout_layout_constraintLeft_toLeftOf 38
+int styleable Layout_layout_constraintLeft_toRightOf 39
+int styleable Layout_layout_constraintRight_creator 40
+int styleable Layout_layout_constraintRight_toLeftOf 41
+int styleable Layout_layout_constraintRight_toRightOf 42
+int styleable Layout_layout_constraintStart_toEndOf 43
+int styleable Layout_layout_constraintStart_toStartOf 44
+int styleable Layout_layout_constraintTop_creator 45
+int styleable Layout_layout_constraintTop_toBottomOf 46
+int styleable Layout_layout_constraintTop_toTopOf 47
+int styleable Layout_layout_constraintVertical_bias 48
+int styleable Layout_layout_constraintVertical_chainStyle 49
+int styleable Layout_layout_constraintVertical_weight 50
+int styleable Layout_layout_constraintWidth_default 51
+int styleable Layout_layout_constraintWidth_max 52
+int styleable Layout_layout_constraintWidth_min 53
+int styleable Layout_layout_constraintWidth_percent 54
+int styleable Layout_layout_editor_absoluteX 55
+int styleable Layout_layout_editor_absoluteY 56
+int styleable Layout_layout_goneMarginBottom 57
+int styleable Layout_layout_goneMarginEnd 58
+int styleable Layout_layout_goneMarginLeft 59
+int styleable Layout_layout_goneMarginRight 60
+int styleable Layout_layout_goneMarginStart 61
+int styleable Layout_layout_goneMarginTop 62
+int styleable Layout_maxHeight 63
+int styleable Layout_maxWidth 64
+int styleable Layout_minHeight 65
+int styleable Layout_minWidth 66
+int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x0, 0x0, 0x0, 0x0 }
+int styleable LinearLayoutCompat_android_baselineAligned 0
+int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1
+int styleable LinearLayoutCompat_android_gravity 2
+int styleable LinearLayoutCompat_android_orientation 3
+int styleable LinearLayoutCompat_android_weightSum 4
+int styleable LinearLayoutCompat_divider 5
+int styleable LinearLayoutCompat_dividerPadding 6
+int styleable LinearLayoutCompat_measureWithLargestChild 7
+int styleable LinearLayoutCompat_showDividers 8
+int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 }
+int styleable LinearLayoutCompat_Layout_android_layout_gravity 0
+int styleable LinearLayoutCompat_Layout_android_layout_height 1
+int styleable LinearLayoutCompat_Layout_android_layout_weight 2
+int styleable LinearLayoutCompat_Layout_android_layout_width 3
+int[] styleable LinearProgressIndicator { 0x0, 0x0 }
+int styleable LinearProgressIndicator_indeterminateAnimationType 0
+int styleable LinearProgressIndicator_indicatorDirectionLinear 1
+int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad }
+int styleable ListPopupWindow_android_dropDownHorizontalOffset 0
+int styleable ListPopupWindow_android_dropDownVerticalOffset 1
+int[] styleable MaterialAlertDialog { 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialAlertDialog_backgroundInsetBottom 0
+int styleable MaterialAlertDialog_backgroundInsetEnd 1
+int styleable MaterialAlertDialog_backgroundInsetStart 2
+int styleable MaterialAlertDialog_backgroundInsetTop 3
+int[] styleable MaterialAlertDialogTheme { 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialAlertDialogTheme_materialAlertDialogBodyTextStyle 0
+int styleable MaterialAlertDialogTheme_materialAlertDialogTheme 1
+int styleable MaterialAlertDialogTheme_materialAlertDialogTitleIconStyle 2
+int styleable MaterialAlertDialogTheme_materialAlertDialogTitlePanelStyle 3
+int styleable MaterialAlertDialogTheme_materialAlertDialogTitleTextStyle 4
+int[] styleable MaterialAutoCompleteTextView { 0x1010220 }
+int styleable MaterialAutoCompleteTextView_android_inputType 0
+int[] styleable MaterialButton { 0x10100d4, 0x10101e5, 0x10101ba, 0x10101b7, 0x10101b8, 0x10101b9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialButton_android_background 0
+int styleable MaterialButton_android_checkable 1
+int styleable MaterialButton_android_insetBottom 2
+int styleable MaterialButton_android_insetLeft 3
+int styleable MaterialButton_android_insetRight 4
+int styleable MaterialButton_android_insetTop 5
+int styleable MaterialButton_backgroundTint 6
+int styleable MaterialButton_backgroundTintMode 7
+int styleable MaterialButton_cornerRadius 8
+int styleable MaterialButton_elevation 9
+int styleable MaterialButton_icon 10
+int styleable MaterialButton_iconGravity 11
+int styleable MaterialButton_iconPadding 12
+int styleable MaterialButton_iconSize 13
+int styleable MaterialButton_iconTint 14
+int styleable MaterialButton_iconTintMode 15
+int styleable MaterialButton_rippleColor 16
+int styleable MaterialButton_shapeAppearance 17
+int styleable MaterialButton_shapeAppearanceOverlay 18
+int styleable MaterialButton_strokeColor 19
+int styleable MaterialButton_strokeWidth 20
+int[] styleable MaterialButtonToggleGroup { 0x0, 0x0, 0x0 }
+int styleable MaterialButtonToggleGroup_checkedButton 0
+int styleable MaterialButtonToggleGroup_selectionRequired 1
+int styleable MaterialButtonToggleGroup_singleSelection 2
+int[] styleable MaterialCalendar { 0x101020d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialCalendar_android_windowFullscreen 0
+int styleable MaterialCalendar_dayInvalidStyle 1
+int styleable MaterialCalendar_daySelectedStyle 2
+int styleable MaterialCalendar_dayStyle 3
+int styleable MaterialCalendar_dayTodayStyle 4
+int styleable MaterialCalendar_nestedScrollable 5
+int styleable MaterialCalendar_rangeFillColor 6
+int styleable MaterialCalendar_yearSelectedStyle 7
+int styleable MaterialCalendar_yearStyle 8
+int styleable MaterialCalendar_yearTodayStyle 9
+int[] styleable MaterialCalendarItem { 0x10101ba, 0x10101b7, 0x10101b8, 0x10101b9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialCalendarItem_android_insetBottom 0
+int styleable MaterialCalendarItem_android_insetLeft 1
+int styleable MaterialCalendarItem_android_insetRight 2
+int styleable MaterialCalendarItem_android_insetTop 3
+int styleable MaterialCalendarItem_itemFillColor 4
+int styleable MaterialCalendarItem_itemShapeAppearance 5
+int styleable MaterialCalendarItem_itemShapeAppearanceOverlay 6
+int styleable MaterialCalendarItem_itemStrokeColor 7
+int styleable MaterialCalendarItem_itemStrokeWidth 8
+int styleable MaterialCalendarItem_itemTextColor 9
+int[] styleable MaterialCardView { 0x10101e5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MaterialCardView_android_checkable 0
+int styleable MaterialCardView_cardForegroundColor 1
+int styleable MaterialCardView_checkedIcon 2
+int styleable MaterialCardView_checkedIconMargin 3
+int styleable MaterialCardView_checkedIconSize 4
+int styleable MaterialCardView_checkedIconTint 5
+int styleable MaterialCardView_rippleColor 6
+int styleable MaterialCardView_shapeAppearance 7
+int styleable MaterialCardView_shapeAppearanceOverlay 8
+int styleable MaterialCardView_state_dragged 9
+int styleable MaterialCardView_strokeColor 10
+int styleable MaterialCardView_strokeWidth 11
+int[] styleable MaterialCheckBox { 0x0, 0x0 }
+int styleable MaterialCheckBox_buttonTint 0
+int styleable MaterialCheckBox_useMaterialThemeColors 1
+int[] styleable MaterialRadioButton { 0x0, 0x0 }
+int styleable MaterialRadioButton_buttonTint 0
+int styleable MaterialRadioButton_useMaterialThemeColors 1
+int[] styleable MaterialShape { 0x0, 0x0 }
+int styleable MaterialShape_shapeAppearance 0
+int styleable MaterialShape_shapeAppearanceOverlay 1
+int[] styleable MaterialTextAppearance { 0x10104b6, 0x101057f, 0x0 }
+int styleable MaterialTextAppearance_android_letterSpacing 0
+int styleable MaterialTextAppearance_android_lineHeight 1
+int styleable MaterialTextAppearance_lineHeight 2
+int[] styleable MaterialTextView { 0x101057f, 0x1010034, 0x0 }
+int styleable MaterialTextView_android_lineHeight 0
+int styleable MaterialTextView_android_textAppearance 1
+int styleable MaterialTextView_lineHeight 2
+int[] styleable MaterialTimePicker { 0x0, 0x0 }
+int styleable MaterialTimePicker_clockIcon 0
+int styleable MaterialTimePicker_keyboardIcon 1
+int[] styleable MaterialToolbar { 0x0, 0x0, 0x0 }
+int styleable MaterialToolbar_navigationIconTint 0
+int styleable MaterialToolbar_subtitleCentered 1
+int styleable MaterialToolbar_titleCentered 2
+int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 }
+int styleable MenuGroup_android_checkableBehavior 0
+int styleable MenuGroup_android_enabled 1
+int styleable MenuGroup_android_id 2
+int styleable MenuGroup_android_menuCategory 3
+int styleable MenuGroup_android_orderInCategory 4
+int styleable MenuGroup_android_visible 5
+int[] styleable MenuItem { 0x0, 0x0, 0x0, 0x0, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MenuItem_actionLayout 0
+int styleable MenuItem_actionProviderClass 1
+int styleable MenuItem_actionViewClass 2
+int styleable MenuItem_alphabeticModifiers 3
+int styleable MenuItem_android_alphabeticShortcut 4
+int styleable MenuItem_android_checkable 5
+int styleable MenuItem_android_checked 6
+int styleable MenuItem_android_enabled 7
+int styleable MenuItem_android_icon 8
+int styleable MenuItem_android_id 9
+int styleable MenuItem_android_menuCategory 10
+int styleable MenuItem_android_numericShortcut 11
+int styleable MenuItem_android_onClick 12
+int styleable MenuItem_android_orderInCategory 13
+int styleable MenuItem_android_title 14
+int styleable MenuItem_android_titleCondensed 15
+int styleable MenuItem_android_visible 16
+int styleable MenuItem_contentDescription 17
+int styleable MenuItem_iconTint 18
+int styleable MenuItem_iconTintMode 19
+int styleable MenuItem_numericModifiers 20
+int styleable MenuItem_showAsAction 21
+int styleable MenuItem_tooltipText 22
+int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x0, 0x0 }
+int styleable MenuView_android_headerBackground 0
+int styleable MenuView_android_horizontalDivider 1
+int styleable MenuView_android_itemBackground 2
+int styleable MenuView_android_itemIconDisabledAlpha 3
+int styleable MenuView_android_itemTextAppearance 4
+int styleable MenuView_android_verticalDivider 5
+int styleable MenuView_android_windowAnimationStyle 6
+int styleable MenuView_preserveIconSpacing 7
+int styleable MenuView_subMenuArrow 8
+int[] styleable MockView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MockView_mock_diagonalsColor 0
+int styleable MockView_mock_label 1
+int styleable MockView_mock_labelBackgroundColor 2
+int styleable MockView_mock_labelColor 3
+int styleable MockView_mock_showDiagonals 4
+int styleable MockView_mock_showLabel 5
+int[] styleable Motion { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Motion_animate_relativeTo 0
+int styleable Motion_drawPath 1
+int styleable Motion_motionPathRotate 2
+int styleable Motion_motionStagger 3
+int styleable Motion_pathMotionArc 4
+int styleable Motion_transitionEasing 5
+int[] styleable MotionHelper { 0x0, 0x0 }
+int styleable MotionHelper_onHide 0
+int styleable MotionHelper_onShow 1
+int[] styleable MotionLayout { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable MotionLayout_applyMotionScene 0
+int styleable MotionLayout_currentState 1
+int styleable MotionLayout_layoutDescription 2
+int styleable MotionLayout_motionDebug 3
+int styleable MotionLayout_motionProgress 4
+int styleable MotionLayout_showPaths 5
+int[] styleable MotionScene { 0x0, 0x0 }
+int styleable MotionScene_defaultDuration 0
+int styleable MotionScene_layoutDuringTransition 1
+int[] styleable MotionTelltales { 0x0, 0x0, 0x0 }
+int styleable MotionTelltales_telltales_tailColor 0
+int styleable MotionTelltales_telltales_tailScale 1
+int styleable MotionTelltales_telltales_velocityMode 2
+int[] styleable NavigationBarView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable NavigationBarView_backgroundTint 0
+int styleable NavigationBarView_elevation 1
+int styleable NavigationBarView_itemBackground 2
+int styleable NavigationBarView_itemIconSize 3
+int styleable NavigationBarView_itemIconTint 4
+int styleable NavigationBarView_itemRippleColor 5
+int styleable NavigationBarView_itemTextAppearanceActive 6
+int styleable NavigationBarView_itemTextAppearanceInactive 7
+int styleable NavigationBarView_itemTextColor 8
+int styleable NavigationBarView_labelVisibilityMode 9
+int styleable NavigationBarView_menu 10
+int[] styleable NavigationRailView { 0x0, 0x0 }
+int styleable NavigationRailView_headerLayout 0
+int styleable NavigationRailView_menuGravity 1
+int[] styleable NavigationView { 0x10100d4, 0x10100dd, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable NavigationView_android_background 0
+int styleable NavigationView_android_fitsSystemWindows 1
+int styleable NavigationView_android_maxWidth 2
+int styleable NavigationView_elevation 3
+int styleable NavigationView_headerLayout 4
+int styleable NavigationView_itemBackground 5
+int styleable NavigationView_itemHorizontalPadding 6
+int styleable NavigationView_itemIconPadding 7
+int styleable NavigationView_itemIconSize 8
+int styleable NavigationView_itemIconTint 9
+int styleable NavigationView_itemMaxLines 10
+int styleable NavigationView_itemShapeAppearance 11
+int styleable NavigationView_itemShapeAppearanceOverlay 12
+int styleable NavigationView_itemShapeFillColor 13
+int styleable NavigationView_itemShapeInsetBottom 14
+int styleable NavigationView_itemShapeInsetEnd 15
+int styleable NavigationView_itemShapeInsetStart 16
+int styleable NavigationView_itemShapeInsetTop 17
+int styleable NavigationView_itemTextAppearance 18
+int styleable NavigationView_itemTextColor 19
+int styleable NavigationView_menu 20
+int styleable NavigationView_shapeAppearance 21
+int styleable NavigationView_shapeAppearanceOverlay 22
+int[] styleable OnClick { 0x0, 0x0 }
+int styleable OnClick_clickAction 0
+int styleable OnClick_targetId 1
+int[] styleable OnSwipe { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable OnSwipe_dragDirection 0
+int styleable OnSwipe_dragScale 1
+int styleable OnSwipe_dragThreshold 2
+int styleable OnSwipe_limitBoundsTo 3
+int styleable OnSwipe_maxAcceleration 4
+int styleable OnSwipe_maxVelocity 5
+int styleable OnSwipe_moveWhenScrollAtTop 6
+int styleable OnSwipe_nestedScrollFlags 7
+int styleable OnSwipe_onTouchUp 8
+int styleable OnSwipe_touchAnchorId 9
+int styleable OnSwipe_touchAnchorSide 10
+int styleable OnSwipe_touchRegionId 11
+int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x0 }
+int styleable PopupWindow_android_popupAnimationStyle 0
+int styleable PopupWindow_android_popupBackground 1
+int styleable PopupWindow_overlapAnchor 2
+int[] styleable PopupWindowBackgroundState { 0x0 }
+int styleable PopupWindowBackgroundState_state_above_anchor 0
+int[] styleable PropertySet { 0x101031f, 0x10100dc, 0x0, 0x0, 0x0 }
+int styleable PropertySet_android_alpha 0
+int styleable PropertySet_android_visibility 1
+int styleable PropertySet_layout_constraintTag 2
+int styleable PropertySet_motionProgress 3
+int styleable PropertySet_visibilityMode 4
+int[] styleable RadialViewGroup { 0x0 }
+int styleable RadialViewGroup_materialCircleRadius 0
+int[] styleable RangeSlider { 0x0, 0x0 }
+int styleable RangeSlider_minSeparation 0
+int styleable RangeSlider_values 1
+int[] styleable RecycleListView { 0x0, 0x0 }
+int styleable RecycleListView_paddingBottomNoButtons 0
+int styleable RecycleListView_paddingTopNoTitle 1
+int[] styleable RecyclerView { 0x10100eb, 0x10100f1, 0x10100c4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable RecyclerView_android_clipToPadding 0
+int styleable RecyclerView_android_descendantFocusability 1
+int styleable RecyclerView_android_orientation 2
+int styleable RecyclerView_fastScrollEnabled 3
+int styleable RecyclerView_fastScrollHorizontalThumbDrawable 4
+int styleable RecyclerView_fastScrollHorizontalTrackDrawable 5
+int styleable RecyclerView_fastScrollVerticalThumbDrawable 6
+int styleable RecyclerView_fastScrollVerticalTrackDrawable 7
+int styleable RecyclerView_layoutManager 8
+int styleable RecyclerView_reverseLayout 9
+int styleable RecyclerView_spanCount 10
+int styleable RecyclerView_stackFromEnd 11
+int[] styleable ScrimInsetsFrameLayout { 0x0 }
+int styleable ScrimInsetsFrameLayout_insetForeground 0
+int[] styleable ScrollingViewBehavior_Layout { 0x0 }
+int styleable ScrollingViewBehavior_Layout_behavior_overlapTop 0
+int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable SearchView_android_focusable 0
+int styleable SearchView_android_imeOptions 1
+int styleable SearchView_android_inputType 2
+int styleable SearchView_android_maxWidth 3
+int styleable SearchView_closeIcon 4
+int styleable SearchView_commitIcon 5
+int styleable SearchView_defaultQueryHint 6
+int styleable SearchView_goIcon 7
+int styleable SearchView_iconifiedByDefault 8
+int styleable SearchView_layout 9
+int styleable SearchView_queryBackground 10
+int styleable SearchView_queryHint 11
+int styleable SearchView_searchHintIcon 12
+int styleable SearchView_searchIcon 13
+int styleable SearchView_submitBackground 14
+int styleable SearchView_suggestionRowLayout 15
+int styleable SearchView_voiceIcon 16
+int[] styleable ShapeAppearance { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ShapeAppearance_cornerFamily 0
+int styleable ShapeAppearance_cornerFamilyBottomLeft 1
+int styleable ShapeAppearance_cornerFamilyBottomRight 2
+int styleable ShapeAppearance_cornerFamilyTopLeft 3
+int styleable ShapeAppearance_cornerFamilyTopRight 4
+int styleable ShapeAppearance_cornerSize 5
+int styleable ShapeAppearance_cornerSizeBottomLeft 6
+int styleable ShapeAppearance_cornerSizeBottomRight 7
+int styleable ShapeAppearance_cornerSizeTopLeft 8
+int styleable ShapeAppearance_cornerSizeTopRight 9
+int[] styleable ShapeableImageView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable ShapeableImageView_contentPadding 0
+int styleable ShapeableImageView_contentPaddingBottom 1
+int styleable ShapeableImageView_contentPaddingEnd 2
+int styleable ShapeableImageView_contentPaddingLeft 3
+int styleable ShapeableImageView_contentPaddingRight 4
+int styleable ShapeableImageView_contentPaddingStart 5
+int styleable ShapeableImageView_contentPaddingTop 6
+int styleable ShapeableImageView_shapeAppearance 7
+int styleable ShapeableImageView_shapeAppearanceOverlay 8
+int styleable ShapeableImageView_strokeColor 9
+int styleable ShapeableImageView_strokeWidth 10
+int[] styleable Slider { 0x101000e, 0x1010146, 0x1010024, 0x10102de, 0x10102df, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Slider_android_enabled 0
+int styleable Slider_android_stepSize 1
+int styleable Slider_android_value 2
+int styleable Slider_android_valueFrom 3
+int styleable Slider_android_valueTo 4
+int styleable Slider_haloColor 5
+int styleable Slider_haloRadius 6
+int styleable Slider_labelBehavior 7
+int styleable Slider_labelStyle 8
+int styleable Slider_thumbColor 9
+int styleable Slider_thumbElevation 10
+int styleable Slider_thumbRadius 11
+int styleable Slider_thumbStrokeColor 12
+int styleable Slider_thumbStrokeWidth 13
+int styleable Slider_tickColor 14
+int styleable Slider_tickColorActive 15
+int styleable Slider_tickColorInactive 16
+int styleable Slider_tickVisible 17
+int styleable Slider_trackColor 18
+int styleable Slider_trackColorActive 19
+int styleable Slider_trackColorInactive 20
+int styleable Slider_trackHeight 21
+int[] styleable Snackbar { 0x0, 0x0, 0x0 }
+int styleable Snackbar_snackbarButtonStyle 0
+int styleable Snackbar_snackbarStyle 1
+int styleable Snackbar_snackbarTextViewStyle 2
+int[] styleable SnackbarLayout { 0x0, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable SnackbarLayout_actionTextColorAlpha 0
+int styleable SnackbarLayout_android_maxWidth 1
+int styleable SnackbarLayout_animationMode 2
+int styleable SnackbarLayout_backgroundOverlayColorAlpha 3
+int styleable SnackbarLayout_backgroundTint 4
+int styleable SnackbarLayout_backgroundTintMode 5
+int styleable SnackbarLayout_elevation 6
+int styleable SnackbarLayout_maxActionInlineWidth 7
+int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x0 }
+int styleable Spinner_android_dropDownWidth 0
+int styleable Spinner_android_entries 1
+int styleable Spinner_android_popupBackground 2
+int styleable Spinner_android_prompt 3
+int styleable Spinner_popupTheme 4
+int[] styleable State { 0x10100d0, 0x0 }
+int styleable State_android_id 0
+int styleable State_constraints 1
+int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
+int styleable StateListDrawable_android_constantSize 0
+int styleable StateListDrawable_android_dither 1
+int styleable StateListDrawable_android_enterFadeDuration 2
+int styleable StateListDrawable_android_exitFadeDuration 3
+int styleable StateListDrawable_android_variablePadding 4
+int styleable StateListDrawable_android_visible 5
+int[] styleable StateListDrawableItem { 0x1010199 }
+int styleable StateListDrawableItem_android_drawable 0
+int[] styleable StateSet { 0x0 }
+int styleable StateSet_defaultState 0
+int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable SwitchCompat_android_textOff 0
+int styleable SwitchCompat_android_textOn 1
+int styleable SwitchCompat_android_thumb 2
+int styleable SwitchCompat_showText 3
+int styleable SwitchCompat_splitTrack 4
+int styleable SwitchCompat_switchMinWidth 5
+int styleable SwitchCompat_switchPadding 6
+int styleable SwitchCompat_switchTextAppearance 7
+int styleable SwitchCompat_thumbTextPadding 8
+int styleable SwitchCompat_thumbTint 9
+int styleable SwitchCompat_thumbTintMode 10
+int styleable SwitchCompat_track 11
+int styleable SwitchCompat_trackTint 12
+int styleable SwitchCompat_trackTintMode 13
+int[] styleable SwitchMaterial { 0x0 }
+int styleable SwitchMaterial_useMaterialThemeColors 0
+int[] styleable TabItem { 0x1010002, 0x10100f2, 0x101014f }
+int styleable TabItem_android_icon 0
+int styleable TabItem_android_layout 1
+int styleable TabItem_android_text 2
+int[] styleable TabLayout { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable TabLayout_tabBackground 0
+int styleable TabLayout_tabContentStart 1
+int styleable TabLayout_tabGravity 2
+int styleable TabLayout_tabIconTint 3
+int styleable TabLayout_tabIconTintMode 4
+int styleable TabLayout_tabIndicator 5
+int styleable TabLayout_tabIndicatorAnimationDuration 6
+int styleable TabLayout_tabIndicatorAnimationMode 7
+int styleable TabLayout_tabIndicatorColor 8
+int styleable TabLayout_tabIndicatorFullWidth 9
+int styleable TabLayout_tabIndicatorGravity 10
+int styleable TabLayout_tabIndicatorHeight 11
+int styleable TabLayout_tabInlineLabel 12
+int styleable TabLayout_tabMaxWidth 13
+int styleable TabLayout_tabMinWidth 14
+int styleable TabLayout_tabMode 15
+int styleable TabLayout_tabPadding 16
+int styleable TabLayout_tabPaddingBottom 17
+int styleable TabLayout_tabPaddingEnd 18
+int styleable TabLayout_tabPaddingStart 19
+int styleable TabLayout_tabPaddingTop 20
+int styleable TabLayout_tabRippleColor 21
+int styleable TabLayout_tabSelectedTextColor 22
+int styleable TabLayout_tabTextAppearance 23
+int styleable TabLayout_tabTextColor 24
+int styleable TabLayout_tabUnboundedRipple 25
+int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010585, 0x1010095, 0x1010097, 0x1010096, 0x0, 0x0, 0x0, 0x0 }
+int styleable TextAppearance_android_fontFamily 0
+int styleable TextAppearance_android_shadowColor 1
+int styleable TextAppearance_android_shadowDx 2
+int styleable TextAppearance_android_shadowDy 3
+int styleable TextAppearance_android_shadowRadius 4
+int styleable TextAppearance_android_textColor 5
+int styleable TextAppearance_android_textColorHint 6
+int styleable TextAppearance_android_textColorLink 7
+int styleable TextAppearance_android_textFontWeight 8
+int styleable TextAppearance_android_textSize 9
+int styleable TextAppearance_android_textStyle 10
+int styleable TextAppearance_android_typeface 11
+int styleable TextAppearance_fontFamily 12
+int styleable TextAppearance_fontVariationSettings 13
+int styleable TextAppearance_textAllCaps 14
+int styleable TextAppearance_textLocale 15
+int[] styleable TextInputEditText { 0x0 }
+int styleable TextInputEditText_textInputLayoutFocusedRectEnabled 0
+int[] styleable TextInputLayout { 0x101000e, 0x1010150, 0x101011f, 0x101013f, 0x101009a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable TextInputLayout_android_enabled 0
+int styleable TextInputLayout_android_hint 1
+int styleable TextInputLayout_android_maxWidth 2
+int styleable TextInputLayout_android_minWidth 3
+int styleable TextInputLayout_android_textColorHint 4
+int styleable TextInputLayout_boxBackgroundColor 5
+int styleable TextInputLayout_boxBackgroundMode 6
+int styleable TextInputLayout_boxCollapsedPaddingTop 7
+int styleable TextInputLayout_boxCornerRadiusBottomEnd 8
+int styleable TextInputLayout_boxCornerRadiusBottomStart 9
+int styleable TextInputLayout_boxCornerRadiusTopEnd 10
+int styleable TextInputLayout_boxCornerRadiusTopStart 11
+int styleable TextInputLayout_boxStrokeColor 12
+int styleable TextInputLayout_boxStrokeErrorColor 13
+int styleable TextInputLayout_boxStrokeWidth 14
+int styleable TextInputLayout_boxStrokeWidthFocused 15
+int styleable TextInputLayout_counterEnabled 16
+int styleable TextInputLayout_counterMaxLength 17
+int styleable TextInputLayout_counterOverflowTextAppearance 18
+int styleable TextInputLayout_counterOverflowTextColor 19
+int styleable TextInputLayout_counterTextAppearance 20
+int styleable TextInputLayout_counterTextColor 21
+int styleable TextInputLayout_endIconCheckable 22
+int styleable TextInputLayout_endIconContentDescription 23
+int styleable TextInputLayout_endIconDrawable 24
+int styleable TextInputLayout_endIconMode 25
+int styleable TextInputLayout_endIconTint 26
+int styleable TextInputLayout_endIconTintMode 27
+int styleable TextInputLayout_errorContentDescription 28
+int styleable TextInputLayout_errorEnabled 29
+int styleable TextInputLayout_errorIconDrawable 30
+int styleable TextInputLayout_errorIconTint 31
+int styleable TextInputLayout_errorIconTintMode 32
+int styleable TextInputLayout_errorTextAppearance 33
+int styleable TextInputLayout_errorTextColor 34
+int styleable TextInputLayout_expandedHintEnabled 35
+int styleable TextInputLayout_helperText 36
+int styleable TextInputLayout_helperTextEnabled 37
+int styleable TextInputLayout_helperTextTextAppearance 38
+int styleable TextInputLayout_helperTextTextColor 39
+int styleable TextInputLayout_hintAnimationEnabled 40
+int styleable TextInputLayout_hintEnabled 41
+int styleable TextInputLayout_hintTextAppearance 42
+int styleable TextInputLayout_hintTextColor 43
+int styleable TextInputLayout_passwordToggleContentDescription 44
+int styleable TextInputLayout_passwordToggleDrawable 45
+int styleable TextInputLayout_passwordToggleEnabled 46
+int styleable TextInputLayout_passwordToggleTint 47
+int styleable TextInputLayout_passwordToggleTintMode 48
+int styleable TextInputLayout_placeholderText 49
+int styleable TextInputLayout_placeholderTextAppearance 50
+int styleable TextInputLayout_placeholderTextColor 51
+int styleable TextInputLayout_prefixText 52
+int styleable TextInputLayout_prefixTextAppearance 53
+int styleable TextInputLayout_prefixTextColor 54
+int styleable TextInputLayout_shapeAppearance 55
+int styleable TextInputLayout_shapeAppearanceOverlay 56
+int styleable TextInputLayout_startIconCheckable 57
+int styleable TextInputLayout_startIconContentDescription 58
+int styleable TextInputLayout_startIconDrawable 59
+int styleable TextInputLayout_startIconTint 60
+int styleable TextInputLayout_startIconTintMode 61
+int styleable TextInputLayout_suffixText 62
+int styleable TextInputLayout_suffixTextAppearance 63
+int styleable TextInputLayout_suffixTextColor 64
+int[] styleable ThemeEnforcement { 0x1010034, 0x0, 0x0 }
+int styleable ThemeEnforcement_android_textAppearance 0
+int styleable ThemeEnforcement_enforceMaterialTheme 1
+int styleable ThemeEnforcement_enforceTextAppearance 2
+int[] styleable Toolbar { 0x10100af, 0x1010140, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Toolbar_android_gravity 0
+int styleable Toolbar_android_minHeight 1
+int styleable Toolbar_buttonGravity 2
+int styleable Toolbar_collapseContentDescription 3
+int styleable Toolbar_collapseIcon 4
+int styleable Toolbar_contentInsetEnd 5
+int styleable Toolbar_contentInsetEndWithActions 6
+int styleable Toolbar_contentInsetLeft 7
+int styleable Toolbar_contentInsetRight 8
+int styleable Toolbar_contentInsetStart 9
+int styleable Toolbar_contentInsetStartWithNavigation 10
+int styleable Toolbar_logo 11
+int styleable Toolbar_logoDescription 12
+int styleable Toolbar_maxButtonHeight 13
+int styleable Toolbar_menu 14
+int styleable Toolbar_navigationContentDescription 15
+int styleable Toolbar_navigationIcon 16
+int styleable Toolbar_popupTheme 17
+int styleable Toolbar_subtitle 18
+int styleable Toolbar_subtitleTextAppearance 19
+int styleable Toolbar_subtitleTextColor 20
+int styleable Toolbar_title 21
+int styleable Toolbar_titleMargin 22
+int styleable Toolbar_titleMarginBottom 23
+int styleable Toolbar_titleMarginEnd 24
+int styleable Toolbar_titleMarginStart 25
+int styleable Toolbar_titleMarginTop 26
+int styleable Toolbar_titleMargins 27
+int styleable Toolbar_titleTextAppearance 28
+int styleable Toolbar_titleTextColor 29
+int[] styleable Tooltip { 0x10100f6, 0x1010140, 0x101013f, 0x10100d5, 0x101014f, 0x1010034, 0x0 }
+int styleable Tooltip_android_layout_margin 0
+int styleable Tooltip_android_minHeight 1
+int styleable Tooltip_android_minWidth 2
+int styleable Tooltip_android_padding 3
+int styleable Tooltip_android_text 4
+int styleable Tooltip_android_textAppearance 5
+int styleable Tooltip_backgroundTint 6
+int[] styleable Transform { 0x1010440, 0x1010326, 0x1010327, 0x1010328, 0x1010324, 0x1010325, 0x1010320, 0x1010321, 0x1010322, 0x1010323, 0x10103fa }
+int styleable Transform_android_elevation 0
+int styleable Transform_android_rotation 1
+int styleable Transform_android_rotationX 2
+int styleable Transform_android_rotationY 3
+int styleable Transform_android_scaleX 4
+int styleable Transform_android_scaleY 5
+int styleable Transform_android_transformPivotX 6
+int styleable Transform_android_transformPivotY 7
+int styleable Transform_android_translationX 8
+int styleable Transform_android_translationY 9
+int styleable Transform_android_translationZ 10
+int[] styleable Transition { 0x10100d0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Transition_android_id 0
+int styleable Transition_autoTransition 1
+int styleable Transition_constraintSetEnd 2
+int styleable Transition_constraintSetStart 3
+int styleable Transition_duration 4
+int styleable Transition_layoutDuringTransition 5
+int styleable Transition_motionInterpolator 6
+int styleable Transition_pathMotionArc 7
+int styleable Transition_staggered 8
+int styleable Transition_transitionDisable 9
+int styleable Transition_transitionFlags 10
+int[] styleable Variant { 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable Variant_constraints 0
+int styleable Variant_region_heightLessThan 1
+int styleable Variant_region_heightMoreThan 2
+int styleable Variant_region_widthLessThan 3
+int styleable Variant_region_widthMoreThan 4
+int[] styleable View { 0x10100da, 0x1010000, 0x0, 0x0, 0x0 }
+int styleable View_android_focusable 0
+int styleable View_android_theme 1
+int styleable View_paddingEnd 2
+int styleable View_paddingStart 3
+int styleable View_theme 4
+int[] styleable ViewBackgroundHelper { 0x10100d4, 0x0, 0x0 }
+int styleable ViewBackgroundHelper_android_background 0
+int styleable ViewBackgroundHelper_backgroundTint 1
+int styleable ViewBackgroundHelper_backgroundTintMode 2
+int[] styleable ViewPager2 { 0x10100c4 }
+int styleable ViewPager2_android_orientation 0
+int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 }
+int styleable ViewStubCompat_android_id 0
+int styleable ViewStubCompat_android_inflatedId 1
+int styleable ViewStubCompat_android_layout 2
+int xml standalone_badge 0x0
+int xml standalone_badge_gravity_bottom_end 0x0
+int xml standalone_badge_gravity_bottom_start 0x0
+int xml standalone_badge_gravity_top_start 0x0
+int xml standalone_badge_offset 0x0
diff --git a/player/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/player/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 0000000000000000000000000000000000000000..65f58e68519797d7fe85c12182217c11807a297d
Binary files /dev/null and b/player/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/player/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/player/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3786d572858fe168dcbef3bc1e47634de8affa1d
--- /dev/null
+++ b/player/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/incremental/mergeDebugShaders/merger.xml b/player/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..652c53049096443fd09779138bd1469abd668ddb
--- /dev/null
+++ b/player/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/incremental/packageDebugAssets/merger.xml b/player/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd84bc4e111f1e2d200869528f732b40326acf15
--- /dev/null
+++ b/player/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/incremental/packageDebugResources/compile-file-map.properties b/player/build/intermediates/incremental/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000000000000000000000000000000000000..30dc466a492b3daaf96f8ab74f29dc4bcc6186ff
--- /dev/null
+++ b/player/build/intermediates/incremental/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Thu Nov 04 22:48:03 CST 2021
diff --git a/player/build/intermediates/incremental/packageDebugResources/merger.xml b/player/build/intermediates/incremental/packageDebugResources/merger.xml
new file mode 100644
index 0000000000000000000000000000000000000000..97d41607afb4c6205784fe65de38712a65dd6ce8
--- /dev/null
+++ b/player/build/intermediates/incremental/packageDebugResources/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/javac/debug/classes/com/ggz/player/BuildConfig.class b/player/build/intermediates/javac/debug/classes/com/ggz/player/BuildConfig.class
new file mode 100644
index 0000000000000000000000000000000000000000..0228844b730e4f0ecaaa6451519d9523651ee259
Binary files /dev/null and b/player/build/intermediates/javac/debug/classes/com/ggz/player/BuildConfig.class differ
diff --git a/player/build/intermediates/local_only_symbol_list/debug/R-def.txt b/player/build/intermediates/local_only_symbol_list/debug/R-def.txt
new file mode 100644
index 0000000000000000000000000000000000000000..78ac5b8befe332ed81b26e325fdd18037d83cac5
--- /dev/null
+++ b/player/build/intermediates/local_only_symbol_list/debug/R-def.txt
@@ -0,0 +1,2 @@
+R_DEF: Internal format may change without notice
+local
diff --git a/player/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/player/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e5fcfec49e4e50beb1f46feded61479fd712342b
--- /dev/null
+++ b/player/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
@@ -0,0 +1,11 @@
+1
+2
+4
+5 D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+7 android:targetSdkVersion="31" />
+7-->D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+8
+9
diff --git a/player/build/intermediates/merged_consumer_proguard_file/debug/proguard.txt b/player/build/intermediates/merged_consumer_proguard_file/debug/proguard.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/player/build/intermediates/merged_java_res/debug/feature-player.jar b/player/build/intermediates/merged_java_res/debug/feature-player.jar
new file mode 100644
index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7
Binary files /dev/null and b/player/build/intermediates/merged_java_res/debug/feature-player.jar differ
diff --git a/player/build/intermediates/merged_manifest/debug/AndroidManifest.xml b/player/build/intermediates/merged_manifest/debug/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e279984a98ff69f211f5b90874ee4b94bddb34d5
--- /dev/null
+++ b/player/build/intermediates/merged_manifest/debug/AndroidManifest.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/player/build/intermediates/packaged_manifests/debug/output-metadata.json b/player/build/intermediates/packaged_manifests/debug/output-metadata.json
new file mode 100644
index 0000000000000000000000000000000000000000..af9e9359c82439dc96df8ef487057db00f312e03
--- /dev/null
+++ b/player/build/intermediates/packaged_manifests/debug/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "PACKAGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.ggz.player",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "../../merged_manifest/debug/AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/player/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/player/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3ca8aabb65303364f36c34070ab20c2b43d31e6e
--- /dev/null
+++ b/player/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt
@@ -0,0 +1,3230 @@
+com.ggz.player
+anim abc_fade_in
+anim abc_fade_out
+anim abc_grow_fade_in_from_bottom
+anim abc_popup_enter
+anim abc_popup_exit
+anim abc_shrink_fade_out_from_bottom
+anim abc_slide_in_bottom
+anim abc_slide_in_top
+anim abc_slide_out_bottom
+anim abc_slide_out_top
+anim abc_tooltip_enter
+anim abc_tooltip_exit
+anim btn_checkbox_to_checked_box_inner_merged_animation
+anim btn_checkbox_to_checked_box_outer_merged_animation
+anim btn_checkbox_to_checked_icon_null_animation
+anim btn_checkbox_to_unchecked_box_inner_merged_animation
+anim btn_checkbox_to_unchecked_check_path_merged_animation
+anim btn_checkbox_to_unchecked_icon_null_animation
+anim btn_radio_to_off_mtrl_dot_group_animation
+anim btn_radio_to_off_mtrl_ring_outer_animation
+anim btn_radio_to_off_mtrl_ring_outer_path_animation
+anim btn_radio_to_on_mtrl_dot_group_animation
+anim btn_radio_to_on_mtrl_ring_outer_animation
+anim btn_radio_to_on_mtrl_ring_outer_path_animation
+anim design_bottom_sheet_slide_in
+anim design_bottom_sheet_slide_out
+anim design_snackbar_in
+anim design_snackbar_out
+anim fragment_fast_out_extra_slow_in
+anim mtrl_bottom_sheet_slide_in
+anim mtrl_bottom_sheet_slide_out
+anim mtrl_card_lowers_interpolator
+animator design_appbar_state_list_animator
+animator design_fab_hide_motion_spec
+animator design_fab_show_motion_spec
+animator fragment_close_enter
+animator fragment_close_exit
+animator fragment_fade_enter
+animator fragment_fade_exit
+animator fragment_open_enter
+animator fragment_open_exit
+animator linear_indeterminate_line1_head_interpolator
+animator linear_indeterminate_line1_tail_interpolator
+animator linear_indeterminate_line2_head_interpolator
+animator linear_indeterminate_line2_tail_interpolator
+animator mtrl_btn_state_list_anim
+animator mtrl_btn_unelevated_state_list_anim
+animator mtrl_card_state_list_anim
+animator mtrl_chip_state_list_anim
+animator mtrl_extended_fab_change_size_collapse_motion_spec
+animator mtrl_extended_fab_change_size_expand_motion_spec
+animator mtrl_extended_fab_hide_motion_spec
+animator mtrl_extended_fab_show_motion_spec
+animator mtrl_extended_fab_state_list_animator
+animator mtrl_fab_hide_motion_spec
+animator mtrl_fab_show_motion_spec
+animator mtrl_fab_transformation_sheet_collapse_spec
+animator mtrl_fab_transformation_sheet_expand_spec
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseContentDescription
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModePopupWindowStyle
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeTheme
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionTextColorAlpha
+attr actionViewClass
+attr activityChooserViewStyle
+attr alertDialogButtonGroupStyle
+attr alertDialogCenterButtons
+attr alertDialogStyle
+attr alertDialogTheme
+attr allowStacking
+attr alpha
+attr alphabeticModifiers
+attr altSrc
+attr animate_relativeTo
+attr animationMode
+attr appBarLayoutStyle
+attr applyMotionScene
+attr arcMode
+attr arrowHeadLength
+attr arrowShaftLength
+attr attributeName
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr autoTransition
+attr background
+attr backgroundColor
+attr backgroundInsetBottom
+attr backgroundInsetEnd
+attr backgroundInsetStart
+attr backgroundInsetTop
+attr backgroundOverlayColorAlpha
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr badgeGravity
+attr badgeStyle
+attr badgeTextColor
+attr barLength
+attr barrierAllowsGoneWidgets
+attr barrierDirection
+attr barrierMargin
+attr behavior_autoHide
+attr behavior_autoShrink
+attr behavior_draggable
+attr behavior_expandedOffset
+attr behavior_fitToContents
+attr behavior_halfExpandedRatio
+attr behavior_hideable
+attr behavior_overlapTop
+attr behavior_peekHeight
+attr behavior_saveFlags
+attr behavior_skipCollapsed
+attr borderWidth
+attr borderlessButtonStyle
+attr bottomAppBarStyle
+attr bottomNavigationStyle
+attr bottomSheetDialogTheme
+attr bottomSheetStyle
+attr boxBackgroundColor
+attr boxBackgroundMode
+attr boxCollapsedPaddingTop
+attr boxCornerRadiusBottomEnd
+attr boxCornerRadiusBottomStart
+attr boxCornerRadiusTopEnd
+attr boxCornerRadiusTopStart
+attr boxStrokeColor
+attr boxStrokeErrorColor
+attr boxStrokeWidth
+attr boxStrokeWidthFocused
+attr brightness
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonCompat
+attr buttonGravity
+attr buttonIconDimen
+attr buttonPanelSideLayout
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr cardBackgroundColor
+attr cardCornerRadius
+attr cardElevation
+attr cardForegroundColor
+attr cardMaxElevation
+attr cardPreventCornerOverlap
+attr cardUseCompatPadding
+attr cardViewStyle
+attr chainUseRtl
+attr checkboxStyle
+attr checkedButton
+attr checkedChip
+attr checkedIcon
+attr checkedIconEnabled
+attr checkedIconMargin
+attr checkedIconSize
+attr checkedIconTint
+attr checkedIconVisible
+attr checkedTextViewStyle
+attr chipBackgroundColor
+attr chipCornerRadius
+attr chipEndPadding
+attr chipGroupStyle
+attr chipIcon
+attr chipIconEnabled
+attr chipIconSize
+attr chipIconTint
+attr chipIconVisible
+attr chipMinHeight
+attr chipMinTouchTargetSize
+attr chipSpacing
+attr chipSpacingHorizontal
+attr chipSpacingVertical
+attr chipStandaloneStyle
+attr chipStartPadding
+attr chipStrokeColor
+attr chipStrokeWidth
+attr chipStyle
+attr chipSurfaceColor
+attr circleRadius
+attr circularProgressIndicatorStyle
+attr clickAction
+attr clockFaceBackgroundColor
+attr clockHandColor
+attr clockIcon
+attr clockNumberTextColor
+attr closeIcon
+attr closeIconEnabled
+attr closeIconEndPadding
+attr closeIconSize
+attr closeIconStartPadding
+attr closeIconTint
+attr closeIconVisible
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr collapsedSize
+attr collapsedTitleGravity
+attr collapsedTitleTextAppearance
+attr collapsingToolbarLayoutStyle
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorOnBackground
+attr colorOnError
+attr colorOnPrimary
+attr colorOnPrimarySurface
+attr colorOnSecondary
+attr colorOnSurface
+attr colorPrimary
+attr colorPrimaryDark
+attr colorPrimarySurface
+attr colorPrimaryVariant
+attr colorSecondary
+attr colorSecondaryVariant
+attr colorSurface
+attr colorSwitchThumbNormal
+attr commitIcon
+attr constraintSet
+attr constraintSetEnd
+attr constraintSetStart
+attr constraint_referenced_ids
+attr constraints
+attr content
+attr contentDescription
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr contentPadding
+attr contentPaddingBottom
+attr contentPaddingEnd
+attr contentPaddingLeft
+attr contentPaddingRight
+attr contentPaddingStart
+attr contentPaddingTop
+attr contentScrim
+attr contrast
+attr controlBackground
+attr coordinatorLayoutStyle
+attr cornerFamily
+attr cornerFamilyBottomLeft
+attr cornerFamilyBottomRight
+attr cornerFamilyTopLeft
+attr cornerFamilyTopRight
+attr cornerRadius
+attr cornerSize
+attr cornerSizeBottomLeft
+attr cornerSizeBottomRight
+attr cornerSizeTopLeft
+attr cornerSizeTopRight
+attr counterEnabled
+attr counterMaxLength
+attr counterOverflowTextAppearance
+attr counterOverflowTextColor
+attr counterTextAppearance
+attr counterTextColor
+attr crossfade
+attr currentState
+attr curveFit
+attr customBoolean
+attr customColorDrawableValue
+attr customColorValue
+attr customDimension
+attr customFloatValue
+attr customIntegerValue
+attr customNavigationLayout
+attr customPixelDimension
+attr customStringValue
+attr dayInvalidStyle
+attr daySelectedStyle
+attr dayStyle
+attr dayTodayStyle
+attr defaultDuration
+attr defaultQueryHint
+attr defaultState
+attr deltaPolarAngle
+attr deltaPolarRadius
+attr deriveConstraintsFrom
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr dragDirection
+attr dragScale
+attr dragThreshold
+attr drawPath
+attr drawableBottomCompat
+attr drawableEndCompat
+attr drawableLeftCompat
+attr drawableRightCompat
+attr drawableSize
+attr drawableStartCompat
+attr drawableTint
+attr drawableTintMode
+attr drawableTopCompat
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr dropdownListPreferredItemHeight
+attr duration
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr elevationOverlayColor
+attr elevationOverlayEnabled
+attr enableEdgeToEdge
+attr endIconCheckable
+attr endIconContentDescription
+attr endIconDrawable
+attr endIconMode
+attr endIconTint
+attr endIconTintMode
+attr enforceMaterialTheme
+attr enforceTextAppearance
+attr ensureMinTouchTargetSize
+attr errorContentDescription
+attr errorEnabled
+attr errorIconDrawable
+attr errorIconTint
+attr errorIconTintMode
+attr errorTextAppearance
+attr errorTextColor
+attr expandActivityOverflowButtonDrawable
+attr expanded
+attr expandedHintEnabled
+attr expandedTitleGravity
+attr expandedTitleMargin
+attr expandedTitleMarginBottom
+attr expandedTitleMarginEnd
+attr expandedTitleMarginStart
+attr expandedTitleMarginTop
+attr expandedTitleTextAppearance
+attr extendMotionSpec
+attr extendedFloatingActionButtonStyle
+attr extraMultilineHeightEnabled
+attr fabAlignmentMode
+attr fabAnimationMode
+attr fabCradleMargin
+attr fabCradleRoundedCornerRadius
+attr fabCradleVerticalOffset
+attr fabCustomSize
+attr fabSize
+attr fastScrollEnabled
+attr fastScrollHorizontalThumbDrawable
+attr fastScrollHorizontalTrackDrawable
+attr fastScrollVerticalThumbDrawable
+attr fastScrollVerticalTrackDrawable
+attr firstBaselineToTopHeight
+attr floatingActionButtonStyle
+attr flow_firstHorizontalBias
+attr flow_firstHorizontalStyle
+attr flow_firstVerticalBias
+attr flow_firstVerticalStyle
+attr flow_horizontalAlign
+attr flow_horizontalBias
+attr flow_horizontalGap
+attr flow_horizontalStyle
+attr flow_lastHorizontalBias
+attr flow_lastHorizontalStyle
+attr flow_lastVerticalBias
+attr flow_lastVerticalStyle
+attr flow_maxElementsWrap
+attr flow_padding
+attr flow_verticalAlign
+attr flow_verticalBias
+attr flow_verticalGap
+attr flow_verticalStyle
+attr flow_wrapMode
+attr font
+attr fontFamily
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr forceApplySystemWindowInsetTop
+attr foregroundInsidePadding
+attr framePosition
+attr gapBetweenBars
+attr gestureInsetBottomIgnored
+attr goIcon
+attr haloColor
+attr haloRadius
+attr headerLayout
+attr height
+attr helperText
+attr helperTextEnabled
+attr helperTextTextAppearance
+attr helperTextTextColor
+attr hideAnimationBehavior
+attr hideMotionSpec
+attr hideOnContentScroll
+attr hideOnScroll
+attr hintAnimationEnabled
+attr hintEnabled
+attr hintTextAppearance
+attr hintTextColor
+attr homeAsUpIndicator
+attr homeLayout
+attr horizontalOffset
+attr hoveredFocusedTranslationZ
+attr icon
+attr iconEndPadding
+attr iconGravity
+attr iconPadding
+attr iconSize
+attr iconStartPadding
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateAnimationType
+attr indeterminateProgressStyle
+attr indicatorColor
+attr indicatorDirectionCircular
+attr indicatorDirectionLinear
+attr indicatorInset
+attr indicatorSize
+attr initialActivityCount
+attr insetForeground
+attr isLightTheme
+attr isMaterialTheme
+attr itemBackground
+attr itemFillColor
+attr itemHorizontalPadding
+attr itemHorizontalTranslationEnabled
+attr itemIconPadding
+attr itemIconSize
+attr itemIconTint
+attr itemMaxLines
+attr itemPadding
+attr itemRippleColor
+attr itemShapeAppearance
+attr itemShapeAppearanceOverlay
+attr itemShapeFillColor
+attr itemShapeInsetBottom
+attr itemShapeInsetEnd
+attr itemShapeInsetStart
+attr itemShapeInsetTop
+attr itemSpacing
+attr itemStrokeColor
+attr itemStrokeWidth
+attr itemTextAppearance
+attr itemTextAppearanceActive
+attr itemTextAppearanceInactive
+attr itemTextColor
+attr keyPositionType
+attr keyboardIcon
+attr keylines
+attr labelBehavior
+attr labelStyle
+attr labelVisibilityMode
+attr lastBaselineToBottomHeight
+attr layout
+attr layoutDescription
+attr layoutDuringTransition
+attr layoutManager
+attr layout_anchor
+attr layout_anchorGravity
+attr layout_behavior
+attr layout_collapseMode
+attr layout_collapseParallaxMultiplier
+attr layout_constrainedHeight
+attr layout_constrainedWidth
+attr layout_constraintBaseline_creator
+attr layout_constraintBaseline_toBaselineOf
+attr layout_constraintBottom_creator
+attr layout_constraintBottom_toBottomOf
+attr layout_constraintBottom_toTopOf
+attr layout_constraintCircle
+attr layout_constraintCircleAngle
+attr layout_constraintCircleRadius
+attr layout_constraintDimensionRatio
+attr layout_constraintEnd_toEndOf
+attr layout_constraintEnd_toStartOf
+attr layout_constraintGuide_begin
+attr layout_constraintGuide_end
+attr layout_constraintGuide_percent
+attr layout_constraintHeight_default
+attr layout_constraintHeight_max
+attr layout_constraintHeight_min
+attr layout_constraintHeight_percent
+attr layout_constraintHorizontal_bias
+attr layout_constraintHorizontal_chainStyle
+attr layout_constraintHorizontal_weight
+attr layout_constraintLeft_creator
+attr layout_constraintLeft_toLeftOf
+attr layout_constraintLeft_toRightOf
+attr layout_constraintRight_creator
+attr layout_constraintRight_toLeftOf
+attr layout_constraintRight_toRightOf
+attr layout_constraintStart_toEndOf
+attr layout_constraintStart_toStartOf
+attr layout_constraintTag
+attr layout_constraintTop_creator
+attr layout_constraintTop_toBottomOf
+attr layout_constraintTop_toTopOf
+attr layout_constraintVertical_bias
+attr layout_constraintVertical_chainStyle
+attr layout_constraintVertical_weight
+attr layout_constraintWidth_default
+attr layout_constraintWidth_max
+attr layout_constraintWidth_min
+attr layout_constraintWidth_percent
+attr layout_dodgeInsetEdges
+attr layout_editor_absoluteX
+attr layout_editor_absoluteY
+attr layout_goneMarginBottom
+attr layout_goneMarginEnd
+attr layout_goneMarginLeft
+attr layout_goneMarginRight
+attr layout_goneMarginStart
+attr layout_goneMarginTop
+attr layout_insetEdge
+attr layout_keyline
+attr layout_optimizationLevel
+attr layout_scrollFlags
+attr layout_scrollInterpolator
+attr liftOnScroll
+attr liftOnScrollTargetViewId
+attr limitBoundsTo
+attr lineHeight
+attr lineSpacing
+attr linearProgressIndicatorStyle
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listItemLayout
+attr listLayout
+attr listMenuViewStyle
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr materialAlertDialogBodyTextStyle
+attr materialAlertDialogTheme
+attr materialAlertDialogTitleIconStyle
+attr materialAlertDialogTitlePanelStyle
+attr materialAlertDialogTitleTextStyle
+attr materialButtonOutlinedStyle
+attr materialButtonStyle
+attr materialButtonToggleGroupStyle
+attr materialCalendarDay
+attr materialCalendarFullscreenTheme
+attr materialCalendarHeaderCancelButton
+attr materialCalendarHeaderConfirmButton
+attr materialCalendarHeaderDivider
+attr materialCalendarHeaderLayout
+attr materialCalendarHeaderSelection
+attr materialCalendarHeaderTitle
+attr materialCalendarHeaderToggleButton
+attr materialCalendarMonth
+attr materialCalendarMonthNavigationButton
+attr materialCalendarStyle
+attr materialCalendarTheme
+attr materialCalendarYearNavigationButton
+attr materialCardViewStyle
+attr materialCircleRadius
+attr materialClockStyle
+attr materialThemeOverlay
+attr materialTimePickerStyle
+attr materialTimePickerTheme
+attr maxAcceleration
+attr maxActionInlineWidth
+attr maxButtonHeight
+attr maxCharacterCount
+attr maxHeight
+attr maxImageSize
+attr maxLines
+attr maxVelocity
+attr maxWidth
+attr measureWithLargestChild
+attr menu
+attr menuGravity
+attr minHeight
+attr minHideDelay
+attr minSeparation
+attr minTouchTargetSize
+attr minWidth
+attr mock_diagonalsColor
+attr mock_label
+attr mock_labelBackgroundColor
+attr mock_labelColor
+attr mock_showDiagonals
+attr mock_showLabel
+attr motionDebug
+attr motionDurationLong1
+attr motionDurationLong2
+attr motionDurationMedium1
+attr motionDurationMedium2
+attr motionDurationShort1
+attr motionDurationShort2
+attr motionEasingAccelerated
+attr motionEasingDecelerated
+attr motionEasingEmphasized
+attr motionEasingLinear
+attr motionEasingStandard
+attr motionInterpolator
+attr motionPath
+attr motionPathRotate
+attr motionProgress
+attr motionStagger
+attr motionTarget
+attr motion_postLayoutCollision
+attr motion_triggerOnCollision
+attr moveWhenScrollAtTop
+attr multiChoiceItemLayout
+attr navigationContentDescription
+attr navigationIcon
+attr navigationIconTint
+attr navigationMode
+attr navigationRailStyle
+attr navigationViewStyle
+attr nestedScrollFlags
+attr nestedScrollViewStyle
+attr nestedScrollable
+attr number
+attr numericModifiers
+attr onCross
+attr onHide
+attr onNegativeCross
+attr onPositiveCross
+attr onShow
+attr onTouchUp
+attr overlapAnchor
+attr overlay
+attr paddingBottomNoButtons
+attr paddingBottomSystemWindowInsets
+attr paddingEnd
+attr paddingLeftSystemWindowInsets
+attr paddingRightSystemWindowInsets
+attr paddingStart
+attr paddingTopNoTitle
+attr paddingTopSystemWindowInsets
+attr panelBackground
+attr panelMenuListTheme
+attr panelMenuListWidth
+attr passwordToggleContentDescription
+attr passwordToggleDrawable
+attr passwordToggleEnabled
+attr passwordToggleTint
+attr passwordToggleTintMode
+attr pathMotionArc
+attr path_percent
+attr percentHeight
+attr percentWidth
+attr percentX
+attr percentY
+attr perpendicularPath_percent
+attr pivotAnchor
+attr placeholderText
+attr placeholderTextAppearance
+attr placeholderTextColor
+attr placeholder_emptyVisibility
+attr popupMenuBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr prefixText
+attr prefixTextAppearance
+attr prefixTextColor
+attr preserveIconSpacing
+attr pressedTranslationZ
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr queryPatterns
+attr radioButtonStyle
+attr rangeFillColor
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr recyclerViewStyle
+attr region_heightLessThan
+attr region_heightMoreThan
+attr region_widthLessThan
+attr region_widthMoreThan
+attr reverseLayout
+attr rippleColor
+attr round
+attr roundPercent
+attr saturation
+attr scrimAnimationDuration
+attr scrimBackground
+attr scrimVisibleHeightTrigger
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr selectionRequired
+attr selectorSize
+attr shapeAppearance
+attr shapeAppearanceLargeComponent
+attr shapeAppearanceMediumComponent
+attr shapeAppearanceOverlay
+attr shapeAppearanceSmallComponent
+attr shortcutMatchRequired
+attr showAnimationBehavior
+attr showAsAction
+attr showDelay
+attr showDividers
+attr showMotionSpec
+attr showPaths
+attr showText
+attr showTitle
+attr shrinkMotionSpec
+attr singleChoiceItemLayout
+attr singleLine
+attr singleSelection
+attr sizePercent
+attr sliderStyle
+attr snackbarButtonStyle
+attr snackbarStyle
+attr snackbarTextViewStyle
+attr spanCount
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr stackFromEnd
+attr staggered
+attr startIconCheckable
+attr startIconContentDescription
+attr startIconDrawable
+attr startIconTint
+attr startIconTintMode
+attr state_above_anchor
+attr state_collapsed
+attr state_collapsible
+attr state_dragged
+attr state_liftable
+attr state_lifted
+attr statusBarBackground
+attr statusBarForeground
+attr statusBarScrim
+attr strokeColor
+attr strokeWidth
+attr subMenuArrow
+attr submitBackground
+attr subtitle
+attr subtitleCentered
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suffixText
+attr suffixTextAppearance
+attr suffixTextColor
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr tabBackground
+attr tabContentStart
+attr tabGravity
+attr tabIconTint
+attr tabIconTintMode
+attr tabIndicator
+attr tabIndicatorAnimationDuration
+attr tabIndicatorAnimationMode
+attr tabIndicatorColor
+attr tabIndicatorFullWidth
+attr tabIndicatorGravity
+attr tabIndicatorHeight
+attr tabInlineLabel
+attr tabMaxWidth
+attr tabMinWidth
+attr tabMode
+attr tabPadding
+attr tabPaddingBottom
+attr tabPaddingEnd
+attr tabPaddingStart
+attr tabPaddingTop
+attr tabRippleColor
+attr tabSelectedTextColor
+attr tabStyle
+attr tabTextAppearance
+attr tabTextColor
+attr tabUnboundedRipple
+attr targetId
+attr telltales_tailColor
+attr telltales_tailScale
+attr telltales_velocityMode
+attr textAllCaps
+attr textAppearanceBody1
+attr textAppearanceBody2
+attr textAppearanceButton
+attr textAppearanceCaption
+attr textAppearanceHeadline1
+attr textAppearanceHeadline2
+attr textAppearanceHeadline3
+attr textAppearanceHeadline4
+attr textAppearanceHeadline5
+attr textAppearanceHeadline6
+attr textAppearanceLargePopupMenu
+attr textAppearanceLineHeightEnabled
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearanceOverline
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textAppearanceSubtitle1
+attr textAppearanceSubtitle2
+attr textColorAlertDialogListItem
+attr textColorSearchUrl
+attr textEndPadding
+attr textInputLayoutFocusedRectEnabled
+attr textInputStyle
+attr textLocale
+attr textStartPadding
+attr theme
+attr themeLineHeight
+attr thickness
+attr thumbColor
+attr thumbElevation
+attr thumbRadius
+attr thumbStrokeColor
+attr thumbStrokeWidth
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickColor
+attr tickColorActive
+attr tickColorInactive
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tickVisible
+attr tint
+attr tintMode
+attr title
+attr titleCentered
+attr titleCollapseMode
+attr titleEnabled
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarId
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr tooltipForegroundColor
+attr tooltipFrameBackground
+attr tooltipStyle
+attr tooltipText
+attr touchAnchorId
+attr touchAnchorSide
+attr touchRegionId
+attr track
+attr trackColor
+attr trackColorActive
+attr trackColorInactive
+attr trackCornerRadius
+attr trackHeight
+attr trackThickness
+attr trackTint
+attr trackTintMode
+attr transitionDisable
+attr transitionEasing
+attr transitionFlags
+attr transitionPathRotate
+attr transitionShapeAppearance
+attr triggerId
+attr triggerReceiver
+attr triggerSlack
+attr ttcIndex
+attr useCompatPadding
+attr useMaterialThemeColors
+attr values
+attr verticalOffset
+attr viewInflaterClass
+attr visibilityMode
+attr voiceIcon
+attr warmth
+attr waveDecay
+attr waveOffset
+attr wavePeriod
+attr waveShape
+attr waveVariesBy
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowFixedHeightMajor
+attr windowFixedHeightMinor
+attr windowFixedWidthMajor
+attr windowFixedWidthMinor
+attr windowMinWidthMajor
+attr windowMinWidthMinor
+attr windowNoTitle
+attr yearSelectedStyle
+attr yearStyle
+attr yearTodayStyle
+bool abc_action_bar_embed_tabs
+bool abc_allow_stacked_button_bar
+bool abc_config_actionMenuItemAllCaps
+bool mtrl_btn_textappearance_all_caps
+color abc_background_cache_hint_selector_material_dark
+color abc_background_cache_hint_selector_material_light
+color abc_btn_colored_borderless_text_material
+color abc_btn_colored_text_material
+color abc_color_highlight_material
+color abc_decor_view_status_guard
+color abc_decor_view_status_guard_light
+color abc_hint_foreground_material_dark
+color abc_hint_foreground_material_light
+color abc_primary_text_disable_only_material_dark
+color abc_primary_text_disable_only_material_light
+color abc_primary_text_material_dark
+color abc_primary_text_material_light
+color abc_search_url_text
+color abc_search_url_text_normal
+color abc_search_url_text_pressed
+color abc_search_url_text_selected
+color abc_secondary_text_material_dark
+color abc_secondary_text_material_light
+color abc_tint_btn_checkable
+color abc_tint_default
+color abc_tint_edittext
+color abc_tint_seek_thumb
+color abc_tint_spinner
+color abc_tint_switch_track
+color accent_material_dark
+color accent_material_light
+color androidx_core_ripple_material_light
+color androidx_core_secondary_text_default_material_light
+color background_floating_material_dark
+color background_floating_material_light
+color background_material_dark
+color background_material_light
+color bright_foreground_disabled_material_dark
+color bright_foreground_disabled_material_light
+color bright_foreground_inverse_material_dark
+color bright_foreground_inverse_material_light
+color bright_foreground_material_dark
+color bright_foreground_material_light
+color button_material_dark
+color button_material_light
+color cardview_dark_background
+color cardview_light_background
+color cardview_shadow_end_color
+color cardview_shadow_start_color
+color checkbox_themeable_attribute_color
+color design_bottom_navigation_shadow_color
+color design_box_stroke_color
+color design_dark_default_color_background
+color design_dark_default_color_error
+color design_dark_default_color_on_background
+color design_dark_default_color_on_error
+color design_dark_default_color_on_primary
+color design_dark_default_color_on_secondary
+color design_dark_default_color_on_surface
+color design_dark_default_color_primary
+color design_dark_default_color_primary_dark
+color design_dark_default_color_primary_variant
+color design_dark_default_color_secondary
+color design_dark_default_color_secondary_variant
+color design_dark_default_color_surface
+color design_default_color_background
+color design_default_color_error
+color design_default_color_on_background
+color design_default_color_on_error
+color design_default_color_on_primary
+color design_default_color_on_secondary
+color design_default_color_on_surface
+color design_default_color_primary
+color design_default_color_primary_dark
+color design_default_color_primary_variant
+color design_default_color_secondary
+color design_default_color_secondary_variant
+color design_default_color_surface
+color design_error
+color design_fab_shadow_end_color
+color design_fab_shadow_mid_color
+color design_fab_shadow_start_color
+color design_fab_stroke_end_inner_color
+color design_fab_stroke_end_outer_color
+color design_fab_stroke_top_inner_color
+color design_fab_stroke_top_outer_color
+color design_icon_tint
+color design_snackbar_background_color
+color dim_foreground_disabled_material_dark
+color dim_foreground_disabled_material_light
+color dim_foreground_material_dark
+color dim_foreground_material_light
+color error_color_material_dark
+color error_color_material_light
+color foreground_material_dark
+color foreground_material_light
+color highlighted_text_material_dark
+color highlighted_text_material_light
+color material_blue_grey_800
+color material_blue_grey_900
+color material_blue_grey_950
+color material_cursor_color
+color material_deep_teal_200
+color material_deep_teal_500
+color material_grey_100
+color material_grey_300
+color material_grey_50
+color material_grey_600
+color material_grey_800
+color material_grey_850
+color material_grey_900
+color material_on_background_disabled
+color material_on_background_emphasis_high_type
+color material_on_background_emphasis_medium
+color material_on_primary_disabled
+color material_on_primary_emphasis_high_type
+color material_on_primary_emphasis_medium
+color material_on_surface_disabled
+color material_on_surface_emphasis_high_type
+color material_on_surface_emphasis_medium
+color material_on_surface_stroke
+color material_slider_active_tick_marks_color
+color material_slider_active_track_color
+color material_slider_halo_color
+color material_slider_inactive_tick_marks_color
+color material_slider_inactive_track_color
+color material_slider_thumb_color
+color material_timepicker_button_background
+color material_timepicker_button_stroke
+color material_timepicker_clock_text_color
+color material_timepicker_clockface
+color material_timepicker_modebutton_tint
+color mtrl_btn_bg_color_selector
+color mtrl_btn_ripple_color
+color mtrl_btn_stroke_color_selector
+color mtrl_btn_text_btn_bg_color_selector
+color mtrl_btn_text_btn_ripple_color
+color mtrl_btn_text_color_disabled
+color mtrl_btn_text_color_selector
+color mtrl_btn_transparent_bg_color
+color mtrl_calendar_item_stroke_color
+color mtrl_calendar_selected_range
+color mtrl_card_view_foreground
+color mtrl_card_view_ripple
+color mtrl_chip_background_color
+color mtrl_chip_close_icon_tint
+color mtrl_chip_surface_color
+color mtrl_chip_text_color
+color mtrl_choice_chip_background_color
+color mtrl_choice_chip_ripple_color
+color mtrl_choice_chip_text_color
+color mtrl_error
+color mtrl_fab_bg_color_selector
+color mtrl_fab_icon_text_color_selector
+color mtrl_fab_ripple_color
+color mtrl_filled_background_color
+color mtrl_filled_icon_tint
+color mtrl_filled_stroke_color
+color mtrl_indicator_text_color
+color mtrl_navigation_bar_colored_item_tint
+color mtrl_navigation_bar_colored_ripple_color
+color mtrl_navigation_bar_item_tint
+color mtrl_navigation_bar_ripple_color
+color mtrl_navigation_item_background_color
+color mtrl_navigation_item_icon_tint
+color mtrl_navigation_item_text_color
+color mtrl_on_primary_text_btn_text_color_selector
+color mtrl_on_surface_ripple_color
+color mtrl_outlined_icon_tint
+color mtrl_outlined_stroke_color
+color mtrl_popupmenu_overlay_color
+color mtrl_scrim_color
+color mtrl_tabs_colored_ripple_color
+color mtrl_tabs_icon_color_selector
+color mtrl_tabs_icon_color_selector_colored
+color mtrl_tabs_legacy_text_color_selector
+color mtrl_tabs_ripple_color
+color mtrl_text_btn_text_color_selector
+color mtrl_textinput_default_box_stroke_color
+color mtrl_textinput_disabled_color
+color mtrl_textinput_filled_box_default_background_color
+color mtrl_textinput_focused_box_stroke_color
+color mtrl_textinput_hovered_box_stroke_color
+color notification_action_color_filter
+color notification_icon_bg_color
+color primary_dark_material_dark
+color primary_dark_material_light
+color primary_material_dark
+color primary_material_light
+color primary_text_default_material_dark
+color primary_text_default_material_light
+color primary_text_disabled_material_dark
+color primary_text_disabled_material_light
+color radiobutton_themeable_attribute_color
+color ripple_material_dark
+color ripple_material_light
+color secondary_text_default_material_dark
+color secondary_text_default_material_light
+color secondary_text_disabled_material_dark
+color secondary_text_disabled_material_light
+color switch_thumb_disabled_material_dark
+color switch_thumb_disabled_material_light
+color switch_thumb_material_dark
+color switch_thumb_material_light
+color switch_thumb_normal_material_dark
+color switch_thumb_normal_material_light
+color test_mtrl_calendar_day
+color test_mtrl_calendar_day_selected
+color tooltip_background_dark
+color tooltip_background_light
+dimen abc_action_bar_content_inset_material
+dimen abc_action_bar_content_inset_with_nav
+dimen abc_action_bar_default_height_material
+dimen abc_action_bar_default_padding_end_material
+dimen abc_action_bar_default_padding_start_material
+dimen abc_action_bar_elevation_material
+dimen abc_action_bar_icon_vertical_padding_material
+dimen abc_action_bar_overflow_padding_end_material
+dimen abc_action_bar_overflow_padding_start_material
+dimen abc_action_bar_stacked_max_height
+dimen abc_action_bar_stacked_tab_max_width
+dimen abc_action_bar_subtitle_bottom_margin_material
+dimen abc_action_bar_subtitle_top_margin_material
+dimen abc_action_button_min_height_material
+dimen abc_action_button_min_width_material
+dimen abc_action_button_min_width_overflow_material
+dimen abc_alert_dialog_button_bar_height
+dimen abc_alert_dialog_button_dimen
+dimen abc_button_inset_horizontal_material
+dimen abc_button_inset_vertical_material
+dimen abc_button_padding_horizontal_material
+dimen abc_button_padding_vertical_material
+dimen abc_cascading_menus_min_smallest_width
+dimen abc_config_prefDialogWidth
+dimen abc_control_corner_material
+dimen abc_control_inset_material
+dimen abc_control_padding_material
+dimen abc_dialog_corner_radius_material
+dimen abc_dialog_fixed_height_major
+dimen abc_dialog_fixed_height_minor
+dimen abc_dialog_fixed_width_major
+dimen abc_dialog_fixed_width_minor
+dimen abc_dialog_list_padding_bottom_no_buttons
+dimen abc_dialog_list_padding_top_no_title
+dimen abc_dialog_min_width_major
+dimen abc_dialog_min_width_minor
+dimen abc_dialog_padding_material
+dimen abc_dialog_padding_top_material
+dimen abc_dialog_title_divider_material
+dimen abc_disabled_alpha_material_dark
+dimen abc_disabled_alpha_material_light
+dimen abc_dropdownitem_icon_width
+dimen abc_dropdownitem_text_padding_left
+dimen abc_dropdownitem_text_padding_right
+dimen abc_edit_text_inset_bottom_material
+dimen abc_edit_text_inset_horizontal_material
+dimen abc_edit_text_inset_top_material
+dimen abc_floating_window_z
+dimen abc_list_item_height_large_material
+dimen abc_list_item_height_material
+dimen abc_list_item_height_small_material
+dimen abc_list_item_padding_horizontal_material
+dimen abc_panel_menu_list_width
+dimen abc_progress_bar_height_material
+dimen abc_search_view_preferred_height
+dimen abc_search_view_preferred_width
+dimen abc_seekbar_track_background_height_material
+dimen abc_seekbar_track_progress_height_material
+dimen abc_select_dialog_padding_start_material
+dimen abc_star_big
+dimen abc_star_medium
+dimen abc_star_small
+dimen abc_switch_padding
+dimen abc_text_size_body_1_material
+dimen abc_text_size_body_2_material
+dimen abc_text_size_button_material
+dimen abc_text_size_caption_material
+dimen abc_text_size_display_1_material
+dimen abc_text_size_display_2_material
+dimen abc_text_size_display_3_material
+dimen abc_text_size_display_4_material
+dimen abc_text_size_headline_material
+dimen abc_text_size_large_material
+dimen abc_text_size_medium_material
+dimen abc_text_size_menu_header_material
+dimen abc_text_size_menu_material
+dimen abc_text_size_small_material
+dimen abc_text_size_subhead_material
+dimen abc_text_size_subtitle_material_toolbar
+dimen abc_text_size_title_material
+dimen abc_text_size_title_material_toolbar
+dimen action_bar_size
+dimen appcompat_dialog_background_inset
+dimen cardview_compat_inset_shadow
+dimen cardview_default_elevation
+dimen cardview_default_radius
+dimen clock_face_margin_start
+dimen compat_button_inset_horizontal_material
+dimen compat_button_inset_vertical_material
+dimen compat_button_padding_horizontal_material
+dimen compat_button_padding_vertical_material
+dimen compat_control_corner_material
+dimen compat_notification_large_icon_max_height
+dimen compat_notification_large_icon_max_width
+dimen default_dimension
+dimen design_appbar_elevation
+dimen design_bottom_navigation_active_item_max_width
+dimen design_bottom_navigation_active_item_min_width
+dimen design_bottom_navigation_active_text_size
+dimen design_bottom_navigation_elevation
+dimen design_bottom_navigation_height
+dimen design_bottom_navigation_icon_size
+dimen design_bottom_navigation_item_max_width
+dimen design_bottom_navigation_item_min_width
+dimen design_bottom_navigation_label_padding
+dimen design_bottom_navigation_margin
+dimen design_bottom_navigation_shadow_height
+dimen design_bottom_navigation_text_size
+dimen design_bottom_sheet_elevation
+dimen design_bottom_sheet_modal_elevation
+dimen design_bottom_sheet_peek_height_min
+dimen design_fab_border_width
+dimen design_fab_elevation
+dimen design_fab_image_size
+dimen design_fab_size_mini
+dimen design_fab_size_normal
+dimen design_fab_translation_z_hovered_focused
+dimen design_fab_translation_z_pressed
+dimen design_navigation_elevation
+dimen design_navigation_icon_padding
+dimen design_navigation_icon_size
+dimen design_navigation_item_horizontal_padding
+dimen design_navigation_item_icon_padding
+dimen design_navigation_max_width
+dimen design_navigation_padding_bottom
+dimen design_navigation_separator_vertical_padding
+dimen design_snackbar_action_inline_max_width
+dimen design_snackbar_action_text_color_alpha
+dimen design_snackbar_background_corner_radius
+dimen design_snackbar_elevation
+dimen design_snackbar_extra_spacing_horizontal
+dimen design_snackbar_max_width
+dimen design_snackbar_min_width
+dimen design_snackbar_padding_horizontal
+dimen design_snackbar_padding_vertical
+dimen design_snackbar_padding_vertical_2lines
+dimen design_snackbar_text_size
+dimen design_tab_max_width
+dimen design_tab_scrollable_min_width
+dimen design_tab_text_size
+dimen design_tab_text_size_2line
+dimen design_textinput_caption_translate_y
+dimen disabled_alpha_material_dark
+dimen disabled_alpha_material_light
+dimen fastscroll_default_thickness
+dimen fastscroll_margin
+dimen fastscroll_minimum_range
+dimen highlight_alpha_material_colored
+dimen highlight_alpha_material_dark
+dimen highlight_alpha_material_light
+dimen hint_alpha_material_dark
+dimen hint_alpha_material_light
+dimen hint_pressed_alpha_material_dark
+dimen hint_pressed_alpha_material_light
+dimen item_touch_helper_max_drag_scroll_per_frame
+dimen item_touch_helper_swipe_escape_max_velocity
+dimen item_touch_helper_swipe_escape_velocity
+dimen material_bottom_sheet_max_width
+dimen material_clock_display_padding
+dimen material_clock_face_margin_top
+dimen material_clock_hand_center_dot_radius
+dimen material_clock_hand_padding
+dimen material_clock_hand_stroke_width
+dimen material_clock_number_text_size
+dimen material_clock_period_toggle_height
+dimen material_clock_period_toggle_margin_left
+dimen material_clock_period_toggle_width
+dimen material_clock_size
+dimen material_cursor_inset_bottom
+dimen material_cursor_inset_top
+dimen material_cursor_width
+dimen material_emphasis_disabled
+dimen material_emphasis_high_type
+dimen material_emphasis_medium
+dimen material_filled_edittext_font_1_3_padding_bottom
+dimen material_filled_edittext_font_1_3_padding_top
+dimen material_filled_edittext_font_2_0_padding_bottom
+dimen material_filled_edittext_font_2_0_padding_top
+dimen material_font_1_3_box_collapsed_padding_top
+dimen material_font_2_0_box_collapsed_padding_top
+dimen material_helper_text_default_padding_top
+dimen material_helper_text_font_1_3_padding_horizontal
+dimen material_helper_text_font_1_3_padding_top
+dimen material_input_text_to_prefix_suffix_padding
+dimen material_text_view_test_line_height
+dimen material_text_view_test_line_height_override
+dimen material_textinput_default_width
+dimen material_textinput_max_width
+dimen material_textinput_min_width
+dimen material_time_picker_minimum_screen_height
+dimen material_time_picker_minimum_screen_width
+dimen material_timepicker_dialog_buttons_margin_top
+dimen mtrl_alert_dialog_background_inset_bottom
+dimen mtrl_alert_dialog_background_inset_end
+dimen mtrl_alert_dialog_background_inset_start
+dimen mtrl_alert_dialog_background_inset_top
+dimen mtrl_alert_dialog_picker_background_inset
+dimen mtrl_badge_horizontal_edge_offset
+dimen mtrl_badge_long_text_horizontal_padding
+dimen mtrl_badge_radius
+dimen mtrl_badge_text_horizontal_edge_offset
+dimen mtrl_badge_text_size
+dimen mtrl_badge_toolbar_action_menu_item_horizontal_offset
+dimen mtrl_badge_toolbar_action_menu_item_vertical_offset
+dimen mtrl_badge_with_text_radius
+dimen mtrl_bottomappbar_fabOffsetEndMode
+dimen mtrl_bottomappbar_fab_bottom_margin
+dimen mtrl_bottomappbar_fab_cradle_margin
+dimen mtrl_bottomappbar_fab_cradle_rounded_corner_radius
+dimen mtrl_bottomappbar_fab_cradle_vertical_offset
+dimen mtrl_bottomappbar_height
+dimen mtrl_btn_corner_radius
+dimen mtrl_btn_dialog_btn_min_width
+dimen mtrl_btn_disabled_elevation
+dimen mtrl_btn_disabled_z
+dimen mtrl_btn_elevation
+dimen mtrl_btn_focused_z
+dimen mtrl_btn_hovered_z
+dimen mtrl_btn_icon_btn_padding_left
+dimen mtrl_btn_icon_padding
+dimen mtrl_btn_inset
+dimen mtrl_btn_letter_spacing
+dimen mtrl_btn_max_width
+dimen mtrl_btn_padding_bottom
+dimen mtrl_btn_padding_left
+dimen mtrl_btn_padding_right
+dimen mtrl_btn_padding_top
+dimen mtrl_btn_pressed_z
+dimen mtrl_btn_snackbar_margin_horizontal
+dimen mtrl_btn_stroke_size
+dimen mtrl_btn_text_btn_icon_padding
+dimen mtrl_btn_text_btn_padding_left
+dimen mtrl_btn_text_btn_padding_right
+dimen mtrl_btn_text_size
+dimen mtrl_btn_z
+dimen mtrl_calendar_action_confirm_button_min_width
+dimen mtrl_calendar_action_height
+dimen mtrl_calendar_action_padding
+dimen mtrl_calendar_bottom_padding
+dimen mtrl_calendar_content_padding
+dimen mtrl_calendar_day_corner
+dimen mtrl_calendar_day_height
+dimen mtrl_calendar_day_horizontal_padding
+dimen mtrl_calendar_day_today_stroke
+dimen mtrl_calendar_day_vertical_padding
+dimen mtrl_calendar_day_width
+dimen mtrl_calendar_days_of_week_height
+dimen mtrl_calendar_dialog_background_inset
+dimen mtrl_calendar_header_content_padding
+dimen mtrl_calendar_header_content_padding_fullscreen
+dimen mtrl_calendar_header_divider_thickness
+dimen mtrl_calendar_header_height
+dimen mtrl_calendar_header_height_fullscreen
+dimen mtrl_calendar_header_selection_line_height
+dimen mtrl_calendar_header_text_padding
+dimen mtrl_calendar_header_toggle_margin_bottom
+dimen mtrl_calendar_header_toggle_margin_top
+dimen mtrl_calendar_landscape_header_width
+dimen mtrl_calendar_maximum_default_fullscreen_minor_axis
+dimen mtrl_calendar_month_horizontal_padding
+dimen mtrl_calendar_month_vertical_padding
+dimen mtrl_calendar_navigation_bottom_padding
+dimen mtrl_calendar_navigation_height
+dimen mtrl_calendar_navigation_top_padding
+dimen mtrl_calendar_pre_l_text_clip_padding
+dimen mtrl_calendar_selection_baseline_to_top_fullscreen
+dimen mtrl_calendar_selection_text_baseline_to_bottom
+dimen mtrl_calendar_selection_text_baseline_to_bottom_fullscreen
+dimen mtrl_calendar_selection_text_baseline_to_top
+dimen mtrl_calendar_text_input_padding_top
+dimen mtrl_calendar_title_baseline_to_top
+dimen mtrl_calendar_title_baseline_to_top_fullscreen
+dimen mtrl_calendar_year_corner
+dimen mtrl_calendar_year_height
+dimen mtrl_calendar_year_horizontal_padding
+dimen mtrl_calendar_year_vertical_padding
+dimen mtrl_calendar_year_width
+dimen mtrl_card_checked_icon_margin
+dimen mtrl_card_checked_icon_size
+dimen mtrl_card_corner_radius
+dimen mtrl_card_dragged_z
+dimen mtrl_card_elevation
+dimen mtrl_card_spacing
+dimen mtrl_chip_pressed_translation_z
+dimen mtrl_chip_text_size
+dimen mtrl_edittext_rectangle_top_offset
+dimen mtrl_exposed_dropdown_menu_popup_elevation
+dimen mtrl_exposed_dropdown_menu_popup_vertical_offset
+dimen mtrl_exposed_dropdown_menu_popup_vertical_padding
+dimen mtrl_extended_fab_bottom_padding
+dimen mtrl_extended_fab_corner_radius
+dimen mtrl_extended_fab_disabled_elevation
+dimen mtrl_extended_fab_disabled_translation_z
+dimen mtrl_extended_fab_elevation
+dimen mtrl_extended_fab_end_padding
+dimen mtrl_extended_fab_end_padding_icon
+dimen mtrl_extended_fab_icon_size
+dimen mtrl_extended_fab_icon_text_spacing
+dimen mtrl_extended_fab_min_height
+dimen mtrl_extended_fab_min_width
+dimen mtrl_extended_fab_start_padding
+dimen mtrl_extended_fab_start_padding_icon
+dimen mtrl_extended_fab_top_padding
+dimen mtrl_extended_fab_translation_z_base
+dimen mtrl_extended_fab_translation_z_hovered_focused
+dimen mtrl_extended_fab_translation_z_pressed
+dimen mtrl_fab_elevation
+dimen mtrl_fab_min_touch_target
+dimen mtrl_fab_translation_z_hovered_focused
+dimen mtrl_fab_translation_z_pressed
+dimen mtrl_high_ripple_default_alpha
+dimen mtrl_high_ripple_focused_alpha
+dimen mtrl_high_ripple_hovered_alpha
+dimen mtrl_high_ripple_pressed_alpha
+dimen mtrl_large_touch_target
+dimen mtrl_low_ripple_default_alpha
+dimen mtrl_low_ripple_focused_alpha
+dimen mtrl_low_ripple_hovered_alpha
+dimen mtrl_low_ripple_pressed_alpha
+dimen mtrl_min_touch_target_size
+dimen mtrl_navigation_bar_item_default_icon_size
+dimen mtrl_navigation_bar_item_default_margin
+dimen mtrl_navigation_elevation
+dimen mtrl_navigation_item_horizontal_padding
+dimen mtrl_navigation_item_icon_padding
+dimen mtrl_navigation_item_icon_size
+dimen mtrl_navigation_item_shape_horizontal_margin
+dimen mtrl_navigation_item_shape_vertical_margin
+dimen mtrl_navigation_rail_active_text_size
+dimen mtrl_navigation_rail_compact_width
+dimen mtrl_navigation_rail_default_width
+dimen mtrl_navigation_rail_elevation
+dimen mtrl_navigation_rail_icon_margin
+dimen mtrl_navigation_rail_icon_size
+dimen mtrl_navigation_rail_margin
+dimen mtrl_navigation_rail_text_bottom_margin
+dimen mtrl_navigation_rail_text_size
+dimen mtrl_progress_circular_inset
+dimen mtrl_progress_circular_inset_extra_small
+dimen mtrl_progress_circular_inset_medium
+dimen mtrl_progress_circular_inset_small
+dimen mtrl_progress_circular_radius
+dimen mtrl_progress_circular_size
+dimen mtrl_progress_circular_size_extra_small
+dimen mtrl_progress_circular_size_medium
+dimen mtrl_progress_circular_size_small
+dimen mtrl_progress_circular_track_thickness_extra_small
+dimen mtrl_progress_circular_track_thickness_medium
+dimen mtrl_progress_circular_track_thickness_small
+dimen mtrl_progress_indicator_full_rounded_corner_radius
+dimen mtrl_progress_track_thickness
+dimen mtrl_shape_corner_size_large_component
+dimen mtrl_shape_corner_size_medium_component
+dimen mtrl_shape_corner_size_small_component
+dimen mtrl_slider_halo_radius
+dimen mtrl_slider_label_padding
+dimen mtrl_slider_label_radius
+dimen mtrl_slider_label_square_side
+dimen mtrl_slider_thumb_elevation
+dimen mtrl_slider_thumb_radius
+dimen mtrl_slider_track_height
+dimen mtrl_slider_track_side_padding
+dimen mtrl_slider_track_top
+dimen mtrl_slider_widget_height
+dimen mtrl_snackbar_action_text_color_alpha
+dimen mtrl_snackbar_background_corner_radius
+dimen mtrl_snackbar_background_overlay_color_alpha
+dimen mtrl_snackbar_margin
+dimen mtrl_snackbar_message_margin_horizontal
+dimen mtrl_snackbar_padding_horizontal
+dimen mtrl_switch_thumb_elevation
+dimen mtrl_textinput_box_corner_radius_medium
+dimen mtrl_textinput_box_corner_radius_small
+dimen mtrl_textinput_box_label_cutout_padding
+dimen mtrl_textinput_box_stroke_width_default
+dimen mtrl_textinput_box_stroke_width_focused
+dimen mtrl_textinput_counter_margin_start
+dimen mtrl_textinput_end_icon_margin_start
+dimen mtrl_textinput_outline_box_expanded_padding
+dimen mtrl_textinput_start_icon_margin_end
+dimen mtrl_toolbar_default_height
+dimen mtrl_tooltip_arrowSize
+dimen mtrl_tooltip_cornerSize
+dimen mtrl_tooltip_minHeight
+dimen mtrl_tooltip_minWidth
+dimen mtrl_tooltip_padding
+dimen mtrl_transition_shared_axis_slide_distance
+dimen notification_action_icon_size
+dimen notification_action_text_size
+dimen notification_big_circle_margin
+dimen notification_content_margin_start
+dimen notification_large_icon_height
+dimen notification_large_icon_width
+dimen notification_main_column_padding_top
+dimen notification_media_narrow_margin
+dimen notification_right_icon_size
+dimen notification_right_side_padding_top
+dimen notification_small_icon_background_padding
+dimen notification_small_icon_size_as_large
+dimen notification_subtext_size
+dimen notification_top_pad
+dimen notification_top_pad_large_text
+dimen test_mtrl_calendar_day_cornerSize
+dimen test_navigation_bar_active_item_max_width
+dimen test_navigation_bar_active_item_min_width
+dimen test_navigation_bar_active_text_size
+dimen test_navigation_bar_elevation
+dimen test_navigation_bar_height
+dimen test_navigation_bar_icon_size
+dimen test_navigation_bar_item_max_width
+dimen test_navigation_bar_item_min_width
+dimen test_navigation_bar_label_padding
+dimen test_navigation_bar_shadow_height
+dimen test_navigation_bar_text_size
+dimen tooltip_corner_radius
+dimen tooltip_horizontal_padding
+dimen tooltip_margin
+dimen tooltip_precise_anchor_extra_offset
+dimen tooltip_precise_anchor_threshold
+dimen tooltip_vertical_padding
+dimen tooltip_y_offset_non_touch
+dimen tooltip_y_offset_touch
+drawable abc_ab_share_pack_mtrl_alpha
+drawable abc_action_bar_item_background_material
+drawable abc_btn_borderless_material
+drawable abc_btn_check_material
+drawable abc_btn_check_material_anim
+drawable abc_btn_check_to_on_mtrl_000
+drawable abc_btn_check_to_on_mtrl_015
+drawable abc_btn_colored_material
+drawable abc_btn_default_mtrl_shape
+drawable abc_btn_radio_material
+drawable abc_btn_radio_material_anim
+drawable abc_btn_radio_to_on_mtrl_000
+drawable abc_btn_radio_to_on_mtrl_015
+drawable abc_btn_switch_to_on_mtrl_00001
+drawable abc_btn_switch_to_on_mtrl_00012
+drawable abc_cab_background_internal_bg
+drawable abc_cab_background_top_material
+drawable abc_cab_background_top_mtrl_alpha
+drawable abc_control_background_material
+drawable abc_dialog_material_background
+drawable abc_edit_text_material
+drawable abc_ic_ab_back_material
+drawable abc_ic_arrow_drop_right_black_24dp
+drawable abc_ic_clear_material
+drawable abc_ic_commit_search_api_mtrl_alpha
+drawable abc_ic_go_search_api_material
+drawable abc_ic_menu_copy_mtrl_am_alpha
+drawable abc_ic_menu_cut_mtrl_alpha
+drawable abc_ic_menu_overflow_material
+drawable abc_ic_menu_paste_mtrl_am_alpha
+drawable abc_ic_menu_selectall_mtrl_alpha
+drawable abc_ic_menu_share_mtrl_alpha
+drawable abc_ic_search_api_material
+drawable abc_ic_star_black_16dp
+drawable abc_ic_star_black_36dp
+drawable abc_ic_star_black_48dp
+drawable abc_ic_star_half_black_16dp
+drawable abc_ic_star_half_black_36dp
+drawable abc_ic_star_half_black_48dp
+drawable abc_ic_voice_search_api_material
+drawable abc_item_background_holo_dark
+drawable abc_item_background_holo_light
+drawable abc_list_divider_material
+drawable abc_list_divider_mtrl_alpha
+drawable abc_list_focused_holo
+drawable abc_list_longpressed_holo
+drawable abc_list_pressed_holo_dark
+drawable abc_list_pressed_holo_light
+drawable abc_list_selector_background_transition_holo_dark
+drawable abc_list_selector_background_transition_holo_light
+drawable abc_list_selector_disabled_holo_dark
+drawable abc_list_selector_disabled_holo_light
+drawable abc_list_selector_holo_dark
+drawable abc_list_selector_holo_light
+drawable abc_menu_hardkey_panel_mtrl_mult
+drawable abc_popup_background_mtrl_mult
+drawable abc_ratingbar_indicator_material
+drawable abc_ratingbar_material
+drawable abc_ratingbar_small_material
+drawable abc_scrubber_control_off_mtrl_alpha
+drawable abc_scrubber_control_to_pressed_mtrl_000
+drawable abc_scrubber_control_to_pressed_mtrl_005
+drawable abc_scrubber_primary_mtrl_alpha
+drawable abc_scrubber_track_mtrl_alpha
+drawable abc_seekbar_thumb_material
+drawable abc_seekbar_tick_mark_material
+drawable abc_seekbar_track_material
+drawable abc_spinner_mtrl_am_alpha
+drawable abc_spinner_textfield_background_material
+drawable abc_star_black_48dp
+drawable abc_star_half_black_48dp
+drawable abc_switch_thumb_material
+drawable abc_switch_track_mtrl_alpha
+drawable abc_tab_indicator_material
+drawable abc_tab_indicator_mtrl_alpha
+drawable abc_text_cursor_material
+drawable abc_text_select_handle_left_mtrl
+drawable abc_text_select_handle_left_mtrl_dark
+drawable abc_text_select_handle_left_mtrl_light
+drawable abc_text_select_handle_middle_mtrl
+drawable abc_text_select_handle_middle_mtrl_dark
+drawable abc_text_select_handle_middle_mtrl_light
+drawable abc_text_select_handle_right_mtrl
+drawable abc_text_select_handle_right_mtrl_dark
+drawable abc_text_select_handle_right_mtrl_light
+drawable abc_textfield_activated_mtrl_alpha
+drawable abc_textfield_default_mtrl_alpha
+drawable abc_textfield_search_activated_mtrl_alpha
+drawable abc_textfield_search_default_mtrl_alpha
+drawable abc_textfield_search_material
+drawable abc_vector_test
+drawable avd_hide_password
+drawable avd_show_password
+drawable btn_checkbox_checked_mtrl
+drawable btn_checkbox_checked_to_unchecked_mtrl_animation
+drawable btn_checkbox_unchecked_mtrl
+drawable btn_checkbox_unchecked_to_checked_mtrl_animation
+drawable btn_radio_off_mtrl
+drawable btn_radio_off_to_on_mtrl_animation
+drawable btn_radio_on_mtrl
+drawable btn_radio_on_to_off_mtrl_animation
+drawable design_fab_background
+drawable design_ic_visibility
+drawable design_ic_visibility_off
+drawable design_password_eye
+drawable design_snackbar_background
+drawable ic_clock_black_24dp
+drawable ic_keyboard_black_24dp
+drawable ic_mtrl_checked_circle
+drawable ic_mtrl_chip_checked_black
+drawable ic_mtrl_chip_checked_circle
+drawable ic_mtrl_chip_close_circle
+drawable material_cursor_drawable
+drawable material_ic_calendar_black_24dp
+drawable material_ic_clear_black_24dp
+drawable material_ic_edit_black_24dp
+drawable material_ic_keyboard_arrow_left_black_24dp
+drawable material_ic_keyboard_arrow_next_black_24dp
+drawable material_ic_keyboard_arrow_previous_black_24dp
+drawable material_ic_keyboard_arrow_right_black_24dp
+drawable material_ic_menu_arrow_down_black_24dp
+drawable material_ic_menu_arrow_up_black_24dp
+drawable mtrl_dialog_background
+drawable mtrl_dropdown_arrow
+drawable mtrl_ic_arrow_drop_down
+drawable mtrl_ic_arrow_drop_up
+drawable mtrl_ic_cancel
+drawable mtrl_ic_error
+drawable mtrl_navigation_bar_item_background
+drawable mtrl_popupmenu_background
+drawable mtrl_popupmenu_background_dark
+drawable mtrl_tabs_default_indicator
+drawable navigation_empty_icon
+drawable notification_action_background
+drawable notification_bg
+drawable notification_bg_low
+drawable notification_bg_low_normal
+drawable notification_bg_low_pressed
+drawable notification_bg_normal
+drawable notification_bg_normal_pressed
+drawable notification_icon_background
+drawable notification_template_icon_bg
+drawable notification_template_icon_low_bg
+drawable notification_tile_bg
+drawable notify_panel_notification_icon_bg
+drawable test_custom_background
+drawable tooltip_frame_dark
+drawable tooltip_frame_light
+id BOTTOM_END
+id BOTTOM_START
+id NO_DEBUG
+id SHOW_ALL
+id SHOW_PATH
+id SHOW_PROGRESS
+id TOP_END
+id TOP_START
+id accelerate
+id accessibility_action_clickable_span
+id accessibility_custom_action_0
+id accessibility_custom_action_1
+id accessibility_custom_action_10
+id accessibility_custom_action_11
+id accessibility_custom_action_12
+id accessibility_custom_action_13
+id accessibility_custom_action_14
+id accessibility_custom_action_15
+id accessibility_custom_action_16
+id accessibility_custom_action_17
+id accessibility_custom_action_18
+id accessibility_custom_action_19
+id accessibility_custom_action_2
+id accessibility_custom_action_20
+id accessibility_custom_action_21
+id accessibility_custom_action_22
+id accessibility_custom_action_23
+id accessibility_custom_action_24
+id accessibility_custom_action_25
+id accessibility_custom_action_26
+id accessibility_custom_action_27
+id accessibility_custom_action_28
+id accessibility_custom_action_29
+id accessibility_custom_action_3
+id accessibility_custom_action_30
+id accessibility_custom_action_31
+id accessibility_custom_action_4
+id accessibility_custom_action_5
+id accessibility_custom_action_6
+id accessibility_custom_action_7
+id accessibility_custom_action_8
+id accessibility_custom_action_9
+id action_bar
+id action_bar_activity_content
+id action_bar_container
+id action_bar_root
+id action_bar_spinner
+id action_bar_subtitle
+id action_bar_title
+id action_container
+id action_context_bar
+id action_divider
+id action_image
+id action_menu_divider
+id action_menu_presenter
+id action_mode_bar
+id action_mode_bar_stub
+id action_mode_close_button
+id action_text
+id actions
+id activity_chooser_view_content
+id add
+id alertTitle
+id aligned
+id animateToEnd
+id animateToStart
+id arc
+id asConfigured
+id async
+id auto
+id autoComplete
+id autoCompleteToEnd
+id autoCompleteToStart
+id barrier
+id baseline
+id blocking
+id bottom
+id bounce
+id buttonPanel
+id cancel_button
+id center
+id chain
+id checkbox
+id checked
+id chip
+id chip1
+id chip2
+id chip3
+id chip_group
+id chronometer
+id circle_center
+id clear_text
+id clockwise
+id confirm_button
+id container
+id content
+id contentPanel
+id contiguous
+id coordinator
+id cos
+id counterclockwise
+id custom
+id customPanel
+id cut
+id date_picker_actions
+id decelerate
+id decelerateAndComplete
+id decor_content_parent
+id default_activity_button
+id deltaRelative
+id design_bottom_sheet
+id design_menu_item_action_area
+id design_menu_item_action_area_stub
+id design_menu_item_text
+id design_navigation_view
+id dialog_button
+id disjoint
+id dragDown
+id dragEnd
+id dragLeft
+id dragRight
+id dragStart
+id dragUp
+id dropdown_menu
+id easeIn
+id easeInOut
+id easeOut
+id edit_query
+id elastic
+id end
+id endToStart
+id expand_activities_button
+id expanded_menu
+id fade
+id fill
+id filled
+id fixed
+id flip
+id floating
+id forever
+id fragment_container_view_tag
+id ghost_view
+id ghost_view_holder
+id gone
+id group_divider
+id guideline
+id header_title
+id home
+id honorRequest
+id icon
+id icon_group
+id ignore
+id ignoreRequest
+id image
+id info
+id invisible
+id inward
+id italic
+id item_touch_helper_previous_elevation
+id jumpToEnd
+id jumpToStart
+id labeled
+id layout
+id left
+id leftToRight
+id line1
+id line3
+id linear
+id listMode
+id list_item
+id masked
+id material_clock_display
+id material_clock_face
+id material_clock_hand
+id material_clock_period_am_button
+id material_clock_period_pm_button
+id material_clock_period_toggle
+id material_hour_text_input
+id material_hour_tv
+id material_label
+id material_minute_text_input
+id material_minute_tv
+id material_textinput_timepicker
+id material_timepicker_cancel_button
+id material_timepicker_container
+id material_timepicker_edit_text
+id material_timepicker_mode_button
+id material_timepicker_ok_button
+id material_timepicker_view
+id material_value_index
+id message
+id middle
+id mini
+id month_grid
+id month_navigation_bar
+id month_navigation_fragment_toggle
+id month_navigation_next
+id month_navigation_previous
+id month_title
+id motion_base
+id mtrl_anchor_parent
+id mtrl_calendar_day_selector_frame
+id mtrl_calendar_days_of_week
+id mtrl_calendar_frame
+id mtrl_calendar_main_pane
+id mtrl_calendar_months
+id mtrl_calendar_selection_frame
+id mtrl_calendar_text_input_frame
+id mtrl_calendar_year_selector_frame
+id mtrl_card_checked_layer_id
+id mtrl_child_content_container
+id mtrl_internal_children_alpha_tag
+id mtrl_motion_snapshot_view
+id mtrl_picker_fullscreen
+id mtrl_picker_header
+id mtrl_picker_header_selection_text
+id mtrl_picker_header_title_and_selection
+id mtrl_picker_header_toggle
+id mtrl_picker_text_input_date
+id mtrl_picker_text_input_range_end
+id mtrl_picker_text_input_range_start
+id mtrl_picker_title_text
+id mtrl_view_tag_bottom_padding
+id multiply
+id navigation_bar_item_icon_view
+id navigation_bar_item_labels_group
+id navigation_bar_item_large_label_view
+id navigation_bar_item_small_label_view
+id navigation_header_container
+id none
+id normal
+id notification_background
+id notification_main_column
+id notification_main_column_container
+id off
+id on
+id outline
+id outward
+id packed
+id parallax
+id parent
+id parentPanel
+id parentRelative
+id parent_matrix
+id password_toggle
+id path
+id pathRelative
+id percent
+id pin
+id position
+id postLayout
+id progress_circular
+id progress_horizontal
+id radio
+id rectangles
+id reverseSawtooth
+id right
+id rightToLeft
+id right_icon
+id right_side
+id rounded
+id row_index_key
+id save_non_transition_alpha
+id save_overlay_view
+id sawtooth
+id scale
+id screen
+id scrollIndicatorDown
+id scrollIndicatorUp
+id scrollView
+id scrollable
+id search_badge
+id search_bar
+id search_button
+id search_close_btn
+id search_edit_frame
+id search_go_btn
+id search_mag_icon
+id search_plate
+id search_src_text
+id search_voice_btn
+id select_dialog_listview
+id selected
+id selection_type
+id shortcut
+id sin
+id slide
+id snackbar_action
+id snackbar_text
+id spacer
+id special_effects_controller_view_tag
+id spline
+id split_action_bar
+id spread
+id spread_inside
+id square
+id src_atop
+id src_in
+id src_over
+id standard
+id start
+id startHorizontal
+id startToEnd
+id startVertical
+id staticLayout
+id staticPostLayout
+id stop
+id stretch
+id submenuarrow
+id submit_area
+id tabMode
+id tag_accessibility_actions
+id tag_accessibility_clickable_spans
+id tag_accessibility_heading
+id tag_accessibility_pane_title
+id tag_on_apply_window_listener
+id tag_on_receive_content_listener
+id tag_on_receive_content_mime_types
+id tag_screen_reader_focusable
+id tag_state_description
+id tag_transition_group
+id tag_unhandled_key_event_manager
+id tag_unhandled_key_listeners
+id tag_window_insets_animation_callback
+id test_checkbox_android_button_tint
+id test_checkbox_app_button_tint
+id test_radiobutton_android_button_tint
+id test_radiobutton_app_button_tint
+id text
+id text2
+id textSpacerNoButtons
+id textSpacerNoTitle
+id text_input_end_icon
+id text_input_error_icon
+id text_input_start_icon
+id textinput_counter
+id textinput_error
+id textinput_helper_text
+id textinput_placeholder
+id textinput_prefix_text
+id textinput_suffix_text
+id time
+id title
+id titleDividerNoCustom
+id title_template
+id top
+id topPanel
+id touch_outside
+id transition_current_scene
+id transition_layout_save
+id transition_position
+id transition_scene_layoutid_cache
+id transition_transform
+id triangle
+id unchecked
+id uniform
+id unlabeled
+id up
+id view_offset_helper
+id view_tree_lifecycle_owner
+id view_tree_saved_state_registry_owner
+id view_tree_view_model_store_owner
+id visible
+id visible_removing_fragment_view_tag
+id withinBounds
+id wrap
+id wrap_content
+id zero_corner_chip
+integer abc_config_activityDefaultDur
+integer abc_config_activityShortDur
+integer app_bar_elevation_anim_duration
+integer bottom_sheet_slide_duration
+integer cancel_button_image_alpha
+integer config_tooltipAnimTime
+integer design_snackbar_text_max_lines
+integer design_tab_indicator_anim_duration_ms
+integer hide_password_duration
+integer material_motion_duration_long_1
+integer material_motion_duration_long_2
+integer material_motion_duration_medium_1
+integer material_motion_duration_medium_2
+integer material_motion_duration_short_1
+integer material_motion_duration_short_2
+integer material_motion_path
+integer mtrl_badge_max_character_count
+integer mtrl_btn_anim_delay_ms
+integer mtrl_btn_anim_duration_ms
+integer mtrl_calendar_header_orientation
+integer mtrl_calendar_selection_text_lines
+integer mtrl_calendar_year_selector_span
+integer mtrl_card_anim_delay_ms
+integer mtrl_card_anim_duration_ms
+integer mtrl_chip_anim_duration
+integer mtrl_tab_indicator_anim_duration_ms
+integer show_password_duration
+integer status_bar_notification_info_maxnum
+interpolator btn_checkbox_checked_mtrl_animation_interpolator_0
+interpolator btn_checkbox_checked_mtrl_animation_interpolator_1
+interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0
+interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1
+interpolator btn_radio_to_off_mtrl_animation_interpolator_0
+interpolator btn_radio_to_on_mtrl_animation_interpolator_0
+interpolator fast_out_slow_in
+interpolator mtrl_fast_out_linear_in
+interpolator mtrl_fast_out_slow_in
+interpolator mtrl_linear
+interpolator mtrl_linear_out_slow_in
+layout abc_action_bar_title_item
+layout abc_action_bar_up_container
+layout abc_action_menu_item_layout
+layout abc_action_menu_layout
+layout abc_action_mode_bar
+layout abc_action_mode_close_item_material
+layout abc_activity_chooser_view
+layout abc_activity_chooser_view_list_item
+layout abc_alert_dialog_button_bar_material
+layout abc_alert_dialog_material
+layout abc_alert_dialog_title_material
+layout abc_cascading_menu_item_layout
+layout abc_dialog_title_material
+layout abc_expanded_menu_layout
+layout abc_list_menu_item_checkbox
+layout abc_list_menu_item_icon
+layout abc_list_menu_item_layout
+layout abc_list_menu_item_radio
+layout abc_popup_menu_header_item_layout
+layout abc_popup_menu_item_layout
+layout abc_screen_content_include
+layout abc_screen_simple
+layout abc_screen_simple_overlay_action_mode
+layout abc_screen_toolbar
+layout abc_search_dropdown_item_icons_2line
+layout abc_search_view
+layout abc_select_dialog_material
+layout abc_tooltip
+layout custom_dialog
+layout design_bottom_navigation_item
+layout design_bottom_sheet_dialog
+layout design_layout_snackbar
+layout design_layout_snackbar_include
+layout design_layout_tab_icon
+layout design_layout_tab_text
+layout design_menu_item_action_area
+layout design_navigation_item
+layout design_navigation_item_header
+layout design_navigation_item_separator
+layout design_navigation_item_subheader
+layout design_navigation_menu
+layout design_navigation_menu_item
+layout design_text_input_end_icon
+layout design_text_input_start_icon
+layout material_chip_input_combo
+layout material_clock_display
+layout material_clock_display_divider
+layout material_clock_period_toggle
+layout material_clock_period_toggle_land
+layout material_clockface_textview
+layout material_clockface_view
+layout material_radial_view_group
+layout material_textinput_timepicker
+layout material_time_chip
+layout material_time_input
+layout material_timepicker
+layout material_timepicker_dialog
+layout material_timepicker_textinput_display
+layout mtrl_alert_dialog
+layout mtrl_alert_dialog_actions
+layout mtrl_alert_dialog_title
+layout mtrl_alert_select_dialog_item
+layout mtrl_alert_select_dialog_multichoice
+layout mtrl_alert_select_dialog_singlechoice
+layout mtrl_calendar_day
+layout mtrl_calendar_day_of_week
+layout mtrl_calendar_days_of_week
+layout mtrl_calendar_horizontal
+layout mtrl_calendar_month
+layout mtrl_calendar_month_labeled
+layout mtrl_calendar_month_navigation
+layout mtrl_calendar_months
+layout mtrl_calendar_vertical
+layout mtrl_calendar_year
+layout mtrl_layout_snackbar
+layout mtrl_layout_snackbar_include
+layout mtrl_navigation_rail_item
+layout mtrl_picker_actions
+layout mtrl_picker_dialog
+layout mtrl_picker_fullscreen
+layout mtrl_picker_header_dialog
+layout mtrl_picker_header_fullscreen
+layout mtrl_picker_header_selection_text
+layout mtrl_picker_header_title_text
+layout mtrl_picker_header_toggle
+layout mtrl_picker_text_input_date
+layout mtrl_picker_text_input_date_range
+layout notification_action
+layout notification_action_tombstone
+layout notification_template_custom_big
+layout notification_template_icon_group
+layout notification_template_part_chronometer
+layout notification_template_part_time
+layout select_dialog_item_material
+layout select_dialog_multichoice_material
+layout select_dialog_singlechoice_material
+layout support_simple_spinner_dropdown_item
+layout test_action_chip
+layout test_chip_zero_corner_radius
+layout test_design_checkbox
+layout test_design_radiobutton
+layout test_navigation_bar_item_layout
+layout test_reflow_chipgroup
+layout test_toolbar
+layout test_toolbar_custom_background
+layout test_toolbar_elevation
+layout test_toolbar_surface
+layout text_view_with_line_height_from_appearance
+layout text_view_with_line_height_from_layout
+layout text_view_with_line_height_from_style
+layout text_view_with_theme_line_height
+layout text_view_without_line_height
+plurals mtrl_badge_content_description
+string abc_action_bar_home_description
+string abc_action_bar_up_description
+string abc_action_menu_overflow_description
+string abc_action_mode_done
+string abc_activity_chooser_view_see_all
+string abc_activitychooserview_choose_application
+string abc_capital_off
+string abc_capital_on
+string abc_menu_alt_shortcut_label
+string abc_menu_ctrl_shortcut_label
+string abc_menu_delete_shortcut_label
+string abc_menu_enter_shortcut_label
+string abc_menu_function_shortcut_label
+string abc_menu_meta_shortcut_label
+string abc_menu_shift_shortcut_label
+string abc_menu_space_shortcut_label
+string abc_menu_sym_shortcut_label
+string abc_prepend_shortcut_label
+string abc_search_hint
+string abc_searchview_description_clear
+string abc_searchview_description_query
+string abc_searchview_description_search
+string abc_searchview_description_submit
+string abc_searchview_description_voice
+string abc_shareactionprovider_share_with
+string abc_shareactionprovider_share_with_application
+string abc_toolbar_collapse_description
+string appbar_scrolling_view_behavior
+string bottom_sheet_behavior
+string bottomsheet_action_expand_halfway
+string character_counter_content_description
+string character_counter_overflowed_content_description
+string character_counter_pattern
+string chip_text
+string clear_text_end_icon_content_description
+string error_icon_content_description
+string exposed_dropdown_menu_content_description
+string fab_transformation_scrim_behavior
+string fab_transformation_sheet_behavior
+string hide_bottom_view_on_scroll_behavior
+string icon_content_description
+string item_view_role_description
+string material_clock_display_divider
+string material_clock_toggle_content_description
+string material_hour_selection
+string material_hour_suffix
+string material_minute_selection
+string material_minute_suffix
+string material_motion_easing_accelerated
+string material_motion_easing_decelerated
+string material_motion_easing_emphasized
+string material_motion_easing_linear
+string material_motion_easing_standard
+string material_slider_range_end
+string material_slider_range_start
+string material_timepicker_am
+string material_timepicker_clock_mode_description
+string material_timepicker_hour
+string material_timepicker_minute
+string material_timepicker_pm
+string material_timepicker_select_time
+string material_timepicker_text_input_mode_description
+string mtrl_badge_numberless_content_description
+string mtrl_chip_close_icon_content_description
+string mtrl_exceed_max_badge_number_content_description
+string mtrl_exceed_max_badge_number_suffix
+string mtrl_picker_a11y_next_month
+string mtrl_picker_a11y_prev_month
+string mtrl_picker_announce_current_selection
+string mtrl_picker_cancel
+string mtrl_picker_confirm
+string mtrl_picker_date_header_selected
+string mtrl_picker_date_header_title
+string mtrl_picker_date_header_unselected
+string mtrl_picker_day_of_week_column_header
+string mtrl_picker_invalid_format
+string mtrl_picker_invalid_format_example
+string mtrl_picker_invalid_format_use
+string mtrl_picker_invalid_range
+string mtrl_picker_navigate_to_year_description
+string mtrl_picker_out_of_range
+string mtrl_picker_range_header_only_end_selected
+string mtrl_picker_range_header_only_start_selected
+string mtrl_picker_range_header_selected
+string mtrl_picker_range_header_title
+string mtrl_picker_range_header_unselected
+string mtrl_picker_save
+string mtrl_picker_text_input_date_hint
+string mtrl_picker_text_input_date_range_end_hint
+string mtrl_picker_text_input_date_range_start_hint
+string mtrl_picker_text_input_day_abbr
+string mtrl_picker_text_input_month_abbr
+string mtrl_picker_text_input_year_abbr
+string mtrl_picker_toggle_to_calendar_input_mode
+string mtrl_picker_toggle_to_day_selection
+string mtrl_picker_toggle_to_text_input_mode
+string mtrl_picker_toggle_to_year_selection
+string password_toggle_content_description
+string path_password_eye
+string path_password_eye_mask_strike_through
+string path_password_eye_mask_visible
+string path_password_strike_through
+string search_menu_title
+string status_bar_notification_info_overflow
+style AlertDialog_AppCompat
+style AlertDialog_AppCompat_Light
+style AndroidThemeColorAccentYellow
+style Animation_AppCompat_Dialog
+style Animation_AppCompat_DropDownUp
+style Animation_AppCompat_Tooltip
+style Animation_Design_BottomSheetDialog
+style Animation_MaterialComponents_BottomSheetDialog
+style Base_AlertDialog_AppCompat
+style Base_AlertDialog_AppCompat_Light
+style Base_Animation_AppCompat_Dialog
+style Base_Animation_AppCompat_DropDownUp
+style Base_Animation_AppCompat_Tooltip
+style Base_CardView
+style Base_DialogWindowTitleBackground_AppCompat
+style Base_DialogWindowTitle_AppCompat
+style Base_MaterialAlertDialog_MaterialComponents_Title_Icon
+style Base_MaterialAlertDialog_MaterialComponents_Title_Panel
+style Base_MaterialAlertDialog_MaterialComponents_Title_Text
+style Base_TextAppearance_AppCompat
+style Base_TextAppearance_AppCompat_Body1
+style Base_TextAppearance_AppCompat_Body2
+style Base_TextAppearance_AppCompat_Button
+style Base_TextAppearance_AppCompat_Caption
+style Base_TextAppearance_AppCompat_Display1
+style Base_TextAppearance_AppCompat_Display2
+style Base_TextAppearance_AppCompat_Display3
+style Base_TextAppearance_AppCompat_Display4
+style Base_TextAppearance_AppCompat_Headline
+style Base_TextAppearance_AppCompat_Inverse
+style Base_TextAppearance_AppCompat_Large
+style Base_TextAppearance_AppCompat_Large_Inverse
+style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style Base_TextAppearance_AppCompat_Medium
+style Base_TextAppearance_AppCompat_Medium_Inverse
+style Base_TextAppearance_AppCompat_Menu
+style Base_TextAppearance_AppCompat_SearchResult
+style Base_TextAppearance_AppCompat_SearchResult_Subtitle
+style Base_TextAppearance_AppCompat_SearchResult_Title
+style Base_TextAppearance_AppCompat_Small
+style Base_TextAppearance_AppCompat_Small_Inverse
+style Base_TextAppearance_AppCompat_Subhead
+style Base_TextAppearance_AppCompat_Subhead_Inverse
+style Base_TextAppearance_AppCompat_Title
+style Base_TextAppearance_AppCompat_Title_Inverse
+style Base_TextAppearance_AppCompat_Tooltip
+style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu
+style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style Base_TextAppearance_AppCompat_Widget_ActionBar_Title
+style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style Base_TextAppearance_AppCompat_Widget_ActionMode_Title
+style Base_TextAppearance_AppCompat_Widget_Button
+style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style Base_TextAppearance_AppCompat_Widget_Button_Colored
+style Base_TextAppearance_AppCompat_Widget_Button_Inverse
+style Base_TextAppearance_AppCompat_Widget_DropDownItem
+style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header
+style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large
+style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small
+style Base_TextAppearance_AppCompat_Widget_Switch
+style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style Base_TextAppearance_MaterialComponents_Badge
+style Base_TextAppearance_MaterialComponents_Button
+style Base_TextAppearance_MaterialComponents_Headline6
+style Base_TextAppearance_MaterialComponents_Subtitle2
+style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item
+style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle
+style Base_TextAppearance_Widget_AppCompat_Toolbar_Title
+style Base_ThemeOverlay_AppCompat
+style Base_ThemeOverlay_AppCompat_ActionBar
+style Base_ThemeOverlay_AppCompat_Dark
+style Base_ThemeOverlay_AppCompat_Dark_ActionBar
+style Base_ThemeOverlay_AppCompat_Dialog
+style Base_ThemeOverlay_AppCompat_Dialog_Alert
+style Base_ThemeOverlay_AppCompat_Light
+style Base_ThemeOverlay_MaterialComponents_Dialog
+style Base_ThemeOverlay_MaterialComponents_Dialog_Alert
+style Base_ThemeOverlay_MaterialComponents_Dialog_Alert_Framework
+style Base_ThemeOverlay_MaterialComponents_Light_Dialog_Alert_Framework
+style Base_ThemeOverlay_MaterialComponents_MaterialAlertDialog
+style Base_Theme_AppCompat
+style Base_Theme_AppCompat_CompactMenu
+style Base_Theme_AppCompat_Dialog
+style Base_Theme_AppCompat_DialogWhenLarge
+style Base_Theme_AppCompat_Dialog_Alert
+style Base_Theme_AppCompat_Dialog_FixedSize
+style Base_Theme_AppCompat_Dialog_MinWidth
+style Base_Theme_AppCompat_Light
+style Base_Theme_AppCompat_Light_DarkActionBar
+style Base_Theme_AppCompat_Light_Dialog
+style Base_Theme_AppCompat_Light_DialogWhenLarge
+style Base_Theme_AppCompat_Light_Dialog_Alert
+style Base_Theme_AppCompat_Light_Dialog_FixedSize
+style Base_Theme_AppCompat_Light_Dialog_MinWidth
+style Base_Theme_MaterialComponents
+style Base_Theme_MaterialComponents_Bridge
+style Base_Theme_MaterialComponents_CompactMenu
+style Base_Theme_MaterialComponents_Dialog
+style Base_Theme_MaterialComponents_DialogWhenLarge
+style Base_Theme_MaterialComponents_Dialog_Alert
+style Base_Theme_MaterialComponents_Dialog_Bridge
+style Base_Theme_MaterialComponents_Dialog_FixedSize
+style Base_Theme_MaterialComponents_Dialog_MinWidth
+style Base_Theme_MaterialComponents_Light
+style Base_Theme_MaterialComponents_Light_Bridge
+style Base_Theme_MaterialComponents_Light_DarkActionBar
+style Base_Theme_MaterialComponents_Light_DarkActionBar_Bridge
+style Base_Theme_MaterialComponents_Light_Dialog
+style Base_Theme_MaterialComponents_Light_DialogWhenLarge
+style Base_Theme_MaterialComponents_Light_Dialog_Alert
+style Base_Theme_MaterialComponents_Light_Dialog_Bridge
+style Base_Theme_MaterialComponents_Light_Dialog_FixedSize
+style Base_Theme_MaterialComponents_Light_Dialog_MinWidth
+style Base_V14_ThemeOverlay_MaterialComponents_BottomSheetDialog
+style Base_V14_ThemeOverlay_MaterialComponents_Dialog
+style Base_V14_ThemeOverlay_MaterialComponents_Dialog_Alert
+style Base_V14_ThemeOverlay_MaterialComponents_MaterialAlertDialog
+style Base_V14_Theme_MaterialComponents
+style Base_V14_Theme_MaterialComponents_Bridge
+style Base_V14_Theme_MaterialComponents_Dialog
+style Base_V14_Theme_MaterialComponents_Dialog_Bridge
+style Base_V14_Theme_MaterialComponents_Light
+style Base_V14_Theme_MaterialComponents_Light_Bridge
+style Base_V14_Theme_MaterialComponents_Light_DarkActionBar_Bridge
+style Base_V14_Theme_MaterialComponents_Light_Dialog
+style Base_V14_Theme_MaterialComponents_Light_Dialog_Bridge
+style Base_V21_ThemeOverlay_AppCompat_Dialog
+style Base_V21_ThemeOverlay_MaterialComponents_BottomSheetDialog
+style Base_V21_Theme_AppCompat
+style Base_V21_Theme_AppCompat_Dialog
+style Base_V21_Theme_AppCompat_Light
+style Base_V21_Theme_AppCompat_Light_Dialog
+style Base_V21_Theme_MaterialComponents
+style Base_V21_Theme_MaterialComponents_Dialog
+style Base_V21_Theme_MaterialComponents_Light
+style Base_V21_Theme_MaterialComponents_Light_Dialog
+style Base_V22_Theme_AppCompat
+style Base_V22_Theme_AppCompat_Light
+style Base_V23_Theme_AppCompat
+style Base_V23_Theme_AppCompat_Light
+style Base_V26_Theme_AppCompat
+style Base_V26_Theme_AppCompat_Light
+style Base_V26_Widget_AppCompat_Toolbar
+style Base_V28_Theme_AppCompat
+style Base_V28_Theme_AppCompat_Light
+style Base_V7_ThemeOverlay_AppCompat_Dialog
+style Base_V7_Theme_AppCompat
+style Base_V7_Theme_AppCompat_Dialog
+style Base_V7_Theme_AppCompat_Light
+style Base_V7_Theme_AppCompat_Light_Dialog
+style Base_V7_Widget_AppCompat_AutoCompleteTextView
+style Base_V7_Widget_AppCompat_EditText
+style Base_V7_Widget_AppCompat_Toolbar
+style Base_Widget_AppCompat_ActionBar
+style Base_Widget_AppCompat_ActionBar_Solid
+style Base_Widget_AppCompat_ActionBar_TabBar
+style Base_Widget_AppCompat_ActionBar_TabText
+style Base_Widget_AppCompat_ActionBar_TabView
+style Base_Widget_AppCompat_ActionButton
+style Base_Widget_AppCompat_ActionButton_CloseMode
+style Base_Widget_AppCompat_ActionButton_Overflow
+style Base_Widget_AppCompat_ActionMode
+style Base_Widget_AppCompat_ActivityChooserView
+style Base_Widget_AppCompat_AutoCompleteTextView
+style Base_Widget_AppCompat_Button
+style Base_Widget_AppCompat_ButtonBar
+style Base_Widget_AppCompat_ButtonBar_AlertDialog
+style Base_Widget_AppCompat_Button_Borderless
+style Base_Widget_AppCompat_Button_Borderless_Colored
+style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Base_Widget_AppCompat_Button_Colored
+style Base_Widget_AppCompat_Button_Small
+style Base_Widget_AppCompat_CompoundButton_CheckBox
+style Base_Widget_AppCompat_CompoundButton_RadioButton
+style Base_Widget_AppCompat_CompoundButton_Switch
+style Base_Widget_AppCompat_DrawerArrowToggle
+style Base_Widget_AppCompat_DrawerArrowToggle_Common
+style Base_Widget_AppCompat_DropDownItem_Spinner
+style Base_Widget_AppCompat_EditText
+style Base_Widget_AppCompat_ImageButton
+style Base_Widget_AppCompat_Light_ActionBar
+style Base_Widget_AppCompat_Light_ActionBar_Solid
+style Base_Widget_AppCompat_Light_ActionBar_TabBar
+style Base_Widget_AppCompat_Light_ActionBar_TabText
+style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Base_Widget_AppCompat_Light_ActionBar_TabView
+style Base_Widget_AppCompat_Light_PopupMenu
+style Base_Widget_AppCompat_Light_PopupMenu_Overflow
+style Base_Widget_AppCompat_ListMenuView
+style Base_Widget_AppCompat_ListPopupWindow
+style Base_Widget_AppCompat_ListView
+style Base_Widget_AppCompat_ListView_DropDown
+style Base_Widget_AppCompat_ListView_Menu
+style Base_Widget_AppCompat_PopupMenu
+style Base_Widget_AppCompat_PopupMenu_Overflow
+style Base_Widget_AppCompat_PopupWindow
+style Base_Widget_AppCompat_ProgressBar
+style Base_Widget_AppCompat_ProgressBar_Horizontal
+style Base_Widget_AppCompat_RatingBar
+style Base_Widget_AppCompat_RatingBar_Indicator
+style Base_Widget_AppCompat_RatingBar_Small
+style Base_Widget_AppCompat_SearchView
+style Base_Widget_AppCompat_SearchView_ActionBar
+style Base_Widget_AppCompat_SeekBar
+style Base_Widget_AppCompat_SeekBar_Discrete
+style Base_Widget_AppCompat_Spinner
+style Base_Widget_AppCompat_Spinner_Underlined
+style Base_Widget_AppCompat_TextView
+style Base_Widget_AppCompat_TextView_SpinnerItem
+style Base_Widget_AppCompat_Toolbar
+style Base_Widget_AppCompat_Toolbar_Button_Navigation
+style Base_Widget_Design_TabLayout
+style Base_Widget_MaterialComponents_AutoCompleteTextView
+style Base_Widget_MaterialComponents_CheckedTextView
+style Base_Widget_MaterialComponents_Chip
+style Base_Widget_MaterialComponents_MaterialCalendar_NavigationButton
+style Base_Widget_MaterialComponents_PopupMenu
+style Base_Widget_MaterialComponents_PopupMenu_ContextMenu
+style Base_Widget_MaterialComponents_PopupMenu_ListPopupWindow
+style Base_Widget_MaterialComponents_PopupMenu_Overflow
+style Base_Widget_MaterialComponents_Slider
+style Base_Widget_MaterialComponents_Snackbar
+style Base_Widget_MaterialComponents_TextInputEditText
+style Base_Widget_MaterialComponents_TextInputLayout
+style Base_Widget_MaterialComponents_TextView
+style CardView
+style CardView_Dark
+style CardView_Light
+style EmptyTheme
+style MaterialAlertDialog_MaterialComponents
+style MaterialAlertDialog_MaterialComponents_Body_Text
+style MaterialAlertDialog_MaterialComponents_Picker_Date_Calendar
+style MaterialAlertDialog_MaterialComponents_Picker_Date_Spinner
+style MaterialAlertDialog_MaterialComponents_Title_Icon
+style MaterialAlertDialog_MaterialComponents_Title_Icon_CenterStacked
+style MaterialAlertDialog_MaterialComponents_Title_Panel
+style MaterialAlertDialog_MaterialComponents_Title_Panel_CenterStacked
+style MaterialAlertDialog_MaterialComponents_Title_Text
+style MaterialAlertDialog_MaterialComponents_Title_Text_CenterStacked
+style Platform_AppCompat
+style Platform_AppCompat_Light
+style Platform_MaterialComponents
+style Platform_MaterialComponents_Dialog
+style Platform_MaterialComponents_Light
+style Platform_MaterialComponents_Light_Dialog
+style Platform_ThemeOverlay_AppCompat
+style Platform_ThemeOverlay_AppCompat_Dark
+style Platform_ThemeOverlay_AppCompat_Light
+style Platform_V21_AppCompat
+style Platform_V21_AppCompat_Light
+style Platform_V25_AppCompat
+style Platform_V25_AppCompat_Light
+style Platform_Widget_AppCompat_Spinner
+style RtlOverlay_DialogWindowTitle_AppCompat
+style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem
+style RtlOverlay_Widget_AppCompat_DialogTitle_Icon
+style RtlOverlay_Widget_AppCompat_PopupMenuItem
+style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup
+style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut
+style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow
+style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text
+style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title
+style RtlOverlay_Widget_AppCompat_SearchView_MagIcon
+style RtlOverlay_Widget_AppCompat_Search_DropDown
+style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1
+style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2
+style RtlOverlay_Widget_AppCompat_Search_DropDown_Query
+style RtlOverlay_Widget_AppCompat_Search_DropDown_Text
+style RtlUnderlay_Widget_AppCompat_ActionButton
+style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow
+style ShapeAppearanceOverlay
+style ShapeAppearanceOverlay_BottomLeftDifferentCornerSize
+style ShapeAppearanceOverlay_BottomRightCut
+style ShapeAppearanceOverlay_Cut
+style ShapeAppearanceOverlay_DifferentCornerSize
+style ShapeAppearanceOverlay_MaterialComponents_BottomSheet
+style ShapeAppearanceOverlay_MaterialComponents_Chip
+style ShapeAppearanceOverlay_MaterialComponents_ExtendedFloatingActionButton
+style ShapeAppearanceOverlay_MaterialComponents_FloatingActionButton
+style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Day
+style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Window_Fullscreen
+style ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Year
+style ShapeAppearanceOverlay_MaterialComponents_TextInputLayout_FilledBox
+style ShapeAppearanceOverlay_TopLeftCut
+style ShapeAppearanceOverlay_TopRightDifferentCornerSize
+style ShapeAppearance_MaterialComponents
+style ShapeAppearance_MaterialComponents_LargeComponent
+style ShapeAppearance_MaterialComponents_MediumComponent
+style ShapeAppearance_MaterialComponents_SmallComponent
+style ShapeAppearance_MaterialComponents_Test
+style ShapeAppearance_MaterialComponents_Tooltip
+style TestStyleWithLineHeight
+style TestStyleWithLineHeightAppearance
+style TestStyleWithThemeLineHeightAttribute
+style TestStyleWithoutLineHeight
+style TestThemeWithLineHeight
+style TestThemeWithLineHeightDisabled
+style Test_ShapeAppearanceOverlay_MaterialComponents_MaterialCalendar_Day
+style Test_Theme_MaterialComponents_MaterialCalendar
+style Test_Widget_MaterialComponents_MaterialCalendar
+style Test_Widget_MaterialComponents_MaterialCalendar_Day
+style Test_Widget_MaterialComponents_MaterialCalendar_Day_Selected
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Tooltip
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
+style TextAppearance_Design_CollapsingToolbar_Expanded
+style TextAppearance_Design_Counter
+style TextAppearance_Design_Counter_Overflow
+style TextAppearance_Design_Error
+style TextAppearance_Design_HelperText
+style TextAppearance_Design_Hint
+style TextAppearance_Design_Placeholder
+style TextAppearance_Design_Prefix
+style TextAppearance_Design_Snackbar_Message
+style TextAppearance_Design_Suffix
+style TextAppearance_Design_Tab
+style TextAppearance_MaterialComponents_Badge
+style TextAppearance_MaterialComponents_Body1
+style TextAppearance_MaterialComponents_Body2
+style TextAppearance_MaterialComponents_Button
+style TextAppearance_MaterialComponents_Caption
+style TextAppearance_MaterialComponents_Chip
+style TextAppearance_MaterialComponents_Headline1
+style TextAppearance_MaterialComponents_Headline2
+style TextAppearance_MaterialComponents_Headline3
+style TextAppearance_MaterialComponents_Headline4
+style TextAppearance_MaterialComponents_Headline5
+style TextAppearance_MaterialComponents_Headline6
+style TextAppearance_MaterialComponents_Overline
+style TextAppearance_MaterialComponents_Subtitle1
+style TextAppearance_MaterialComponents_Subtitle2
+style TextAppearance_MaterialComponents_TimePicker_Title
+style TextAppearance_MaterialComponents_Tooltip
+style TextAppearance_Widget_AppCompat_ExpandedMenu_Item
+style TextAppearance_Widget_AppCompat_Toolbar_Subtitle
+style TextAppearance_Widget_AppCompat_Toolbar_Title
+style ThemeOverlayColorAccentRed
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style ThemeOverlay_Design_TextInputEditText
+style ThemeOverlay_MaterialComponents
+style ThemeOverlay_MaterialComponents_ActionBar
+style ThemeOverlay_MaterialComponents_ActionBar_Primary
+style ThemeOverlay_MaterialComponents_ActionBar_Surface
+style ThemeOverlay_MaterialComponents_AutoCompleteTextView
+style ThemeOverlay_MaterialComponents_AutoCompleteTextView_FilledBox
+style ThemeOverlay_MaterialComponents_AutoCompleteTextView_FilledBox_Dense
+style ThemeOverlay_MaterialComponents_AutoCompleteTextView_OutlinedBox
+style ThemeOverlay_MaterialComponents_AutoCompleteTextView_OutlinedBox_Dense
+style ThemeOverlay_MaterialComponents_BottomAppBar_Primary
+style ThemeOverlay_MaterialComponents_BottomAppBar_Surface
+style ThemeOverlay_MaterialComponents_BottomSheetDialog
+style ThemeOverlay_MaterialComponents_Dark
+style ThemeOverlay_MaterialComponents_Dark_ActionBar
+style ThemeOverlay_MaterialComponents_DayNight_BottomSheetDialog
+style ThemeOverlay_MaterialComponents_Dialog
+style ThemeOverlay_MaterialComponents_Dialog_Alert
+style ThemeOverlay_MaterialComponents_Dialog_Alert_Framework
+style ThemeOverlay_MaterialComponents_Light
+style ThemeOverlay_MaterialComponents_Light_Dialog_Alert_Framework
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Centered
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Calendar
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Header_Text
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Header_Text_Day
+style ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Spinner
+style ThemeOverlay_MaterialComponents_MaterialCalendar
+style ThemeOverlay_MaterialComponents_MaterialCalendar_Fullscreen
+style ThemeOverlay_MaterialComponents_TextInputEditText
+style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox
+style ThemeOverlay_MaterialComponents_TextInputEditText_FilledBox_Dense
+style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox
+style ThemeOverlay_MaterialComponents_TextInputEditText_OutlinedBox_Dense
+style ThemeOverlay_MaterialComponents_TimePicker
+style ThemeOverlay_MaterialComponents_TimePicker_Display
+style ThemeOverlay_MaterialComponents_Toolbar_Primary
+style ThemeOverlay_MaterialComponents_Toolbar_Surface
+style Theme_AppCompat
+style Theme_AppCompat_CompactMenu
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Empty
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Theme_Design
+style Theme_Design_BottomSheetDialog
+style Theme_Design_Light
+style Theme_Design_Light_BottomSheetDialog
+style Theme_Design_Light_NoActionBar
+style Theme_Design_NoActionBar
+style Theme_MaterialComponents
+style Theme_MaterialComponents_BottomSheetDialog
+style Theme_MaterialComponents_Bridge
+style Theme_MaterialComponents_CompactMenu
+style Theme_MaterialComponents_DayNight
+style Theme_MaterialComponents_DayNight_BottomSheetDialog
+style Theme_MaterialComponents_DayNight_Bridge
+style Theme_MaterialComponents_DayNight_DarkActionBar
+style Theme_MaterialComponents_DayNight_DarkActionBar_Bridge
+style Theme_MaterialComponents_DayNight_Dialog
+style Theme_MaterialComponents_DayNight_DialogWhenLarge
+style Theme_MaterialComponents_DayNight_Dialog_Alert
+style Theme_MaterialComponents_DayNight_Dialog_Alert_Bridge
+style Theme_MaterialComponents_DayNight_Dialog_Bridge
+style Theme_MaterialComponents_DayNight_Dialog_FixedSize
+style Theme_MaterialComponents_DayNight_Dialog_FixedSize_Bridge
+style Theme_MaterialComponents_DayNight_Dialog_MinWidth
+style Theme_MaterialComponents_DayNight_Dialog_MinWidth_Bridge
+style Theme_MaterialComponents_DayNight_NoActionBar
+style Theme_MaterialComponents_DayNight_NoActionBar_Bridge
+style Theme_MaterialComponents_Dialog
+style Theme_MaterialComponents_DialogWhenLarge
+style Theme_MaterialComponents_Dialog_Alert
+style Theme_MaterialComponents_Dialog_Alert_Bridge
+style Theme_MaterialComponents_Dialog_Bridge
+style Theme_MaterialComponents_Dialog_FixedSize
+style Theme_MaterialComponents_Dialog_FixedSize_Bridge
+style Theme_MaterialComponents_Dialog_MinWidth
+style Theme_MaterialComponents_Dialog_MinWidth_Bridge
+style Theme_MaterialComponents_Light
+style Theme_MaterialComponents_Light_BarSize
+style Theme_MaterialComponents_Light_BottomSheetDialog
+style Theme_MaterialComponents_Light_Bridge
+style Theme_MaterialComponents_Light_DarkActionBar
+style Theme_MaterialComponents_Light_DarkActionBar_Bridge
+style Theme_MaterialComponents_Light_Dialog
+style Theme_MaterialComponents_Light_DialogWhenLarge
+style Theme_MaterialComponents_Light_Dialog_Alert
+style Theme_MaterialComponents_Light_Dialog_Alert_Bridge
+style Theme_MaterialComponents_Light_Dialog_Bridge
+style Theme_MaterialComponents_Light_Dialog_FixedSize
+style Theme_MaterialComponents_Light_Dialog_FixedSize_Bridge
+style Theme_MaterialComponents_Light_Dialog_MinWidth
+style Theme_MaterialComponents_Light_Dialog_MinWidth_Bridge
+style Theme_MaterialComponents_Light_LargeTouch
+style Theme_MaterialComponents_Light_NoActionBar
+style Theme_MaterialComponents_Light_NoActionBar_Bridge
+style Theme_MaterialComponents_NoActionBar
+style Theme_MaterialComponents_NoActionBar_Bridge
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_ActivityChooserView
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_ActivityChooserView
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListMenuView
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
+style Widget_Compat_NotificationActionContainer
+style Widget_Compat_NotificationActionText
+style Widget_Design_AppBarLayout
+style Widget_Design_BottomNavigationView
+style Widget_Design_BottomSheet_Modal
+style Widget_Design_CollapsingToolbar
+style Widget_Design_FloatingActionButton
+style Widget_Design_NavigationView
+style Widget_Design_ScrimInsetsFrameLayout
+style Widget_Design_Snackbar
+style Widget_Design_TabLayout
+style Widget_Design_TextInputEditText
+style Widget_Design_TextInputLayout
+style Widget_MaterialComponents_ActionBar_Primary
+style Widget_MaterialComponents_ActionBar_PrimarySurface
+style Widget_MaterialComponents_ActionBar_Solid
+style Widget_MaterialComponents_ActionBar_Surface
+style Widget_MaterialComponents_AppBarLayout_Primary
+style Widget_MaterialComponents_AppBarLayout_PrimarySurface
+style Widget_MaterialComponents_AppBarLayout_Surface
+style Widget_MaterialComponents_AutoCompleteTextView_FilledBox
+style Widget_MaterialComponents_AutoCompleteTextView_FilledBox_Dense
+style Widget_MaterialComponents_AutoCompleteTextView_OutlinedBox
+style Widget_MaterialComponents_AutoCompleteTextView_OutlinedBox_Dense
+style Widget_MaterialComponents_Badge
+style Widget_MaterialComponents_BottomAppBar
+style Widget_MaterialComponents_BottomAppBar_Colored
+style Widget_MaterialComponents_BottomAppBar_PrimarySurface
+style Widget_MaterialComponents_BottomNavigationView
+style Widget_MaterialComponents_BottomNavigationView_Colored
+style Widget_MaterialComponents_BottomNavigationView_PrimarySurface
+style Widget_MaterialComponents_BottomSheet
+style Widget_MaterialComponents_BottomSheet_Modal
+style Widget_MaterialComponents_Button
+style Widget_MaterialComponents_Button_Icon
+style Widget_MaterialComponents_Button_OutlinedButton
+style Widget_MaterialComponents_Button_OutlinedButton_Icon
+style Widget_MaterialComponents_Button_TextButton
+style Widget_MaterialComponents_Button_TextButton_Dialog
+style Widget_MaterialComponents_Button_TextButton_Dialog_Flush
+style Widget_MaterialComponents_Button_TextButton_Dialog_Icon
+style Widget_MaterialComponents_Button_TextButton_Icon
+style Widget_MaterialComponents_Button_TextButton_Snackbar
+style Widget_MaterialComponents_Button_UnelevatedButton
+style Widget_MaterialComponents_Button_UnelevatedButton_Icon
+style Widget_MaterialComponents_CardView
+style Widget_MaterialComponents_CheckedTextView
+style Widget_MaterialComponents_ChipGroup
+style Widget_MaterialComponents_Chip_Action
+style Widget_MaterialComponents_Chip_Choice
+style Widget_MaterialComponents_Chip_Entry
+style Widget_MaterialComponents_Chip_Filter
+style Widget_MaterialComponents_CircularProgressIndicator
+style Widget_MaterialComponents_CircularProgressIndicator_ExtraSmall
+style Widget_MaterialComponents_CircularProgressIndicator_Medium
+style Widget_MaterialComponents_CircularProgressIndicator_Small
+style Widget_MaterialComponents_CollapsingToolbar
+style Widget_MaterialComponents_CompoundButton_CheckBox
+style Widget_MaterialComponents_CompoundButton_RadioButton
+style Widget_MaterialComponents_CompoundButton_Switch
+style Widget_MaterialComponents_ExtendedFloatingActionButton
+style Widget_MaterialComponents_ExtendedFloatingActionButton_Icon
+style Widget_MaterialComponents_FloatingActionButton
+style Widget_MaterialComponents_Light_ActionBar_Solid
+style Widget_MaterialComponents_LinearProgressIndicator
+style Widget_MaterialComponents_MaterialButtonToggleGroup
+style Widget_MaterialComponents_MaterialCalendar
+style Widget_MaterialComponents_MaterialCalendar_Day
+style Widget_MaterialComponents_MaterialCalendar_DayTextView
+style Widget_MaterialComponents_MaterialCalendar_Day_Invalid
+style Widget_MaterialComponents_MaterialCalendar_Day_Selected
+style Widget_MaterialComponents_MaterialCalendar_Day_Today
+style Widget_MaterialComponents_MaterialCalendar_Fullscreen
+style Widget_MaterialComponents_MaterialCalendar_HeaderCancelButton
+style Widget_MaterialComponents_MaterialCalendar_HeaderConfirmButton
+style Widget_MaterialComponents_MaterialCalendar_HeaderDivider
+style Widget_MaterialComponents_MaterialCalendar_HeaderLayout
+style Widget_MaterialComponents_MaterialCalendar_HeaderSelection
+style Widget_MaterialComponents_MaterialCalendar_HeaderSelection_Fullscreen
+style Widget_MaterialComponents_MaterialCalendar_HeaderTitle
+style Widget_MaterialComponents_MaterialCalendar_HeaderToggleButton
+style Widget_MaterialComponents_MaterialCalendar_Item
+style Widget_MaterialComponents_MaterialCalendar_MonthNavigationButton
+style Widget_MaterialComponents_MaterialCalendar_MonthTextView
+style Widget_MaterialComponents_MaterialCalendar_Year
+style Widget_MaterialComponents_MaterialCalendar_YearNavigationButton
+style Widget_MaterialComponents_MaterialCalendar_Year_Selected
+style Widget_MaterialComponents_MaterialCalendar_Year_Today
+style Widget_MaterialComponents_NavigationRailView
+style Widget_MaterialComponents_NavigationRailView_Colored
+style Widget_MaterialComponents_NavigationRailView_Colored_Compact
+style Widget_MaterialComponents_NavigationRailView_Compact
+style Widget_MaterialComponents_NavigationRailView_PrimarySurface
+style Widget_MaterialComponents_NavigationView
+style Widget_MaterialComponents_PopupMenu
+style Widget_MaterialComponents_PopupMenu_ContextMenu
+style Widget_MaterialComponents_PopupMenu_ListPopupWindow
+style Widget_MaterialComponents_PopupMenu_Overflow
+style Widget_MaterialComponents_ProgressIndicator
+style Widget_MaterialComponents_ShapeableImageView
+style Widget_MaterialComponents_Slider
+style Widget_MaterialComponents_Snackbar
+style Widget_MaterialComponents_Snackbar_FullWidth
+style Widget_MaterialComponents_Snackbar_TextView
+style Widget_MaterialComponents_TabLayout
+style Widget_MaterialComponents_TabLayout_Colored
+style Widget_MaterialComponents_TabLayout_PrimarySurface
+style Widget_MaterialComponents_TextInputEditText_FilledBox
+style Widget_MaterialComponents_TextInputEditText_FilledBox_Dense
+style Widget_MaterialComponents_TextInputEditText_OutlinedBox
+style Widget_MaterialComponents_TextInputEditText_OutlinedBox_Dense
+style Widget_MaterialComponents_TextInputLayout_FilledBox
+style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense
+style Widget_MaterialComponents_TextInputLayout_FilledBox_Dense_ExposedDropdownMenu
+style Widget_MaterialComponents_TextInputLayout_FilledBox_ExposedDropdownMenu
+style Widget_MaterialComponents_TextInputLayout_OutlinedBox
+style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense
+style Widget_MaterialComponents_TextInputLayout_OutlinedBox_Dense_ExposedDropdownMenu
+style Widget_MaterialComponents_TextInputLayout_OutlinedBox_ExposedDropdownMenu
+style Widget_MaterialComponents_TextView
+style Widget_MaterialComponents_TimePicker
+style Widget_MaterialComponents_TimePicker_Button
+style Widget_MaterialComponents_TimePicker_Clock
+style Widget_MaterialComponents_TimePicker_Display
+style Widget_MaterialComponents_TimePicker_Display_TextInputEditText
+style Widget_MaterialComponents_TimePicker_ImageButton
+style Widget_MaterialComponents_TimePicker_ImageButton_ShapeAppearance
+style Widget_MaterialComponents_Toolbar
+style Widget_MaterialComponents_Toolbar_Primary
+style Widget_MaterialComponents_Toolbar_PrimarySurface
+style Widget_MaterialComponents_Toolbar_Surface
+style Widget_MaterialComponents_Tooltip
+style Widget_Support_CoordinatorLayout
+styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle
+styleable ActionBarLayout android_layout_gravity
+styleable ActionMenuItemView android_minWidth
+styleable ActionMenuView
+styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle
+styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount
+styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout
+styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
+styleable AnimatedStateListDrawableItem android_drawable android_id
+styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId
+styleable AppBarLayout android_background android_keyboardNavigationCluster android_touchscreenBlocksFocus elevation expanded liftOnScroll liftOnScrollTargetViewId statusBarForeground
+styleable AppBarLayoutStates state_collapsed state_collapsible state_liftable state_lifted
+styleable AppBarLayout_Layout layout_scrollFlags layout_scrollInterpolator
+styleable AppCompatImageView android_src srcCompat tint tintMode
+styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode
+styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance
+styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType drawableBottomCompat drawableEndCompat drawableLeftCompat drawableRightCompat drawableStartCompat drawableTint drawableTintMode drawableTopCompat firstBaselineToTopHeight fontFamily fontVariationSettings lastBaselineToBottomHeight lineHeight textAllCaps textLocale
+styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseContentDescription actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeTheme actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listChoiceIndicatorMultipleAnimated listChoiceIndicatorSingleAnimated listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingEnd listPreferredItemPaddingLeft listPreferredItemPaddingRight listPreferredItemPaddingStart panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle
+styleable Badge backgroundColor badgeGravity badgeTextColor horizontalOffset maxCharacterCount number verticalOffset
+styleable BaseProgressIndicator android_indeterminate hideAnimationBehavior indicatorColor minHideDelay showAnimationBehavior showDelay trackColor trackCornerRadius trackThickness
+styleable BottomAppBar backgroundTint elevation fabAlignmentMode fabAnimationMode fabCradleMargin fabCradleRoundedCornerRadius fabCradleVerticalOffset hideOnScroll paddingBottomSystemWindowInsets paddingLeftSystemWindowInsets paddingRightSystemWindowInsets
+styleable BottomNavigationView itemHorizontalTranslationEnabled
+styleable BottomSheetBehavior_Layout android_elevation android_maxWidth backgroundTint behavior_draggable behavior_expandedOffset behavior_fitToContents behavior_halfExpandedRatio behavior_hideable behavior_peekHeight behavior_saveFlags behavior_skipCollapsed gestureInsetBottomIgnored paddingBottomSystemWindowInsets paddingLeftSystemWindowInsets paddingRightSystemWindowInsets paddingTopSystemWindowInsets shapeAppearance shapeAppearanceOverlay
+styleable ButtonBarLayout allowStacking
+styleable Capability queryPatterns shortcutMatchRequired
+styleable CardView android_minHeight android_minWidth cardBackgroundColor cardCornerRadius cardElevation cardMaxElevation cardPreventCornerOverlap cardUseCompatPadding contentPadding contentPaddingBottom contentPaddingLeft contentPaddingRight contentPaddingTop
+styleable Chip android_checkable android_ellipsize android_maxWidth android_text android_textAppearance android_textColor android_textSize checkedIcon checkedIconEnabled checkedIconTint checkedIconVisible chipBackgroundColor chipCornerRadius chipEndPadding chipIcon chipIconEnabled chipIconSize chipIconTint chipIconVisible chipMinHeight chipMinTouchTargetSize chipStartPadding chipStrokeColor chipStrokeWidth chipSurfaceColor closeIcon closeIconEnabled closeIconEndPadding closeIconSize closeIconStartPadding closeIconTint closeIconVisible ensureMinTouchTargetSize hideMotionSpec iconEndPadding iconStartPadding rippleColor shapeAppearance shapeAppearanceOverlay showMotionSpec textEndPadding textStartPadding
+styleable ChipGroup checkedChip chipSpacing chipSpacingHorizontal chipSpacingVertical selectionRequired singleLine singleSelection
+styleable CircularProgressIndicator indicatorDirectionCircular indicatorInset indicatorSize
+styleable ClockFaceView clockFaceBackgroundColor clockNumberTextColor
+styleable ClockHandView clockHandColor materialCircleRadius selectorSize
+styleable CollapsingToolbarLayout collapsedTitleGravity collapsedTitleTextAppearance contentScrim expandedTitleGravity expandedTitleMargin expandedTitleMarginBottom expandedTitleMarginEnd expandedTitleMarginStart expandedTitleMarginTop expandedTitleTextAppearance extraMultilineHeightEnabled forceApplySystemWindowInsetTop maxLines scrimAnimationDuration scrimVisibleHeightTrigger statusBarScrim title titleCollapseMode titleEnabled toolbarId
+styleable CollapsingToolbarLayout_Layout layout_collapseMode layout_collapseParallaxMultiplier
+styleable ColorStateListItem alpha android_alpha android_color
+styleable CompoundButton android_button buttonCompat buttonTint buttonTintMode
+styleable Constraint android_alpha android_elevation android_id android_layout_height android_layout_marginBottom android_layout_marginEnd android_layout_marginLeft android_layout_marginRight android_layout_marginStart android_layout_marginTop android_layout_width android_maxHeight android_maxWidth android_minHeight android_minWidth android_orientation android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_transformPivotX android_transformPivotY android_translationX android_translationY android_translationZ android_visibility animate_relativeTo barrierAllowsGoneWidgets barrierDirection barrierMargin chainUseRtl constraint_referenced_ids drawPath flow_firstHorizontalBias flow_firstHorizontalStyle flow_firstVerticalBias flow_firstVerticalStyle flow_horizontalAlign flow_horizontalBias flow_horizontalGap flow_horizontalStyle flow_lastHorizontalBias flow_lastHorizontalStyle flow_lastVerticalBias flow_lastVerticalStyle flow_maxElementsWrap flow_verticalAlign flow_verticalBias flow_verticalGap flow_verticalStyle flow_wrapMode layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTag layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop motionProgress motionStagger pathMotionArc pivotAnchor transitionEasing transitionPathRotate visibilityMode
+styleable ConstraintLayout_Layout android_elevation android_maxHeight android_maxWidth android_minHeight android_minWidth android_orientation android_padding android_paddingBottom android_paddingEnd android_paddingLeft android_paddingRight android_paddingStart android_paddingTop android_visibility barrierAllowsGoneWidgets barrierDirection barrierMargin chainUseRtl constraintSet constraint_referenced_ids flow_firstHorizontalBias flow_firstHorizontalStyle flow_firstVerticalBias flow_firstVerticalStyle flow_horizontalAlign flow_horizontalBias flow_horizontalGap flow_horizontalStyle flow_lastHorizontalBias flow_lastHorizontalStyle flow_lastVerticalBias flow_lastVerticalStyle flow_maxElementsWrap flow_verticalAlign flow_verticalBias flow_verticalGap flow_verticalStyle flow_wrapMode layoutDescription layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTag layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop layout_optimizationLevel
+styleable ConstraintLayout_placeholder content placeholder_emptyVisibility
+styleable ConstraintSet android_alpha android_elevation android_id android_layout_height android_layout_marginBottom android_layout_marginEnd android_layout_marginLeft android_layout_marginRight android_layout_marginStart android_layout_marginTop android_layout_width android_maxHeight android_maxWidth android_minHeight android_minWidth android_orientation android_pivotX android_pivotY android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_transformPivotX android_transformPivotY android_translationX android_translationY android_translationZ android_visibility animate_relativeTo barrierAllowsGoneWidgets barrierDirection barrierMargin chainUseRtl constraint_referenced_ids deriveConstraintsFrom drawPath flow_firstHorizontalBias flow_firstHorizontalStyle flow_firstVerticalBias flow_firstVerticalStyle flow_horizontalAlign flow_horizontalBias flow_horizontalGap flow_horizontalStyle flow_lastHorizontalBias flow_lastHorizontalStyle flow_lastVerticalBias flow_lastVerticalStyle flow_maxElementsWrap flow_verticalAlign flow_verticalBias flow_verticalGap flow_verticalStyle flow_wrapMode layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTag layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop motionProgress motionStagger pathMotionArc pivotAnchor transitionEasing transitionPathRotate
+styleable CoordinatorLayout keylines statusBarBackground
+styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline
+styleable CustomAttribute attributeName customBoolean customColorDrawableValue customColorValue customDimension customFloatValue customIntegerValue customPixelDimension customStringValue
+styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness
+styleable ExtendedFloatingActionButton collapsedSize elevation extendMotionSpec hideMotionSpec showMotionSpec shrinkMotionSpec
+styleable ExtendedFloatingActionButton_Behavior_Layout behavior_autoHide behavior_autoShrink
+styleable FloatingActionButton android_enabled backgroundTint backgroundTintMode borderWidth elevation ensureMinTouchTargetSize fabCustomSize fabSize hideMotionSpec hoveredFocusedTranslationZ maxImageSize pressedTranslationZ rippleColor shapeAppearance shapeAppearanceOverlay showMotionSpec useCompatPadding
+styleable FloatingActionButton_Behavior_Layout behavior_autoHide
+styleable FlowLayout itemSpacing lineSpacing
+styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery fontProviderSystemFontFamily
+styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex
+styleable ForegroundLinearLayout android_foreground android_foregroundGravity foregroundInsidePadding
+styleable Fragment android_id android_name android_tag
+styleable FragmentContainerView android_name android_tag
+styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type
+styleable GradientColorItem android_color android_offset
+styleable ImageFilterView altSrc brightness contrast crossfade overlay round roundPercent saturation warmth
+styleable Insets paddingBottomSystemWindowInsets paddingLeftSystemWindowInsets paddingRightSystemWindowInsets paddingTopSystemWindowInsets
+styleable KeyAttribute android_alpha android_elevation android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_transformPivotX android_transformPivotY android_translationX android_translationY android_translationZ curveFit framePosition motionProgress motionTarget transitionEasing transitionPathRotate
+styleable KeyCycle android_alpha android_elevation android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_translationX android_translationY android_translationZ curveFit framePosition motionProgress motionTarget transitionEasing transitionPathRotate waveOffset wavePeriod waveShape waveVariesBy
+styleable KeyPosition curveFit drawPath framePosition keyPositionType motionTarget pathMotionArc percentHeight percentWidth percentX percentY sizePercent transitionEasing
+styleable KeyTimeCycle android_alpha android_elevation android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_translationX android_translationY android_translationZ curveFit framePosition motionProgress motionTarget transitionEasing transitionPathRotate waveDecay waveOffset wavePeriod waveShape
+styleable KeyTrigger framePosition motionTarget motion_postLayoutCollision motion_triggerOnCollision onCross onNegativeCross onPositiveCross triggerId triggerReceiver triggerSlack
+styleable Layout android_layout_height android_layout_marginBottom android_layout_marginEnd android_layout_marginLeft android_layout_marginRight android_layout_marginStart android_layout_marginTop android_layout_width android_orientation barrierAllowsGoneWidgets barrierDirection barrierMargin chainUseRtl constraint_referenced_ids layout_constrainedHeight layout_constrainedWidth layout_constraintBaseline_creator layout_constraintBaseline_toBaselineOf layout_constraintBottom_creator layout_constraintBottom_toBottomOf layout_constraintBottom_toTopOf layout_constraintCircle layout_constraintCircleAngle layout_constraintCircleRadius layout_constraintDimensionRatio layout_constraintEnd_toEndOf layout_constraintEnd_toStartOf layout_constraintGuide_begin layout_constraintGuide_end layout_constraintGuide_percent layout_constraintHeight_default layout_constraintHeight_max layout_constraintHeight_min layout_constraintHeight_percent layout_constraintHorizontal_bias layout_constraintHorizontal_chainStyle layout_constraintHorizontal_weight layout_constraintLeft_creator layout_constraintLeft_toLeftOf layout_constraintLeft_toRightOf layout_constraintRight_creator layout_constraintRight_toLeftOf layout_constraintRight_toRightOf layout_constraintStart_toEndOf layout_constraintStart_toStartOf layout_constraintTop_creator layout_constraintTop_toBottomOf layout_constraintTop_toTopOf layout_constraintVertical_bias layout_constraintVertical_chainStyle layout_constraintVertical_weight layout_constraintWidth_default layout_constraintWidth_max layout_constraintWidth_min layout_constraintWidth_percent layout_editor_absoluteX layout_editor_absoluteY layout_goneMarginBottom layout_goneMarginEnd layout_goneMarginLeft layout_goneMarginRight layout_goneMarginStart layout_goneMarginTop maxHeight maxWidth minHeight minWidth
+styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers
+styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width
+styleable LinearProgressIndicator indeterminateAnimationType indicatorDirectionLinear
+styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset
+styleable MaterialAlertDialog backgroundInsetBottom backgroundInsetEnd backgroundInsetStart backgroundInsetTop
+styleable MaterialAlertDialogTheme materialAlertDialogBodyTextStyle materialAlertDialogTheme materialAlertDialogTitleIconStyle materialAlertDialogTitlePanelStyle materialAlertDialogTitleTextStyle
+styleable MaterialAutoCompleteTextView android_inputType
+styleable MaterialButton android_background android_checkable android_insetBottom android_insetLeft android_insetRight android_insetTop backgroundTint backgroundTintMode cornerRadius elevation icon iconGravity iconPadding iconSize iconTint iconTintMode rippleColor shapeAppearance shapeAppearanceOverlay strokeColor strokeWidth
+styleable MaterialButtonToggleGroup checkedButton selectionRequired singleSelection
+styleable MaterialCalendar android_windowFullscreen dayInvalidStyle daySelectedStyle dayStyle dayTodayStyle nestedScrollable rangeFillColor yearSelectedStyle yearStyle yearTodayStyle
+styleable MaterialCalendarItem android_insetBottom android_insetLeft android_insetRight android_insetTop itemFillColor itemShapeAppearance itemShapeAppearanceOverlay itemStrokeColor itemStrokeWidth itemTextColor
+styleable MaterialCardView android_checkable cardForegroundColor checkedIcon checkedIconMargin checkedIconSize checkedIconTint rippleColor shapeAppearance shapeAppearanceOverlay state_dragged strokeColor strokeWidth
+styleable MaterialCheckBox buttonTint useMaterialThemeColors
+styleable MaterialRadioButton buttonTint useMaterialThemeColors
+styleable MaterialShape shapeAppearance shapeAppearanceOverlay
+styleable MaterialTextAppearance android_letterSpacing android_lineHeight lineHeight
+styleable MaterialTextView android_lineHeight android_textAppearance lineHeight
+styleable MaterialTimePicker clockIcon keyboardIcon
+styleable MaterialToolbar navigationIconTint subtitleCentered titleCentered
+styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible
+styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText
+styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow
+styleable MockView mock_diagonalsColor mock_label mock_labelBackgroundColor mock_labelColor mock_showDiagonals mock_showLabel
+styleable Motion animate_relativeTo drawPath motionPathRotate motionStagger pathMotionArc transitionEasing
+styleable MotionHelper onHide onShow
+styleable MotionLayout applyMotionScene currentState layoutDescription motionDebug motionProgress showPaths
+styleable MotionScene defaultDuration layoutDuringTransition
+styleable MotionTelltales telltales_tailColor telltales_tailScale telltales_velocityMode
+styleable NavigationBarView backgroundTint elevation itemBackground itemIconSize itemIconTint itemRippleColor itemTextAppearanceActive itemTextAppearanceInactive itemTextColor labelVisibilityMode menu
+styleable NavigationRailView headerLayout menuGravity
+styleable NavigationView android_background android_fitsSystemWindows android_maxWidth elevation headerLayout itemBackground itemHorizontalPadding itemIconPadding itemIconSize itemIconTint itemMaxLines itemShapeAppearance itemShapeAppearanceOverlay itemShapeFillColor itemShapeInsetBottom itemShapeInsetEnd itemShapeInsetStart itemShapeInsetTop itemTextAppearance itemTextColor menu shapeAppearance shapeAppearanceOverlay
+styleable OnClick clickAction targetId
+styleable OnSwipe dragDirection dragScale dragThreshold limitBoundsTo maxAcceleration maxVelocity moveWhenScrollAtTop nestedScrollFlags onTouchUp touchAnchorId touchAnchorSide touchRegionId
+styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor
+styleable PopupWindowBackgroundState state_above_anchor
+styleable PropertySet android_alpha android_visibility layout_constraintTag motionProgress visibilityMode
+styleable RadialViewGroup materialCircleRadius
+styleable RangeSlider minSeparation values
+styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle
+styleable RecyclerView android_clipToPadding android_descendantFocusability android_orientation fastScrollEnabled fastScrollHorizontalThumbDrawable fastScrollHorizontalTrackDrawable fastScrollVerticalThumbDrawable fastScrollVerticalTrackDrawable layoutManager reverseLayout spanCount stackFromEnd
+styleable ScrimInsetsFrameLayout insetForeground
+styleable ScrollingViewBehavior_Layout behavior_overlapTop
+styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon
+styleable ShapeAppearance cornerFamily cornerFamilyBottomLeft cornerFamilyBottomRight cornerFamilyTopLeft cornerFamilyTopRight cornerSize cornerSizeBottomLeft cornerSizeBottomRight cornerSizeTopLeft cornerSizeTopRight
+styleable ShapeableImageView contentPadding contentPaddingBottom contentPaddingEnd contentPaddingLeft contentPaddingRight contentPaddingStart contentPaddingTop shapeAppearance shapeAppearanceOverlay strokeColor strokeWidth
+styleable Slider android_enabled android_stepSize android_value android_valueFrom android_valueTo haloColor haloRadius labelBehavior labelStyle thumbColor thumbElevation thumbRadius thumbStrokeColor thumbStrokeWidth tickColor tickColorActive tickColorInactive tickVisible trackColor trackColorActive trackColorInactive trackHeight
+styleable Snackbar snackbarButtonStyle snackbarStyle snackbarTextViewStyle
+styleable SnackbarLayout actionTextColorAlpha android_maxWidth animationMode backgroundOverlayColorAlpha backgroundTint backgroundTintMode elevation maxActionInlineWidth
+styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme
+styleable State android_id constraints
+styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
+styleable StateListDrawableItem android_drawable
+styleable StateSet defaultState
+styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode
+styleable SwitchMaterial useMaterialThemeColors
+styleable TabItem android_icon android_layout android_text
+styleable TabLayout tabBackground tabContentStart tabGravity tabIconTint tabIconTintMode tabIndicator tabIndicatorAnimationDuration tabIndicatorAnimationMode tabIndicatorColor tabIndicatorFullWidth tabIndicatorGravity tabIndicatorHeight tabInlineLabel tabMaxWidth tabMinWidth tabMode tabPadding tabPaddingBottom tabPaddingEnd tabPaddingStart tabPaddingTop tabRippleColor tabSelectedTextColor tabTextAppearance tabTextColor tabUnboundedRipple
+styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textFontWeight android_textSize android_textStyle android_typeface fontFamily fontVariationSettings textAllCaps textLocale
+styleable TextInputEditText textInputLayoutFocusedRectEnabled
+styleable TextInputLayout android_enabled android_hint android_maxWidth android_minWidth android_textColorHint boxBackgroundColor boxBackgroundMode boxCollapsedPaddingTop boxCornerRadiusBottomEnd boxCornerRadiusBottomStart boxCornerRadiusTopEnd boxCornerRadiusTopStart boxStrokeColor boxStrokeErrorColor boxStrokeWidth boxStrokeWidthFocused counterEnabled counterMaxLength counterOverflowTextAppearance counterOverflowTextColor counterTextAppearance counterTextColor endIconCheckable endIconContentDescription endIconDrawable endIconMode endIconTint endIconTintMode errorContentDescription errorEnabled errorIconDrawable errorIconTint errorIconTintMode errorTextAppearance errorTextColor expandedHintEnabled helperText helperTextEnabled helperTextTextAppearance helperTextTextColor hintAnimationEnabled hintEnabled hintTextAppearance hintTextColor passwordToggleContentDescription passwordToggleDrawable passwordToggleEnabled passwordToggleTint passwordToggleTintMode placeholderText placeholderTextAppearance placeholderTextColor prefixText prefixTextAppearance prefixTextColor shapeAppearance shapeAppearanceOverlay startIconCheckable startIconContentDescription startIconDrawable startIconTint startIconTintMode suffixText suffixTextAppearance suffixTextColor
+styleable ThemeEnforcement android_textAppearance enforceMaterialTheme enforceTextAppearance
+styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight menu navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor
+styleable Tooltip android_layout_margin android_minHeight android_minWidth android_padding android_text android_textAppearance backgroundTint
+styleable Transform android_elevation android_rotation android_rotationX android_rotationY android_scaleX android_scaleY android_transformPivotX android_transformPivotY android_translationX android_translationY android_translationZ
+styleable Transition android_id autoTransition constraintSetEnd constraintSetStart duration layoutDuringTransition motionInterpolator pathMotionArc staggered transitionDisable transitionFlags
+styleable Variant constraints region_heightLessThan region_heightMoreThan region_widthLessThan region_widthMoreThan
+styleable View android_focusable android_theme paddingEnd paddingStart theme
+styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode
+styleable ViewPager2 android_orientation
+styleable ViewStubCompat android_id android_inflatedId android_layout
+xml standalone_badge
+xml standalone_badge_gravity_bottom_end
+xml standalone_badge_gravity_bottom_start
+xml standalone_badge_gravity_top_start
+xml standalone_badge_offset
diff --git a/player/build/outputs/aar/player-debug.aar b/player/build/outputs/aar/player-debug.aar
new file mode 100644
index 0000000000000000000000000000000000000000..7e682f905a222819819e100e6017f8c192bea392
Binary files /dev/null and b/player/build/outputs/aar/player-debug.aar differ
diff --git a/player/build/outputs/logs/manifest-merger-debug-report.txt b/player/build/outputs/logs/manifest-merger-debug-report.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5a37bbf983376fe9f48ad16baa312339a733d359
--- /dev/null
+++ b/player/build/outputs/logs/manifest-merger-debug-report.txt
@@ -0,0 +1,25 @@
+-- Merging decision tree log ---
+manifest
+ADDED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml:2:1-5:12
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml:2:1-5:12
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml:2:1-5:12
+ package
+ ADDED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml:3:5-29
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ xmlns:android
+ ADDED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml:2:11-69
+uses-sdk
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ ADDED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ ADDED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
+ INJECTED from D:\APP\CodeSource\AndroidProgrem\AndroidTest\player\src\main\AndroidManifest.xml
diff --git a/player/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/player/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 0000000000000000000000000000000000000000..74316ab7bcb5fa93735d8f0476de394a18ed8b58
Binary files /dev/null and b/player/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/pushbase/jiguangpush/build.gradle b/pushbase/jiguangpush/build.gradle
index a8e50862d954fb87b48c9f0799367a29d2d852d3..9449eb015accf514e8cb76f5ceff1f3dd09699e1 100644
--- a/pushbase/jiguangpush/build.gradle
+++ b/pushbase/jiguangpush/build.gradle
@@ -9,13 +9,11 @@ plugins {
android {
compileSdkVersion 30
- buildToolsVersion "30.0.0"
+ buildToolsVersion "30.0.2"
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
@@ -53,7 +51,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.2'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
}
\ No newline at end of file
diff --git a/pushbase/mipush/build.gradle b/pushbase/mipush/build.gradle
index ad67055fa8636f6d6d3300283b92ecbc3dd78431..0487997736f2724069bcf16f1ef9d9bfb3c89d52 100644
--- a/pushbase/mipush/build.gradle
+++ b/pushbase/mipush/build.gradle
@@ -4,13 +4,11 @@ plugins {
android {
compileSdkVersion 30
- buildToolsVersion "30.0.0"
+ buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
@@ -31,7 +29,6 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
}
\ No newline at end of file
diff --git a/router/build.gradle b/router/build.gradle
index 325d94d0e310f055833947af21af1c68eb86009f..599b184db0de7569d25eb4cb287931ab53a22952 100644
--- a/router/build.gradle
+++ b/router/build.gradle
@@ -11,14 +11,12 @@ plugins{
android {
compileSdkVersion 30
- buildToolsVersion "30.0.0"
+ buildToolsVersion "30.0.3"
/* applicationId "com.guiguzi.router"*/
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -39,7 +37,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'androidx.core:core-ktx:1.3.2'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
}
diff --git a/router/src/main/AndroidManifest.xml b/router/src/main/AndroidManifest.xml
index 93ff27ce198a3ab8ea757f771619087acdc4644e..235efc076548b6a0773ac1730d4945d52cdfd00a 100644
--- a/router/src/main/AndroidManifest.xml
+++ b/router/src/main/AndroidManifest.xml
@@ -10,10 +10,13 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
-
+
-
-
+
+
+
diff --git a/settings.gradle b/settings.gradle
index b455fd7f67efe03738c516345fa33878b6f1393c..be64b1f00efe4346a8e641bc5ece3a575b0b25dd 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -11,3 +11,6 @@ include ':router'
include ':pushbase:jiguangpush'
include ':pushbase:mipush'
+include ':LongImage'
+include ':JsonViewer'
+include ':AutoViewPager'
diff --git a/util/build.gradle b/util/build.gradle
index 5d7cf54df21830f21cb4415fec8c7f64af330a41..4695804557242d4249024194ac7293496b0d50e3 100644
--- a/util/build.gradle
+++ b/util/build.gradle
@@ -4,13 +4,11 @@ plugins {
android {
compileSdkVersion 30
- buildToolsVersion "30.0.0"
+ buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 26
targetSdkVersion 30
- versionCode 1
- versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
@@ -29,6 +27,6 @@ android {
}
dependencies {
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation "androidx.appcompat:appcompat:$appcompat"
+ implementation 'com.google.android.material:material:1.4.0'
}
\ No newline at end of file