pdfViewReference;
+
+ private PdfiumCore pdfiumCore;
+ private String password;
+ private DocumentSource docSource;
+ private int[] userPages;
+ private PdfFile pdfFile;
+
+ DecodingAsyncTask(DocumentSource docSource, String password, int[] userPages, PDFView pdfView, PdfiumCore pdfiumCore) {
+ this.docSource = docSource;
+ this.userPages = userPages;
+ this.cancelled = false;
+ this.pdfViewReference = new WeakReference<>(pdfView);
+ this.password = password;
+ this.pdfiumCore = pdfiumCore;
+ }
+
+ @Override
+ protected Throwable doInBackground(Void... params) {
+ try {
+ PDFView pdfView = pdfViewReference.get();
+ if (pdfView != null) {
+ PdfDocument pdfDocument = docSource.createDocument(pdfView.getContext(), pdfiumCore, password);
+ pdfFile = new PdfFile(pdfiumCore, pdfDocument, pdfView.getPageFitPolicy(), getViewSize(pdfView),
+ userPages, pdfView.isSwipeVertical(), pdfView.getSpacingPx(), pdfView.isAutoSpacingEnabled(),
+ pdfView.isFitEachPage());
+ return null;
+ } else {
+ return new NullPointerException("pdfView == null");
+ }
+
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+
+ private Size getViewSize(PDFView pdfView) {
+ return new Size(pdfView.getWidth(), pdfView.getHeight());
+ }
+
+ @Override
+ protected void onPostExecute(Throwable t) {
+ PDFView pdfView = pdfViewReference.get();
+ if (pdfView != null) {
+ if (t != null) {
+ pdfView.loadError(t);
+ return;
+ }
+ if (!cancelled) {
+ pdfView.loadComplete(pdfFile);
+ }
+ }
+ }
+
+ @Override
+ protected void onCancelled() {
+ cancelled = true;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/DragPinchManager.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/DragPinchManager.java
new file mode 100644
index 0000000..edca09f
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/DragPinchManager.java
@@ -0,0 +1,317 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer;
+
+import android.graphics.PointF;
+import android.graphics.RectF;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
+import android.view.View;
+
+import com.github.barteksc.pdfviewer.model.LinkTapEvent;
+import com.github.barteksc.pdfviewer.scroll.ScrollHandle;
+import com.github.barteksc.pdfviewer.util.SnapEdge;
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.util.SizeF;
+
+import static com.github.barteksc.pdfviewer.util.Constants.Pinch.MAXIMUM_ZOOM;
+import static com.github.barteksc.pdfviewer.util.Constants.Pinch.MINIMUM_ZOOM;
+
+/**
+ * This Manager takes care of moving the PDFView,
+ * set its zoom track user actions.
+ */
+class DragPinchManager implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener, ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener {
+
+ private PDFView pdfView;
+ private AnimationManager animationManager;
+
+ private GestureDetector gestureDetector;
+ private ScaleGestureDetector scaleGestureDetector;
+
+ private boolean scrolling = false;
+ private boolean scaling = false;
+ private boolean enabled = false;
+
+ DragPinchManager(PDFView pdfView, AnimationManager animationManager) {
+ this.pdfView = pdfView;
+ this.animationManager = animationManager;
+ gestureDetector = new GestureDetector(pdfView.getContext(), this);
+ scaleGestureDetector = new ScaleGestureDetector(pdfView.getContext(), this);
+ pdfView.setOnTouchListener(this);
+ }
+
+ void enable() {
+ enabled = true;
+ }
+
+ void disable() {
+ enabled = false;
+ }
+
+ void disableLongpress(){
+ gestureDetector.setIsLongpressEnabled(false);
+ }
+
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+ boolean onTapHandled = pdfView.callbacks.callOnTap(e);
+ boolean linkTapped = checkLinkTapped(e.getX(), e.getY());
+ if (!onTapHandled && !linkTapped) {
+ ScrollHandle ps = pdfView.getScrollHandle();
+ if (ps != null && !pdfView.documentFitsView()) {
+ if (!ps.shown()) {
+ ps.show();
+ } else {
+ ps.hide();
+ }
+ }
+ }
+ pdfView.performClick();
+ return true;
+ }
+
+ private boolean checkLinkTapped(float x, float y) {
+ PdfFile pdfFile = pdfView.pdfFile;
+ if (pdfFile == null) {
+ return false;
+ }
+ float mappedX = -pdfView.getCurrentXOffset() + x;
+ float mappedY = -pdfView.getCurrentYOffset() + y;
+ int page = pdfFile.getPageAtOffset(pdfView.isSwipeVertical() ? mappedY : mappedX, pdfView.getZoom());
+ SizeF pageSize = pdfFile.getScaledPageSize(page, pdfView.getZoom());
+ int pageX, pageY;
+ if (pdfView.isSwipeVertical()) {
+ pageX = (int) pdfFile.getSecondaryPageOffset(page, pdfView.getZoom());
+ pageY = (int) pdfFile.getPageOffset(page, pdfView.getZoom());
+ } else {
+ pageY = (int) pdfFile.getSecondaryPageOffset(page, pdfView.getZoom());
+ pageX = (int) pdfFile.getPageOffset(page, pdfView.getZoom());
+ }
+ for (PdfDocument.Link link : pdfFile.getPageLinks(page)) {
+ RectF mapped = pdfFile.mapRectToDevice(page, pageX, pageY, (int) pageSize.getWidth(),
+ (int) pageSize.getHeight(), link.getBounds());
+ mapped.sort();
+ if (mapped.contains(mappedX, mappedY)) {
+ pdfView.callbacks.callLinkHandler(new LinkTapEvent(x, y, mappedX, mappedY, mapped, link));
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void startPageFling(MotionEvent downEvent, MotionEvent ev, float velocityX, float velocityY) {
+ if (!checkDoPageFling(velocityX, velocityY)) {
+ return;
+ }
+
+ int direction;
+ if (pdfView.isSwipeVertical()) {
+ direction = velocityY > 0 ? -1 : 1;
+ } else {
+ direction = velocityX > 0 ? -1 : 1;
+ }
+ // get the focused page during the down event to ensure only a single page is changed
+ float delta = pdfView.isSwipeVertical() ? ev.getY() - downEvent.getY() : ev.getX() - downEvent.getX();
+ float offsetX = pdfView.getCurrentXOffset() - delta * pdfView.getZoom();
+ float offsetY = pdfView.getCurrentYOffset() - delta * pdfView.getZoom();
+ int startingPage = pdfView.findFocusPage(offsetX, offsetY);
+ int targetPage = Math.max(0, Math.min(pdfView.getPageCount() - 1, startingPage + direction));
+
+ SnapEdge edge = pdfView.findSnapEdge(targetPage);
+ float offset = pdfView.snapOffsetForPage(targetPage, edge);
+ animationManager.startPageFlingAnimation(-offset);
+ }
+
+ @Override
+ public boolean onDoubleTap(MotionEvent e) {
+ if (!pdfView.isDoubletapEnabled()) {
+ return false;
+ }
+
+ if (pdfView.getZoom() < pdfView.getMidZoom()) {
+ pdfView.zoomWithAnimation(e.getX(), e.getY(), pdfView.getMidZoom());
+ } else if (pdfView.getZoom() < pdfView.getMaxZoom()) {
+ pdfView.zoomWithAnimation(e.getX(), e.getY(), pdfView.getMaxZoom());
+ } else {
+ pdfView.resetZoomWithAnimation();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onDoubleTapEvent(MotionEvent e) {
+ return false;
+ }
+
+ @Override
+ public boolean onDown(MotionEvent e) {
+ animationManager.stopFling();
+ return true;
+ }
+
+ @Override
+ public void onShowPress(MotionEvent e) {
+
+ }
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ return false;
+ }
+
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+ scrolling = true;
+ if (pdfView.isZooming() || pdfView.isSwipeEnabled()) {
+ pdfView.moveRelativeTo(-distanceX, -distanceY);
+ }
+ if (!scaling || pdfView.doRenderDuringScale()) {
+ pdfView.loadPageByOffset();
+ }
+ return true;
+ }
+
+ private void onScrollEnd(MotionEvent event) {
+ pdfView.loadPages();
+ hideHandle();
+ if (!animationManager.isFlinging()) {
+ pdfView.performPageSnap();
+ }
+ }
+
+ @Override
+ public void onLongPress(MotionEvent e) {
+ pdfView.callbacks.callOnLongPress(e);
+ }
+
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ if (!pdfView.isSwipeEnabled()) {
+ return false;
+ }
+ if (pdfView.isPageFlingEnabled()) {
+ if (pdfView.pageFillsScreen()) {
+ onBoundedFling(velocityX, velocityY);
+ } else {
+ startPageFling(e1, e2, velocityX, velocityY);
+ }
+ return true;
+ }
+
+ int xOffset = (int) pdfView.getCurrentXOffset();
+ int yOffset = (int) pdfView.getCurrentYOffset();
+
+ float minX, minY;
+ PdfFile pdfFile = pdfView.pdfFile;
+ if (pdfView.isSwipeVertical()) {
+ minX = -(pdfView.toCurrentScale(pdfFile.getMaxPageWidth()) - pdfView.getWidth());
+ minY = -(pdfFile.getDocLen(pdfView.getZoom()) - pdfView.getHeight());
+ } else {
+ minX = -(pdfFile.getDocLen(pdfView.getZoom()) - pdfView.getWidth());
+ minY = -(pdfView.toCurrentScale(pdfFile.getMaxPageHeight()) - pdfView.getHeight());
+ }
+
+ animationManager.startFlingAnimation(xOffset, yOffset, (int) (velocityX), (int) (velocityY),
+ (int) minX, 0, (int) minY, 0);
+ return true;
+ }
+
+ private void onBoundedFling(float velocityX, float velocityY) {
+ int xOffset = (int) pdfView.getCurrentXOffset();
+ int yOffset = (int) pdfView.getCurrentYOffset();
+
+ PdfFile pdfFile = pdfView.pdfFile;
+
+ float pageStart = -pdfFile.getPageOffset(pdfView.getCurrentPage(), pdfView.getZoom());
+ float pageEnd = pageStart - pdfFile.getPageLength(pdfView.getCurrentPage(), pdfView.getZoom());
+ float minX, minY, maxX, maxY;
+ if (pdfView.isSwipeVertical()) {
+ minX = -(pdfView.toCurrentScale(pdfFile.getMaxPageWidth()) - pdfView.getWidth());
+ minY = pageEnd + pdfView.getHeight();
+ maxX = 0;
+ maxY = pageStart;
+ } else {
+ minX = pageEnd + pdfView.getWidth();
+ minY = -(pdfView.toCurrentScale(pdfFile.getMaxPageHeight()) - pdfView.getHeight());
+ maxX = pageStart;
+ maxY = 0;
+ }
+
+ animationManager.startFlingAnimation(xOffset, yOffset, (int) (velocityX), (int) (velocityY),
+ (int) minX, (int) maxX, (int) minY, (int) maxY);
+ }
+
+ @Override
+ public boolean onScale(ScaleGestureDetector detector) {
+ float dr = detector.getScaleFactor();
+ float wantedZoom = pdfView.getZoom() * dr;
+ float minZoom = Math.min(MINIMUM_ZOOM, pdfView.getMinZoom());
+ float maxZoom = Math.min(MAXIMUM_ZOOM, pdfView.getMaxZoom());
+ if (wantedZoom < minZoom) {
+ dr = minZoom / pdfView.getZoom();
+ } else if (wantedZoom > maxZoom) {
+ dr = maxZoom / pdfView.getZoom();
+ }
+ pdfView.zoomCenteredRelativeTo(dr, new PointF(detector.getFocusX(), detector.getFocusY()));
+ return true;
+ }
+
+ @Override
+ public boolean onScaleBegin(ScaleGestureDetector detector) {
+ scaling = true;
+ return true;
+ }
+
+ @Override
+ public void onScaleEnd(ScaleGestureDetector detector) {
+ pdfView.loadPages();
+ hideHandle();
+ scaling = false;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (!enabled) {
+ return false;
+ }
+
+ boolean retVal = scaleGestureDetector.onTouchEvent(event);
+ retVal = gestureDetector.onTouchEvent(event) || retVal;
+
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ if (scrolling) {
+ scrolling = false;
+ onScrollEnd(event);
+ }
+ }
+ return retVal;
+ }
+
+ private void hideHandle() {
+ ScrollHandle scrollHandle = pdfView.getScrollHandle();
+ if (scrollHandle != null && scrollHandle.shown()) {
+ scrollHandle.hideDelayed();
+ }
+ }
+
+ private boolean checkDoPageFling(float velocityX, float velocityY) {
+ float absX = Math.abs(velocityX);
+ float absY = Math.abs(velocityY);
+ return pdfView.isSwipeVertical() ? absY > absX : absX > absY;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java
new file mode 100644
index 0000000..321a803
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java
@@ -0,0 +1,1563 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.PaintFlagsDrawFilter;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.HandlerThread;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.RelativeLayout;
+
+import com.github.barteksc.pdfviewer.exception.PageRenderingException;
+import com.github.barteksc.pdfviewer.link.DefaultLinkHandler;
+import com.github.barteksc.pdfviewer.link.LinkHandler;
+import com.github.barteksc.pdfviewer.listener.Callbacks;
+import com.github.barteksc.pdfviewer.listener.OnDrawListener;
+import com.github.barteksc.pdfviewer.listener.OnErrorListener;
+import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
+import com.github.barteksc.pdfviewer.listener.OnLongPressListener;
+import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
+import com.github.barteksc.pdfviewer.listener.OnPageErrorListener;
+import com.github.barteksc.pdfviewer.listener.OnPageScrollListener;
+import com.github.barteksc.pdfviewer.listener.OnRenderListener;
+import com.github.barteksc.pdfviewer.listener.OnTapListener;
+import com.github.barteksc.pdfviewer.model.PagePart;
+import com.github.barteksc.pdfviewer.scroll.ScrollHandle;
+import com.github.barteksc.pdfviewer.source.AssetSource;
+import com.github.barteksc.pdfviewer.source.ByteArraySource;
+import com.github.barteksc.pdfviewer.source.DocumentSource;
+import com.github.barteksc.pdfviewer.source.FileSource;
+import com.github.barteksc.pdfviewer.source.InputStreamSource;
+import com.github.barteksc.pdfviewer.source.UriSource;
+import com.github.barteksc.pdfviewer.util.Constants;
+import com.github.barteksc.pdfviewer.util.FitPolicy;
+import com.github.barteksc.pdfviewer.util.MathUtils;
+import com.github.barteksc.pdfviewer.util.SnapEdge;
+import com.github.barteksc.pdfviewer.util.Util;
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+import com.shockwave.pdfium.util.Size;
+import com.shockwave.pdfium.util.SizeF;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * It supports animations, zoom, cache, and swipe.
+ *
+ * To fully understand this class you must know its principles :
+ * - The PDF document is seen as if we always want to draw all the pages.
+ * - The thing is that we only draw the visible parts.
+ * - All parts are the same size, this is because we can't interrupt a native page rendering,
+ * so we need these renderings to be as fast as possible, and be able to interrupt them
+ * as soon as we can.
+ * - The parts are loaded when the current offset or the current zoom level changes
+ *
+ * Important :
+ * - DocumentPage = A page of the PDF document.
+ * - UserPage = A page as defined by the user.
+ * By default, they're the same. But the user can change the pages order
+ * using {@link #load(DocumentSource, String, int[])}. In this
+ * particular case, a userPage of 5 can refer to a documentPage of 17.
+ */
+public class PDFView extends RelativeLayout {
+
+ private static final String TAG = PDFView.class.getSimpleName();
+
+ public static final float DEFAULT_MAX_SCALE = 3.0f;
+ public static final float DEFAULT_MID_SCALE = 1.75f;
+ public static final float DEFAULT_MIN_SCALE = 1.0f;
+
+ private float minZoom = DEFAULT_MIN_SCALE;
+ private float midZoom = DEFAULT_MID_SCALE;
+ private float maxZoom = DEFAULT_MAX_SCALE;
+
+ /**
+ * START - scrolling in first page direction
+ * END - scrolling in last page direction
+ * NONE - not scrolling
+ */
+ enum ScrollDir {
+ NONE, START, END
+ }
+
+ private ScrollDir scrollDir = ScrollDir.NONE;
+
+ /** Rendered parts go to the cache manager */
+ CacheManager cacheManager;
+
+ /** Animation manager manage all offset and zoom animation */
+ private AnimationManager animationManager;
+
+ /** Drag manager manage all touch events */
+ private DragPinchManager dragPinchManager;
+
+ PdfFile pdfFile;
+
+ /** The index of the current sequence */
+ private int currentPage;
+
+ /**
+ * If you picture all the pages side by side in their optimal width,
+ * and taking into account the zoom level, the current offset is the
+ * position of the left border of the screen in this big picture
+ */
+ private float currentXOffset = 0;
+
+ /**
+ * If you picture all the pages side by side in their optimal width,
+ * and taking into account the zoom level, the current offset is the
+ * position of the left border of the screen in this big picture
+ */
+ private float currentYOffset = 0;
+
+ /** The zoom level, always >= 1 */
+ private float zoom = 1f;
+
+ /** True if the PDFView has been recycled */
+ private boolean recycled = true;
+
+ /** Current state of the view */
+ private State state = State.DEFAULT;
+
+ /** Async task used during the loading phase to decode a PDF document */
+ private DecodingAsyncTask decodingAsyncTask;
+
+ /** The thread {@link #renderingHandler} will run on */
+ private HandlerThread renderingHandlerThread;
+ /** Handler always waiting in the background and rendering tasks */
+ RenderingHandler renderingHandler;
+
+ private PagesLoader pagesLoader;
+
+ Callbacks callbacks = new Callbacks();
+
+ /** Paint object for drawing */
+ private Paint paint;
+
+ /** Paint object for drawing debug stuff */
+ private Paint debugPaint;
+
+ /** Policy for fitting pages to screen */
+ private FitPolicy pageFitPolicy = FitPolicy.WIDTH;
+
+ private boolean fitEachPage = false;
+
+ private int defaultPage = 0;
+
+ /** True if should scroll through pages vertically instead of horizontally */
+ private boolean swipeVertical = true;
+
+ private boolean enableSwipe = true;
+
+ private boolean doubletapEnabled = true;
+
+ private boolean nightMode = false;
+
+ private boolean pageSnap = true;
+
+ /** Pdfium core for loading and rendering PDFs */
+ private PdfiumCore pdfiumCore;
+
+ private ScrollHandle scrollHandle;
+
+ private boolean isScrollHandleInit = false;
+
+ ScrollHandle getScrollHandle() {
+ return scrollHandle;
+ }
+
+ /**
+ * True if bitmap should use ARGB_8888 format and take more memory
+ * False if bitmap should be compressed by using RGB_565 format and take less memory
+ */
+ private boolean bestQuality = false;
+
+ /**
+ * True if annotations should be rendered
+ * False otherwise
+ */
+ private boolean annotationRendering = false;
+
+ /**
+ * True if the view should render during scaling
+ * Can not be forced on older API versions (< Build.VERSION_CODES.KITKAT) as the GestureDetector does
+ * not detect scrolling while scaling.
+ * False otherwise
+ */
+ private boolean renderDuringScale = false;
+
+ /** Antialiasing and bitmap filtering */
+ private boolean enableAntialiasing = true;
+ private PaintFlagsDrawFilter antialiasFilter =
+ new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+
+ /** Spacing between pages, in px */
+ private int spacingPx = 0;
+
+ /** Add dynamic spacing to fit each page separately on the screen. */
+ private boolean autoSpacing = false;
+
+ /** Fling a single page at a time */
+ private boolean pageFling = true;
+
+ /** Pages numbers used when calling onDrawAllListener */
+ private List onDrawPagesNums = new ArrayList<>(10);
+
+ /** Holds info whether view has been added to layout and has width and height */
+ private boolean hasSize = false;
+
+ /** Holds last used Configurator that should be loaded when view has size */
+ private Configurator waitingDocumentConfigurator;
+
+ /** Construct the initial view */
+ public PDFView(Context context, AttributeSet set) {
+ super(context, set);
+
+ renderingHandlerThread = new HandlerThread("PDF renderer");
+
+ if (isInEditMode()) {
+ return;
+ }
+
+ cacheManager = new CacheManager();
+ animationManager = new AnimationManager(this);
+ dragPinchManager = new DragPinchManager(this, animationManager);
+ pagesLoader = new PagesLoader(this);
+
+ paint = new Paint();
+ debugPaint = new Paint();
+ debugPaint.setStyle(Style.STROKE);
+
+ pdfiumCore = new PdfiumCore(context);
+ setWillNotDraw(false);
+ }
+
+ private void load(DocumentSource docSource, String password) {
+ load(docSource, password, null);
+ }
+
+ private void load(DocumentSource docSource, String password, int[] userPages) {
+
+ if (!recycled) {
+ throw new IllegalStateException("Don't call load on a PDF View without recycling it first.");
+ }
+
+ recycled = false;
+ // Start decoding document
+ decodingAsyncTask = new DecodingAsyncTask(docSource, password, userPages, this, pdfiumCore);
+ decodingAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ /**
+ * Go to the given page.
+ *
+ * @param page Page index.
+ */
+ public void jumpTo(int page, boolean withAnimation) {
+ if (pdfFile == null) {
+ return;
+ }
+
+ page = pdfFile.determineValidPageNumberFrom(page);
+ float offset = page == 0 ? 0 : -pdfFile.getPageOffset(page, zoom);
+ if (swipeVertical) {
+ if (withAnimation) {
+ animationManager.startYAnimation(currentYOffset, offset);
+ } else {
+ moveTo(currentXOffset, offset);
+ }
+ } else {
+ if (withAnimation) {
+ animationManager.startXAnimation(currentXOffset, offset);
+ } else {
+ moveTo(offset, currentYOffset);
+ }
+ }
+ showPage(page);
+ }
+
+ public void jumpTo(int page) {
+ jumpTo(page, false);
+ }
+
+ void showPage(int pageNb) {
+ if (recycled) {
+ return;
+ }
+
+ // Check the page number and makes the
+ // difference between UserPages and DocumentPages
+ pageNb = pdfFile.determineValidPageNumberFrom(pageNb);
+ currentPage = pageNb;
+
+ loadPages();
+
+ if (scrollHandle != null && !documentFitsView()) {
+ scrollHandle.setPageNum(currentPage + 1);
+ }
+
+ callbacks.callOnPageChange(currentPage, pdfFile.getPagesCount());
+ }
+
+ /**
+ * Get current position as ratio of document length to visible area.
+ * 0 means that document start is visible, 1 that document end is visible
+ *
+ * @return offset between 0 and 1
+ */
+ public float getPositionOffset() {
+ float offset;
+ if (swipeVertical) {
+ offset = -currentYOffset / (pdfFile.getDocLen(zoom) - getHeight());
+ } else {
+ offset = -currentXOffset / (pdfFile.getDocLen(zoom) - getWidth());
+ }
+ return MathUtils.limit(offset, 0, 1);
+ }
+
+ /**
+ * @param progress must be between 0 and 1
+ * @param moveHandle whether to move scroll handle
+ * @see PDFView#getPositionOffset()
+ */
+ public void setPositionOffset(float progress, boolean moveHandle) {
+ if (swipeVertical) {
+ moveTo(currentXOffset, (-pdfFile.getDocLen(zoom) + getHeight()) * progress, moveHandle);
+ } else {
+ moveTo((-pdfFile.getDocLen(zoom) + getWidth()) * progress, currentYOffset, moveHandle);
+ }
+ loadPageByOffset();
+ }
+
+ public void setPositionOffset(float progress) {
+ setPositionOffset(progress, true);
+ }
+
+ public void stopFling() {
+ animationManager.stopFling();
+ }
+
+ public int getPageCount() {
+ if (pdfFile == null) {
+ return 0;
+ }
+ return pdfFile.getPagesCount();
+ }
+
+ public void setSwipeEnabled(boolean enableSwipe) {
+ this.enableSwipe = enableSwipe;
+ }
+
+ public void setNightMode(boolean nightMode) {
+ this.nightMode = nightMode;
+ if (nightMode) {
+ ColorMatrix colorMatrixInverted =
+ new ColorMatrix(new float[]{
+ -1, 0, 0, 0, 255,
+ 0, -1, 0, 0, 255,
+ 0, 0, -1, 0, 255,
+ 0, 0, 0, 1, 0});
+
+ ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrixInverted);
+ paint.setColorFilter(filter);
+ } else {
+ paint.setColorFilter(null);
+ }
+ }
+
+ void enableDoubletap(boolean enableDoubletap) {
+ this.doubletapEnabled = enableDoubletap;
+ }
+
+ boolean isDoubletapEnabled() {
+ return doubletapEnabled;
+ }
+
+ void onPageError(PageRenderingException ex) {
+ if (!callbacks.callOnPageError(ex.getPage(), ex.getCause())) {
+ Log.e(TAG, "Cannot open page " + ex.getPage(), ex.getCause());
+ }
+ }
+
+ public void recycle() {
+ waitingDocumentConfigurator = null;
+
+ animationManager.stopAll();
+ dragPinchManager.disable();
+
+ // Stop tasks
+ if (renderingHandler != null) {
+ renderingHandler.stop();
+ renderingHandler.removeMessages(RenderingHandler.MSG_RENDER_TASK);
+ }
+ if (decodingAsyncTask != null) {
+ decodingAsyncTask.cancel(true);
+ }
+
+ // Clear caches
+ cacheManager.recycle();
+
+ if (scrollHandle != null && isScrollHandleInit) {
+ scrollHandle.destroyLayout();
+ }
+
+ if (pdfFile != null) {
+ pdfFile.dispose();
+ pdfFile = null;
+ }
+
+ renderingHandler = null;
+ scrollHandle = null;
+ isScrollHandleInit = false;
+ currentXOffset = currentYOffset = 0;
+ zoom = 1f;
+ recycled = true;
+ callbacks = new Callbacks();
+ state = State.DEFAULT;
+ }
+
+ public boolean isRecycled() {
+ return recycled;
+ }
+
+ /** Handle fling animation */
+ @Override
+ public void computeScroll() {
+ super.computeScroll();
+ if (isInEditMode()) {
+ return;
+ }
+ animationManager.computeFling();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ recycle();
+ if (renderingHandlerThread != null) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ renderingHandlerThread.quitSafely();
+ } else {
+ renderingHandlerThread.quit();
+ }
+ renderingHandlerThread = null;
+ }
+ super.onDetachedFromWindow();
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ hasSize = true;
+ if (waitingDocumentConfigurator != null) {
+ waitingDocumentConfigurator.load();
+ }
+ if (isInEditMode() || state != State.SHOWN) {
+ return;
+ }
+
+ // calculates the position of the point which in the center of view relative to big strip
+ float centerPointInStripXOffset = -currentXOffset + oldw * 0.5f;
+ float centerPointInStripYOffset = -currentYOffset + oldh * 0.5f;
+
+ float relativeCenterPointInStripXOffset;
+ float relativeCenterPointInStripYOffset;
+
+ if (swipeVertical){
+ relativeCenterPointInStripXOffset = centerPointInStripXOffset / pdfFile.getMaxPageWidth();
+ relativeCenterPointInStripYOffset = centerPointInStripYOffset / pdfFile.getDocLen(zoom);
+ }else {
+ relativeCenterPointInStripXOffset = centerPointInStripXOffset / pdfFile.getDocLen(zoom);
+ relativeCenterPointInStripYOffset = centerPointInStripYOffset / pdfFile.getMaxPageHeight();
+ }
+
+ animationManager.stopAll();
+ pdfFile.recalculatePageSizes(new Size(w, h));
+
+ if (swipeVertical) {
+ currentXOffset = -relativeCenterPointInStripXOffset * pdfFile.getMaxPageWidth() + w * 0.5f;
+ currentYOffset = -relativeCenterPointInStripYOffset * pdfFile.getDocLen(zoom) + h * 0.5f ;
+ }else {
+ currentXOffset = -relativeCenterPointInStripXOffset * pdfFile.getDocLen(zoom) + w * 0.5f;
+ currentYOffset = -relativeCenterPointInStripYOffset * pdfFile.getMaxPageHeight() + h * 0.5f;
+ }
+ moveTo(currentXOffset,currentYOffset);
+ loadPageByOffset();
+ }
+
+ @Override
+ public boolean canScrollHorizontally(int direction) {
+ if (pdfFile == null) {
+ return true;
+ }
+
+ if (swipeVertical) {
+ if (direction < 0 && currentXOffset < 0) {
+ return true;
+ } else if (direction > 0 && currentXOffset + toCurrentScale(pdfFile.getMaxPageWidth()) > getWidth()) {
+ return true;
+ }
+ } else {
+ if (direction < 0 && currentXOffset < 0) {
+ return true;
+ } else if (direction > 0 && currentXOffset + pdfFile.getDocLen(zoom) > getWidth()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canScrollVertically(int direction) {
+ if (pdfFile == null) {
+ return true;
+ }
+
+ if (swipeVertical) {
+ if (direction < 0 && currentYOffset < 0) {
+ return true;
+ } else if (direction > 0 && currentYOffset + pdfFile.getDocLen(zoom) > getHeight()) {
+ return true;
+ }
+ } else {
+ if (direction < 0 && currentYOffset < 0) {
+ return true;
+ } else if (direction > 0 && currentYOffset + toCurrentScale(pdfFile.getMaxPageHeight()) > getHeight()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (isInEditMode()) {
+ return;
+ }
+ // As I said in this class javadoc, we can think of this canvas as a huge
+ // strip on which we draw all the images. We actually only draw the rendered
+ // parts, of course, but we render them in the place they belong in this huge
+ // strip.
+
+ // That's where Canvas.translate(x, y) becomes very helpful.
+ // This is the situation :
+ // _______________________________________________
+ // | | |
+ // | the actual | The big strip |
+ // | canvas | |
+ // |_____________| |
+ // |_______________________________________________|
+ //
+ // If the rendered part is on the bottom right corner of the strip
+ // we can draw it but we won't see it because the canvas is not big enough.
+
+ // But if we call translate(-X, -Y) on the canvas just before drawing the object :
+ // _______________________________________________
+ // | _____________|
+ // | The big strip | |
+ // | | the actual |
+ // | | canvas |
+ // |_________________________________|_____________|
+ //
+ // The object will be on the canvas.
+ // This technique is massively used in this method, and allows
+ // abstraction of the screen position when rendering the parts.
+
+ // Draws background
+
+ if (enableAntialiasing) {
+ canvas.setDrawFilter(antialiasFilter);
+ }
+
+ Drawable bg = getBackground();
+ if (bg == null) {
+ canvas.drawColor(nightMode ? Color.BLACK : Color.WHITE);
+ } else {
+ bg.draw(canvas);
+ }
+
+ if (recycled) {
+ return;
+ }
+
+ if (state != State.SHOWN) {
+ return;
+ }
+
+ // Moves the canvas before drawing any element
+ float currentXOffset = this.currentXOffset;
+ float currentYOffset = this.currentYOffset;
+ canvas.translate(currentXOffset, currentYOffset);
+
+ // Draws thumbnails
+ for (PagePart part : cacheManager.getThumbnails()) {
+ drawPart(canvas, part);
+
+ }
+
+ // Draws parts
+ for (PagePart part : cacheManager.getPageParts()) {
+ drawPart(canvas, part);
+ if (callbacks.getOnDrawAll() != null
+ && !onDrawPagesNums.contains(part.getPage())) {
+ onDrawPagesNums.add(part.getPage());
+ }
+ }
+
+ for (Integer page : onDrawPagesNums) {
+ drawWithListener(canvas, page, callbacks.getOnDrawAll());
+ }
+ onDrawPagesNums.clear();
+
+ drawWithListener(canvas, currentPage, callbacks.getOnDraw());
+
+ // Restores the canvas position
+ canvas.translate(-currentXOffset, -currentYOffset);
+ }
+
+ private void drawWithListener(Canvas canvas, int page, OnDrawListener listener) {
+ if (listener != null) {
+ float translateX, translateY;
+ if (swipeVertical) {
+ translateX = 0;
+ translateY = pdfFile.getPageOffset(page, zoom);
+ } else {
+ translateY = 0;
+ translateX = pdfFile.getPageOffset(page, zoom);
+ }
+
+ canvas.translate(translateX, translateY);
+ SizeF size = pdfFile.getPageSize(page);
+ listener.onLayerDrawn(canvas,
+ toCurrentScale(size.getWidth()),
+ toCurrentScale(size.getHeight()),
+ page);
+
+ canvas.translate(-translateX, -translateY);
+ }
+ }
+
+ /** Draw a given PagePart on the canvas */
+ private void drawPart(Canvas canvas, PagePart part) {
+ // Can seem strange, but avoid lot of calls
+ RectF pageRelativeBounds = part.getPageRelativeBounds();
+ Bitmap renderedBitmap = part.getRenderedBitmap();
+
+ if (renderedBitmap.isRecycled()) {
+ return;
+ }
+
+ // Move to the target page
+ float localTranslationX = 0;
+ float localTranslationY = 0;
+ SizeF size = pdfFile.getPageSize(part.getPage());
+
+ if (swipeVertical) {
+ localTranslationY = pdfFile.getPageOffset(part.getPage(), zoom);
+ float maxWidth = pdfFile.getMaxPageWidth();
+ localTranslationX = toCurrentScale(maxWidth - size.getWidth()) / 2;
+ } else {
+ localTranslationX = pdfFile.getPageOffset(part.getPage(), zoom);
+ float maxHeight = pdfFile.getMaxPageHeight();
+ localTranslationY = toCurrentScale(maxHeight - size.getHeight()) / 2;
+ }
+ canvas.translate(localTranslationX, localTranslationY);
+
+ Rect srcRect = new Rect(0, 0, renderedBitmap.getWidth(),
+ renderedBitmap.getHeight());
+
+ float offsetX = toCurrentScale(pageRelativeBounds.left * size.getWidth());
+ float offsetY = toCurrentScale(pageRelativeBounds.top * size.getHeight());
+ float width = toCurrentScale(pageRelativeBounds.width() * size.getWidth());
+ float height = toCurrentScale(pageRelativeBounds.height() * size.getHeight());
+
+ // If we use float values for this rectangle, there will be
+ // a possible gap between page parts, especially when
+ // the zoom level is high.
+ RectF dstRect = new RectF((int) offsetX, (int) offsetY,
+ (int) (offsetX + width),
+ (int) (offsetY + height));
+
+ // Check if bitmap is in the screen
+ float translationX = currentXOffset + localTranslationX;
+ float translationY = currentYOffset + localTranslationY;
+ if (translationX + dstRect.left >= getWidth() || translationX + dstRect.right <= 0 ||
+ translationY + dstRect.top >= getHeight() || translationY + dstRect.bottom <= 0) {
+ canvas.translate(-localTranslationX, -localTranslationY);
+ return;
+ }
+
+ canvas.drawBitmap(renderedBitmap, srcRect, dstRect, paint);
+
+ if (Constants.DEBUG_MODE) {
+ debugPaint.setColor(part.getPage() % 2 == 0 ? Color.RED : Color.BLUE);
+ canvas.drawRect(dstRect, debugPaint);
+ }
+
+ // Restore the canvas position
+ canvas.translate(-localTranslationX, -localTranslationY);
+
+ }
+
+ /**
+ * Load all the parts around the center of the screen,
+ * taking into account X and Y offsets, zoom level, and
+ * the current page displayed
+ */
+ public void loadPages() {
+ if (pdfFile == null || renderingHandler == null) {
+ return;
+ }
+
+ // Cancel all current tasks
+ renderingHandler.removeMessages(RenderingHandler.MSG_RENDER_TASK);
+ cacheManager.makeANewSet();
+
+ pagesLoader.loadPages();
+ redraw();
+ }
+
+ /** Called when the PDF is loaded */
+ void loadComplete(PdfFile pdfFile) {
+ state = State.LOADED;
+
+ this.pdfFile = pdfFile;
+
+ if (!renderingHandlerThread.isAlive()) {
+ renderingHandlerThread.start();
+ }
+ renderingHandler = new RenderingHandler(renderingHandlerThread.getLooper(), this);
+ renderingHandler.start();
+
+ if (scrollHandle != null) {
+ scrollHandle.setupLayout(this);
+ isScrollHandleInit = true;
+ }
+
+ dragPinchManager.enable();
+
+ callbacks.callOnLoadComplete(pdfFile.getPagesCount());
+
+ jumpTo(defaultPage, false);
+ }
+
+ void loadError(Throwable t) {
+ state = State.ERROR;
+ // store reference, because callbacks will be cleared in recycle() method
+ OnErrorListener onErrorListener = callbacks.getOnError();
+ recycle();
+ invalidate();
+ if (onErrorListener != null) {
+ onErrorListener.onError(t);
+ } else {
+ Log.e("PDFView", "load pdf error", t);
+ }
+ }
+
+ void redraw() {
+ invalidate();
+ }
+
+ /**
+ * Called when a rendering task is over and
+ * a PagePart has been freshly created.
+ *
+ * @param part The created PagePart.
+ */
+ public void onBitmapRendered(PagePart part) {
+ // when it is first rendered part
+ if (state == State.LOADED) {
+ state = State.SHOWN;
+ callbacks.callOnRender(pdfFile.getPagesCount());
+ }
+
+ if (part.isThumbnail()) {
+ cacheManager.cacheThumbnail(part);
+ } else {
+ cacheManager.cachePart(part);
+ }
+ redraw();
+ }
+
+ public void moveTo(float offsetX, float offsetY) {
+ moveTo(offsetX, offsetY, true);
+ }
+
+ /**
+ * Move to the given X and Y offsets, but check them ahead of time
+ * to be sure not to go outside the the big strip.
+ *
+ * @param offsetX The big strip X offset to use as the left border of the screen.
+ * @param offsetY The big strip Y offset to use as the right border of the screen.
+ * @param moveHandle whether to move scroll handle or not
+ */
+ public void moveTo(float offsetX, float offsetY, boolean moveHandle) {
+ if (swipeVertical) {
+ // Check X offset
+ float scaledPageWidth = toCurrentScale(pdfFile.getMaxPageWidth());
+ if (scaledPageWidth < getWidth()) {
+ offsetX = getWidth() / 2 - scaledPageWidth / 2;
+ } else {
+ if (offsetX > 0) {
+ offsetX = 0;
+ } else if (offsetX + scaledPageWidth < getWidth()) {
+ offsetX = getWidth() - scaledPageWidth;
+ }
+ }
+
+ // Check Y offset
+ float contentHeight = pdfFile.getDocLen(zoom);
+ if (contentHeight < getHeight()) { // whole document height visible on screen
+ offsetY = (getHeight() - contentHeight) / 2;
+ } else {
+ if (offsetY > 0) { // top visible
+ offsetY = 0;
+ } else if (offsetY + contentHeight < getHeight()) { // bottom visible
+ offsetY = -contentHeight + getHeight();
+ }
+ }
+
+ if (offsetY < currentYOffset) {
+ scrollDir = ScrollDir.END;
+ } else if (offsetY > currentYOffset) {
+ scrollDir = ScrollDir.START;
+ } else {
+ scrollDir = ScrollDir.NONE;
+ }
+ } else {
+ // Check Y offset
+ float scaledPageHeight = toCurrentScale(pdfFile.getMaxPageHeight());
+ if (scaledPageHeight < getHeight()) {
+ offsetY = getHeight() / 2 - scaledPageHeight / 2;
+ } else {
+ if (offsetY > 0) {
+ offsetY = 0;
+ } else if (offsetY + scaledPageHeight < getHeight()) {
+ offsetY = getHeight() - scaledPageHeight;
+ }
+ }
+
+ // Check X offset
+ float contentWidth = pdfFile.getDocLen(zoom);
+ if (contentWidth < getWidth()) { // whole document width visible on screen
+ offsetX = (getWidth() - contentWidth) / 2;
+ } else {
+ if (offsetX > 0) { // left visible
+ offsetX = 0;
+ } else if (offsetX + contentWidth < getWidth()) { // right visible
+ offsetX = -contentWidth + getWidth();
+ }
+ }
+
+ if (offsetX < currentXOffset) {
+ scrollDir = ScrollDir.END;
+ } else if (offsetX > currentXOffset) {
+ scrollDir = ScrollDir.START;
+ } else {
+ scrollDir = ScrollDir.NONE;
+ }
+ }
+
+ currentXOffset = offsetX;
+ currentYOffset = offsetY;
+ float positionOffset = getPositionOffset();
+
+ if (moveHandle && scrollHandle != null && !documentFitsView()) {
+ scrollHandle.setScroll(positionOffset);
+ }
+
+ callbacks.callOnPageScroll(getCurrentPage(), positionOffset);
+
+ redraw();
+ }
+
+ void loadPageByOffset() {
+ if (0 == pdfFile.getPagesCount()) {
+ return;
+ }
+
+ float offset, screenCenter;
+ if (swipeVertical) {
+ offset = currentYOffset;
+ screenCenter = ((float) getHeight()) / 2;
+ } else {
+ offset = currentXOffset;
+ screenCenter = ((float) getWidth()) / 2;
+ }
+
+ int page = pdfFile.getPageAtOffset(-(offset - screenCenter), zoom);
+
+ if (page >= 0 && page <= pdfFile.getPagesCount() - 1 && page != getCurrentPage()) {
+ showPage(page);
+ } else {
+ loadPages();
+ }
+ }
+
+ /**
+ * Animate to the nearest snapping position for the current SnapPolicy
+ */
+ public void performPageSnap() {
+ if (!pageSnap || pdfFile == null || pdfFile.getPagesCount() == 0) {
+ return;
+ }
+ int centerPage = findFocusPage(currentXOffset, currentYOffset);
+ SnapEdge edge = findSnapEdge(centerPage);
+ if (edge == SnapEdge.NONE) {
+ return;
+ }
+
+ float offset = snapOffsetForPage(centerPage, edge);
+ if (swipeVertical) {
+ animationManager.startYAnimation(currentYOffset, -offset);
+ } else {
+ animationManager.startXAnimation(currentXOffset, -offset);
+ }
+ }
+
+ /**
+ * Find the edge to snap to when showing the specified page
+ */
+ SnapEdge findSnapEdge(int page) {
+ if (!pageSnap || page < 0) {
+ return SnapEdge.NONE;
+ }
+ float currentOffset = swipeVertical ? currentYOffset : currentXOffset;
+ float offset = -pdfFile.getPageOffset(page, zoom);
+ int length = swipeVertical ? getHeight() : getWidth();
+ float pageLength = pdfFile.getPageLength(page, zoom);
+
+ if (length >= pageLength) {
+ return SnapEdge.CENTER;
+ } else if (currentOffset >= offset) {
+ return SnapEdge.START;
+ } else if (offset - pageLength > currentOffset - length) {
+ return SnapEdge.END;
+ } else {
+ return SnapEdge.NONE;
+ }
+ }
+
+ /**
+ * Get the offset to move to in order to snap to the page
+ */
+ float snapOffsetForPage(int pageIndex, SnapEdge edge) {
+ float offset = pdfFile.getPageOffset(pageIndex, zoom);
+
+ float length = swipeVertical ? getHeight() : getWidth();
+ float pageLength = pdfFile.getPageLength(pageIndex, zoom);
+
+ if (edge == SnapEdge.CENTER) {
+ offset = offset - length / 2f + pageLength / 2f;
+ } else if (edge == SnapEdge.END) {
+ offset = offset - length + pageLength;
+ }
+ return offset;
+ }
+
+ int findFocusPage(float xOffset, float yOffset) {
+ float currOffset = swipeVertical ? yOffset : xOffset;
+ float length = swipeVertical ? getHeight() : getWidth();
+ // make sure first and last page can be found
+ if (currOffset > -1) {
+ return 0;
+ } else if (currOffset < -pdfFile.getDocLen(zoom) + length + 1) {
+ return pdfFile.getPagesCount() - 1;
+ }
+ // else find page in center
+ float center = currOffset - length / 2f;
+ return pdfFile.getPageAtOffset(-center, zoom);
+ }
+
+ /**
+ * @return true if single page fills the entire screen in the scrolling direction
+ */
+ public boolean pageFillsScreen() {
+ float start = -pdfFile.getPageOffset(currentPage, zoom);
+ float end = start - pdfFile.getPageLength(currentPage, zoom);
+ if (isSwipeVertical()) {
+ return start > currentYOffset && end < currentYOffset - getHeight();
+ } else {
+ return start > currentXOffset && end < currentXOffset - getWidth();
+ }
+ }
+
+ /**
+ * Move relatively to the current position.
+ *
+ * @param dx The X difference you want to apply.
+ * @param dy The Y difference you want to apply.
+ * @see #moveTo(float, float)
+ */
+ public void moveRelativeTo(float dx, float dy) {
+ moveTo(currentXOffset + dx, currentYOffset + dy);
+ }
+
+ /**
+ * Change the zoom level
+ */
+ public void zoomTo(float zoom) {
+ this.zoom = zoom;
+ }
+
+ /**
+ * Change the zoom level, relatively to a pivot point.
+ * It will call moveTo() to make sure the given point stays
+ * in the middle of the screen.
+ *
+ * @param zoom The zoom level.
+ * @param pivot The point on the screen that should stays.
+ */
+ public void zoomCenteredTo(float zoom, PointF pivot) {
+ float dzoom = zoom / this.zoom;
+ zoomTo(zoom);
+ float baseX = currentXOffset * dzoom;
+ float baseY = currentYOffset * dzoom;
+ baseX += (pivot.x - pivot.x * dzoom);
+ baseY += (pivot.y - pivot.y * dzoom);
+ moveTo(baseX, baseY);
+ }
+
+ /**
+ * @see #zoomCenteredTo(float, PointF)
+ */
+ public void zoomCenteredRelativeTo(float dzoom, PointF pivot) {
+ zoomCenteredTo(zoom * dzoom, pivot);
+ }
+
+ /**
+ * Checks if whole document can be displayed on screen, doesn't include zoom
+ *
+ * @return true if whole document can displayed at once, false otherwise
+ */
+ public boolean documentFitsView() {
+ float len = pdfFile.getDocLen(1);
+ if (swipeVertical) {
+ return len < getHeight();
+ } else {
+ return len < getWidth();
+ }
+ }
+
+ public void fitToWidth(int page) {
+ if (state != State.SHOWN) {
+ Log.e(TAG, "Cannot fit, document not rendered yet");
+ return;
+ }
+ zoomTo(getWidth() / pdfFile.getPageSize(page).getWidth());
+ jumpTo(page);
+ }
+
+ public SizeF getPageSize(int pageIndex) {
+ if (pdfFile == null) {
+ return new SizeF(0, 0);
+ }
+ return pdfFile.getPageSize(pageIndex);
+ }
+
+ public int getCurrentPage() {
+ return currentPage;
+ }
+
+ public float getCurrentXOffset() {
+ return currentXOffset;
+ }
+
+ public float getCurrentYOffset() {
+ return currentYOffset;
+ }
+
+ public float toRealScale(float size) {
+ return size / zoom;
+ }
+
+ public float toCurrentScale(float size) {
+ return size * zoom;
+ }
+
+ public float getZoom() {
+ return zoom;
+ }
+
+ public boolean isZooming() {
+ return zoom != minZoom;
+ }
+
+ private void setDefaultPage(int defaultPage) {
+ this.defaultPage = defaultPage;
+ }
+
+ public void resetZoom() {
+ zoomTo(minZoom);
+ }
+
+ public void resetZoomWithAnimation() {
+ zoomWithAnimation(minZoom);
+ }
+
+ public void zoomWithAnimation(float centerX, float centerY, float scale) {
+ animationManager.startZoomAnimation(centerX, centerY, zoom, scale);
+ }
+
+ public void zoomWithAnimation(float scale) {
+ animationManager.startZoomAnimation(getWidth() / 2, getHeight() / 2, zoom, scale);
+ }
+
+ private void setScrollHandle(ScrollHandle scrollHandle) {
+ this.scrollHandle = scrollHandle;
+ }
+
+ /**
+ * Get page number at given offset
+ *
+ * @param positionOffset scroll offset between 0 and 1
+ * @return page number at given offset, starting from 0
+ */
+ public int getPageAtPositionOffset(float positionOffset) {
+ return pdfFile.getPageAtOffset(pdfFile.getDocLen(zoom) * positionOffset, zoom);
+ }
+
+ public float getMinZoom() {
+ return minZoom;
+ }
+
+ public void setMinZoom(float minZoom) {
+ this.minZoom = minZoom;
+ }
+
+ public float getMidZoom() {
+ return midZoom;
+ }
+
+ public void setMidZoom(float midZoom) {
+ this.midZoom = midZoom;
+ }
+
+ public float getMaxZoom() {
+ return maxZoom;
+ }
+
+ public void setMaxZoom(float maxZoom) {
+ this.maxZoom = maxZoom;
+ }
+
+ public void useBestQuality(boolean bestQuality) {
+ this.bestQuality = bestQuality;
+ }
+
+ public boolean isBestQuality() {
+ return bestQuality;
+ }
+
+ public boolean isSwipeVertical() {
+ return swipeVertical;
+ }
+
+ public boolean isSwipeEnabled() {
+ return enableSwipe;
+ }
+
+ private void setSwipeVertical(boolean swipeVertical) {
+ this.swipeVertical = swipeVertical;
+ }
+
+ public void enableAnnotationRendering(boolean annotationRendering) {
+ this.annotationRendering = annotationRendering;
+ }
+
+ public boolean isAnnotationRendering() {
+ return annotationRendering;
+ }
+
+ public void enableRenderDuringScale(boolean renderDuringScale) {
+ this.renderDuringScale = renderDuringScale;
+ }
+
+ public boolean isAntialiasing() {
+ return enableAntialiasing;
+ }
+
+ public void enableAntialiasing(boolean enableAntialiasing) {
+ this.enableAntialiasing = enableAntialiasing;
+ }
+
+ public int getSpacingPx() {
+ return spacingPx;
+ }
+
+ public boolean isAutoSpacingEnabled() {
+ return autoSpacing;
+ }
+
+ public void setPageFling(boolean pageFling) {
+ this.pageFling = pageFling;
+ }
+
+ public boolean isPageFlingEnabled() {
+ return pageFling;
+ }
+
+ private void setSpacing(int spacingDp) {
+ this.spacingPx = Util.getDP(getContext(), spacingDp);
+ }
+
+ private void setAutoSpacing(boolean autoSpacing) {
+ this.autoSpacing = autoSpacing;
+ }
+
+ private void setPageFitPolicy(FitPolicy pageFitPolicy) {
+ this.pageFitPolicy = pageFitPolicy;
+ }
+
+ public FitPolicy getPageFitPolicy() {
+ return pageFitPolicy;
+ }
+
+ private void setFitEachPage(boolean fitEachPage) {
+ this.fitEachPage = fitEachPage;
+ }
+
+ public boolean isFitEachPage() {
+ return fitEachPage;
+ }
+
+ public boolean isPageSnap() {
+ return pageSnap;
+ }
+
+ public void setPageSnap(boolean pageSnap) {
+ this.pageSnap = pageSnap;
+ }
+
+ public boolean doRenderDuringScale() {
+ return renderDuringScale;
+ }
+
+ /** Returns null if document is not loaded */
+ public PdfDocument.Meta getDocumentMeta() {
+ if (pdfFile == null) {
+ return null;
+ }
+ return pdfFile.getMetaData();
+ }
+
+ /** Will be empty until document is loaded */
+ public List getTableOfContents() {
+ if (pdfFile == null) {
+ return Collections.emptyList();
+ }
+ return pdfFile.getBookmarks();
+ }
+
+ /** Will be empty until document is loaded */
+ public List getLinks(int page) {
+ if (pdfFile == null) {
+ return Collections.emptyList();
+ }
+ return pdfFile.getPageLinks(page);
+ }
+
+ /** Use an asset file as the pdf source */
+ public Configurator fromAsset(String assetName) {
+ return new Configurator(new AssetSource(assetName));
+ }
+
+ /** Use a file as the pdf source */
+ public Configurator fromFile(File file) {
+ return new Configurator(new FileSource(file));
+ }
+
+ /** Use URI as the pdf source, for use with content providers */
+ public Configurator fromUri(Uri uri) {
+ return new Configurator(new UriSource(uri));
+ }
+
+ /** Use bytearray as the pdf source, documents is not saved */
+ public Configurator fromBytes(byte[] bytes) {
+ return new Configurator(new ByteArraySource(bytes));
+ }
+
+ /** Use stream as the pdf source. Stream will be written to bytearray, because native code does not support Java Streams */
+ public Configurator fromStream(InputStream stream) {
+ return new Configurator(new InputStreamSource(stream));
+ }
+
+ /** Use custom source as pdf source */
+ public Configurator fromSource(DocumentSource docSource) {
+ return new Configurator(docSource);
+ }
+
+ private enum State {DEFAULT, LOADED, SHOWN, ERROR}
+
+ public class Configurator {
+
+ private final DocumentSource documentSource;
+
+ private int[] pageNumbers = null;
+
+ private boolean enableSwipe = true;
+
+ private boolean enableDoubletap = true;
+
+ private OnDrawListener onDrawListener;
+
+ private OnDrawListener onDrawAllListener;
+
+ private OnLoadCompleteListener onLoadCompleteListener;
+
+ private OnErrorListener onErrorListener;
+
+ private OnPageChangeListener onPageChangeListener;
+
+ private OnPageScrollListener onPageScrollListener;
+
+ private OnRenderListener onRenderListener;
+
+ private OnTapListener onTapListener;
+
+ private OnLongPressListener onLongPressListener;
+
+ private OnPageErrorListener onPageErrorListener;
+
+ private LinkHandler linkHandler = new DefaultLinkHandler(PDFView.this);
+
+ private int defaultPage = 0;
+
+ private boolean swipeHorizontal = false;
+
+ private boolean annotationRendering = false;
+
+ private String password = null;
+
+ private ScrollHandle scrollHandle = null;
+
+ private boolean antialiasing = true;
+
+ private int spacing = 0;
+
+ private boolean autoSpacing = false;
+
+ private FitPolicy pageFitPolicy = FitPolicy.WIDTH;
+
+ private boolean fitEachPage = false;
+
+ private boolean pageFling = false;
+
+ private boolean pageSnap = false;
+
+ private boolean nightMode = false;
+
+ private Configurator(DocumentSource documentSource) {
+ this.documentSource = documentSource;
+ }
+
+ public Configurator pages(int... pageNumbers) {
+ this.pageNumbers = pageNumbers;
+ return this;
+ }
+
+ public Configurator enableSwipe(boolean enableSwipe) {
+ this.enableSwipe = enableSwipe;
+ return this;
+ }
+
+ public Configurator enableDoubletap(boolean enableDoubletap) {
+ this.enableDoubletap = enableDoubletap;
+ return this;
+ }
+
+ public Configurator enableAnnotationRendering(boolean annotationRendering) {
+ this.annotationRendering = annotationRendering;
+ return this;
+ }
+
+ public Configurator onDraw(OnDrawListener onDrawListener) {
+ this.onDrawListener = onDrawListener;
+ return this;
+ }
+
+ public Configurator onDrawAll(OnDrawListener onDrawAllListener) {
+ this.onDrawAllListener = onDrawAllListener;
+ return this;
+ }
+
+ public Configurator onLoad(OnLoadCompleteListener onLoadCompleteListener) {
+ this.onLoadCompleteListener = onLoadCompleteListener;
+ return this;
+ }
+
+ public Configurator onPageScroll(OnPageScrollListener onPageScrollListener) {
+ this.onPageScrollListener = onPageScrollListener;
+ return this;
+ }
+
+ public Configurator onError(OnErrorListener onErrorListener) {
+ this.onErrorListener = onErrorListener;
+ return this;
+ }
+
+ public Configurator onPageError(OnPageErrorListener onPageErrorListener) {
+ this.onPageErrorListener = onPageErrorListener;
+ return this;
+ }
+
+ public Configurator onPageChange(OnPageChangeListener onPageChangeListener) {
+ this.onPageChangeListener = onPageChangeListener;
+ return this;
+ }
+
+ public Configurator onRender(OnRenderListener onRenderListener) {
+ this.onRenderListener = onRenderListener;
+ return this;
+ }
+
+ public Configurator onTap(OnTapListener onTapListener) {
+ this.onTapListener = onTapListener;
+ return this;
+ }
+
+ public Configurator onLongPress(OnLongPressListener onLongPressListener) {
+ this.onLongPressListener = onLongPressListener;
+ return this;
+ }
+
+ public Configurator linkHandler(LinkHandler linkHandler) {
+ this.linkHandler = linkHandler;
+ return this;
+ }
+
+ public Configurator defaultPage(int defaultPage) {
+ this.defaultPage = defaultPage;
+ return this;
+ }
+
+ public Configurator swipeHorizontal(boolean swipeHorizontal) {
+ this.swipeHorizontal = swipeHorizontal;
+ return this;
+ }
+
+ public Configurator password(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public Configurator scrollHandle(ScrollHandle scrollHandle) {
+ this.scrollHandle = scrollHandle;
+ return this;
+ }
+
+ public Configurator enableAntialiasing(boolean antialiasing) {
+ this.antialiasing = antialiasing;
+ return this;
+ }
+
+ public Configurator spacing(int spacing) {
+ this.spacing = spacing;
+ return this;
+ }
+
+ public Configurator autoSpacing(boolean autoSpacing) {
+ this.autoSpacing = autoSpacing;
+ return this;
+ }
+
+ public Configurator pageFitPolicy(FitPolicy pageFitPolicy) {
+ this.pageFitPolicy = pageFitPolicy;
+ return this;
+ }
+
+ public Configurator fitEachPage(boolean fitEachPage) {
+ this.fitEachPage = fitEachPage;
+ return this;
+ }
+
+ public Configurator pageSnap(boolean pageSnap) {
+ this.pageSnap = pageSnap;
+ return this;
+ }
+
+ public Configurator pageFling(boolean pageFling) {
+ this.pageFling = pageFling;
+ return this;
+ }
+
+ public Configurator nightMode(boolean nightMode) {
+ this.nightMode = nightMode;
+ return this;
+ }
+
+ public Configurator disableLongpress() {
+ PDFView.this.dragPinchManager.disableLongpress();
+ return this;
+ }
+
+ public void load() {
+ if (!hasSize) {
+ waitingDocumentConfigurator = this;
+ return;
+ }
+ PDFView.this.recycle();
+ PDFView.this.callbacks.setOnLoadComplete(onLoadCompleteListener);
+ PDFView.this.callbacks.setOnError(onErrorListener);
+ PDFView.this.callbacks.setOnDraw(onDrawListener);
+ PDFView.this.callbacks.setOnDrawAll(onDrawAllListener);
+ PDFView.this.callbacks.setOnPageChange(onPageChangeListener);
+ PDFView.this.callbacks.setOnPageScroll(onPageScrollListener);
+ PDFView.this.callbacks.setOnRender(onRenderListener);
+ PDFView.this.callbacks.setOnTap(onTapListener);
+ PDFView.this.callbacks.setOnLongPress(onLongPressListener);
+ PDFView.this.callbacks.setOnPageError(onPageErrorListener);
+ PDFView.this.callbacks.setLinkHandler(linkHandler);
+ PDFView.this.setSwipeEnabled(enableSwipe);
+ PDFView.this.setNightMode(nightMode);
+ PDFView.this.enableDoubletap(enableDoubletap);
+ PDFView.this.setDefaultPage(defaultPage);
+ PDFView.this.setSwipeVertical(!swipeHorizontal);
+ PDFView.this.enableAnnotationRendering(annotationRendering);
+ PDFView.this.setScrollHandle(scrollHandle);
+ PDFView.this.enableAntialiasing(antialiasing);
+ PDFView.this.setSpacing(spacing);
+ PDFView.this.setAutoSpacing(autoSpacing);
+ PDFView.this.setPageFitPolicy(pageFitPolicy);
+ PDFView.this.setFitEachPage(fitEachPage);
+ PDFView.this.setPageSnap(pageSnap);
+ PDFView.this.setPageFling(pageFling);
+
+ if (pageNumbers != null) {
+ PDFView.this.load(documentSource, password, pageNumbers);
+ } else {
+ PDFView.this.load(documentSource, password);
+ }
+ }
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PagesLoader.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PagesLoader.java
new file mode 100644
index 0000000..26c30f4
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PagesLoader.java
@@ -0,0 +1,317 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer;
+
+import android.graphics.RectF;
+
+import com.github.barteksc.pdfviewer.util.Constants;
+import com.github.barteksc.pdfviewer.util.MathUtils;
+import com.github.barteksc.pdfviewer.util.Util;
+import com.shockwave.pdfium.util.SizeF;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import static com.github.barteksc.pdfviewer.util.Constants.Cache.CACHE_SIZE;
+import static com.github.barteksc.pdfviewer.util.Constants.PRELOAD_OFFSET;
+
+class PagesLoader {
+
+ private PDFView pdfView;
+ private int cacheOrder;
+ private float xOffset;
+ private float yOffset;
+ private float pageRelativePartWidth;
+ private float pageRelativePartHeight;
+ private float partRenderWidth;
+ private float partRenderHeight;
+ private final RectF thumbnailRect = new RectF(0, 0, 1, 1);
+ private final int preloadOffset;
+
+ private class Holder {
+ int row;
+ int col;
+
+ @Override
+ public String toString() {
+ return "Holder{" +
+ "row=" + row +
+ ", col=" + col +
+ '}';
+ }
+ }
+
+ private class RenderRange {
+ int page;
+ GridSize gridSize;
+ Holder leftTop;
+ Holder rightBottom;
+
+ RenderRange() {
+ this.page = 0;
+ this.gridSize = new GridSize();
+ this.leftTop = new Holder();
+ this.rightBottom = new Holder();
+ }
+
+ @Override
+ public String toString() {
+ return "RenderRange{" +
+ "page=" + page +
+ ", gridSize=" + gridSize +
+ ", leftTop=" + leftTop +
+ ", rightBottom=" + rightBottom +
+ '}';
+ }
+ }
+
+ private class GridSize {
+ int rows;
+ int cols;
+
+ @Override
+ public String toString() {
+ return "GridSize{" +
+ "rows=" + rows +
+ ", cols=" + cols +
+ '}';
+ }
+ }
+
+ PagesLoader(PDFView pdfView) {
+ this.pdfView = pdfView;
+ this.preloadOffset = Util.getDP(pdfView.getContext(), PRELOAD_OFFSET);
+ }
+
+ private void getPageColsRows(GridSize grid, int pageIndex) {
+ SizeF size = pdfView.pdfFile.getPageSize(pageIndex);
+ float ratioX = 1f / size.getWidth();
+ float ratioY = 1f / size.getHeight();
+ final float partHeight = (Constants.PART_SIZE * ratioY) / pdfView.getZoom();
+ final float partWidth = (Constants.PART_SIZE * ratioX) / pdfView.getZoom();
+ grid.rows = MathUtils.ceil(1f / partHeight);
+ grid.cols = MathUtils.ceil(1f / partWidth);
+ }
+
+ private void calculatePartSize(GridSize grid) {
+ pageRelativePartWidth = 1f / (float) grid.cols;
+ pageRelativePartHeight = 1f / (float) grid.rows;
+ partRenderWidth = Constants.PART_SIZE / pageRelativePartWidth;
+ partRenderHeight = Constants.PART_SIZE / pageRelativePartHeight;
+ }
+
+
+ /**
+ * calculate the render range of each page
+ */
+ private List getRenderRangeList(float firstXOffset, float firstYOffset, float lastXOffset, float lastYOffset) {
+
+ float fixedFirstXOffset = -MathUtils.max(firstXOffset, 0);
+ float fixedFirstYOffset = -MathUtils.max(firstYOffset, 0);
+
+ float fixedLastXOffset = -MathUtils.max(lastXOffset, 0);
+ float fixedLastYOffset = -MathUtils.max(lastYOffset, 0);
+
+ float offsetFirst = pdfView.isSwipeVertical() ? fixedFirstYOffset : fixedFirstXOffset;
+ float offsetLast = pdfView.isSwipeVertical() ? fixedLastYOffset : fixedLastXOffset;
+
+ int firstPage = pdfView.pdfFile.getPageAtOffset(offsetFirst, pdfView.getZoom());
+ int lastPage = pdfView.pdfFile.getPageAtOffset(offsetLast, pdfView.getZoom());
+ int pageCount = lastPage - firstPage + 1;
+
+ List renderRanges = new LinkedList<>();
+
+ for (int page = firstPage; page <= lastPage; page++) {
+ RenderRange range = new RenderRange();
+ range.page = page;
+
+ float pageFirstXOffset, pageFirstYOffset, pageLastXOffset, pageLastYOffset;
+ if (page == firstPage) {
+ pageFirstXOffset = fixedFirstXOffset;
+ pageFirstYOffset = fixedFirstYOffset;
+ if (pageCount == 1) {
+ pageLastXOffset = fixedLastXOffset;
+ pageLastYOffset = fixedLastYOffset;
+ } else {
+ float pageOffset = pdfView.pdfFile.getPageOffset(page, pdfView.getZoom());
+ SizeF pageSize = pdfView.pdfFile.getScaledPageSize(page, pdfView.getZoom());
+ if (pdfView.isSwipeVertical()) {
+ pageLastXOffset = fixedLastXOffset;
+ pageLastYOffset = pageOffset + pageSize.getHeight();
+ } else {
+ pageLastYOffset = fixedLastYOffset;
+ pageLastXOffset = pageOffset + pageSize.getWidth();
+ }
+ }
+ } else if (page == lastPage) {
+ float pageOffset = pdfView.pdfFile.getPageOffset(page, pdfView.getZoom());
+
+ if (pdfView.isSwipeVertical()) {
+ pageFirstXOffset = fixedFirstXOffset;
+ pageFirstYOffset = pageOffset;
+ } else {
+ pageFirstYOffset = fixedFirstYOffset;
+ pageFirstXOffset = pageOffset;
+ }
+
+ pageLastXOffset = fixedLastXOffset;
+ pageLastYOffset = fixedLastYOffset;
+
+ } else {
+ float pageOffset = pdfView.pdfFile.getPageOffset(page, pdfView.getZoom());
+ SizeF pageSize = pdfView.pdfFile.getScaledPageSize(page, pdfView.getZoom());
+ if (pdfView.isSwipeVertical()) {
+ pageFirstXOffset = fixedFirstXOffset;
+ pageFirstYOffset = pageOffset;
+
+ pageLastXOffset = fixedLastXOffset;
+ pageLastYOffset = pageOffset + pageSize.getHeight();
+ } else {
+ pageFirstXOffset = pageOffset;
+ pageFirstYOffset = fixedFirstYOffset;
+
+ pageLastXOffset = pageOffset + pageSize.getWidth();
+ pageLastYOffset = fixedLastYOffset;
+ }
+ }
+
+ getPageColsRows(range.gridSize, range.page); // get the page's grid size that rows and cols
+ SizeF scaledPageSize = pdfView.pdfFile.getScaledPageSize(range.page, pdfView.getZoom());
+ float rowHeight = scaledPageSize.getHeight() / range.gridSize.rows;
+ float colWidth = scaledPageSize.getWidth() / range.gridSize.cols;
+
+
+ // get the page offset int the whole file
+ // ---------------------------------------
+ // | | | |
+ // |<--offset-->| (page) |<--offset-->|
+ // | | | |
+ // | | | |
+ // ---------------------------------------
+ float secondaryOffset = pdfView.pdfFile.getSecondaryPageOffset(page, pdfView.getZoom());
+
+ // calculate the row,col of the point in the leftTop and rightBottom
+ if (pdfView.isSwipeVertical()) {
+ range.leftTop.row = MathUtils.floor(Math.abs(pageFirstYOffset - pdfView.pdfFile.getPageOffset(range.page, pdfView.getZoom())) / rowHeight);
+ range.leftTop.col = MathUtils.floor(MathUtils.min(pageFirstXOffset - secondaryOffset, 0) / colWidth);
+
+ range.rightBottom.row = MathUtils.ceil(Math.abs(pageLastYOffset - pdfView.pdfFile.getPageOffset(range.page, pdfView.getZoom())) / rowHeight);
+ range.rightBottom.col = MathUtils.floor(MathUtils.min(pageLastXOffset - secondaryOffset, 0) / colWidth);
+ } else {
+ range.leftTop.col = MathUtils.floor(Math.abs(pageFirstXOffset - pdfView.pdfFile.getPageOffset(range.page, pdfView.getZoom())) / colWidth);
+ range.leftTop.row = MathUtils.floor(MathUtils.min(pageFirstYOffset - secondaryOffset, 0) / rowHeight);
+
+ range.rightBottom.col = MathUtils.floor(Math.abs(pageLastXOffset - pdfView.pdfFile.getPageOffset(range.page, pdfView.getZoom())) / colWidth);
+ range.rightBottom.row = MathUtils.floor(MathUtils.min(pageLastYOffset - secondaryOffset, 0) / rowHeight);
+ }
+
+ renderRanges.add(range);
+ }
+
+ return renderRanges;
+ }
+
+ private void loadVisible() {
+ int parts = 0;
+ float scaledPreloadOffset = preloadOffset;
+ float firstXOffset = -xOffset + scaledPreloadOffset;
+ float lastXOffset = -xOffset - pdfView.getWidth() - scaledPreloadOffset;
+ float firstYOffset = -yOffset + scaledPreloadOffset;
+ float lastYOffset = -yOffset - pdfView.getHeight() - scaledPreloadOffset;
+
+ List rangeList = getRenderRangeList(firstXOffset, firstYOffset, lastXOffset, lastYOffset);
+
+ for (RenderRange range : rangeList) {
+ loadThumbnail(range.page);
+ }
+
+ for (RenderRange range : rangeList) {
+ calculatePartSize(range.gridSize);
+ parts += loadPage(range.page, range.leftTop.row, range.rightBottom.row, range.leftTop.col, range.rightBottom.col, CACHE_SIZE - parts);
+ if (parts >= CACHE_SIZE) {
+ break;
+ }
+ }
+
+ }
+
+ private int loadPage(int page, int firstRow, int lastRow, int firstCol, int lastCol,
+ int nbOfPartsLoadable) {
+ int loaded = 0;
+ for (int row = firstRow; row <= lastRow; row++) {
+ for (int col = firstCol; col <= lastCol; col++) {
+ if (loadCell(page, row, col, pageRelativePartWidth, pageRelativePartHeight)) {
+ loaded++;
+ }
+ if (loaded >= nbOfPartsLoadable) {
+ return loaded;
+ }
+ }
+ }
+ return loaded;
+ }
+
+ private boolean loadCell(int page, int row, int col, float pageRelativePartWidth, float pageRelativePartHeight) {
+
+ float relX = pageRelativePartWidth * col;
+ float relY = pageRelativePartHeight * row;
+ float relWidth = pageRelativePartWidth;
+ float relHeight = pageRelativePartHeight;
+
+ float renderWidth = partRenderWidth;
+ float renderHeight = partRenderHeight;
+ if (relX + relWidth > 1) {
+ relWidth = 1 - relX;
+ }
+ if (relY + relHeight > 1) {
+ relHeight = 1 - relY;
+ }
+ renderWidth *= relWidth;
+ renderHeight *= relHeight;
+ RectF pageRelativeBounds = new RectF(relX, relY, relX + relWidth, relY + relHeight);
+
+ if (renderWidth > 0 && renderHeight > 0) {
+ if (!pdfView.cacheManager.upPartIfContained(page, pageRelativeBounds, cacheOrder)) {
+ pdfView.renderingHandler.addRenderingTask(page, renderWidth, renderHeight,
+ pageRelativeBounds, false, cacheOrder, pdfView.isBestQuality(),
+ pdfView.isAnnotationRendering());
+ }
+
+ cacheOrder++;
+ return true;
+ }
+ return false;
+ }
+
+ private void loadThumbnail(int page) {
+ SizeF pageSize = pdfView.pdfFile.getPageSize(page);
+ float thumbnailWidth = pageSize.getWidth() * Constants.THUMBNAIL_RATIO;
+ float thumbnailHeight = pageSize.getHeight() * Constants.THUMBNAIL_RATIO;
+ if (!pdfView.cacheManager.containsThumbnail(page, thumbnailRect)) {
+ pdfView.renderingHandler.addRenderingTask(page,
+ thumbnailWidth, thumbnailHeight, thumbnailRect,
+ true, 0, pdfView.isBestQuality(), pdfView.isAnnotationRendering());
+ }
+ }
+
+ void loadPages() {
+ cacheOrder = 1;
+ xOffset = -MathUtils.max(pdfView.getCurrentXOffset(), 0);
+ yOffset = -MathUtils.max(pdfView.getCurrentYOffset(), 0);
+
+ loadVisible();
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java
new file mode 100644
index 0000000..fdc104f
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java
@@ -0,0 +1,373 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.SparseBooleanArray;
+
+import com.github.barteksc.pdfviewer.exception.PageRenderingException;
+import com.github.barteksc.pdfviewer.util.FitPolicy;
+import com.github.barteksc.pdfviewer.util.PageSizeCalculator;
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+import com.shockwave.pdfium.util.Size;
+import com.shockwave.pdfium.util.SizeF;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class PdfFile {
+
+ private static final Object lock = new Object();
+ private PdfDocument pdfDocument;
+ private PdfiumCore pdfiumCore;
+ private int pagesCount = 0;
+ /** Original page sizes */
+ private List originalPageSizes = new ArrayList<>();
+ /** Scaled page sizes */
+ private List pageSizes = new ArrayList<>();
+ /** Opened pages with indicator whether opening was successful */
+ private SparseBooleanArray openedPages = new SparseBooleanArray();
+ /** Page with maximum width */
+ private Size originalMaxWidthPageSize = new Size(0, 0);
+ /** Page with maximum height */
+ private Size originalMaxHeightPageSize = new Size(0, 0);
+ /** Scaled page with maximum height */
+ private SizeF maxHeightPageSize = new SizeF(0, 0);
+ /** Scaled page with maximum width */
+ private SizeF maxWidthPageSize = new SizeF(0, 0);
+ /** True if scrolling is vertical, else it's horizontal */
+ private boolean isVertical;
+ /** Fixed spacing between pages in pixels */
+ private int spacingPx;
+ /** Calculate spacing automatically so each page fits on it's own in the center of the view */
+ private boolean autoSpacing;
+ /** Calculated offsets for pages */
+ private List pageOffsets = new ArrayList<>();
+ /** Calculated auto spacing for pages */
+ private List pageSpacing = new ArrayList<>();
+ /** Calculated document length (width or height, depending on swipe mode) */
+ private float documentLength = 0;
+ private final FitPolicy pageFitPolicy;
+ /**
+ * True if every page should fit separately according to the FitPolicy,
+ * else the largest page fits and other pages scale relatively
+ */
+ private final boolean fitEachPage;
+ /**
+ * The pages the user want to display in order
+ * (ex: 0, 2, 2, 8, 8, 1, 1, 1)
+ */
+ private int[] originalUserPages;
+
+ PdfFile(PdfiumCore pdfiumCore, PdfDocument pdfDocument, FitPolicy pageFitPolicy, Size viewSize, int[] originalUserPages,
+ boolean isVertical, int spacing, boolean autoSpacing, boolean fitEachPage) {
+ this.pdfiumCore = pdfiumCore;
+ this.pdfDocument = pdfDocument;
+ this.pageFitPolicy = pageFitPolicy;
+ this.originalUserPages = originalUserPages;
+ this.isVertical = isVertical;
+ this.spacingPx = spacing;
+ this.autoSpacing = autoSpacing;
+ this.fitEachPage = fitEachPage;
+ setup(viewSize);
+ }
+
+ private void setup(Size viewSize) {
+ if (originalUserPages != null) {
+ pagesCount = originalUserPages.length;
+ } else {
+ pagesCount = pdfiumCore.getPageCount(pdfDocument);
+ }
+
+ for (int i = 0; i < pagesCount; i++) {
+ Size pageSize = pdfiumCore.getPageSize(pdfDocument, documentPage(i));
+ if (pageSize.getWidth() > originalMaxWidthPageSize.getWidth()) {
+ originalMaxWidthPageSize = pageSize;
+ }
+ if (pageSize.getHeight() > originalMaxHeightPageSize.getHeight()) {
+ originalMaxHeightPageSize = pageSize;
+ }
+ originalPageSizes.add(pageSize);
+ }
+
+ recalculatePageSizes(viewSize);
+ }
+
+ /**
+ * Call after view size change to recalculate page sizes, offsets and document length
+ *
+ * @param viewSize new size of changed view
+ */
+ public void recalculatePageSizes(Size viewSize) {
+ pageSizes.clear();
+ PageSizeCalculator calculator = new PageSizeCalculator(pageFitPolicy, originalMaxWidthPageSize,
+ originalMaxHeightPageSize, viewSize, fitEachPage);
+ maxWidthPageSize = calculator.getOptimalMaxWidthPageSize();
+ maxHeightPageSize = calculator.getOptimalMaxHeightPageSize();
+
+ for (Size size : originalPageSizes) {
+ pageSizes.add(calculator.calculate(size));
+ }
+ if (autoSpacing) {
+ prepareAutoSpacing(viewSize);
+ }
+ prepareDocLen();
+ preparePagesOffset();
+ }
+
+ public int getPagesCount() {
+ return pagesCount;
+ }
+
+ public SizeF getPageSize(int pageIndex) {
+ int docPage = documentPage(pageIndex);
+ if (docPage < 0) {
+ return new SizeF(0, 0);
+ }
+ return pageSizes.get(pageIndex);
+ }
+
+ public SizeF getScaledPageSize(int pageIndex, float zoom) {
+ SizeF size = getPageSize(pageIndex);
+ return new SizeF(size.getWidth() * zoom, size.getHeight() * zoom);
+ }
+
+ /**
+ * get page size with biggest dimension (width in vertical mode and height in horizontal mode)
+ *
+ * @return size of page
+ */
+ public SizeF getMaxPageSize() {
+ return isVertical ? maxWidthPageSize : maxHeightPageSize;
+ }
+
+ public float getMaxPageWidth() {
+ return getMaxPageSize().getWidth();
+ }
+
+ public float getMaxPageHeight() {
+ return getMaxPageSize().getHeight();
+ }
+
+ private void prepareAutoSpacing(Size viewSize) {
+ pageSpacing.clear();
+ for (int i = 0; i < getPagesCount(); i++) {
+ SizeF pageSize = pageSizes.get(i);
+ float spacing = Math.max(0, isVertical ? viewSize.getHeight() - pageSize.getHeight() :
+ viewSize.getWidth() - pageSize.getWidth());
+ if (i < getPagesCount() - 1) {
+ spacing += spacingPx;
+ }
+ pageSpacing.add(spacing);
+ }
+ }
+
+ private void prepareDocLen() {
+ float length = 0;
+ for (int i = 0; i < getPagesCount(); i++) {
+ SizeF pageSize = pageSizes.get(i);
+ length += isVertical ? pageSize.getHeight() : pageSize.getWidth();
+ if (autoSpacing) {
+ length += pageSpacing.get(i);
+ } else if (i < getPagesCount() - 1) {
+ length += spacingPx;
+ }
+ }
+ documentLength = length;
+ }
+
+ private void preparePagesOffset() {
+ pageOffsets.clear();
+ float offset = 0;
+ for (int i = 0; i < getPagesCount(); i++) {
+ SizeF pageSize = pageSizes.get(i);
+ float size = isVertical ? pageSize.getHeight() : pageSize.getWidth();
+ if (autoSpacing) {
+ offset += pageSpacing.get(i) / 2f;
+ if (i == 0) {
+ offset -= spacingPx / 2f;
+ } else if (i == getPagesCount() - 1) {
+ offset += spacingPx / 2f;
+ }
+ pageOffsets.add(offset);
+ offset += size + pageSpacing.get(i) / 2f;
+ } else {
+ pageOffsets.add(offset);
+ offset += size + spacingPx;
+ }
+ }
+ }
+
+ public float getDocLen(float zoom) {
+ return documentLength * zoom;
+ }
+
+ /**
+ * Get the page's height if swiping vertical, or width if swiping horizontal.
+ */
+ public float getPageLength(int pageIndex, float zoom) {
+ SizeF size = getPageSize(pageIndex);
+ return (isVertical ? size.getHeight() : size.getWidth()) * zoom;
+ }
+
+ public float getPageSpacing(int pageIndex, float zoom) {
+ float spacing = autoSpacing ? pageSpacing.get(pageIndex) : spacingPx;
+ return spacing * zoom;
+ }
+
+ /** Get primary page offset, that is Y for vertical scroll and X for horizontal scroll */
+ public float getPageOffset(int pageIndex, float zoom) {
+ int docPage = documentPage(pageIndex);
+ if (docPage < 0) {
+ return 0;
+ }
+ return pageOffsets.get(pageIndex) * zoom;
+ }
+
+ /** Get secondary page offset, that is X for vertical scroll and Y for horizontal scroll */
+ public float getSecondaryPageOffset(int pageIndex, float zoom) {
+ SizeF pageSize = getPageSize(pageIndex);
+ if (isVertical) {
+ float maxWidth = getMaxPageWidth();
+ return zoom * (maxWidth - pageSize.getWidth()) / 2; //x
+ } else {
+ float maxHeight = getMaxPageHeight();
+ return zoom * (maxHeight - pageSize.getHeight()) / 2; //y
+ }
+ }
+
+ public int getPageAtOffset(float offset, float zoom) {
+ int currentPage = 0;
+ for (int i = 0; i < getPagesCount(); i++) {
+ float off = pageOffsets.get(i) * zoom - getPageSpacing(i, zoom) / 2f;
+ if (off >= offset) {
+ break;
+ }
+ currentPage++;
+ }
+ return --currentPage >= 0 ? currentPage : 0;
+ }
+
+ public boolean openPage(int pageIndex) throws PageRenderingException {
+ int docPage = documentPage(pageIndex);
+ if (docPage < 0) {
+ return false;
+ }
+
+ synchronized (lock) {
+ if (openedPages.indexOfKey(docPage) < 0) {
+ try {
+ pdfiumCore.openPage(pdfDocument, docPage);
+ openedPages.put(docPage, true);
+ return true;
+ } catch (Exception e) {
+ openedPages.put(docPage, false);
+ throw new PageRenderingException(pageIndex, e);
+ }
+ }
+ return false;
+ }
+ }
+
+ public boolean pageHasError(int pageIndex) {
+ int docPage = documentPage(pageIndex);
+ return !openedPages.get(docPage, false);
+ }
+
+ public void renderPageBitmap(Bitmap bitmap, int pageIndex, Rect bounds, boolean annotationRendering) {
+ int docPage = documentPage(pageIndex);
+ pdfiumCore.renderPageBitmap(pdfDocument, bitmap, docPage,
+ bounds.left, bounds.top, bounds.width(), bounds.height(), annotationRendering);
+ }
+
+ public PdfDocument.Meta getMetaData() {
+ if (pdfDocument == null) {
+ return null;
+ }
+ return pdfiumCore.getDocumentMeta(pdfDocument);
+ }
+
+ public List getBookmarks() {
+ if (pdfDocument == null) {
+ return new ArrayList<>();
+ }
+ return pdfiumCore.getTableOfContents(pdfDocument);
+ }
+
+ public List getPageLinks(int pageIndex) {
+ int docPage = documentPage(pageIndex);
+ return pdfiumCore.getPageLinks(pdfDocument, docPage);
+ }
+
+ public RectF mapRectToDevice(int pageIndex, int startX, int startY, int sizeX, int sizeY,
+ RectF rect) {
+ int docPage = documentPage(pageIndex);
+ return pdfiumCore.mapRectToDevice(pdfDocument, docPage, startX, startY, sizeX, sizeY, 0, rect);
+ }
+
+ public void dispose() {
+ if (pdfiumCore != null && pdfDocument != null) {
+ pdfiumCore.closeDocument(pdfDocument);
+ }
+
+ pdfDocument = null;
+ originalUserPages = null;
+ }
+
+ /**
+ * Given the UserPage number, this method restrict it
+ * to be sure it's an existing page. It takes care of
+ * using the user defined pages if any.
+ *
+ * @param userPage A page number.
+ * @return A restricted valid page number (example : -2 => 0)
+ */
+ public int determineValidPageNumberFrom(int userPage) {
+ if (userPage <= 0) {
+ return 0;
+ }
+ if (originalUserPages != null) {
+ if (userPage >= originalUserPages.length) {
+ return originalUserPages.length - 1;
+ }
+ } else {
+ if (userPage >= getPagesCount()) {
+ return getPagesCount() - 1;
+ }
+ }
+ return userPage;
+ }
+
+ public int documentPage(int userPage) {
+ int documentPage = userPage;
+ if (originalUserPages != null) {
+ if (userPage < 0 || userPage >= originalUserPages.length) {
+ return -1;
+ } else {
+ documentPage = originalUserPages[userPage];
+ }
+ }
+
+ if (documentPage < 0 || userPage >= getPagesCount()) {
+ return -1;
+ }
+
+ return documentPage;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/RenderingHandler.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/RenderingHandler.java
new file mode 100644
index 0000000..aa9471f
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/RenderingHandler.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer;
+
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import com.github.barteksc.pdfviewer.exception.PageRenderingException;
+import com.github.barteksc.pdfviewer.model.PagePart;
+
+/**
+ * A {@link Handler} that will process incoming {@link RenderingTask} messages
+ * and alert {@link PDFView#onBitmapRendered(PagePart)} when the portion of the
+ * PDF is ready to render.
+ */
+class RenderingHandler extends Handler {
+ /**
+ * {@link Message#what} kind of message this handler processes.
+ */
+ static final int MSG_RENDER_TASK = 1;
+
+ private static final String TAG = RenderingHandler.class.getName();
+
+ private PDFView pdfView;
+
+ private RectF renderBounds = new RectF();
+ private Rect roundedRenderBounds = new Rect();
+ private Matrix renderMatrix = new Matrix();
+ private boolean running = false;
+
+ RenderingHandler(Looper looper, PDFView pdfView) {
+ super(looper);
+ this.pdfView = pdfView;
+ }
+
+ void addRenderingTask(int page, float width, float height, RectF bounds, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
+ RenderingTask task = new RenderingTask(width, height, bounds, page, thumbnail, cacheOrder, bestQuality, annotationRendering);
+ Message msg = obtainMessage(MSG_RENDER_TASK, task);
+ sendMessage(msg);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ RenderingTask task = (RenderingTask) message.obj;
+ try {
+ final PagePart part = proceed(task);
+ if (part != null) {
+ if (running) {
+ pdfView.post(new Runnable() {
+ @Override
+ public void run() {
+ pdfView.onBitmapRendered(part);
+ }
+ });
+ } else {
+ part.getRenderedBitmap().recycle();
+ }
+ }
+ } catch (final PageRenderingException ex) {
+ pdfView.post(new Runnable() {
+ @Override
+ public void run() {
+ pdfView.onPageError(ex);
+ }
+ });
+ }
+ }
+
+ private PagePart proceed(RenderingTask renderingTask) throws PageRenderingException {
+ PdfFile pdfFile = pdfView.pdfFile;
+ pdfFile.openPage(renderingTask.page);
+
+ int w = Math.round(renderingTask.width);
+ int h = Math.round(renderingTask.height);
+
+ if (w == 0 || h == 0 || pdfFile.pageHasError(renderingTask.page)) {
+ return null;
+ }
+
+ Bitmap render;
+ try {
+ render = Bitmap.createBitmap(w, h, renderingTask.bestQuality ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Cannot create bitmap", e);
+ return null;
+ }
+ calculateBounds(w, h, renderingTask.bounds);
+
+ pdfFile.renderPageBitmap(render, renderingTask.page, roundedRenderBounds, renderingTask.annotationRendering);
+
+ return new PagePart(renderingTask.page, render,
+ renderingTask.bounds, renderingTask.thumbnail,
+ renderingTask.cacheOrder);
+ }
+
+ private void calculateBounds(int width, int height, RectF pageSliceBounds) {
+ renderMatrix.reset();
+ renderMatrix.postTranslate(-pageSliceBounds.left * width, -pageSliceBounds.top * height);
+ renderMatrix.postScale(1 / pageSliceBounds.width(), 1 / pageSliceBounds.height());
+
+ renderBounds.set(0, 0, width, height);
+ renderMatrix.mapRect(renderBounds);
+ renderBounds.round(roundedRenderBounds);
+ }
+
+ void stop() {
+ running = false;
+ }
+
+ void start() {
+ running = true;
+ }
+
+ private class RenderingTask {
+
+ float width, height;
+
+ RectF bounds;
+
+ int page;
+
+ boolean thumbnail;
+
+ int cacheOrder;
+
+ boolean bestQuality;
+
+ boolean annotationRendering;
+
+ RenderingTask(float width, float height, RectF bounds, int page, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
+ this.page = page;
+ this.width = width;
+ this.height = height;
+ this.bounds = bounds;
+ this.thumbnail = thumbnail;
+ this.cacheOrder = cacheOrder;
+ this.bestQuality = bestQuality;
+ this.annotationRendering = annotationRendering;
+ }
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/FileNotFoundException.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/FileNotFoundException.java
new file mode 100644
index 0000000..f0fc6f8
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/FileNotFoundException.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.exception;
+
+@Deprecated
+public class FileNotFoundException extends RuntimeException {
+
+ public FileNotFoundException(String detailMessage) {
+ super(detailMessage);
+ }
+
+ public FileNotFoundException(String detailMessage, Throwable throwable) {
+ super(detailMessage, throwable);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/PageRenderingException.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/PageRenderingException.java
new file mode 100644
index 0000000..b6ff2b8
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/exception/PageRenderingException.java
@@ -0,0 +1,14 @@
+package com.github.barteksc.pdfviewer.exception;
+
+public class PageRenderingException extends Exception {
+ private final int page;
+
+ public PageRenderingException(int page, Throwable cause) {
+ super(cause);
+ this.page = page;
+ }
+
+ public int getPage() {
+ return page;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java
new file mode 100644
index 0000000..0849da3
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.link;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.util.Log;
+
+import com.github.barteksc.pdfviewer.PDFView;
+import com.github.barteksc.pdfviewer.model.LinkTapEvent;
+
+public class DefaultLinkHandler implements LinkHandler {
+
+ private static final String TAG = DefaultLinkHandler.class.getSimpleName();
+
+ private PDFView pdfView;
+
+ public DefaultLinkHandler(PDFView pdfView) {
+ this.pdfView = pdfView;
+ }
+
+ @Override
+ public void handleLinkEvent(LinkTapEvent event) {
+ String uri = event.getLink().getUri();
+ Integer page = event.getLink().getDestPageIdx();
+ if (uri != null && !uri.isEmpty()) {
+ handleUri(uri);
+ } else if (page != null) {
+ handlePage(page);
+ }
+ }
+
+ private void handleUri(String uri) {
+ Uri parsedUri = Uri.parse(uri);
+ Intent intent = new Intent(Intent.ACTION_VIEW, parsedUri);
+ Context context = pdfView.getContext();
+ if (intent.resolveActivity(context.getPackageManager()) != null) {
+ context.startActivity(intent);
+ } else {
+ Log.w(TAG, "No activity found for URI: " + uri);
+ }
+ }
+
+ private void handlePage(int page) {
+ pdfView.jumpTo(page);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/LinkHandler.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/LinkHandler.java
new file mode 100644
index 0000000..f09dc11
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/link/LinkHandler.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.link;
+
+import com.github.barteksc.pdfviewer.model.LinkTapEvent;
+
+public interface LinkHandler {
+
+ /**
+ * Called when link was tapped by user
+ *
+ * @param event current event
+ */
+ void handleLinkEvent(LinkTapEvent event);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/Callbacks.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/Callbacks.java
new file mode 100644
index 0000000..09becb1
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/Callbacks.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+import android.view.MotionEvent;
+
+import com.github.barteksc.pdfviewer.link.LinkHandler;
+import com.github.barteksc.pdfviewer.model.LinkTapEvent;
+
+public class Callbacks {
+
+ /**
+ * Call back object to call when the PDF is loaded
+ */
+ private OnLoadCompleteListener onLoadCompleteListener;
+
+ /**
+ * Call back object to call when document loading error occurs
+ */
+ private OnErrorListener onErrorListener;
+
+ /**
+ * Call back object to call when the page load error occurs
+ */
+ private OnPageErrorListener onPageErrorListener;
+
+ /**
+ * Call back object to call when the document is initially rendered
+ */
+ private OnRenderListener onRenderListener;
+
+ /**
+ * Call back object to call when the page has changed
+ */
+ private OnPageChangeListener onPageChangeListener;
+
+ /**
+ * Call back object to call when the page is scrolled
+ */
+ private OnPageScrollListener onPageScrollListener;
+
+ /**
+ * Call back object to call when the above layer is to drawn
+ */
+ private OnDrawListener onDrawListener;
+
+ private OnDrawListener onDrawAllListener;
+
+ /**
+ * Call back object to call when the user does a tap gesture
+ */
+ private OnTapListener onTapListener;
+
+ /**
+ * Call back object to call when the user does a long tap gesture
+ */
+ private OnLongPressListener onLongPressListener;
+
+ /**
+ * Call back object to call when clicking link
+ */
+ private LinkHandler linkHandler;
+
+ public void setOnLoadComplete(OnLoadCompleteListener onLoadCompleteListener) {
+ this.onLoadCompleteListener = onLoadCompleteListener;
+ }
+
+ public void callOnLoadComplete(int pagesCount) {
+ if (onLoadCompleteListener != null) {
+ onLoadCompleteListener.loadComplete(pagesCount);
+ }
+ }
+
+ public void setOnError(OnErrorListener onErrorListener) {
+ this.onErrorListener = onErrorListener;
+ }
+
+ public OnErrorListener getOnError() {
+ return onErrorListener;
+ }
+
+ public void setOnPageError(OnPageErrorListener onPageErrorListener) {
+ this.onPageErrorListener = onPageErrorListener;
+ }
+
+ public boolean callOnPageError(int page, Throwable error) {
+ if (onPageErrorListener != null) {
+ onPageErrorListener.onPageError(page, error);
+ return true;
+ }
+ return false;
+ }
+
+ public void setOnRender(OnRenderListener onRenderListener) {
+ this.onRenderListener = onRenderListener;
+ }
+
+ public void callOnRender(int pagesCount) {
+ if (onRenderListener != null) {
+ onRenderListener.onInitiallyRendered(pagesCount);
+ }
+ }
+
+ public void setOnPageChange(OnPageChangeListener onPageChangeListener) {
+ this.onPageChangeListener = onPageChangeListener;
+ }
+
+ public void callOnPageChange(int page, int pagesCount) {
+ if (onPageChangeListener != null) {
+ onPageChangeListener.onPageChanged(page, pagesCount);
+ }
+ }
+
+ public void setOnPageScroll(OnPageScrollListener onPageScrollListener) {
+ this.onPageScrollListener = onPageScrollListener;
+ }
+
+ public void callOnPageScroll(int currentPage, float offset) {
+ if (onPageScrollListener != null) {
+ onPageScrollListener.onPageScrolled(currentPage, offset);
+ }
+ }
+
+ public void setOnDraw(OnDrawListener onDrawListener) {
+ this.onDrawListener = onDrawListener;
+ }
+
+ public OnDrawListener getOnDraw() {
+ return onDrawListener;
+ }
+
+ public void setOnDrawAll(OnDrawListener onDrawAllListener) {
+ this.onDrawAllListener = onDrawAllListener;
+ }
+
+ public OnDrawListener getOnDrawAll() {
+ return onDrawAllListener;
+ }
+
+ public void setOnTap(OnTapListener onTapListener) {
+ this.onTapListener = onTapListener;
+ }
+
+ public boolean callOnTap(MotionEvent event) {
+ return onTapListener != null && onTapListener.onTap(event);
+ }
+
+ public void setOnLongPress(OnLongPressListener onLongPressListener) {
+ this.onLongPressListener = onLongPressListener;
+ }
+
+ public void callOnLongPress(MotionEvent event) {
+ if (onLongPressListener != null) {
+ onLongPressListener.onLongPress(event);
+ }
+ }
+
+ public void setLinkHandler(LinkHandler linkHandler) {
+ this.linkHandler = linkHandler;
+ }
+
+ public void callLinkHandler(LinkTapEvent event) {
+ if (linkHandler != null) {
+ linkHandler.handleLinkEvent(event);
+ }
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnDrawListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnDrawListener.java
new file mode 100644
index 0000000..a318ebb
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnDrawListener.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+import android.graphics.Canvas;
+
+/**
+ * This interface allows an extern class to draw
+ * something on the PDFView canvas, above all images.
+ */
+public interface OnDrawListener {
+
+ /**
+ * This method is called when the PDFView is
+ * drawing its view.
+ *
+ * The page is starting at (0,0)
+ *
+ * @param canvas The canvas on which to draw things.
+ * @param pageWidth The width of the current page.
+ * @param pageHeight The height of the current page.
+ * @param displayedPage The current page index
+ */
+ void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnErrorListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnErrorListener.java
new file mode 100644
index 0000000..876bacf
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnErrorListener.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+public interface OnErrorListener {
+
+ /**
+ * Called if error occurred while opening PDF
+ * @param t Throwable with error
+ */
+ void onError(Throwable t);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLoadCompleteListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLoadCompleteListener.java
new file mode 100644
index 0000000..a52cbc9
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLoadCompleteListener.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+/**
+ * Implement this interface to receive events from PDFView
+ * when loading is complete.
+ */
+public interface OnLoadCompleteListener {
+
+ /**
+ * Called when the PDF is loaded
+ * @param nbPages the number of pages in this PDF file
+ */
+ void loadComplete(int nbPages);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLongPressListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLongPressListener.java
new file mode 100644
index 0000000..fc94c72
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnLongPressListener.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+import android.view.MotionEvent;
+
+/**
+ * Implement this interface to receive events from PDFView
+ * when view has been long pressed
+ */
+public interface OnLongPressListener {
+
+ /**
+ * Called when the user has a long tap gesture, before processing scroll handle toggling
+ *
+ * @param e MotionEvent that registered as a confirmed long press
+ */
+ void onLongPress(MotionEvent e);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageChangeListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageChangeListener.java
new file mode 100644
index 0000000..0945ca8
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageChangeListener.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+/**
+ * Implements this interface to receive events from PDFView
+ * when a page has changed through swipe
+ */
+public interface OnPageChangeListener {
+
+ /**
+ * Called when the user use swipe to change page
+ *
+ * @param page the new page displayed, starting from 0
+ * @param pageCount the total page count
+ */
+ void onPageChanged(int page, int pageCount);
+
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageErrorListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageErrorListener.java
new file mode 100644
index 0000000..3fb38a2
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageErrorListener.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+public interface OnPageErrorListener {
+
+ /**
+ * Called if error occurred while loading PDF page
+ * @param t Throwable with error
+ */
+ void onPageError(int page, Throwable t);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageScrollListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageScrollListener.java
new file mode 100644
index 0000000..6eda1fd
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnPageScrollListener.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+/**
+ * Implements this interface to receive events from PDFView
+ * when a page has been scrolled
+ */
+public interface OnPageScrollListener {
+
+ /**
+ * Called on every move while scrolling
+ *
+ * @param page current page index
+ * @param positionOffset see {@link com.github.barteksc.pdfviewer.PDFView#getPositionOffset()}
+ */
+ void onPageScrolled(int page, float positionOffset);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnRenderListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnRenderListener.java
new file mode 100644
index 0000000..9998249
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnRenderListener.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+public interface OnRenderListener {
+
+ /**
+ * Called only once, when document is rendered
+ * @param nbPages number of pages
+ */
+ void onInitiallyRendered(int nbPages);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnTapListener.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnTapListener.java
new file mode 100644
index 0000000..081a3a2
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/listener/OnTapListener.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.listener;
+
+import android.view.MotionEvent;
+
+/**
+ * Implement this interface to receive events from PDFView
+ * when view has been touched
+ */
+public interface OnTapListener {
+
+ /**
+ * Called when the user has a tap gesture, before processing scroll handle toggling
+ *
+ * @param e MotionEvent that registered as a confirmed single tap
+ * @return true if the single tap was handled, false to toggle scroll handle
+ */
+ boolean onTap(MotionEvent e);
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/LinkTapEvent.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/LinkTapEvent.java
new file mode 100644
index 0000000..7e72bdd
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/LinkTapEvent.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.model;
+
+import android.graphics.RectF;
+
+import com.shockwave.pdfium.PdfDocument;
+
+public class LinkTapEvent {
+ private float originalX;
+ private float originalY;
+ private float documentX;
+ private float documentY;
+ private RectF mappedLinkRect;
+ private PdfDocument.Link link;
+
+ public LinkTapEvent(float originalX, float originalY, float documentX, float documentY, RectF mappedLinkRect, PdfDocument.Link link) {
+ this.originalX = originalX;
+ this.originalY = originalY;
+ this.documentX = documentX;
+ this.documentY = documentY;
+ this.mappedLinkRect = mappedLinkRect;
+ this.link = link;
+ }
+
+ public float getOriginalX() {
+ return originalX;
+ }
+
+ public float getOriginalY() {
+ return originalY;
+ }
+
+ public float getDocumentX() {
+ return documentX;
+ }
+
+ public float getDocumentY() {
+ return documentY;
+ }
+
+ public RectF getMappedLinkRect() {
+ return mappedLinkRect;
+ }
+
+ public PdfDocument.Link getLink() {
+ return link;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/PagePart.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/PagePart.java
new file mode 100644
index 0000000..19a2186
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/model/PagePart.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.model;
+
+import android.graphics.Bitmap;
+import android.graphics.RectF;
+
+public class PagePart {
+
+ private int page;
+
+ private Bitmap renderedBitmap;
+
+ private RectF pageRelativeBounds;
+
+ private boolean thumbnail;
+
+ private int cacheOrder;
+
+ public PagePart(int page, Bitmap renderedBitmap, RectF pageRelativeBounds, boolean thumbnail, int cacheOrder) {
+ super();
+ this.page = page;
+ this.renderedBitmap = renderedBitmap;
+ this.pageRelativeBounds = pageRelativeBounds;
+ this.thumbnail = thumbnail;
+ this.cacheOrder = cacheOrder;
+ }
+
+ public int getCacheOrder() {
+ return cacheOrder;
+ }
+
+ public int getPage() {
+ return page;
+ }
+
+ public Bitmap getRenderedBitmap() {
+ return renderedBitmap;
+ }
+
+ public RectF getPageRelativeBounds() {
+ return pageRelativeBounds;
+ }
+
+ public boolean isThumbnail() {
+ return thumbnail;
+ }
+
+ public void setCacheOrder(int cacheOrder) {
+ this.cacheOrder = cacheOrder;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof PagePart)) {
+ return false;
+ }
+
+ PagePart part = (PagePart) obj;
+ return part.getPage() == page
+ && part.getPageRelativeBounds().left == pageRelativeBounds.left
+ && part.getPageRelativeBounds().right == pageRelativeBounds.right
+ && part.getPageRelativeBounds().top == pageRelativeBounds.top
+ && part.getPageRelativeBounds().bottom == pageRelativeBounds.bottom;
+ }
+
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java
new file mode 100644
index 0000000..03160eb
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java
@@ -0,0 +1,240 @@
+package com.github.barteksc.pdfviewer.scroll;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.util.TypedValue;
+import android.view.MotionEvent;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.core.content.ContextCompat;
+
+import com.github.barteksc.pdfviewer.PDFView;
+import com.github.barteksc.pdfviewer.R;
+import com.github.barteksc.pdfviewer.util.Util;
+
+public class DefaultScrollHandle extends RelativeLayout implements ScrollHandle {
+
+ private final static int HANDLE_LONG = 65;
+ private final static int HANDLE_SHORT = 40;
+ private final static int DEFAULT_TEXT_SIZE = 16;
+
+ private float relativeHandlerMiddle = 0f;
+
+ protected TextView textView;
+ protected Context context;
+ private boolean inverted;
+ private PDFView pdfView;
+ private float currentPos;
+
+ private Handler handler = new Handler();
+ private Runnable hidePageScrollerRunnable = new Runnable() {
+ @Override
+ public void run() {
+ hide();
+ }
+ };
+
+ public DefaultScrollHandle(Context context) {
+ this(context, false);
+ }
+
+ public DefaultScrollHandle(Context context, boolean inverted) {
+ super(context);
+ this.context = context;
+ this.inverted = inverted;
+ textView = new TextView(context);
+ setVisibility(INVISIBLE);
+ setTextColor(Color.BLACK);
+ setTextSize(DEFAULT_TEXT_SIZE);
+ }
+
+ @Override
+ public void setupLayout(PDFView pdfView) {
+ int align, width, height;
+ Drawable background;
+ // determine handler position, default is right (when scrolling vertically) or bottom (when scrolling horizontally)
+ if (pdfView.isSwipeVertical()) {
+ width = HANDLE_LONG;
+ height = HANDLE_SHORT;
+ if (inverted) { // left
+ align = ALIGN_PARENT_LEFT;
+ background = ContextCompat.getDrawable(context, R.drawable.default_scroll_handle_left);
+ } else { // right
+ align = ALIGN_PARENT_RIGHT;
+ background = ContextCompat.getDrawable(context, R.drawable.default_scroll_handle_right);
+ }
+ } else {
+ width = HANDLE_SHORT;
+ height = HANDLE_LONG;
+ if (inverted) { // top
+ align = ALIGN_PARENT_TOP;
+ background = ContextCompat.getDrawable(context, R.drawable.default_scroll_handle_top);
+ } else { // bottom
+ align = ALIGN_PARENT_BOTTOM;
+ background = ContextCompat.getDrawable(context, R.drawable.default_scroll_handle_bottom);
+ }
+ }
+
+ if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
+ setBackgroundDrawable(background);
+ } else {
+ setBackground(background);
+ }
+
+ LayoutParams lp = new LayoutParams(Util.getDP(context, width), Util.getDP(context, height));
+ lp.setMargins(0, 0, 0, 0);
+
+ LayoutParams tvlp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ tvlp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
+
+ addView(textView, tvlp);
+
+ lp.addRule(align);
+ pdfView.addView(this, lp);
+
+ this.pdfView = pdfView;
+ }
+
+ @Override
+ public void destroyLayout() {
+ pdfView.removeView(this);
+ }
+
+ @Override
+ public void setScroll(float position) {
+ if (!shown()) {
+ show();
+ } else {
+ handler.removeCallbacks(hidePageScrollerRunnable);
+ }
+ if (pdfView != null) {
+ setPosition((pdfView.isSwipeVertical() ? pdfView.getHeight() : pdfView.getWidth()) * position);
+ }
+ }
+
+ private void setPosition(float pos) {
+ if (Float.isInfinite(pos) || Float.isNaN(pos)) {
+ return;
+ }
+ float pdfViewSize;
+ if (pdfView.isSwipeVertical()) {
+ pdfViewSize = pdfView.getHeight();
+ } else {
+ pdfViewSize = pdfView.getWidth();
+ }
+ pos -= relativeHandlerMiddle;
+
+ if (pos < 0) {
+ pos = 0;
+ } else if (pos > pdfViewSize - Util.getDP(context, HANDLE_SHORT)) {
+ pos = pdfViewSize - Util.getDP(context, HANDLE_SHORT);
+ }
+
+ if (pdfView.isSwipeVertical()) {
+ setY(pos);
+ } else {
+ setX(pos);
+ }
+
+ calculateMiddle();
+ invalidate();
+ }
+
+ private void calculateMiddle() {
+ float pos, viewSize, pdfViewSize;
+ if (pdfView.isSwipeVertical()) {
+ pos = getY();
+ viewSize = getHeight();
+ pdfViewSize = pdfView.getHeight();
+ } else {
+ pos = getX();
+ viewSize = getWidth();
+ pdfViewSize = pdfView.getWidth();
+ }
+ relativeHandlerMiddle = ((pos + relativeHandlerMiddle) / pdfViewSize) * viewSize;
+ }
+
+ @Override
+ public void hideDelayed() {
+ handler.postDelayed(hidePageScrollerRunnable, 1000);
+ }
+
+ @Override
+ public void setPageNum(int pageNum) {
+ String text = String.valueOf(pageNum);
+ if (!textView.getText().equals(text)) {
+ textView.setText(text);
+ }
+ }
+
+ @Override
+ public boolean shown() {
+ return getVisibility() == VISIBLE;
+ }
+
+ @Override
+ public void show() {
+ setVisibility(VISIBLE);
+ }
+
+ @Override
+ public void hide() {
+ setVisibility(INVISIBLE);
+ }
+
+ public void setTextColor(int color) {
+ textView.setTextColor(color);
+ }
+
+ /**
+ * @param size text size in dp
+ */
+ public void setTextSize(int size) {
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
+ }
+
+ private boolean isPDFViewReady() {
+ return pdfView != null && pdfView.getPageCount() > 0 && !pdfView.documentFitsView();
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+
+ if (!isPDFViewReady()) {
+ return super.onTouchEvent(event);
+ }
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_POINTER_DOWN:
+ pdfView.stopFling();
+ handler.removeCallbacks(hidePageScrollerRunnable);
+ if (pdfView.isSwipeVertical()) {
+ currentPos = event.getRawY() - getY();
+ } else {
+ currentPos = event.getRawX() - getX();
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (pdfView.isSwipeVertical()) {
+ setPosition(event.getRawY() - currentPos + relativeHandlerMiddle);
+ pdfView.setPositionOffset(relativeHandlerMiddle / (float) getHeight(), false);
+ } else {
+ setPosition(event.getRawX() - currentPos + relativeHandlerMiddle);
+ pdfView.setPositionOffset(relativeHandlerMiddle / (float) getWidth(), false);
+ }
+ return true;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_POINTER_UP:
+ hideDelayed();
+ pdfView.performPageSnap();
+ return true;
+ }
+
+ return super.onTouchEvent(event);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/ScrollHandle.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/ScrollHandle.java
new file mode 100644
index 0000000..b58de5a
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/scroll/ScrollHandle.java
@@ -0,0 +1,57 @@
+package com.github.barteksc.pdfviewer.scroll;
+
+import com.github.barteksc.pdfviewer.PDFView;
+
+public interface ScrollHandle {
+
+ /**
+ * Used to move the handle, called internally by PDFView
+ *
+ * @param position current scroll ratio between 0 and 1
+ */
+ void setScroll(float position);
+
+ /**
+ * Method called by PDFView after setting scroll handle.
+ * Do not call this method manually.
+ * For usage sample see {@link DefaultScrollHandle}
+ *
+ * @param pdfView PDFView instance
+ */
+ void setupLayout(PDFView pdfView);
+
+ /**
+ * Method called by PDFView when handle should be removed from layout
+ * Do not call this method manually.
+ */
+ void destroyLayout();
+
+ /**
+ * Set page number displayed on handle
+ *
+ * @param pageNum page number
+ */
+ void setPageNum(int pageNum);
+
+ /**
+ * Get handle visibility
+ *
+ * @return true if handle is visible, false otherwise
+ */
+ boolean shown();
+
+ /**
+ * Show handle
+ */
+ void show();
+
+ /**
+ * Hide handle immediately
+ */
+ void hide();
+
+ /**
+ * Hide handle after some time (defined by implementation)
+ */
+ void hideDelayed();
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/AssetSource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/AssetSource.java
new file mode 100644
index 0000000..3e24e20
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/AssetSource.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+
+import android.content.Context;
+import android.os.ParcelFileDescriptor;
+
+import com.github.barteksc.pdfviewer.util.FileUtils;
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.File;
+import java.io.IOException;
+
+public class AssetSource implements DocumentSource {
+
+ private final String assetName;
+
+ public AssetSource(String assetName) {
+ this.assetName = assetName;
+ }
+
+ @Override
+ public PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException {
+ File f = FileUtils.fileFromAsset(context, assetName);
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
+ return core.newDocument(pfd, password);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/ByteArraySource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/ByteArraySource.java
new file mode 100644
index 0000000..245c78f
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/ByteArraySource.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+import android.content.Context;
+
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.IOException;
+
+public class ByteArraySource implements DocumentSource {
+
+ private byte[] data;
+
+ public ByteArraySource(byte[] data) {
+ this.data = data;
+ }
+
+ @Override
+ public PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException {
+ return core.newDocument(data, password);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/DocumentSource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/DocumentSource.java
new file mode 100644
index 0000000..4c76c5a
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/DocumentSource.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+import android.content.Context;
+
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.IOException;
+
+public interface DocumentSource {
+ PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException;
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/FileSource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/FileSource.java
new file mode 100644
index 0000000..cfe092c
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/FileSource.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+import android.content.Context;
+import android.os.ParcelFileDescriptor;
+
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.File;
+import java.io.IOException;
+
+public class FileSource implements DocumentSource {
+
+ private File file;
+
+ public FileSource(File file) {
+ this.file = file;
+ }
+
+ @Override
+ public PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException {
+ ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ return core.newDocument(pfd, password);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/InputStreamSource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/InputStreamSource.java
new file mode 100644
index 0000000..26e60a8
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/InputStreamSource.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+import android.content.Context;
+
+import com.github.barteksc.pdfviewer.util.Util;
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class InputStreamSource implements DocumentSource {
+
+ private InputStream inputStream;
+
+ public InputStreamSource(InputStream inputStream) {
+ this.inputStream = inputStream;
+ }
+
+ @Override
+ public PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException {
+ return core.newDocument(Util.toByteArray(inputStream), password);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/UriSource.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/UriSource.java
new file mode 100644
index 0000000..15215f0
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/source/UriSource.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.source;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+
+import com.shockwave.pdfium.PdfDocument;
+import com.shockwave.pdfium.PdfiumCore;
+
+import java.io.IOException;
+
+public class UriSource implements DocumentSource {
+
+ private Uri uri;
+
+ public UriSource(Uri uri) {
+ this.uri = uri;
+ }
+
+ @Override
+ public PdfDocument createDocument(Context context, PdfiumCore core, String password) throws IOException {
+ ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
+ return core.newDocument(pfd, password);
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/ArrayUtils.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/ArrayUtils.java
new file mode 100644
index 0000000..3fb887d
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/ArrayUtils.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtils {
+
+ private ArrayUtils() {
+ // Prevents instantiation
+ }
+
+ /** Transforms (0,1,2,2,3) to (0,1,2,3) */
+ public static int[] deleteDuplicatedPages(int[] pages) {
+ List result = new ArrayList<>();
+ int lastInt = -1;
+ for (Integer currentInt : pages) {
+ if (lastInt != currentInt) {
+ result.add(currentInt);
+ }
+ lastInt = currentInt;
+ }
+ int[] arrayResult = new int[result.size()];
+ for (int i = 0; i < result.size(); i++) {
+ arrayResult[i] = result.get(i);
+ }
+ return arrayResult;
+ }
+
+ /** Transforms (0, 4, 4, 6, 6, 6, 3) into (0, 1, 1, 2, 2, 2, 3) */
+ public static int[] calculateIndexesInDuplicateArray(int[] originalUserPages) {
+ int[] result = new int[originalUserPages.length];
+ if (originalUserPages.length == 0) {
+ return result;
+ }
+
+ int index = 0;
+ result[0] = index;
+ for (int i = 1; i < originalUserPages.length; i++) {
+ if (originalUserPages[i] != originalUserPages[i - 1]) {
+ index++;
+ }
+ result[i] = index;
+ }
+
+ return result;
+ }
+
+ public static String arrayToString(int[] array) {
+ StringBuilder builder = new StringBuilder("[");
+ for (int i = 0; i < array.length; i++) {
+ builder.append(array[i]);
+ if (i != array.length - 1) {
+ builder.append(",");
+ }
+ }
+ builder.append("]");
+ return builder.toString();
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Constants.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Constants.java
new file mode 100644
index 0000000..bea7e1b
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Constants.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+public class Constants {
+
+ public static boolean DEBUG_MODE = false;
+
+ /** Between 0 and 1, the thumbnails quality (default 0.3). Increasing this value may cause performance decrease */
+ public static float THUMBNAIL_RATIO = 0.3f;
+
+ /**
+ * The size of the rendered parts (default 256)
+ * Tinier : a little bit slower to have the whole page rendered but more reactive.
+ * Bigger : user will have to wait longer to have the first visual results
+ */
+ public static float PART_SIZE = 256;
+
+ /** Part of document above and below screen that should be preloaded, in dp */
+ public static int PRELOAD_OFFSET = 20;
+
+ public static class Cache {
+
+ /** The size of the cache (number of bitmaps kept) */
+ public static int CACHE_SIZE = 120;
+
+ public static int THUMBNAILS_CACHE_SIZE = 8;
+ }
+
+ public static class Pinch {
+
+ public static float MAXIMUM_ZOOM = 10;
+
+ public static float MINIMUM_ZOOM = 1;
+
+ }
+
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FileUtils.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FileUtils.java
new file mode 100644
index 0000000..0aa325e
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FileUtils.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+import android.content.Context;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class FileUtils {
+
+ private FileUtils() {
+ // Prevents instantiation
+ }
+
+ public static File fileFromAsset(Context context, String assetName) throws IOException {
+ File outFile = new File(context.getCacheDir(), assetName + "-pdfview.pdf");
+ if (assetName.contains("/")) {
+ outFile.getParentFile().mkdirs();
+ }
+ copy(context.getAssets().open(assetName), outFile);
+ return outFile;
+ }
+
+ public static void copy(InputStream inputStream, File output) throws IOException {
+ OutputStream outputStream = null;
+ try {
+ outputStream = new FileOutputStream(output);
+ int read = 0;
+ byte[] bytes = new byte[1024];
+ while ((read = inputStream.read(bytes)) != -1) {
+ outputStream.write(bytes, 0, read);
+ }
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FitPolicy.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FitPolicy.java
new file mode 100644
index 0000000..6e90dd5
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/FitPolicy.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+public enum FitPolicy {
+ WIDTH, HEIGHT, BOTH
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/MathUtils.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/MathUtils.java
new file mode 100644
index 0000000..8d9b224
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/MathUtils.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright 2016 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+public class MathUtils {
+
+ static private final int BIG_ENOUGH_INT = 16 * 1024;
+ static private final double BIG_ENOUGH_FLOOR = BIG_ENOUGH_INT;
+ static private final double BIG_ENOUGH_CEIL = 16384.999999999996;
+
+ private MathUtils() {
+ // Prevents instantiation
+ }
+
+ /**
+ * Limits the given number between the other values
+ * @param number The number to limit.
+ * @param between The smallest value the number can take.
+ * @param and The biggest value the number can take.
+ * @return The limited number.
+ */
+ public static int limit(int number, int between, int and) {
+ if (number <= between) {
+ return between;
+ }
+ if (number >= and) {
+ return and;
+ }
+ return number;
+ }
+
+ /**
+ * Limits the given number between the other values
+ * @param number The number to limit.
+ * @param between The smallest value the number can take.
+ * @param and The biggest value the number can take.
+ * @return The limited number.
+ */
+ public static float limit(float number, float between, float and) {
+ if (number <= between) {
+ return between;
+ }
+ if (number >= and) {
+ return and;
+ }
+ return number;
+ }
+
+ public static float max(float number, float max) {
+ if (number > max) {
+ return max;
+ }
+ return number;
+ }
+
+ public static float min(float number, float min) {
+ if (number < min) {
+ return min;
+ }
+ return number;
+ }
+
+ public static int max(int number, int max) {
+ if (number > max) {
+ return max;
+ }
+ return number;
+ }
+
+ public static int min(int number, int min) {
+ if (number < min) {
+ return min;
+ }
+ return number;
+ }
+
+ /**
+ * Methods from libGDX - https://github.com/libgdx/libgdx
+ */
+
+ /** Returns the largest integer less than or equal to the specified float. This method will only properly floor floats from
+ * -(2^14) to (Float.MAX_VALUE - 2^14). */
+ static public int floor(float value) {
+ return (int) (value + BIG_ENOUGH_FLOOR) - BIG_ENOUGH_INT;
+ }
+
+ /** Returns the smallest integer greater than or equal to the specified float. This method will only properly ceil floats from
+ * -(2^14) to (Float.MAX_VALUE - 2^14). */
+ static public int ceil(float value) {
+ return (int) (value + BIG_ENOUGH_CEIL) - BIG_ENOUGH_INT;
+ }
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java
new file mode 100644
index 0000000..4d678c9
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+import com.shockwave.pdfium.util.Size;
+import com.shockwave.pdfium.util.SizeF;
+
+public class PageSizeCalculator {
+
+ private FitPolicy fitPolicy;
+ private final Size originalMaxWidthPageSize;
+ private final Size originalMaxHeightPageSize;
+ private final Size viewSize;
+ private SizeF optimalMaxWidthPageSize;
+ private SizeF optimalMaxHeightPageSize;
+ private float widthRatio;
+ private float heightRatio;
+ private boolean fitEachPage;
+
+ public PageSizeCalculator(FitPolicy fitPolicy, Size originalMaxWidthPageSize, Size originalMaxHeightPageSize,
+ Size viewSize, boolean fitEachPage) {
+ this.fitPolicy = fitPolicy;
+ this.originalMaxWidthPageSize = originalMaxWidthPageSize;
+ this.originalMaxHeightPageSize = originalMaxHeightPageSize;
+ this.viewSize = viewSize;
+ this.fitEachPage = fitEachPage;
+ calculateMaxPages();
+ }
+
+ public SizeF calculate(Size pageSize) {
+ if (pageSize.getWidth() <= 0 || pageSize.getHeight() <= 0) {
+ return new SizeF(0, 0);
+ }
+ float maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() * widthRatio;
+ float maxHeight = fitEachPage ? viewSize.getHeight() : pageSize.getHeight() * heightRatio;
+ switch (fitPolicy) {
+ case HEIGHT:
+ return fitHeight(pageSize, maxHeight);
+ case BOTH:
+ return fitBoth(pageSize, maxWidth, maxHeight);
+ default:
+ return fitWidth(pageSize, maxWidth);
+ }
+ }
+
+ public SizeF getOptimalMaxWidthPageSize() {
+ return optimalMaxWidthPageSize;
+ }
+
+ public SizeF getOptimalMaxHeightPageSize() {
+ return optimalMaxHeightPageSize;
+ }
+
+ private void calculateMaxPages() {
+ switch (fitPolicy) {
+ case HEIGHT:
+ optimalMaxHeightPageSize = fitHeight(originalMaxHeightPageSize, viewSize.getHeight());
+ heightRatio = optimalMaxHeightPageSize.getHeight() / originalMaxHeightPageSize.getHeight();
+ optimalMaxWidthPageSize = fitHeight(originalMaxWidthPageSize, originalMaxWidthPageSize.getHeight() * heightRatio);
+ break;
+ case BOTH:
+ SizeF localOptimalMaxWidth = fitBoth(originalMaxWidthPageSize, viewSize.getWidth(), viewSize.getHeight());
+ float localWidthRatio = localOptimalMaxWidth.getWidth() / originalMaxWidthPageSize.getWidth();
+ this.optimalMaxHeightPageSize = fitBoth(originalMaxHeightPageSize, originalMaxHeightPageSize.getWidth() * localWidthRatio,
+ viewSize.getHeight());
+ heightRatio = optimalMaxHeightPageSize.getHeight() / originalMaxHeightPageSize.getHeight();
+ optimalMaxWidthPageSize = fitBoth(originalMaxWidthPageSize, viewSize.getWidth(), originalMaxWidthPageSize.getHeight() * heightRatio);
+ widthRatio = optimalMaxWidthPageSize.getWidth() / originalMaxWidthPageSize.getWidth();
+ break;
+ default:
+ optimalMaxWidthPageSize = fitWidth(originalMaxWidthPageSize, viewSize.getWidth());
+ widthRatio = optimalMaxWidthPageSize.getWidth() / originalMaxWidthPageSize.getWidth();
+ optimalMaxHeightPageSize = fitWidth(originalMaxHeightPageSize, originalMaxHeightPageSize.getWidth() * widthRatio);
+ break;
+ }
+ }
+
+ private SizeF fitWidth(Size pageSize, float maxWidth) {
+ float w = pageSize.getWidth(), h = pageSize.getHeight();
+ float ratio = w / h;
+ w = maxWidth;
+ h = (float) Math.floor(maxWidth / ratio);
+ return new SizeF(w, h);
+ }
+
+ private SizeF fitHeight(Size pageSize, float maxHeight) {
+ float w = pageSize.getWidth(), h = pageSize.getHeight();
+ float ratio = h / w;
+ h = maxHeight;
+ w = (float) Math.floor(maxHeight / ratio);
+ return new SizeF(w, h);
+ }
+
+ private SizeF fitBoth(Size pageSize, float maxWidth, float maxHeight) {
+ float w = pageSize.getWidth(), h = pageSize.getHeight();
+ float ratio = w / h;
+ w = maxWidth;
+ h = (float) Math.floor(maxWidth / ratio);
+ if (h > maxHeight) {
+ h = maxHeight;
+ w = (float) Math.floor(maxHeight * ratio);
+ }
+ return new SizeF(w, h);
+ }
+
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/SnapEdge.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/SnapEdge.java
new file mode 100644
index 0000000..e2e73ab
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/SnapEdge.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2017 Bartosz Schiller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+public enum SnapEdge {
+ START, CENTER, END, NONE
+}
diff --git a/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Util.java b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Util.java
new file mode 100644
index 0000000..58e473e
--- /dev/null
+++ b/androidpdfviewer/src/main/java/com/github/barteksc/pdfviewer/util/Util.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 Bartosz Schiller.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.barteksc.pdfviewer.util;
+
+import android.content.Context;
+import android.util.TypedValue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class Util {
+ private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
+
+ public static int getDP(Context context, int dp) {
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
+ }
+
+ public static byte[] toByteArray(InputStream inputStream) throws IOException {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+ int n;
+ while (-1 != (n = inputStream.read(buffer))) {
+ os.write(buffer, 0, n);
+ }
+ return os.toByteArray();
+ }
+}
diff --git a/androidpdfviewer/src/main/res/drawable/default_scroll_handle_bottom.xml b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_bottom.xml
new file mode 100644
index 0000000..ada7b75
--- /dev/null
+++ b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_bottom.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidpdfviewer/src/main/res/drawable/default_scroll_handle_left.xml b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_left.xml
new file mode 100644
index 0000000..71f2930
--- /dev/null
+++ b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_left.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/androidpdfviewer/src/main/res/drawable/default_scroll_handle_right.xml b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_right.xml
new file mode 100644
index 0000000..786b3b0
--- /dev/null
+++ b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_right.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidpdfviewer/src/main/res/drawable/default_scroll_handle_top.xml b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_top.xml
new file mode 100644
index 0000000..0eb2b0c
--- /dev/null
+++ b/androidpdfviewer/src/main/res/drawable/default_scroll_handle_top.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/androidpdfviewer/src/main/res/values/attrs.xml b/androidpdfviewer/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..2e07598
--- /dev/null
+++ b/androidpdfviewer/src/main/res/values/attrs.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build.gradle b/androidslantedtextview/build.gradle
new file mode 100644
index 0000000..b23a99e
--- /dev/null
+++ b/androidslantedtextview/build.gradle
@@ -0,0 +1,11 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdk 34
+ defaultConfig {
+ minSdk 24
+ targetSdk 34
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ namespace 'com.haozhang.lib'
+}
\ No newline at end of file
diff --git a/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/results.bin b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/results.bin
new file mode 100644
index 0000000..7ed749e
--- /dev/null
+++ b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haozhang/lib/SlantedTextView.dex b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haozhang/lib/SlantedTextView.dex
new file mode 100644
index 0000000..c82117b
Binary files /dev/null and b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haozhang/lib/SlantedTextView.dex differ
diff --git a/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/androidslantedtextview/build/.transforms/1cff675ba69c62bf48aba777d8458eef/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/results.bin b/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/transformed/classes/classes_dex/classes.dex b/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..c82117b
Binary files /dev/null and b/androidslantedtextview/build/.transforms/1e7ba886b59d2f132ffde2a95f47a1d6/transformed/classes/classes_dex/classes.dex differ
diff --git a/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/results.bin b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/results.bin
new file mode 100644
index 0000000..e1640c9
--- /dev/null
+++ b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirRelease
diff --git a/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haozhang/lib/SlantedTextView.dex b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haozhang/lib/SlantedTextView.dex
new file mode 100644
index 0000000..3e2f19e
Binary files /dev/null and b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haozhang/lib/SlantedTextView.dex differ
diff --git a/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/androidslantedtextview/build/.transforms/6dc31deded660d78fdad35b4b6a40d3b/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin differ
diff --git a/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/results.bin b/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/transformed/classes/classes_dex/classes.dex b/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..3e2f19e
Binary files /dev/null and b/androidslantedtextview/build/.transforms/f84c5e04980a53cd0ac72267670c30ba/transformed/classes/classes_dex/classes.dex differ
diff --git a/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..2c31d51
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..49a75b5
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.haozhang.lib",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..2c31d51
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..2581132
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.haozhang.lib",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/androidslantedtextview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/androidslantedtextview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties b/androidslantedtextview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/androidslantedtextview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/androidslantedtextview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/androidslantedtextview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/androidslantedtextview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 0000000..1e24b50
Binary files /dev/null and b/androidslantedtextview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/androidslantedtextview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/androidslantedtextview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar
new file mode 100644
index 0000000..1e24b50
Binary files /dev/null and b/androidslantedtextview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ
diff --git a/androidslantedtextview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/androidslantedtextview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 0000000..a38e48b
Binary files /dev/null and b/androidslantedtextview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/androidslantedtextview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/androidslantedtextview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar
new file mode 100644
index 0000000..a38e48b
Binary files /dev/null and b/androidslantedtextview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ
diff --git a/androidslantedtextview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/androidslantedtextview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 0000000..1162979
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
@@ -0,0 +1,22 @@
+int attr slantedBackgroundColor 0x0
+int attr slantedLength 0x0
+int attr slantedMode 0x0
+int attr slantedText 0x0
+int attr slantedTextColor 0x0
+int attr slantedTextSize 0x0
+int id left 0x0
+int id left_bottom 0x0
+int id left_bottom_triangle 0x0
+int id left_triangle 0x0
+int id right 0x0
+int id right_bottom 0x0
+int id right_bottom_triangle 0x0
+int id right_triangle 0x0
+int string app_name 0x0
+int[] styleable SlantedTextView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable SlantedTextView_slantedBackgroundColor 0
+int styleable SlantedTextView_slantedLength 1
+int styleable SlantedTextView_slantedMode 2
+int styleable SlantedTextView_slantedText 3
+int styleable SlantedTextView_slantedTextColor 4
+int styleable SlantedTextView_slantedTextSize 5
diff --git a/androidslantedtextview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/androidslantedtextview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
new file mode 100644
index 0000000..1162979
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
@@ -0,0 +1,22 @@
+int attr slantedBackgroundColor 0x0
+int attr slantedLength 0x0
+int attr slantedMode 0x0
+int attr slantedText 0x0
+int attr slantedTextColor 0x0
+int attr slantedTextSize 0x0
+int id left 0x0
+int id left_bottom 0x0
+int id left_bottom_triangle 0x0
+int id left_triangle 0x0
+int id right 0x0
+int id right_bottom 0x0
+int id right_bottom_triangle 0x0
+int id right_triangle 0x0
+int string app_name 0x0
+int[] styleable SlantedTextView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
+int styleable SlantedTextView_slantedBackgroundColor 0
+int styleable SlantedTextView_slantedLength 1
+int styleable SlantedTextView_slantedMode 2
+int styleable SlantedTextView_slantedText 3
+int styleable SlantedTextView_slantedTextColor 4
+int styleable SlantedTextView_slantedTextSize 5
diff --git a/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000..74f6b5b
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:03:42 CST 2024
diff --git a/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..8a29dd9
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
@@ -0,0 +1,21 @@
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 0000000..81fe29c
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/androidslantedtextview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000..d330de6
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/mergeDebugShaders/merger.xml b/androidslantedtextview/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000..36c1440
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/androidslantedtextview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
new file mode 100644
index 0000000..d50a656
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/androidslantedtextview/build/intermediates/incremental/mergeReleaseShaders/merger.xml
new file mode 100644
index 0000000..af129eb
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/mergeReleaseShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/packageDebugAssets/merger.xml b/androidslantedtextview/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000..687b070
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/packageReleaseAssets/merger.xml b/androidslantedtextview/build/intermediates/incremental/packageReleaseAssets/merger.xml
new file mode 100644
index 0000000..0fb7c35
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/packageReleaseAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..8b60d74
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:04:34 CST 2024
diff --git a/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..8a29dd9
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml
@@ -0,0 +1,21 @@
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merger.xml b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merger.xml
new file mode 100644
index 0000000..9a150eb
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/incremental/release/packageReleaseResources/merger.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class b/androidslantedtextview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class
new file mode 100644
index 0000000..ef48c75
Binary files /dev/null and b/androidslantedtextview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class differ
diff --git a/androidslantedtextview/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class b/androidslantedtextview/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class
new file mode 100644
index 0000000..ef48c75
Binary files /dev/null and b/androidslantedtextview/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/haozhang/lib/SlantedTextView.class differ
diff --git a/androidslantedtextview/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/androidslantedtextview/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
new file mode 100644
index 0000000..65ca48d
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
@@ -0,0 +1,18 @@
+R_DEF: Internal format may change without notice
+local
+attr? slantedBackgroundColor
+attr? slantedLength
+attr? slantedMode
+attr? slantedText
+attr? slantedTextColor
+attr? slantedTextSize
+id left
+id left_bottom
+id left_bottom_triangle
+id left_triangle
+id right
+id right_bottom
+id right_bottom_triangle
+id right_triangle
+string app_name
+styleable SlantedTextView slantedTextSize slantedBackgroundColor slantedText slantedTextColor slantedLength slantedMode
diff --git a/androidslantedtextview/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt b/androidslantedtextview/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
new file mode 100644
index 0000000..65ca48d
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
@@ -0,0 +1,18 @@
+R_DEF: Internal format may change without notice
+local
+attr? slantedBackgroundColor
+attr? slantedLength
+attr? slantedMode
+attr? slantedText
+attr? slantedTextColor
+attr? slantedTextSize
+id left
+id left_bottom
+id left_bottom_triangle
+id left_triangle
+id right
+id right_bottom
+id right_bottom_triangle
+id right_triangle
+string app_name
+styleable SlantedTextView slantedTextSize slantedBackgroundColor slantedText slantedTextColor slantedLength slantedMode
diff --git a/androidslantedtextview/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/androidslantedtextview/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
new file mode 100644
index 0000000..c88b591
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/androidslantedtextview/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt b/androidslantedtextview/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
new file mode 100644
index 0000000..c88b591
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/androidslantedtextview/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/androidslantedtextview/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
new file mode 100644
index 0000000..2c31d51
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml b/androidslantedtextview/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
new file mode 100644
index 0000000..2c31d51
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/androidslantedtextview/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json b/androidslantedtextview/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/androidslantedtextview/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt b/androidslantedtextview/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml b/androidslantedtextview/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
new file mode 100644
index 0000000..8a29dd9
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
@@ -0,0 +1,21 @@
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml b/androidslantedtextview/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml
new file mode 100644
index 0000000..8a29dd9
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml
@@ -0,0 +1,21 @@
+
+
+ Libary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/haozhang/lib/SlantedTextView.class b/androidslantedtextview/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/haozhang/lib/SlantedTextView.class
new file mode 100644
index 0000000..ef48c75
Binary files /dev/null and b/androidslantedtextview/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/haozhang/lib/SlantedTextView.class differ
diff --git a/androidslantedtextview/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/haozhang/lib/SlantedTextView.class b/androidslantedtextview/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/haozhang/lib/SlantedTextView.class
new file mode 100644
index 0000000..ef48c75
Binary files /dev/null and b/androidslantedtextview/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/haozhang/lib/SlantedTextView.class differ
diff --git a/androidslantedtextview/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar b/androidslantedtextview/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar
new file mode 100644
index 0000000..d40f299
Binary files /dev/null and b/androidslantedtextview/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar differ
diff --git a/androidslantedtextview/build/intermediates/runtime_library_classes_jar/release/bundleLibRuntimeToJarRelease/classes.jar b/androidslantedtextview/build/intermediates/runtime_library_classes_jar/release/bundleLibRuntimeToJarRelease/classes.jar
new file mode 100644
index 0000000..d40f299
Binary files /dev/null and b/androidslantedtextview/build/intermediates/runtime_library_classes_jar/release/bundleLibRuntimeToJarRelease/classes.jar differ
diff --git a/androidslantedtextview/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/androidslantedtextview/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt
new file mode 100644
index 0000000..3ccbb3d
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt
@@ -0,0 +1,17 @@
+com.haozhang.lib
+attr slantedBackgroundColor
+attr slantedLength
+attr slantedMode
+attr slantedText
+attr slantedTextColor
+attr slantedTextSize
+id left
+id left_bottom
+id left_bottom_triangle
+id left_triangle
+id right
+id right_bottom
+id right_bottom_triangle
+id right_triangle
+string app_name
+styleable SlantedTextView slantedBackgroundColor slantedLength slantedMode slantedText slantedTextColor slantedTextSize
diff --git a/androidslantedtextview/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt b/androidslantedtextview/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt
new file mode 100644
index 0000000..3ccbb3d
--- /dev/null
+++ b/androidslantedtextview/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt
@@ -0,0 +1,17 @@
+com.haozhang.lib
+attr slantedBackgroundColor
+attr slantedLength
+attr slantedMode
+attr slantedText
+attr slantedTextColor
+attr slantedTextSize
+id left
+id left_bottom
+id left_bottom_triangle
+id left_triangle
+id right
+id right_bottom
+id right_bottom_triangle
+id right_triangle
+string app_name
+styleable SlantedTextView slantedBackgroundColor slantedLength slantedMode slantedText slantedTextColor slantedTextSize
diff --git a/androidslantedtextview/build/outputs/logs/manifest-merger-debug-report.txt b/androidslantedtextview/build/outputs/logs/manifest-merger-debug-report.txt
new file mode 100644
index 0000000..a96f1fe
--- /dev/null
+++ b/androidslantedtextview/build/outputs/logs/manifest-merger-debug-report.txt
@@ -0,0 +1,16 @@
+-- Merging decision tree log ---
+manifest
+ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:1-3:12
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:1-3:12
+ package
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ xmlns:android
+ ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:11-69
+uses-sdk
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
diff --git a/androidslantedtextview/build/outputs/logs/manifest-merger-release-report.txt b/androidslantedtextview/build/outputs/logs/manifest-merger-release-report.txt
new file mode 100644
index 0000000..a96f1fe
--- /dev/null
+++ b/androidslantedtextview/build/outputs/logs/manifest-merger-release-report.txt
@@ -0,0 +1,16 @@
+-- Merging decision tree log ---
+manifest
+ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:1-3:12
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:1-3:12
+ package
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ xmlns:android
+ ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml:1:11-69
+uses-sdk
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\androidslantedtextview\src\main\AndroidManifest.xml
diff --git a/androidslantedtextview/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/androidslantedtextview/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 0000000..0088a45
Binary files /dev/null and b/androidslantedtextview/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/androidslantedtextview/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin b/androidslantedtextview/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 0000000..0088a45
Binary files /dev/null and b/androidslantedtextview/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin differ
diff --git a/androidslantedtextview/src/main/AndroidManifest.xml b/androidslantedtextview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0a0938a
--- /dev/null
+++ b/androidslantedtextview/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/androidslantedtextview/src/main/java/com/haozhang/lib/SlantedTextView.java b/androidslantedtextview/src/main/java/com/haozhang/lib/SlantedTextView.java
new file mode 100644
index 0000000..20bad6c
--- /dev/null
+++ b/androidslantedtextview/src/main/java/com/haozhang/lib/SlantedTextView.java
@@ -0,0 +1,344 @@
+package com.haozhang.lib;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * @author HaoZhang
+ */
+public class SlantedTextView extends View {
+
+ public static final int MODE_LEFT = 0;
+ public static final int MODE_RIGHT = 1;
+ public static final int MODE_LEFT_BOTTOM = 2;
+ public static final int MODE_RIGHT_BOTTOM = 3;
+ public static final int MODE_LEFT_TRIANGLE = 4;
+ public static final int MODE_RIGHT_TRIANGLE = 5;
+ public static final int MODE_LEFT_BOTTOM_TRIANGLE = 6;
+ public static final int MODE_RIGHT_BOTTOM_TRIANGLE = 7;
+
+ public static final int ROTATE_ANGLE = 45;
+ private Paint mPaint;
+ private TextPaint mTextPaint;
+ private float mSlantedLength = 40;
+ private float mTextSize = 16;
+ private int mSlantedBackgroundColor = Color.TRANSPARENT;
+ private int mTextColor = Color.WHITE;
+ private String mSlantedText = "";
+ private int mMode = MODE_LEFT;
+
+ public SlantedTextView(Context context) {
+ this(context, null);
+ }
+
+ public SlantedTextView(Context context, AttributeSet attrs) {
+ this(context, attrs, -1);
+ }
+
+ public SlantedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public SlantedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(attrs);
+ }
+
+ public void init(AttributeSet attrs) {
+ TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.SlantedTextView);
+
+ mTextSize = array.getDimension(R.styleable.SlantedTextView_slantedTextSize, mTextSize);
+ mTextColor = array.getColor(R.styleable.SlantedTextView_slantedTextColor, mTextColor);
+ mSlantedLength = array.getDimension(R.styleable.SlantedTextView_slantedLength, mSlantedLength);
+ mSlantedBackgroundColor = array.getColor(R.styleable.SlantedTextView_slantedBackgroundColor, mSlantedBackgroundColor);
+
+ if (array.hasValue(R.styleable.SlantedTextView_slantedText)) {
+ mSlantedText = array.getString(R.styleable.SlantedTextView_slantedText);
+ }
+
+ if (array.hasValue(R.styleable.SlantedTextView_slantedMode)) {
+ mMode = array.getInt(R.styleable.SlantedTextView_slantedMode, 0);
+ }
+ array.recycle();
+
+ mPaint = new Paint();
+ mPaint.setStyle(Paint.Style.FILL);
+ mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
+ mPaint.setAntiAlias(true);
+ mPaint.setColor(mSlantedBackgroundColor);
+
+ mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setTextSize(mTextSize);
+ mTextPaint.setColor(mTextColor);
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ drawBackground(canvas);
+ drawText(canvas);
+ }
+
+
+ private void drawBackground(Canvas canvas) {
+ Path path = new Path();
+ int w = getWidth();
+ int h = getHeight();
+
+ if (w != h) throw new IllegalStateException("SlantedTextView's width must equal to height");
+
+ switch (mMode) {
+ case MODE_LEFT:
+ path = getModeLeftPath(path, w, h);
+ break;
+ case MODE_RIGHT:
+ path = getModeRightPath(path, w, h);
+ break;
+ case MODE_LEFT_BOTTOM:
+ path = getModeLeftBottomPath(path, w, h);
+ break;
+ case MODE_RIGHT_BOTTOM:
+ path = getModeRightBottomPath(path, w, h);
+ break;
+ case MODE_LEFT_TRIANGLE:
+ path = getModeLeftTrianglePath(path, w, h);
+ break;
+ case MODE_RIGHT_TRIANGLE:
+ path = getModeRightTrianglePath(path, w, h);
+ break;
+ case MODE_LEFT_BOTTOM_TRIANGLE:
+ path = getModeLeftBottomTrianglePath(path, w, h);
+ break;
+ case MODE_RIGHT_BOTTOM_TRIANGLE:
+ path = getModeRightBottomTrianglePath(path, w, h);
+ break;
+ }
+ path.close();
+ canvas.drawPath(path, mPaint);
+ canvas.save();
+ }
+
+ private Path getModeLeftPath(Path path, int w, int h) {
+ path.moveTo(w, 0);
+ path.lineTo(0, h);
+ path.lineTo(0, h - mSlantedLength);
+ path.lineTo(w - mSlantedLength, 0);
+ return path;
+ }
+
+ private Path getModeRightPath(Path path, int w, int h) {
+ path.lineTo(w, h);
+ path.lineTo(w, h - mSlantedLength);
+ path.lineTo(mSlantedLength, 0);
+ return path;
+ }
+
+ private Path getModeLeftBottomPath(Path path, int w, int h) {
+ path.lineTo(w, h);
+ path.lineTo(w - mSlantedLength, h);
+ path.lineTo(0, mSlantedLength);
+ return path;
+ }
+
+ private Path getModeRightBottomPath(Path path, int w, int h) {
+ path.moveTo(0, h);
+ path.lineTo(mSlantedLength, h);
+ path.lineTo(w, mSlantedLength);
+ path.lineTo(w, 0);
+ return path;
+ }
+
+ private Path getModeLeftTrianglePath(Path path, int w, int h) {
+ path.lineTo(0,h);
+ path.lineTo(w,0);
+ return path;
+ }
+
+ private Path getModeRightTrianglePath(Path path, int w, int h) {
+ path.lineTo(w,0);
+ path.lineTo(w,h);
+ return path;
+ }
+
+ private Path getModeLeftBottomTrianglePath(Path path, int w, int h) {
+ path.lineTo(w,h);
+ path.lineTo(0,h);
+ return path;
+ }
+
+ private Path getModeRightBottomTrianglePath(Path path, int w, int h) {
+ path.moveTo(0,h);
+ path.lineTo(w,h);
+ path.lineTo(w,0);
+ return path;
+ }
+
+ private void drawText(Canvas canvas) {
+ int w = (int) (canvas.getWidth() - mSlantedLength / 2);
+ int h = (int) (canvas.getHeight() - mSlantedLength / 2);
+ float[] xy = calculateXY(canvas,w, h);
+ float toX = xy[0];
+ float toY = xy[1];
+ float centerX = xy[2];
+ float centerY = xy[3];
+ float angle = xy[4];
+
+ canvas.rotate(angle, centerX , centerY );
+
+ canvas.drawText(mSlantedText, toX, toY, mTextPaint);
+ }
+
+ private float[] calculateXY(Canvas canvas,int w, int h) {
+ float[] xy = new float[5];
+ Rect rect = null;
+ RectF rectF = null;
+ int offset = (int) (mSlantedLength / 2);
+ switch (mMode) {
+ case MODE_LEFT_TRIANGLE:
+ case MODE_LEFT:
+ rect = new Rect(0, 0, w, h);
+ rectF = new RectF(rect);
+ rectF.right = mTextPaint.measureText(mSlantedText, 0, mSlantedText.length());
+ rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
+ rectF.left += (rect.width() - rectF.right) / 2.0f;
+ rectF.top += (rect.height() - rectF.bottom) / 2.0f;
+ xy[0] = rectF.left;
+ xy[1] = rectF.top - mTextPaint.ascent();
+ xy[2] = w / 2;
+ xy[3] = h / 2;
+ xy[4] = -ROTATE_ANGLE;
+ break;
+ case MODE_RIGHT_TRIANGLE:
+ case MODE_RIGHT:
+ rect = new Rect(offset, 0, w + offset, h);
+ rectF = new RectF(rect);
+ rectF.right = mTextPaint.measureText(mSlantedText, 0, mSlantedText.length());
+ rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
+ rectF.left += (rect.width() - rectF.right) / 2.0f;
+ rectF.top += (rect.height() - rectF.bottom) / 2.0f;
+ xy[0] = rectF.left;
+ xy[1] = rectF.top - mTextPaint.ascent();
+ xy[2] = w / 2 + offset;
+ xy[3] = h / 2;
+ xy[4] = ROTATE_ANGLE;
+ break;
+ case MODE_LEFT_BOTTOM_TRIANGLE:
+ case MODE_LEFT_BOTTOM:
+ rect = new Rect(0, offset, w, h+offset);
+ rectF = new RectF(rect);
+ rectF.right = mTextPaint.measureText(mSlantedText, 0, mSlantedText.length());
+ rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
+ rectF.left += (rect.width() - rectF.right) / 2.0f;
+ rectF.top += (rect.height() - rectF.bottom) / 2.0f;
+
+ xy[0] = rectF.left;
+ xy[1] = rectF.top - mTextPaint.ascent();
+ xy[2] = w / 2;
+ xy[3] = h / 2 + offset;
+ xy[4] = ROTATE_ANGLE;
+ break;
+ case MODE_RIGHT_BOTTOM_TRIANGLE:
+ case MODE_RIGHT_BOTTOM:
+ rect = new Rect(offset, offset, w+offset, h+offset);
+ rectF = new RectF(rect);
+ rectF.right = mTextPaint.measureText(mSlantedText, 0, mSlantedText.length());
+ rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
+ rectF.left += (rect.width() - rectF.right) / 2.0f;
+ rectF.top += (rect.height() - rectF.bottom) / 2.0f;
+ xy[0] = rectF.left;
+ xy[1] = rectF.top - mTextPaint.ascent();
+ xy[2] = w / 2 + offset;
+ xy[3] = h / 2 + offset;
+ xy[4] = -ROTATE_ANGLE;
+ break;
+ }
+ return xy;
+ }
+
+ public SlantedTextView setText(String str) {
+ mSlantedText = str;
+ postInvalidate();
+ return this;
+ }
+
+ public SlantedTextView setText(int res) {
+ String str = getResources().getString(res);
+ if (!TextUtils.isEmpty(str)) {
+ setText(str);
+ }
+ return this;
+ }
+
+ public String getText() {
+ return mSlantedText;
+ }
+
+ public SlantedTextView setSlantedBackgroundColor(int color) {
+ mSlantedBackgroundColor = color;
+ mPaint.setColor(mSlantedBackgroundColor);
+ postInvalidate();
+ return this;
+ }
+
+ public SlantedTextView setTextColor(int color) {
+ mTextColor = color;
+ mTextPaint.setColor(mTextColor);
+ postInvalidate();
+ return this;
+ }
+
+ /**
+ * @param mode :
+ * SlantedTextView.MODE_LEFT : top left
+ * SlantedTextView.MODE_RIGHT :top right
+ * @return this
+ */
+ public SlantedTextView setMode(int mode) {
+ if (mMode > MODE_RIGHT_BOTTOM_TRIANGLE || mMode < 0)
+ throw new IllegalArgumentException(mode + "is illegal argument ,please use right value");
+ this.mMode = mode;
+ postInvalidate();
+ return this;
+ }
+
+ public int getMode() {
+ return mMode;
+ }
+
+ public SlantedTextView setTextSize(int size) {
+ this.mTextSize = size;
+ mTextPaint.setTextSize(mTextSize);
+ postInvalidate();
+ return this;
+ }
+
+ /**
+ * set slanted space length
+ *
+ * @param length
+ * @return this
+ */
+ public SlantedTextView setSlantedLength(int length) {
+ mSlantedLength = length;
+ postInvalidate();
+ return this;
+ }
+
+}
diff --git a/androidslantedtextview/src/main/res/values/attr.xml b/androidslantedtextview/src/main/res/values/attr.xml
new file mode 100644
index 0000000..db0f824
--- /dev/null
+++ b/androidslantedtextview/src/main/res/values/attr.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/src/main/res/values/dimens.xml b/androidslantedtextview/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..78554f9
--- /dev/null
+++ b/androidslantedtextview/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/androidslantedtextview/src/main/res/values/strings.xml b/androidslantedtextview/src/main/res/values/strings.xml
new file mode 100644
index 0000000..7835e09
--- /dev/null
+++ b/androidslantedtextview/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Libary
+
diff --git a/app/libs/zixing_core_3.4.1.jar b/app/libs/zixing_core_3.4.1.jar
new file mode 100644
index 0000000..11f6788
Binary files /dev/null and b/app/libs/zixing_core_3.4.1.jar differ
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityAutoToolbarViewBinding.kt b/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityAutoToolbarViewBinding.kt
index 78cb941..714f20c 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityAutoToolbarViewBinding.kt
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityAutoToolbarViewBinding.kt
@@ -6,6 +6,7 @@ import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import android.content.pm.ApplicationInfo
import android.nfc.NdefMessage
import android.nfc.NfcAdapter
import android.nfc.tech.*
@@ -17,7 +18,6 @@ import android.view.View
import android.widget.Toast
import androidx.viewbinding.ViewBinding
import com.rehome.zhdcoa.App
-import com.rehome.zhdcoa.BuildConfig
import com.rehome.zhdcoa.R
import com.rehome.zhdcoa.bean.UserInfoBean
import com.rehome.zhdcoa.utils.ControllerActivity
@@ -288,7 +288,7 @@ abstract class BaseActivityAutoToolbarViewBinding : AutoLayoutA
}
open fun showLog(logText: String?) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null")
} else {
@@ -296,4 +296,16 @@ abstract class BaseActivityAutoToolbarViewBinding : AutoLayoutA
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+ fun isApkInDebug(context: Context): Boolean {
+ try {
+ val info = context.applicationInfo
+ return (info.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
+ } catch (e: Exception) {
+ return false
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityOaToolbarViewBinding.kt b/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityOaToolbarViewBinding.kt
index a5de17e..7712792 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityOaToolbarViewBinding.kt
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseActivityOaToolbarViewBinding.kt
@@ -6,6 +6,7 @@ import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import android.content.pm.ApplicationInfo
import android.nfc.NdefMessage
import android.nfc.NfcAdapter
import android.nfc.tech.*
@@ -18,7 +19,6 @@ import android.widget.EditText
import android.widget.Toast
import androidx.viewbinding.ViewBinding
import com.rehome.zhdcoa.App
-import com.rehome.zhdcoa.BuildConfig
import com.rehome.zhdcoa.R
import com.rehome.zhdcoa.bean.UserInfoBean
import com.rehome.zhdcoa.utils.ControllerActivity
@@ -339,7 +339,7 @@ abstract class BaseActivityOaToolbarViewBinding : AutoLayoutAct
mToolbar.setTvRightOnClickListener(listenerRightClick)
}
open fun showLog(logText: String?) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null")
} else {
@@ -347,4 +347,16 @@ abstract class BaseActivityOaToolbarViewBinding : AutoLayoutAct
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+ fun isApkInDebug(context: Context): Boolean {
+ try {
+ val info = context.applicationInfo
+ return (info.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
+ } catch (e: Exception) {
+ return false
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseFragment.java b/app/src/main/java/com/rehome/zhdcoa/base/BaseFragment.java
index 738d760..f793f71 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseFragment.java
@@ -2,6 +2,7 @@ package com.rehome.zhdcoa.base;
import android.app.Activity;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import androidx.annotation.Nullable;
@@ -14,7 +15,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
-import com.rehome.zhdcoa.BuildConfig;
+
/**
* Created by Rehome-rjb1 on 2017/5/8.
@@ -84,7 +85,7 @@ public abstract class BaseFragment extends Fragment {
}
public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null");
} else {
@@ -92,4 +93,16 @@ public abstract class BaseFragment extends Fragment {
}
}
}
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseLazyFragment.java b/app/src/main/java/com/rehome/zhdcoa/base/BaseLazyFragment.java
index 88c0ccd..35dddf1 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseLazyFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseLazyFragment.java
@@ -1,6 +1,7 @@
package com.rehome.zhdcoa.base;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -13,7 +14,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
-import com.rehome.zhdcoa.BuildConfig;
+
/**
* Created by ruihong on 2018/4/20.
@@ -210,7 +211,7 @@ public abstract class BaseLazyFragment extends Fragment {
}
public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -218,5 +219,17 @@ public abstract class BaseLazyFragment extends Fragment {
}
}
}
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingActivity.java b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingActivity.java
index 25e9d9c..908e141 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingActivity.java
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingActivity.java
@@ -5,6 +5,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
@@ -19,13 +20,11 @@ import android.os.Bundle;
import android.os.Parcelable;
import androidx.appcompat.widget.Toolbar;
import androidx.viewbinding.ViewBinding;
-
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.rehome.zhdcoa.App;
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.R;
import com.rehome.zhdcoa.bean.UserInfoBean;
import com.rehome.zhdcoa.utils.ControllerActivity;
@@ -277,7 +276,7 @@ public abstract class BaseViewBindingActivity extends Aut
}
public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -285,4 +284,17 @@ public abstract class BaseViewBindingActivity extends Aut
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingFragment.java b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingFragment.java
index 2fc8114..24e3441 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingFragment.java
@@ -1,6 +1,7 @@
package com.rehome.zhdcoa.base;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@@ -14,7 +15,7 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewbinding.ViewBinding;
-import com.rehome.zhdcoa.BuildConfig;
+
/**
* Create By HuangWenFei
@@ -79,7 +80,7 @@ public abstract class BaseViewBindingFragment extends Fra
}
public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -87,4 +88,17 @@ public abstract class BaseViewBindingFragment extends Fra
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingKotlinFragment.kt b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingKotlinFragment.kt
index 5f26f53..766265a 100644
--- a/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingKotlinFragment.kt
+++ b/app/src/main/java/com/rehome/zhdcoa/base/BaseViewBindingKotlinFragment.kt
@@ -2,6 +2,7 @@ package com.rehome.zhdcoa.base
import android.content.Context
+import android.content.pm.ApplicationInfo
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
@@ -11,7 +12,6 @@ import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
-import com.rehome.zhdcoa.BuildConfig
/**
* Create By HuangWenFei
@@ -70,7 +70,7 @@ abstract class BaseViewBindingKotlinFragment : Fragment() {
}
open fun showLog(logText: String?) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(mContext!!)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null")
} else {
@@ -78,4 +78,16 @@ abstract class BaseViewBindingKotlinFragment : Fragment() {
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+ fun isApkInDebug(context: Context): Boolean {
+ try {
+ val info = context.applicationInfo
+ return (info.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
+ } catch (e: Exception) {
+ return false
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/service/PushService.java b/app/src/main/java/com/rehome/zhdcoa/service/PushService.java
index af24819..b534a62 100755
--- a/app/src/main/java/com/rehome/zhdcoa/service/PushService.java
+++ b/app/src/main/java/com/rehome/zhdcoa/service/PushService.java
@@ -7,6 +7,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
@@ -15,13 +16,10 @@ import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.WindowManager;
-
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-
import com.rehome.zhdcoa.App;
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.DBModel.Ajhjh;
import com.rehome.zhdcoa.DBModel.AjhjhList;
@@ -414,9 +412,10 @@ public class PushService extends IntentService {
File apkFile = new File(PATH + FILENAME);
+ String applicationId = App.getApplicationId(PushService.this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- Uri contentUri = FileProvider.getUriForFile(PushService.this, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
+ Uri contentUri = FileProvider.getUriForFile(PushService.this, applicationId + ".fileProvider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
@@ -501,7 +500,7 @@ public class PushService extends IntentService {
return null;
}
public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(this)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -509,4 +508,17 @@ public class PushService extends IntentService {
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/ActivitySHYK.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/ActivitySHYK.java
index d8ebcd3..1047753 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/ActivitySHYK.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/ActivitySHYK.java
@@ -1,14 +1,18 @@
package com.rehome.zhdcoa.ui.activity;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
+import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
-import com.king.zxing.Intents;
+//import com.king.zxing.Intents;
+//import com.king.zxing.util.CodeUtils;
+
import com.king.zxing.util.CodeUtils;
import com.rehome.zhdcoa.Api;
import com.rehome.zhdcoa.App;
@@ -19,10 +23,17 @@ import com.rehome.zhdcoa.base.BaseCallBack;
import com.rehome.zhdcoa.bean.QDListBean;
import com.rehome.zhdcoa.bean.xxResultBean;
import com.rehome.zhdcoa.ui.toastview.toastviewbymyself;
+import com.rehome.zhdcoa.utils.FileUtils;
import com.rehome.zhdcoa.utils.GsonUtils;
import com.rehome.zhdcoa.utils.HttpUtils;
import com.rehome.zhdcoa.utils.UriUtils;
+import com.rehome.zhdcoa.zxing.decoding.Intents;
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -30,8 +41,13 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.content.FileProvider;
+
+import cn.hutool.core.io.IoUtil;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Call;
@@ -47,6 +63,7 @@ public class ActivitySHYK extends BaseActivity {
public static final String KEY_IS_CONTINUOUS = "key_continuous_scan";
public static final int REQUEST_CODE_SCAN = 0X01;
+ private String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "com.rehome.zhdcoa/images";
ListView lv;
private List datas;
@@ -81,17 +98,23 @@ public class ActivitySHYK extends BaseActivity {
ActivityCompat.startActivityForResult(ActivitySHYK.this,intent,REQUEST_CODE_SCAN,optionsCompat.toBundle());
// Intent intent = new Intent(ActivitySHYK.this, MipcaActivityCapture.class);
-// startActivityForResult(intent, 1);
+// startActivityForResult(intent, REQUEST_CODE_SCAN);
} else if (position == 1) {
startPhotoCode();
} else if (position == 2) {
Intent intent = new Intent(ActivitySHYK.this, DydhinfoSaveDataActivity.class);
startActivity(intent);
}
- })
- .show();
+ }).show();
}
});
+
+ //android 10 以上
+ if (context.getExternalFilesDir(null) != null) {
+ path = Objects.requireNonNull(context.getExternalFilesDir(null)).getPath() + "/images";
+ } else {
+ path = context.getFilesDir().getPath() + "/images";
+ }
}
@Override
@@ -170,6 +193,7 @@ public class ActivitySHYK extends BaseActivity {
case REQUEST_CODE_SCAN:
String scanResult = data.getStringExtra(Intents.Scan.RESULT);
if (scanResult != null) {
+ showLog(scanResult);
UploadQD(scanResult);
}
break;
@@ -182,17 +206,83 @@ public class ActivitySHYK extends BaseActivity {
}
private void parsePhoto(Intent data) {
- final String path = UriUtils.getImagePath(this, data);
- if (TextUtils.isEmpty(path)) {
+ final String pathPhoto = UriUtils.getImagePath(this, data);
+ showLog(pathPhoto);
+ if (TextUtils.isEmpty(pathPhoto)) {
return;
}
- asyncThread(() -> {
- final String result = CodeUtils.parseCode(path);
- runOnUiThread(() -> {
- UploadQD(result);
- });
- });
+ String fileName = FileUtils.getFileNameByPath(pathPhoto);
+ this.deleteFileIfNeed(path, fileName);
+ String applicationId = App.getApplicationId(context);
+
+ InputStream fis = null;
+ OutputStream out = null;
+
+ try {
+ File fos = this.createFileIfNeed(path, fileName);
+ Uri uriOut = FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
+ out = getContentResolver().openOutputStream(uriOut);
+ fis = getContentResolver().openInputStream(data.getData());
+ IoUtil.copy(fis, out);
+
+ if(fos!=null&&fos.getPath()!=null){
+ //从像册选择二维码
+ asyncThread(() -> {
+ final String result = CodeUtils.parseCode(fos.getPath());
+ runOnUiThread(() -> {
+ showLog(result);
+ if(result==null){
+ showToast("无法识别到二维码");
+ }else{
+ UploadQD(result);
+ }
+ });
+ });
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (fis != null) {
+ try {
+ fis.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ // 在sd卡中创建一保存图片(原图和缩略图共用的)文件夹
+ public File createFileIfNeed(String dirPath, String fileName) throws IOException {
+ File fileDir = new File(dirPath);
+ if (!fileDir.exists()) {
+ fileDir.mkdirs();
+ }
+ File file = new File(fileDir, fileName);
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ return file;
+ }
+
+ // 在app外置存储私有文件目录中删除文件
+ public void deleteFileIfNeed(String dirPath, String fileName) {
+ File fileDir = new File(dirPath);
+ if (fileDir.exists()) {
+ File file = new File(fileDir, fileName);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
}
private void asyncThread(Runnable runnable) {
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_Datijieqi.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_Datijieqi.java
index 1d020d6..6fd1252 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_Datijieqi.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_Datijieqi.java
@@ -352,28 +352,47 @@ public class Activity_Datijieqi extends BaseActivity {
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- switch (v.getId()) {
- case R.id.rb_left://上一题
- if (mCurrentViewID != 0) {
- mCurrentViewID--;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration -= 20;
- mScroller.setmDuration(mMyDuration);
- break;
- case R.id.rb_right://下一题
- if (mCurrentViewID != PAGER_NUM - 1) {
- mCurrentViewID++;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration += 20;
- mScroller.setmDuration(mMyDuration);
- break;
-
- case R.id.rb_check:
-// showToast("查看题库");
- break;
+ if(v.getId()==R.id.rb_left){
+ if (mCurrentViewID != 0) {
+ mCurrentViewID--;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration -= 20;
+ mScroller.setmDuration(mMyDuration);
}
+ if(v.getId()==R.id.rb_right){
+ if (mCurrentViewID != PAGER_NUM - 1) {
+ mCurrentViewID++;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration += 20;
+ mScroller.setmDuration(mMyDuration);
+ }
+ if(v.getId()==R.id.rb_check){
+ //showToast("查看题库");
+ }
+// switch (v.getId()) {
+// case R.id.rb_left://上一题
+// if (mCurrentViewID != 0) {
+// mCurrentViewID--;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration -= 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+// case R.id.rb_right://下一题
+// if (mCurrentViewID != PAGER_NUM - 1) {
+// mCurrentViewID++;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration += 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+//
+// case R.id.rb_check:
+//// showToast("查看题库");
+// break;
+// }
}
};
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_PracticeOnline.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_PracticeOnline.java
index e4c8929..264f7fa 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_PracticeOnline.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_PracticeOnline.java
@@ -480,29 +480,49 @@ public class Activity_PracticeOnline extends BaseActivity {
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- switch (v.getId()) {
- case R.id.rb_left://上一题
- if (mCurrentViewID != 0) {
- mCurrentViewID--;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration -= 20;
- mScroller.setmDuration(mMyDuration);
- break;
- case R.id.rb_right://下一题
- if (mCurrentViewID != PAGER_NUM - 1) {
- mCurrentViewID++;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration += 20;
- mScroller.setmDuration(mMyDuration);
- break;
-
- case R.id.rb_check:
-// showToast("查看题库");
- break;
+ if(v.getId()==R.id.rb_left){
+ if (mCurrentViewID != 0) {
+ mCurrentViewID--;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration -= 20;
+ mScroller.setmDuration(mMyDuration);
+ }
+ if(v.getId()==R.id.rb_right){
+ if (mCurrentViewID != PAGER_NUM - 1) {
+ mCurrentViewID++;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration += 20;
+ mScroller.setmDuration(mMyDuration);
+ }
+ if(v.getId()==R.id.rb_check){
+ //showToast("查看题库");
}
+// switch (v.getId()) {
+// case R.id.rb_left://上一题
+// if (mCurrentViewID != 0) {
+// mCurrentViewID--;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration -= 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+// case R.id.rb_right://下一题
+// if (mCurrentViewID != PAGER_NUM - 1) {
+// mCurrentViewID++;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration += 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+//
+// case R.id.rb_check:
+//// showToast("查看题库");
+// break;
+// }
+
}
};
private final ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_ProduceExamOnline.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_ProduceExamOnline.java
index 7449118..2560e70 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_ProduceExamOnline.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/Activity_ProduceExamOnline.java
@@ -405,28 +405,48 @@ public class Activity_ProduceExamOnline extends BaseActivity {
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- switch (v.getId()) {
- case R.id.rb_left://上一题
- if (mCurrentViewID != 0) {
- mCurrentViewID--;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration -= 20;
- mScroller.setmDuration(mMyDuration);
- break;
- case R.id.rb_right://下一题
- if (mCurrentViewID != PAGER_NUM - 1) {
- mCurrentViewID++;
- vp.setCurrentItem(mCurrentViewID, true);
- }
- mMyDuration += 20;
- mScroller.setmDuration(mMyDuration);
- break;
-
- case R.id.rb_check:
-// showToast("查看题库");
- break;
+ if(v.getId()==R.id.rb_left){
+ if (mCurrentViewID != 0) {
+ mCurrentViewID--;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration -= 20;
+ mScroller.setmDuration(mMyDuration);
+ }
+ if(v.getId()==R.id.rb_left){
+ if (mCurrentViewID != PAGER_NUM - 1) {
+ mCurrentViewID++;
+ vp.setCurrentItem(mCurrentViewID, true);
+ }
+ mMyDuration += 20;
+ mScroller.setmDuration(mMyDuration);
}
+ if(v.getId()==R.id.rb_left){
+ //showToast("查看题库");
+ }
+
+// switch (v.getId()) {
+// case R.id.rb_left://上一题
+// if (mCurrentViewID != 0) {
+// mCurrentViewID--;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration -= 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+// case R.id.rb_right://下一题
+// if (mCurrentViewID != PAGER_NUM - 1) {
+// mCurrentViewID++;
+// vp.setCurrentItem(mCurrentViewID, true);
+// }
+// mMyDuration += 20;
+// mScroller.setmDuration(mMyDuration);
+// break;
+//
+// case R.id.rb_check:
+//// showToast("查看题库");
+// break;
+// }
}
};
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhFragment.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhFragment.java
index 2824a0b..674fd36 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhFragment.java
@@ -96,19 +96,29 @@ public class AjhFragment extends BaseFragment {
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
-
- switch (checkedId) {
- case R.id.rb1:
- rb1.setTextColor(getResources().getColor(R.color.btn));
- rb2.setTextColor(Color.GRAY);
- vp.setCurrentItem(0, false);
- break;
- case R.id.rb2:
- rb2.setTextColor(getResources().getColor(R.color.btn));
- rb1.setTextColor(Color.GRAY);
- vp.setCurrentItem(1, false);
- break;
+ if(checkedId==R.id.rb1){
+ rb1.setTextColor(getResources().getColor(R.color.btn));
+ rb2.setTextColor(Color.GRAY);
+ vp.setCurrentItem(0, false);
}
+ if(checkedId==R.id.rb2){
+ rb2.setTextColor(getResources().getColor(R.color.btn));
+ rb1.setTextColor(Color.GRAY);
+ vp.setCurrentItem(1, false);
+ }
+
+// switch (checkedId) {
+// case R.id.rb1:
+// rb1.setTextColor(getResources().getColor(R.color.btn));
+// rb2.setTextColor(Color.GRAY);
+// vp.setCurrentItem(0, false);
+// break;
+// case R.id.rb2:
+// rb2.setTextColor(getResources().getColor(R.color.btn));
+// rb1.setTextColor(Color.GRAY);
+// vp.setCurrentItem(1, false);
+// break;
+// }
}
});
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhxcDetaliFragment.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhxcDetaliFragment.java
index 27d3c44..b1adc30 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhxcDetaliFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/AjhxcDetaliFragment.java
@@ -27,7 +27,7 @@ import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
-import com.rehome.zhdcoa.BuildConfig;
+;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.DBModel.Ajhxcjs;
import com.rehome.zhdcoa.DBModel.Ajhxzrwqy;
@@ -277,7 +277,8 @@ public class AjhxcDetaliFragment extends BaseFragment {
uri = Uri.fromFile(fos);
uriTakePic = uri;
} else {
- uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ String applicationId = App.getApplicationId(context);
+ uri = FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
uriTakePic = uri;
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpScActivity.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpScActivity.java
index 445c041..c5ed691 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpScActivity.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpScActivity.java
@@ -85,7 +85,7 @@ import com.luck.picture.lib.utils.SandboxTransformUtils;
import com.luck.picture.lib.utils.StyleUtils;
import com.luck.picture.lib.utils.ToastUtils;
import com.luck.picture.lib.widget.MediumBoldTextView;
-import com.rehome.zhdcoa.BuildConfig;
+;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.Listener.GlideEngine;
import com.rehome.zhdcoa.Listener.ImageLoaderUtils;
@@ -246,6 +246,8 @@ public class WztpScActivity extends BaseActivity2 {
private ActivityResultLauncher launcherResult;
+
+
private void findView() {
etHgtm = findViewById(R.id.et_hgtm);
tvSys = findViewById(R.id.tv_sys);
@@ -1307,10 +1309,11 @@ public class WztpScActivity extends BaseActivity2 {
* @throws IOException
*/
private void cropFromTake(String name, int flag) throws IOException {
+ String applicationId = App.getApplicationId(context);
stFileName = name + ".jpg";
this.deleteFileIfNeed(path, stFileName);
File fos = this.createFileIfNeed(path, stFileName);
- Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ Uri uri = FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
uriTakePicSt = uri;
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
@@ -1326,11 +1329,12 @@ public class WztpScActivity extends BaseActivity2 {
* @throws IOException
*/
private void cropFromTakeFjt(String name, int flag) throws IOException {
+ String applicationId = App.getApplicationId(context);
fjtFileName = name + ".jpg";
this.deleteFileIfNeed(path, fjtFileName);
File fos = this.createFileIfNeed(path, fjtFileName);
- Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ Uri uri = FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
uriTakePicFjt = uri;
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
@@ -1345,16 +1349,17 @@ public class WztpScActivity extends BaseActivity2 {
* @return
*/
private Uri uriToExternalFile(Uri uri, String filename) {
+ String applicationId = App.getApplicationId(context);
//this.deleteFileIfNeed(path, filename);
InputStream fis = null;
OutputStream out = null;
try {
File fos = this.createFileIfNeed(path, filename);
- Uri uriOut = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ Uri uriOut = FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
out = getContentResolver().openOutputStream(uriOut);
fis = getContentResolver().openInputStream(uri);
IoUtil.copy(fis, out);
- return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ return FileProvider.getUriForFile(context, applicationId + ".fileprovider", fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
@@ -1446,8 +1451,9 @@ public class WztpScActivity extends BaseActivity2 {
* @throws IOException
*/
private void startPhotoZoom(Uri uri, String fileName, int flags) throws IOException {
+ String applicationId = App.getApplicationId(context);
File CropPhoto = this.createFileIfNeed(path, fileName);
- uriTakePicOutputSt = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", CropPhoto);
+ uriTakePicOutputSt = FileProvider.getUriForFile(context, applicationId + ".fileprovider", CropPhoto);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
@@ -1478,8 +1484,9 @@ public class WztpScActivity extends BaseActivity2 {
* @throws IOException
*/
private void startPhotoZoomFjt(Uri uri, String fileName, int flags) throws IOException {
+ String applicationId = App.getApplicationId(context);
File CropPhoto = this.createFileIfNeed(path, fileName);
- uriTakePicOutputFjt = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", CropPhoto);
+ uriTakePicOutputFjt = FileProvider.getUriForFile(context, applicationId + ".fileprovider", CropPhoto);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpblScDetailActivity.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpblScDetailActivity.java
index c2bfa99..fb3b697 100644
--- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpblScDetailActivity.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WztpblScDetailActivity.java
@@ -98,7 +98,7 @@ import com.luck.picture.lib.utils.SandboxTransformUtils;
import com.luck.picture.lib.utils.StyleUtils;
import com.luck.picture.lib.utils.ToastUtils;
import com.luck.picture.lib.widget.MediumBoldTextView;
-import com.rehome.zhdcoa.BuildConfig;
+;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.Listener.GlideEngine;
import com.rehome.zhdcoa.Listener.ImageLoaderUtils;
@@ -1114,11 +1114,12 @@ public class WztpblScDetailActivity extends BaseActivityOaToolbarViewBinding() {
showLog(GridViewDialog.TAG_AF)
+
+ var results: Array = App.getInstance().userInfo.permissionsResult.split(";".toRegex())
+ .dropLastWhile { it.isEmpty() }
+ .toTypedArray()
+
+ for (result in results) {
+ showLog("---------------->>>>")
+ showLog(result)
+ }
+
}
override fun initData() {
@@ -280,7 +291,7 @@ class HomeFragment : BaseViewBindingFragment() {
Intent(activity, DJExamOnlineActivity::class.java) //在线考试
}
if (tag == "OrdinaryVisit_SH" || tag == "ApplyConference_YLB" || tag == "EveryDayTask" || tag == "TaskCountActivity" || tag == "ConferenceAudioActivity") {
- startActivity(intent)
+ startActivity(intent!!)
} else {
intent!!.putExtra(Contans.KEY.ISEDIT, false)
launcherResultADD.launch(intent)
diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/MineFragment.java b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/MineFragment.java
index 240fde6..c8866a1 100755
--- a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/MineFragment.java
+++ b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/MineFragment.java
@@ -46,7 +46,7 @@ import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.interfaces.OnResultCallbackListener;
import com.rehome.zhdcoa.App;
-import com.rehome.zhdcoa.BuildConfig;
+;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.Listener.GlideEngine;
import com.rehome.zhdcoa.R;
@@ -98,6 +98,8 @@ public class MineFragment extends BaseLazyFragment {
private ActivityResultLauncher launcherResultEmoji;
+
+
CircleImageView civHead;
TextView tvName;
TextView tvMentions;
@@ -847,9 +849,10 @@ public class MineFragment extends BaseLazyFragment {
* @throws IOException
*/
private void cropFromTake() throws IOException {
+ String applicationId = App.getApplicationId(context);
this.deleteFileIfNeed(path, fileName);
File fos = this.createFileIfNeed(path, fileName);
- Uri uri = FileProvider.getUriForFile(requireActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ Uri uri = FileProvider.getUriForFile(requireActivity(), applicationId + ".fileprovider", fos);
uriTakePic = uri;
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
@@ -972,12 +975,13 @@ public class MineFragment extends BaseLazyFragment {
InputStream fis = null;
OutputStream out = null;
try {
+ String applicationId = App.getApplicationId(context);
File fos = this.createFileIfNeed(path, filename);
- Uri uriOut=FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ Uri uriOut=FileProvider.getUriForFile(getActivity(), applicationId + ".fileprovider", fos);
out = getActivity().getContentResolver().openOutputStream(uriOut);
fis = getActivity().getContentResolver().openInputStream(uri);
IoUtil.copy(fis,out);
- return FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", fos);
+ return FileProvider.getUriForFile(getActivity(), applicationId + ".fileprovider", fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
@@ -1007,8 +1011,9 @@ public class MineFragment extends BaseLazyFragment {
* @throws IOException
*/
private void startPhotoZoom(Uri uri, String fileName, int flags) throws IOException {
+ String applicationId = App.getApplicationId(context);
File CropPhoto = this.createFileIfNeed(path, fileName);
- uriTakePicOutput = FileProvider.getUriForFile(requireActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", CropPhoto);
+ uriTakePicOutput = FileProvider.getUriForFile(requireActivity(), applicationId + ".fileprovider", CropPhoto);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginAIUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginAIUtils.java
index 33da506..bd48773 100644
--- a/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginAIUtils.java
+++ b/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginAIUtils.java
@@ -2,25 +2,18 @@ package com.rehome.zhdcoa.utils;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.text.TextUtils;
import android.util.Log;
-
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.bean.UserAuthenticationAIBean;
-import com.yolanda.nohttp.Headers;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.RequestMethod;
import com.yolanda.nohttp.rest.Request;
import com.yolanda.nohttp.rest.Response;
-
import static com.rehome.zhdcoa.utils.GsonUtils.GsonToBean;
-
-import java.net.HttpCookie;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
@@ -67,17 +60,17 @@ public class AuthenticationLoginAIUtils {
@Override
public void onSucceed(int what, Response response) {
- showLog("----------------");
+ showLog("----------------",context);
String result = response.get();
- showLog(result);
+ showLog(result,context);
String jsonDecode = RSAUtils.decryptBASE64StrClient(result);
if (TextUtils.isEmpty(jsonDecode)) {
//解密失败
- showLog("APP解密失败");
+ showLog("APP解密失败",context);
listener.onAuthenticationSuccess(false, "");
} else {
- showLog(jsonDecode);
+ showLog(jsonDecode,context);
UserAuthenticationAIBean bean = GsonToBean(jsonDecode, UserAuthenticationAIBean.class);
if (bean != null) {
if (bean.isSuccess()) {//登录成功
@@ -92,19 +85,19 @@ public class AuthenticationLoginAIUtils {
} else {
listener.onAuthenticationSuccess(false, "");
if (bean.getFlag() == -2) {
- showLog("没有传参");
+ showLog("没有传参",context);
}
if (bean.getFlag() == -3) {
- showLog("服务器解密失败");
+ showLog("服务器解密失败",context);
}
if (bean.getFlag() == -4) {
- showLog("Json 格式不正确");
+ showLog("Json 格式不正确",context);
}
if (bean.getFlag() == -5) {
- showLog("账号密码不能为空");
+ showLog("账号密码不能为空",context);
}
if (bean.getFlag() == -6) {
- showLog("账号或密码错误");
+ showLog("账号或密码错误",context);
}
}
}
@@ -140,14 +133,14 @@ public class AuthenticationLoginAIUtils {
@Override
public void onFailed(int what, Response response) {
- showLog("onFailed");
+ showLog("onFailed",context);
listener.onAuthenticationSuccess(false, "");
}
});
}
- public static void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ public static void showLog(String logText,Context context) {
+ if (isApkInDebug(context)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null");
} else {
@@ -155,4 +148,17 @@ public class AuthenticationLoginAIUtils {
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginUtils.java
index 2338d01..2e2e5ef 100644
--- a/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginUtils.java
+++ b/app/src/main/java/com/rehome/zhdcoa/utils/AuthenticationLoginUtils.java
@@ -3,9 +3,10 @@ package com.rehome.zhdcoa.utils;
import static com.luck.picture.lib.utils.ToastUtils.showToast;
import android.app.Activity;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.text.TextUtils;
import android.util.Log;
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.Contans;
import com.rehome.zhdcoa.R;
import com.rehome.zhdcoa.bean.UserAuthenticationBean;
@@ -32,8 +33,8 @@ public class AuthenticationLoginUtils {
params.put("userid",username);
params.put("password",password);
String json = GsonUtils.GsonString(params);
- showLog("----------authenticationLogin------------");
- showLog(json);
+ showLog("----------authenticationLogin------------",context);
+ showLog(json,context);
//showLog(base64Password);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -51,7 +52,7 @@ public class AuthenticationLoginUtils {
// showLog("fail");
// }
- showLog(jsonEncrypt);
+ showLog(jsonEncrypt,context);
final Request request = NoHttp.createStringRequest(Contans.BASE_URL_COMPANY_SERVER + Contans.ZHAF_LOGIN_URL, RequestMethod.POST);
@@ -64,17 +65,17 @@ public class AuthenticationLoginUtils {
public void onSucceed(int what, Response response) {
String jsonResult = response.get();
- showLog("----------onSucceed------------");
- showLog(jsonResult);
+ showLog("----------onSucceed------------",context);
+ showLog(jsonResult,context);
String jsonDecode = RSAUtils.decryptBASE64StrClient(jsonResult);
//String jsonDecode = RSAUtils.decryptBASE64StrClient("ddDHqrKCDOV3XhuiCrTWoksKWc+oh4np6BjS+ETBBa9E07GGUPCjYcuHSPIengyUntr/xz/iKcY93FiF/J+tqvmjtX6vI2OkrRYb79FHPqBdjCAwFz4GO/dRRgmjA9w2y7JL501oArG8Be+rekrNpf2Zr+yxAK9/fR6biDPd9ATsy8E5fOhurJKFYTJnCof+Y5WeP1nijy36K55EUGT5XMbzY92z/f8sXuTe3J3xPsJYNE6taM37op2ErI65dfO9CkIU3q7gxyQFjkz7iQrn6OrEySWtKBFwwvcDUv6VcrFs7vve7jXUkjlSfIN02XXYVBXdFi/mbKuUZVz69UmIxmlL/7yeKyQaiG2dEKCthzhx48F3g/jPRGmdIUJjnw4wdL2fHaDinXJyBGkv+LRKUg77SNzny20qBlyoxhZSO4IUJEbuctQzDt672lBFtfQH8dWgOYC++wfiT8l6hyCfkEFP2MzCBWta1a5UTRDv1gA39Axji7xhR8e+qwNo8QtgYqzI9rusc/g8aRpUDLEeCUVa8xLl2u55n33XR6ZuKRBB8/5ti8cxny4lEIp4kDeyNtgxsDz2HK6rZa8T7541tF/o9g/eKGexppi+8AtIAzC/MJ8cLj55KzCyHvW5IjWb6E9ipLqyqHbDE32K/OlRTM1cuSjod9y00uRy2FqYnbU=");
- showLog(jsonDecode);
+ showLog(jsonDecode,context);
if (TextUtils.isEmpty(jsonDecode)) {
- showLog(UiUtlis.getString(context, R.string.data_error));
+ showLog(UiUtlis.getString(context, R.string.data_error),context);
} else {
UserAuthenticationBean bean = GsonUtils.GsonToBean(jsonDecode,UserAuthenticationBean.class);
- showLog(GsonUtils.GsonString(bean));
+ showLog(GsonUtils.GsonString(bean),context);
if (bean != null) {
if (bean.isResult()) {
//登录成功
@@ -143,8 +144,8 @@ public class AuthenticationLoginUtils {
// }
// });
}
- public static void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ public static void showLog(String logText,Context context) {
+ if (isApkInDebug(context)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -152,4 +153,17 @@ public class AuthenticationLoginUtils {
}
}
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/BitmapCompressUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/BitmapCompressUtils.java
index 0377416..d223bc0 100644
--- a/app/src/main/java/com/rehome/zhdcoa/utils/BitmapCompressUtils.java
+++ b/app/src/main/java/com/rehome/zhdcoa/utils/BitmapCompressUtils.java
@@ -1,11 +1,12 @@
package com.rehome.zhdcoa.utils;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.util.Log;
-import com.rehome.zhdcoa.BuildConfig;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -59,8 +60,6 @@ public class BitmapCompressUtils {
newOpts.inSampleSize = be;// 设置缩放比例
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
- showLog("---------------");
- showLog("w:"+String.valueOf(bitmap.getWidth()) + " h:" + bitmap.getHeight());
return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
}
/**
@@ -84,8 +83,6 @@ public class BitmapCompressUtils {
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
- showLog("---------------");
- showLog("w:"+String.valueOf(w) + " h:" + h);
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
// float hh = 800f;// 这里设置高度为800f
// float ww = 480f;// 这里设置宽度为480f
@@ -105,19 +102,7 @@ public class BitmapCompressUtils {
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
- showLog("---------------");
- showLog("w:"+String.valueOf(bitmap.getWidth()) + " h:" + bitmap.getHeight());
return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
//return bitmap;
}
-
- public static void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
- if(TextUtils.isEmpty(logText)){
- Log.i("app", "logText is null");
- }else{
- Log.i("app", logText);
- }
- }
- }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java
index b560750..8d51806 100644
--- a/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java
+++ b/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java
@@ -1,16 +1,13 @@
package com.rehome.zhdcoa.utils;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.text.TextUtils;
import android.util.Log;
-
import androidx.annotation.NonNull;
-
import com.rehome.zhdcoa.Api;
import com.rehome.zhdcoa.App;
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.Contans;
-
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@@ -202,7 +199,7 @@ public class HttpUtils {
}
public static void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ if (isApkInDebug(context)) {
if (TextUtils.isEmpty(logText)) {
Log.i("app", "logText is null");
} else {
@@ -315,4 +312,16 @@ public class HttpUtils {
};
}
}
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java
index 1008e58..187e9b1 100644
--- a/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java
+++ b/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java
@@ -2,12 +2,10 @@ package com.rehome.zhdcoa.utils;
import android.app.Activity;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.text.TextUtils;
import android.util.Log;
-
-import com.google.gson.Gson;
import com.rehome.zhdcoa.App;
-import com.rehome.zhdcoa.BuildConfig;
import com.rehome.zhdcoa.R;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.download.DownloadQueue;
@@ -81,7 +79,7 @@ public class NohttpUtils {
String token = App.getInstance().getUserInfo().getToken();
String credential = "Bearer " + token;
request.addHeader("Authorization", credential);
- showLog(request.url());
+ showLog(request.url(),mActivity);
// showLog(credential);
// showLog(new Gson().toJson(request.headers()));
}
@@ -104,7 +102,7 @@ public class NohttpUtils {
if(token!=null){
String credential = "Bearer " + token;
request.addHeader("Authorization", credential);
- showLog(request.url());
+ showLog(request.url(),mActivity);
}
mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg));
}
@@ -115,7 +113,7 @@ public class NohttpUtils {
String token = App.getInstance().getUserInfo().getToken();
String credential = "Bearer " + token;
request.addHeader("Authorization", credential);
- showLog(request.url());
+ showLog(request.url(),mActivity);
// showLog(credential);
// showLog(new Gson().toJson(request.headers()));
}
@@ -127,7 +125,7 @@ public class NohttpUtils {
String token = App.getInstance().getUserInfo().getToken();
String credential = "Bearer " + token;
request.addHeader("Authorization", credential);
- showLog(request.url());
+ showLog(request.url(),mActivity);
// showLog(credential);
// showLog(new Gson().toJson(request.headers()));
}
@@ -139,15 +137,15 @@ public class NohttpUtils {
String token = App.getInstance().getUserInfo().getToken();
String credential = "Bearer " + token;
request.addHeader("Authorization", credential);
- showLog(request.url());
+ showLog(request.url(), context);
// showLog(credential);
// showLog(new Gson().toJson(request.headers()));
}
mQueue.add(what, request, new HttpResponseListenerNoProgress(request, callback));
}
- public void showLog(String logText) {
- if (BuildConfig.LOG_ERROR) {
+ public void showLog(String logText,Context context) {
+ if (isApkInDebug(context)) {
if(TextUtils.isEmpty(logText)){
Log.i("app", "logText is null");
}else{
@@ -203,4 +201,17 @@ public class NohttpUtils {
}
return null;
}
+
+ /**
+ * 判断当前应用是否是debug状态
+ */
+
+ public static boolean isApkInDebug(Context context) {
+ try {
+ ApplicationInfo info = context.getApplicationInfo();
+ return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
}
diff --git a/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/CaptureActivityHandler.java b/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/CaptureActivityHandler.java
index 7dec865..fa49128 100755
--- a/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/CaptureActivityHandler.java
+++ b/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/CaptureActivityHandler.java
@@ -64,48 +64,86 @@ public final class CaptureActivityHandler extends Handler {
@Override
public void handleMessage(Message message) {
- switch (message.what) {
- case R.id.auto_focus:
- //Log.d(TAG, "Got auto-focus message");
- // When one auto focus pass finishes, start another. This is the closest thing to
- // continuous AF. It does seem to hunt background bit, but I'm not sure what else to do.
- if (state == State.PREVIEW) {
- CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
- }
- break;
- case R.id.restart_preview:
- Log.d(TAG, "Got restart preview message");
- restartPreviewAndDecode();
- break;
- case R.id.decode_succeeded:
- Log.d(TAG, "Got decode succeeded message");
- state = State.SUCCESS;
- Bundle bundle = message.getData();
-
- /***********************************************************************/
- Bitmap barcode = bundle == null ? null :
- (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);//���ñ����߳�
-
- activity.handleDecode((Result) message.obj, barcode);//���ؽ��? /***********************************************************************/
- break;
- case R.id.decode_failed:
- // We're decoding as fast as possible, so when one decode fails, start another.
- state = State.PREVIEW;
- CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
- break;
- case R.id.return_scan_result:
- Log.d(TAG, "Got return scan result message");
- activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
- activity.finish();
- break;
- case R.id.launch_product_query:
- Log.d(TAG, "Got product query message");
- String url = (String) message.obj;
- Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- activity.startActivity(intent);
- break;
+ if(message.what==R.id.auto_focus){
+ //Log.d(TAG, "Got auto-focus message");
+ // When one auto focus pass finishes, start another. This is the closest thing to
+ // continuous AF. It does seem to hunt background bit, but I'm not sure what else to do.
+ if (state == State.PREVIEW) {
+ CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
+ }
}
+ if(message.what==R.id.restart_preview){
+ restartPreviewAndDecode();
+ }
+ if(message.what==R.id.decode_succeeded){
+ state = State.SUCCESS;
+ Bundle bundle = message.getData();
+
+ /***********************************************************************/
+ Bitmap barcode = bundle == null ? null :
+ (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);//���ñ����߳�
+
+ activity.handleDecode((Result) message.obj, barcode);
+ }
+ if(message.what==R.id.decode_failed){
+ state = State.PREVIEW;
+ CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
+ }
+ if(message.what==R.id.return_scan_result){
+ activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
+ activity.finish();
+ }
+ if(message.what==R.id.launch_product_query){
+ String url = (String) message.obj;
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ activity.startActivity(intent);
+ }
+
+
+// switch (message.what) {
+// case R.id.auto_focus:
+// //Log.d(TAG, "Got auto-focus message");
+// // When one auto focus pass finishes, start another. This is the closest thing to
+// // continuous AF. It does seem to hunt background bit, but I'm not sure what else to do.
+// if (state == State.PREVIEW) {
+// CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
+// }
+// break;
+// case R.id.restart_preview:
+// Log.d(TAG, "Got restart preview message");
+// restartPreviewAndDecode();
+// break;
+// case R.id.decode_succeeded:
+// Log.d(TAG, "Got decode succeeded message");
+// state = State.SUCCESS;
+// Bundle bundle = message.getData();
+//
+// /***********************************************************************/
+// Bitmap barcode = bundle == null ? null :
+// (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);//���ñ����߳�
+//
+// activity.handleDecode((Result) message.obj, barcode);
+// //���ؽ��? /***********************************************************************/
+// break;
+// case R.id.decode_failed:
+// // We're decoding as fast as possible, so when one decode fails, start another.
+// state = State.PREVIEW;
+// CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
+// break;
+// case R.id.return_scan_result:
+// Log.d(TAG, "Got return scan result message");
+// activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
+// activity.finish();
+// break;
+// case R.id.launch_product_query:
+// Log.d(TAG, "Got product query message");
+// String url = (String) message.obj;
+// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+// activity.startActivity(intent);
+// break;
+// }
}
public void quitSynchronously() {
diff --git a/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/DecodeHandler.java b/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/DecodeHandler.java
index ca6d459..70f1e8c 100755
--- a/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/DecodeHandler.java
+++ b/app/src/main/java/com/rehome/zhdcoa/zxing/decoding/DecodeHandler.java
@@ -17,6 +17,7 @@
package com.rehome.zhdcoa.zxing.decoding;
+import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -31,6 +32,7 @@ import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.rehome.zhdcoa.R;
import com.rehome.zhdcoa.ui.activity.MipcaActivityCapture;
+import com.rehome.zhdcoa.ui.activity.YcryxzActivity;
import com.rehome.zhdcoa.zxing.camera.CameraManager;
import com.rehome.zhdcoa.zxing.camera.PlanarYUVLuminanceSource;
@@ -51,15 +53,21 @@ final class DecodeHandler extends Handler {
@Override
public void handleMessage(Message message) {
- switch (message.what) {
- case R.id.decode:
- //Log.d(TAG, "Got decode message");
- decode((byte[]) message.obj, message.arg1, message.arg2);
- break;
- case R.id.quit:
- Looper.myLooper().quit();
- break;
+ if(message.what==R.id.decode){
+ decode((byte[]) message.obj, message.arg1, message.arg2);
}
+ if(message.what==R.id.quit){
+ Looper.myLooper().quit();
+ }
+// switch (message.what) {
+// case R.id.decode:
+// //Log.d(TAG, "Got decode message");
+// decode((byte[]) message.obj, message.arg1, message.arg2);
+// break;
+// case R.id.quit:
+// Looper.myLooper().quit();
+// break;
+// }
}
/**
diff --git a/app/src/main/res/layout/activity_work_risk_list.xml b/app/src/main/res/layout/activity_work_risk_list.xml
index 770e683..3a95be4 100644
--- a/app/src/main/res/layout/activity_work_risk_list.xml
+++ b/app/src/main/res/layout/activity_work_risk_list.xml
@@ -82,6 +82,7 @@
android:gravity="center|right"
android:layout_weight="1"
android:textSize="20sp"
+ android:textColor="#0099ff"
android:text="A:" />
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build.gradle b/autolayout/build.gradle
new file mode 100644
index 0000000..3986e80
--- /dev/null
+++ b/autolayout/build.gradle
@@ -0,0 +1,15 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdk 34
+ defaultConfig {
+ minSdk 24
+ targetSdk 34
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ namespace 'com.zhy.autolayout'
+}
+
+dependencies {
+ implementation 'androidx.appcompat:appcompat:1.7.0'
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/autolayout/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000..60beba3
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/mergeDebugShaders/merger.xml b/autolayout/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000..29e7dae
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/autolayout/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
new file mode 100644
index 0000000..d1cd6e3
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/autolayout/build/intermediates/incremental/mergeReleaseShaders/merger.xml
new file mode 100644
index 0000000..f6ee658
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/mergeReleaseShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/packageDebugAssets/merger.xml b/autolayout/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000..321d4c1
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/packageReleaseAssets/merger.xml b/autolayout/build/intermediates/incremental/packageReleaseAssets/merger.xml
new file mode 100644
index 0000000..d02cee9
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/packageReleaseAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release-mergeJavaRes/merge-state b/autolayout/build/intermediates/incremental/release-mergeJavaRes/merge-state
new file mode 100644
index 0000000..1c983fc
Binary files /dev/null and b/autolayout/build/intermediates/incremental/release-mergeJavaRes/merge-state differ
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..80425c3
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
@@ -0,0 +1,376 @@
+#Wed Sep 11 19:14:15 CST 2024
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_fade_in.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_fade_in.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_fade_out.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_fade_out.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_grow_fade_in_from_bottom.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_grow_fade_in_from_bottom.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_popup_enter.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_popup_enter.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_popup_exit.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_popup_exit.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_shrink_fade_out_from_bottom.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_shrink_fade_out_from_bottom.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_slide_in_bottom.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_slide_in_bottom.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_slide_in_top.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_slide_in_top.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_slide_out_bottom.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_slide_out_bottom.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_slide_out_top.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_slide_out_top.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_tooltip_enter.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_tooltip_enter.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/abc_tooltip_exit.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\abc_tooltip_exit.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_checked_box_inner_merged_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_checked_box_outer_merged_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_checked_icon_null_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_checked_icon_null_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_unchecked_box_inner_merged_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_unchecked_check_path_merged_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_checkbox_to_unchecked_icon_null_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_checkbox_to_unchecked_icon_null_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_off_mtrl_dot_group_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_off_mtrl_dot_group_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_off_mtrl_ring_outer_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_off_mtrl_ring_outer_path_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_on_mtrl_dot_group_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_on_mtrl_dot_group_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_on_mtrl_ring_outer_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim\\btn_radio_to_on_mtrl_ring_outer_path_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_btn_colored_borderless_text_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_btn_colored_borderless_text_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_btn_colored_text_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_btn_colored_text_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_color_highlight_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_color_highlight_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_btn_checkable.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_btn_checkable.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_default.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_default.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_edittext.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_edittext.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_seek_thumb.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_seek_thumb.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_spinner.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_spinner.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color-v23/abc_tint_switch_track.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color-v23\\abc_tint_switch_track.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_background_cache_hint_selector_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_background_cache_hint_selector_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_background_cache_hint_selector_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_background_cache_hint_selector_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_hint_foreground_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_hint_foreground_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_hint_foreground_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_hint_foreground_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_primary_text_disable_only_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_primary_text_disable_only_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_primary_text_disable_only_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_primary_text_disable_only_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_primary_text_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_primary_text_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_primary_text_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_primary_text_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_search_url_text.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_search_url_text.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_secondary_text_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_secondary_text_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/abc_secondary_text_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\abc_secondary_text_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/switch_thumb_material_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\switch_thumb_material_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/color/switch_thumb_material_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\color\\switch_thumb_material_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_check_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_radio_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_divider_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_focused_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_focused_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_longpressed_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_longpressed_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_pressed_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_pressed_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_list_selector_disabled_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_popup_background_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_switch_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_text_select_handle_left_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_text_select_handle_middle_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_text_select_handle_right_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_textfield_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldrtl-hdpi-v17\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldrtl-mdpi-v17\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldrtl-xhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldrtl-xxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldrtl-xxxhdpi-v17\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_check_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_radio_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_divider_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_focused_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_focused_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_longpressed_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_longpressed_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_pressed_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_pressed_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_list_selector_disabled_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_popup_background_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_switch_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_text_select_handle_left_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_text_select_handle_middle_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_text_select_handle_right_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_textfield_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v21/abc_action_bar_item_background_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\abc_action_bar_item_background_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v21/abc_btn_colored_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\abc_btn_colored_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v21/abc_dialog_material_background.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\abc_dialog_material_background.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v21/abc_edit_text_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\abc_edit_text_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v21/abc_list_divider_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\abc_list_divider_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-v23/abc_control_background_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v23\\abc_control_background_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-watch-v20/abc_dialog_material_background.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-watch-v20\\abc_dialog_material_background.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_check_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_divider_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_focused_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_focused_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_longpressed_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_pressed_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_pressed_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_list_selector_disabled_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_popup_background_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_switch_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_text_select_handle_left_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_text_select_handle_middle_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_text_select_handle_right_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_ab_share_pack_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_cab_background_top_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_ic_commit_search_api_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_divider_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_focused_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_focused_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_longpressed_holo.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_pressed_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_pressed_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_dark.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_list_selector_disabled_holo_light.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_menu_hardkey_panel_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_popup_background_mtrl_mult.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_scrubber_control_off_mtrl_alpha.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_scrubber_primary_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_scrubber_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_text_select_handle_left_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_text_select_handle_middle_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_text_select_handle_right_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_textfield_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_textfield_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_textfield_search_activated_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\abc_textfield_search_default_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_check_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_radio_to_on_mtrl_015.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00001.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_btn_switch_to_on_mtrl_00012.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_000.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_scrubber_control_to_pressed_mtrl_005.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_spinner_mtrl_am_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_switch_track_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_tab_indicator_mtrl_alpha.9.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_text_select_handle_left_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\abc_text_select_handle_right_mtrl.png
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_borderless_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_borderless_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_check_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_check_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_check_material_anim.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_check_material_anim.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_default_mtrl_shape.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_default_mtrl_shape.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_radio_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_radio_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_btn_radio_material_anim.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_btn_radio_material_anim.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_cab_background_internal_bg.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_cab_background_internal_bg.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_cab_background_top_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_cab_background_top_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_ab_back_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_ab_back_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_arrow_drop_right_black_24dp.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_arrow_drop_right_black_24dp.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_clear_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_clear_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_go_search_api_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_go_search_api_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_copy_mtrl_am_alpha.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_cut_mtrl_alpha.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_cut_mtrl_alpha.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_overflow_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_overflow_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_paste_mtrl_am_alpha.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_selectall_mtrl_alpha.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_selectall_mtrl_alpha.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_menu_share_mtrl_alpha.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_menu_share_mtrl_alpha.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_search_api_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_search_api_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ic_voice_search_api_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ic_voice_search_api_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_item_background_holo_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_item_background_holo_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_item_background_holo_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_item_background_holo_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_list_selector_background_transition_holo_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_list_selector_background_transition_holo_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_list_selector_background_transition_holo_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_list_selector_background_transition_holo_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_list_selector_holo_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_list_selector_holo_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_list_selector_holo_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_list_selector_holo_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ratingbar_indicator_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ratingbar_indicator_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ratingbar_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ratingbar_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_ratingbar_small_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_ratingbar_small_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_seekbar_thumb_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_seekbar_thumb_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_seekbar_tick_mark_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_seekbar_tick_mark_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_seekbar_track_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_seekbar_track_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_spinner_textfield_background_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_spinner_textfield_background_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_star_black_48dp.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_star_black_48dp.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_star_half_black_48dp.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_star_half_black_48dp.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_switch_thumb_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_switch_thumb_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_tab_indicator_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_tab_indicator_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_text_cursor_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_text_cursor_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/abc_textfield_search_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_textfield_search_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_checkbox_checked_mtrl.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_checkbox_checked_mtrl.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_checkbox_checked_to_unchecked_mtrl_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_checkbox_unchecked_mtrl.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_checkbox_unchecked_mtrl.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_checkbox_unchecked_to_checked_mtrl_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_radio_off_mtrl.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_radio_off_mtrl.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_radio_off_to_on_mtrl_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_radio_off_to_on_mtrl_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_radio_on_mtrl.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_radio_on_mtrl.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/btn_radio_on_to_off_mtrl_animation.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\btn_radio_on_to_off_mtrl_animation.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/test_level_drawable.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\test_level_drawable.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/tooltip_frame_dark.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\tooltip_frame_dark.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/drawable/tooltip_frame_light.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\tooltip_frame_light.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_checkbox_checked_mtrl_animation_interpolator_0.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_checkbox_checked_mtrl_animation_interpolator_1.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_radio_to_off_mtrl_animation_interpolator_0.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\btn_radio_to_on_mtrl_animation_interpolator_0.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/interpolator/fast_out_slow_in.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\interpolator\\fast_out_slow_in.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout-v26/abc_screen_toolbar.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-v26\\abc_screen_toolbar.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout-watch-v20/abc_alert_dialog_button_bar_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-watch-v20\\abc_alert_dialog_button_bar_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout-watch-v20/abc_alert_dialog_title_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-watch-v20\\abc_alert_dialog_title_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_bar_title_item.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_bar_title_item.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_bar_up_container.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_bar_up_container.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_menu_item_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_menu_item_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_menu_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_menu_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_mode_bar.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_mode_bar.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_action_mode_close_item_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_action_mode_close_item_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_activity_chooser_view.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_activity_chooser_view.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_activity_chooser_view_list_item.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_activity_chooser_view_list_item.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_alert_dialog_button_bar_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_alert_dialog_button_bar_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_alert_dialog_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_alert_dialog_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_alert_dialog_title_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_alert_dialog_title_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_cascading_menu_item_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_cascading_menu_item_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_dialog_title_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_dialog_title_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_expanded_menu_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_expanded_menu_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_list_menu_item_checkbox.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_list_menu_item_checkbox.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_list_menu_item_icon.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_list_menu_item_icon.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_list_menu_item_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_list_menu_item_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_list_menu_item_radio.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_list_menu_item_radio.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_popup_menu_header_item_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_popup_menu_header_item_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_popup_menu_item_layout.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_popup_menu_item_layout.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_screen_content_include.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_screen_content_include.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_screen_simple.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_screen_simple.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_screen_simple_overlay_action_mode.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_screen_simple_overlay_action_mode.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_screen_toolbar.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_screen_toolbar.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_search_dropdown_item_icons_2line.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_search_dropdown_item_icons_2line.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_search_view.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_search_view.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_select_dialog_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_select_dialog_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/abc_tooltip.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\abc_tooltip.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/select_dialog_item_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\select_dialog_item_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/select_dialog_multichoice_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\select_dialog_multichoice_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/select_dialog_singlechoice_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\select_dialog_singlechoice_material.xml
+com.zhy.autolayout-appcompat-1.7.0-9\:/layout/support_simple_spinner_dropdown_item.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\support_simple_spinner_dropdown_item.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_answer.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_answer.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_answer_low.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_answer_low.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_answer_video.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_answer_video.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_answer_video_low.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_answer_video_low.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_decline.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_decline.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-anydpi-v21/ic_call_decline_low.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-anydpi-v21\\ic_call_decline_low.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notification_bg_low_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notification_bg_low_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notification_bg_low_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notification_bg_low_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notification_bg_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notification_bg_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notification_bg_normal_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notification_bg_normal_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notification_oversize_large_icon_bg.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notification_oversize_large_icon_bg.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-hdpi-v4/notify_panel_notification_icon_bg.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-hdpi-v4\\notify_panel_notification_icon_bg.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-ldpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-ldpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/notification_bg_low_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\notification_bg_low_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/notification_bg_low_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\notification_bg_low_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/notification_bg_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\notification_bg_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/notification_bg_normal_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\notification_bg_normal_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-mdpi-v4/notify_panel_notification_icon_bg.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-mdpi-v4\\notify_panel_notification_icon_bg.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-v21/notification_action_background.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-v21\\notification_action_background.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/notification_bg_low_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\notification_bg_low_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/notification_bg_low_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\notification_bg_low_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/notification_bg_normal.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\notification_bg_normal.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\notification_bg_normal_pressed.9.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xhdpi-v4\\notify_panel_notification_icon_bg.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxhdpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxhdpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_answer.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_answer.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_answer_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_answer_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_answer_video.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_answer_video.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_answer_video_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_answer_video_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_decline.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_decline.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable-xxxhdpi-v4/ic_call_decline_low.png=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable-xxxhdpi-v4\\ic_call_decline_low.png
+com.zhy.autolayout-core-1.13.0-3\:/drawable/notification_bg.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\notification_bg.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable/notification_bg_low.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\notification_bg_low.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable/notification_icon_background.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\notification_icon_background.xml
+com.zhy.autolayout-core-1.13.0-3\:/drawable/notification_tile_bg.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\notification_tile_bg.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout-v21/notification_action.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-v21\\notification_action.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout-v21/notification_action_tombstone.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-v21\\notification_action_tombstone.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout-v21/notification_template_custom_big.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-v21\\notification_template_custom_big.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout-v21/notification_template_icon_group.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout-v21\\notification_template_icon_group.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout/custom_dialog.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\custom_dialog.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout/ime_base_split_test_activity.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\ime_base_split_test_activity.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout/ime_secondary_split_test_activity.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\ime_secondary_split_test_activity.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout/notification_template_part_chronometer.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\notification_template_part_chronometer.xml
+com.zhy.autolayout-core-1.13.0-3\:/layout/notification_template_part_time.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\layout\\notification_template_part_time.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/anim-v21/fragment_fast_out_extra_slow_in.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\anim-v21\\fragment_fast_out_extra_slow_in.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_close_enter.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_close_enter.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_close_exit.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_close_exit.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_fade_enter.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_fade_enter.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_fade_exit.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_fade_exit.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_open_enter.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_open_enter.xml
+com.zhy.autolayout-fragment-1.5.4-18\:/animator/fragment_open_exit.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\animator\\fragment_open_exit.xml
+com.zhy.autolayout-jetified-appcompat-resources-1.7.0-17\:/drawable/abc_vector_test.xml=C\:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\autolayout\\build\\intermediates\\merged_res\\release\\mergeReleaseResources\\drawable\\abc_vector_test.xml
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml
new file mode 100644
index 0000000..f2b7ade
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml
@@ -0,0 +1,39 @@
+
+
+ "Gaan na tuisskerm"
+ "Gaan op"
+ "Nog opsies"
+ "Klaar"
+ "Sien alles"
+ "Kies \'n program"
+ "AF"
+ "AAN"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Funksie+"
+ "Meta+"
+ "Shift+"
+ "spasiebalk"
+ "Simbool+"
+ "Kieslys+"
+ "Soek …"
+ "Vee navraag uit"
+ "Soektognavraag"
+ "Soek"
+ "Dien navraag in"
+ "Stemsoektog"
+ "Deel met"
+ "Deel met %s "
+ "Vou in"
+ "Antwoord"
+ "Video"
+ "Wys af"
+ "Lui af"
+ "Inkomende oproep"
+ "Oproep aan die gang"
+ "Keur tans \'n inkomende oproep"
+ "Soek"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml
new file mode 100644
index 0000000..0bc89dd
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml
@@ -0,0 +1,39 @@
+
+
+ "መነሻ ዳስስ"
+ "ወደ ላይ ያስሱ"
+ "ተጨማሪ አማራጮች"
+ "ተከናውኗል"
+ "ሁሉንም ይመልከቱ"
+ "አንድ መተግበሪያ ይምረጡ"
+ "አጥፋ"
+ "አብራ"
+ "Alt+"
+ "Ctrl+"
+ "ሰርዝ"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "ክፍተት"
+ "Sym+"
+ "Menu+"
+ "ይፈልጉ…"
+ "መጠይቅ አጽዳ"
+ "የፍለጋ መጠይቅ"
+ "ፍለጋ"
+ "መጠይቅ አስገባ"
+ "የድምጽ ፍለጋ"
+ "አጋራ በ"
+ "ለ%s አጋራ"
+ "ሰብስብ"
+ "መልስ"
+ "ቪዲዮ"
+ "አትቀበል"
+ "ስልኩን ዝጋ"
+ "ገቢ ጥሪ"
+ "እየተካሄደ ያለ ጥሪ"
+ "ገቢ ጥሪ ማጣራት"
+ "ፍለጋ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml
new file mode 100644
index 0000000..34e2605
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml
@@ -0,0 +1,39 @@
+
+
+ "التوجه إلى المنزل"
+ "التنقل إلى أعلى"
+ "خيارات أكثر"
+ "تم"
+ "عرض الكل"
+ "اختيار تطبيق"
+ "إيقاف"
+ "مفعّلة"
+ "Alt+"
+ "Ctrl+"
+ "حذف"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "فضاء"
+ "Sym+"
+ "القائمة+"
+ "بحث…"
+ "محو طلب البحث"
+ "طلب بحث"
+ "البحث"
+ "إرسال طلب البحث"
+ "بحث صوتي"
+ "مشاركة مع"
+ "مشاركة مع %s "
+ "تصغير"
+ "ردّ"
+ "فيديو"
+ "رفض"
+ "قطع الاتصال"
+ "مكالمة واردة"
+ "مكالمة جارية"
+ "يتم فحص المكالمة الواردة"
+ "البحث"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml
new file mode 100644
index 0000000..ba5e31c
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml
@@ -0,0 +1,39 @@
+
+
+ "গৃহ পৃষ্ঠালৈ যাওক"
+ "ওপৰলৈ যাওক"
+ "অধিক বিকল্প"
+ "সম্পন্ন হ’ল"
+ "আটাইবোৰ চাওক"
+ "কোনো এপ্ বাছনি কৰক"
+ "অফ"
+ "অন"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "সন্ধান কৰক…"
+ "সন্ধান কৰা প্ৰশ্ন মচক"
+ "সন্ধান কৰা প্ৰশ্ন"
+ "সন্ধান কৰক"
+ "প্ৰশ্ন দাখিল কৰক"
+ "কণ্ঠধ্বনিৰ দ্বাৰা সন্ধান"
+ "ইয়াৰ জৰিয়তে শ্বেয়াৰ কৰক"
+ "%s ৰ জৰিয়তে শ্বেয়াৰ কৰক"
+ "সংকোচন কৰক"
+ "উত্তৰ দিয়ক"
+ "ভিডিঅ’"
+ "প্ৰত্যাখ্যান কৰক"
+ "কল কাটি দিয়ক"
+ "অন্তৰ্গামী কল"
+ "চলি থকা কল"
+ "এটা অন্তৰ্গামী কলৰ পৰীক্ষা কৰি থকা হৈছে"
+ "সন্ধান"
+ "৯৯৯+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml
new file mode 100644
index 0000000..358250d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml
@@ -0,0 +1,39 @@
+
+
+ "Əsas səhifəyə keçin"
+ "Yuxarı keçin"
+ "Digər seçimlər"
+ "Hazırdır"
+ "Hamısına baxın"
+ "Tətbiq seçin"
+ "DEAKTİV"
+ "AKTİV"
+ "Alt+"
+ "Ctrl+"
+ "silin"
+ "daxil olun"
+ "Funksiya+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menyu+"
+ "Axtarış..."
+ "Sorğunu silin"
+ "Axtarış sorğusu"
+ "Axtarın"
+ "Sorğunu göndərin"
+ "Səsli axtarış"
+ "Paylaşın"
+ "%s ilə paylaşın"
+ "Yığcamlaşdırın"
+ "Cavab verin"
+ "Video"
+ "İmtina edin"
+ "Dəstəyi asın"
+ "Gələn zəng"
+ "Davam edən zəng"
+ "Gələn zəng göstərilir"
+ "Axtarın"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml
new file mode 100644
index 0000000..4d886df
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml
@@ -0,0 +1,39 @@
+
+
+ "Idite na početnu"
+ "Idite nagore"
+ "Još opcija"
+ "Gotovo"
+ "Prikaži sve"
+ "Izaberite aplikaciju"
+ "ISKLJUČENO"
+ "UKLJUČENO"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "taster za razmak"
+ "Sym+"
+ "Menu+"
+ "Pretražite…"
+ "Obrišite upit"
+ "Pretražite upit"
+ "Pretražite"
+ "Pošaljite upit"
+ "Glasovna pretraga"
+ "Delite pomoću"
+ "Delite pomoću aplikacije %s "
+ "Skupi"
+ "Odgovori"
+ "Video"
+ "Odbij"
+ "Prekini vezu"
+ "Dolazni poziv"
+ "Poziv je u toku"
+ "Proverava se dolazni poziv"
+ "Pretražite"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml
new file mode 100644
index 0000000..f4df976
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml
@@ -0,0 +1,39 @@
+
+
+ "Перайсці на галоўную старонку"
+ "Перайсці ўверх"
+ "Дадатковыя параметры"
+ "Гатова"
+ "Паказаць усе"
+ "Выберыце праграму"
+ "ВЫКЛ."
+ "УКЛ."
+ "Alt +"
+ "Ctrl +"
+ "Delete"
+ "Enter"
+ "Fn +"
+ "Meta +"
+ "Shift +"
+ "Прабел"
+ "Sym +"
+ "Меню +"
+ "Пошук…"
+ "Выдаліць запыт"
+ "Пошукавы запыт"
+ "Пошук"
+ "Адправіць запыт"
+ "Галасавы пошук"
+ "Абагуліць праз"
+ "Абагуліць праз праграму \"%s \""
+ "Згарнуць"
+ "Адказаць"
+ "Відэа"
+ "Адхіліць"
+ "Завяршыць"
+ "Уваходны выклік"
+ "Бягучы выклік"
+ "Фільтраванне ўваходнага выкліку"
+ "Пошук"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml
new file mode 100644
index 0000000..31d81f9
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml
@@ -0,0 +1,39 @@
+
+
+ "Навигиране към началния екран"
+ "Навигиране нагоре"
+ "Още опции"
+ "Готово"
+ "Преглед на всички"
+ "Изберете приложение"
+ "ИЗКЛ."
+ "ВКЛ."
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "клавиша за интервал"
+ "Sym+"
+ "Menu+"
+ "Търсете…"
+ "Изчистване на заявката"
+ "Заявка за търсене"
+ "Търсене"
+ "Изпращане на заявката"
+ "Гласово търсене"
+ "Споделяне със:"
+ "Споделяне със: %s "
+ "Свиване"
+ "Отговор"
+ "Видеообаждане"
+ "Отхвърляне"
+ "Затваряне"
+ "Входящо обаждане"
+ "Текущо обаждане"
+ "Преглежда се входящо обаждане"
+ "Търсене"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml
new file mode 100644
index 0000000..be8415d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml
@@ -0,0 +1,39 @@
+
+
+ "হোমে নেভিগেট করুন"
+ "উপরে নেভিগেট করুন"
+ "আরও বিকল্প"
+ "হয়ে গেছে"
+ "সবগুলি দেখুন"
+ "একটি অ্যাপ বেছে নিন"
+ "বন্ধ আছে"
+ "চালু করুন"
+ "Alt+"
+ "Ctrl+"
+ "মুছুন"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "সার্চ করুন…"
+ "কোয়েরি মুছে ফেলুন"
+ "সার্চ কোয়েরি"
+ "সার্চ করুন"
+ "কোয়েরি জমা দিন"
+ "ভয়েস সার্চ করুন"
+ "শেয়ার করুন"
+ "%s -এর সাথে শেয়ার করুন"
+ "সঙ্কুচিত করুন"
+ "উত্তর দিন"
+ "ভিডিও"
+ "বাতিল করুন"
+ "কল কেটে দিন"
+ "ইনকামিং কল"
+ "চালু থাকা কল"
+ "ইনকামিং কল স্ক্রিনিং করা হচ্ছে"
+ "সার্চ করুন"
+ "৯৯৯+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml
new file mode 100644
index 0000000..9c7f5df
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml
@@ -0,0 +1,39 @@
+
+
+ "Vratite se na početnu stranicu"
+ "Idi gore"
+ "Više opcija"
+ "Gotovo"
+ "Prikaži sve"
+ "Odaberite aplikaciju"
+ "ISKLJUČENO"
+ "UKLJUČENO"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "razmak"
+ "Sym+"
+ "Menu+"
+ "Pretražite..."
+ "Obriši upit"
+ "Pretraži upit"
+ "Pretraživanje"
+ "Pošalji upit"
+ "Glasovno pretraživanje"
+ "Dijeli sa"
+ "Dijeli putem aplikacije %s "
+ "Suzi"
+ "Odgovori"
+ "Video"
+ "Odbaci"
+ "Prekini vezu"
+ "Dolazni poziv"
+ "Poziv u toku"
+ "Filtriranje dolaznog poziva"
+ "Pretražite"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml
new file mode 100644
index 0000000..afdf0d0
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml
@@ -0,0 +1,39 @@
+
+
+ "Navega fins a la pàgina d\'inici"
+ "Navega cap amunt"
+ "Més opcions"
+ "Fet"
+ "Mostra-ho tot"
+ "Selecciona una aplicació"
+ "DESACTIVA"
+ "ACTIVA"
+ "Alt+"
+ "Ctrl+"
+ "Supr"
+ "Retorn"
+ "Funció+"
+ "Meta+"
+ "Maj+"
+ "Espai"
+ "Sym+"
+ "Menú+"
+ "Cerca…"
+ "Esborra la consulta"
+ "Consulta de cerca"
+ "Cerca"
+ "Envia la consulta"
+ "Cerca per veu"
+ "Comparteix amb"
+ "Comparteix amb %s "
+ "Replega"
+ "Respon"
+ "Vídeo"
+ "Rebutja"
+ "Penja"
+ "Trucada entrant"
+ "Trucada en curs"
+ "S\'està filtrant una trucada entrant"
+ "Cerca"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml
new file mode 100644
index 0000000..3dfcebd
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml
@@ -0,0 +1,39 @@
+
+
+ "Přejít na plochu"
+ "Přejít nahoru"
+ "Další možnosti"
+ "Hotovo"
+ "Zobrazit vše"
+ "Vybrat aplikaci"
+ "VYP"
+ "ZAP"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Fn+"
+ "Meta+"
+ "Shift+"
+ "mezerník"
+ "Sym+"
+ "Menu+"
+ "Vyhledat…"
+ "Smazat dotaz"
+ "Dotaz pro vyhledávání"
+ "Hledat"
+ "Odeslat dotaz"
+ "Hlasové vyhledávání"
+ "Sdílet s"
+ "Sdílet s aplikací %s "
+ "Sbalit"
+ "Přijmout"
+ "Video"
+ "Odmítnout"
+ "Zavěsit"
+ "Příchozí hovor"
+ "Probíhající hovor"
+ "Prověřování příchozího hovoru"
+ "Hledat"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml
new file mode 100644
index 0000000..f4a5093
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml
@@ -0,0 +1,39 @@
+
+
+ "Find hjem"
+ "Gå op"
+ "Flere valgmuligheder"
+ "Udfør"
+ "Se alle"
+ "Vælg en app"
+ "FRA"
+ "TIL"
+ "Alt+"
+ "Ctrl+"
+ "slet"
+ "enter"
+ "Fn+"
+ "Meta+"
+ "Shift+"
+ "mellemrum"
+ "Sym+"
+ "Menu+"
+ "Søg…"
+ "Ryd forespørgsel"
+ "Søgeforespørgsel"
+ "Søg"
+ "Indsend forespørgsel"
+ "Talesøgning"
+ "Del med"
+ "Del med %s "
+ "Skjul"
+ "Besvar"
+ "Video"
+ "Afvis"
+ "Læg på"
+ "Indgående opkald"
+ "Igangværende opkald"
+ "Et indgående opkald screenes"
+ "Søg"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml
new file mode 100644
index 0000000..12455f3
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml
@@ -0,0 +1,39 @@
+
+
+ "Zur Startseite"
+ "Nach oben"
+ "Weitere Optionen"
+ "Fertig"
+ "Alle anzeigen"
+ "App auswählen"
+ "AUS"
+ "AN"
+ "Alt +"
+ "Strg +"
+ "Löschen"
+ "Eingabetaste"
+ "Funktionstaste +"
+ "Meta-Taste +"
+ "Umschalttaste +"
+ "Leertaste"
+ "Sym-Taste +"
+ "Menütaste +"
+ "Suchen…"
+ "Suchanfrage löschen"
+ "Suchanfrage"
+ "Suche"
+ "Anfrage senden"
+ "Sprachsuche"
+ "Teilen mit"
+ "Mit %s teilen"
+ "Minimieren"
+ "Annehmen"
+ "Video"
+ "Ablehnen"
+ "Auflegen"
+ "Eingehender Anruf"
+ "Aktueller Anruf"
+ "Filter für eingehenden Anruf"
+ "Suche"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml
new file mode 100644
index 0000000..1cf1520
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml
@@ -0,0 +1,39 @@
+
+
+ "Πλοήγηση στην αρχική σελίδα"
+ "Πλοήγηση προς τα επάνω"
+ "Περισσότερες επιλογές"
+ "Τέλος"
+ "Εμφάνιση όλων"
+ "Επιλέξτε μια εφαρμογή"
+ "ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"
+ "ΕΝΕΡΓΟΠΟΙΗΣΗ"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "διάστημα"
+ "Sym+"
+ "Menu+"
+ "Αναζήτηση…"
+ "Διαγραφή ερωτήματος"
+ "Ερώτημα αναζήτησης"
+ "Αναζήτηση"
+ "Υποβολή ερωτήματος"
+ "Φωνητική αναζήτηση"
+ "Κοινοποίηση σε"
+ "Κοινοποίηση στην εφαρμογή %s "
+ "Σύμπτυξη"
+ "Απάντηση"
+ "Βίντεο"
+ "Απόρριψη"
+ "Τερματισμός"
+ "Εισερχόμενη κλήση"
+ "Κλήση σε εξέλιξη"
+ "Διαλογή εισερχόμενης κλήσης"
+ "Αναζήτηση"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml
new file mode 100644
index 0000000..f6ff55d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigate home"
+ "Navigate up"
+ "More options"
+ "Done"
+ "See all"
+ "Choose an app"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Search…"
+ "Clear query"
+ "Search query"
+ "Search"
+ "Submit query"
+ "Voice search"
+ "Share with"
+ "Share with %s "
+ "Collapse"
+ "Answer"
+ "Video"
+ "Decline"
+ "Hang up"
+ "Incoming call"
+ "On-going call"
+ "Screening an incoming call"
+ "Search"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml
new file mode 100644
index 0000000..bc83d64
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigate home"
+ "Navigate up"
+ "More options"
+ "Done"
+ "See all"
+ "Choose an app"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Search…"
+ "Clear query"
+ "Search query"
+ "Search"
+ "Submit query"
+ "Voice search"
+ "Share with"
+ "Share with %s "
+ "Collapse"
+ "Answer"
+ "Video"
+ "Decline"
+ "Hang Up"
+ "Incoming call"
+ "Ongoing call"
+ "Screening an incoming call"
+ "Search"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml
new file mode 100644
index 0000000..f6ff55d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigate home"
+ "Navigate up"
+ "More options"
+ "Done"
+ "See all"
+ "Choose an app"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Search…"
+ "Clear query"
+ "Search query"
+ "Search"
+ "Submit query"
+ "Voice search"
+ "Share with"
+ "Share with %s "
+ "Collapse"
+ "Answer"
+ "Video"
+ "Decline"
+ "Hang up"
+ "Incoming call"
+ "On-going call"
+ "Screening an incoming call"
+ "Search"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml
new file mode 100644
index 0000000..f6ff55d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigate home"
+ "Navigate up"
+ "More options"
+ "Done"
+ "See all"
+ "Choose an app"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Search…"
+ "Clear query"
+ "Search query"
+ "Search"
+ "Submit query"
+ "Voice search"
+ "Share with"
+ "Share with %s "
+ "Collapse"
+ "Answer"
+ "Video"
+ "Decline"
+ "Hang up"
+ "Incoming call"
+ "On-going call"
+ "Screening an incoming call"
+ "Search"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml
new file mode 100644
index 0000000..27a3d53
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigate home"
+ "Navigate up"
+ "More options"
+ "Done"
+ "See all"
+ "Choose an app"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Search…"
+ "Clear query"
+ "Search query"
+ "Search"
+ "Submit query"
+ "Voice search"
+ "Share with"
+ "Share with %s "
+ "Collapse"
+ "Answer"
+ "Video"
+ "Decline"
+ "Hang Up"
+ "Incoming call"
+ "Ongoing call"
+ "Screening an incoming call"
+ "Search"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml
new file mode 100644
index 0000000..4a76e9d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml
@@ -0,0 +1,39 @@
+
+
+ "Navegar a la página principal"
+ "Navegar hacia arriba"
+ "Más opciones"
+ "Listo"
+ "Ver todas"
+ "Elegir una app"
+ "DESACTIVAR"
+ "ACTIVAR"
+ "Alt+"
+ "Ctrl+"
+ "borrar"
+ "intro"
+ "Función+"
+ "Meta+"
+ "Mayúscula+"
+ "espacio"
+ "Sym+"
+ "Menú+"
+ "Buscar…"
+ "Borrar consulta"
+ "Búsqueda"
+ "Buscar"
+ "Enviar consulta"
+ "Búsqueda por voz"
+ "Compartir con"
+ "Compartir con %s "
+ "Contraer"
+ "Responder"
+ "Video"
+ "Rechazar"
+ "Colgar"
+ "Llamada entrante"
+ "Llamada en curso"
+ "Filtrando una llamada entrante"
+ "Buscar"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml
new file mode 100644
index 0000000..d73dc83
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml
@@ -0,0 +1,39 @@
+
+
+ "Ir a inicio"
+ "Desplazarse hacia arriba"
+ "Más opciones"
+ "Hecho"
+ "Ver todo"
+ "Seleccionar una aplicación"
+ "DESACTIVADO"
+ "ACTIVADO"
+ "Alt +"
+ "Ctrl +"
+ "Suprimir"
+ "Intro"
+ "Función +"
+ "Meta +"
+ "Mayús +"
+ "Espacio"
+ "Sym +"
+ "Menú +"
+ "Buscar…"
+ "Borrar consulta"
+ "Consulta de búsqueda"
+ "Buscar"
+ "Enviar consulta"
+ "Búsqueda por voz"
+ "Compartir con"
+ "Compartir con %s "
+ "Ocultar"
+ "Responder"
+ "Vídeo"
+ "Rechazar"
+ "Colgar"
+ "Llamada entrante"
+ "Llamada en curso"
+ "Filtrando una llamada entrante"
+ "Buscar"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml
new file mode 100644
index 0000000..f59b0dc
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml
@@ -0,0 +1,39 @@
+
+
+ "Liigu avalehele"
+ "Liigu üles"
+ "Rohkem valikuid"
+ "Valmis"
+ "Kuva kõik"
+ "Valige rakendus"
+ "VÄLJAS"
+ "SEES"
+ "Alt +"
+ "Ctrl +"
+ "kustuta"
+ "sisestusklahv"
+ "Funktsiooniklahv +"
+ "Meta +"
+ "Tõstuklahv +"
+ "tühik"
+ "Sym +"
+ "Menüü +"
+ "Otsige …"
+ "Päringu tühistamine"
+ "Otsingupäring"
+ "Otsing"
+ "Päringu esitamine"
+ "Häälotsing"
+ "Jaga:"
+ "Jagamine rakendusega %s "
+ "Ahendamine"
+ "Vasta"
+ "Video"
+ "Keeldu"
+ "Lõpeta kõne"
+ "Sissetulev kõne"
+ "Käimasolev kõne"
+ "Sissetuleva kõne filtreerimine"
+ "Otsing"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml
new file mode 100644
index 0000000..810605e
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml
@@ -0,0 +1,39 @@
+
+
+ "Joan orri nagusira"
+ "Joan gora"
+ "Aukera gehiago"
+ "Eginda"
+ "Ikusi guztiak"
+ "Aukeratu aplikazio bat"
+ "DESAKTIBATU"
+ "AKTIBATU"
+ "Alt +"
+ "Ktrl +"
+ "ezabatu"
+ "sartu"
+ "Funtzioa +"
+ "Meta +"
+ "Maius +"
+ "zuriunea"
+ "Sym +"
+ "Menua +"
+ "Bilatu…"
+ "Garbitu kontsulta"
+ "Bilaketa-kontsulta"
+ "Bilatu"
+ "Bidali kontsulta"
+ "Ahozko bilaketa"
+ "Partekatu honekin"
+ "Partekatu %s aplikazioarekin"
+ "Tolestu"
+ "Erantzun"
+ "Bideoa"
+ "Baztertu"
+ "Amaitu deia"
+ "Sarrerako deia"
+ "Deia abian da"
+ "Sarrerako dei bat bistaratzen"
+ "Bilatu"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml
new file mode 100644
index 0000000..384236d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml
@@ -0,0 +1,39 @@
+
+
+ "پیمایش به صفحه اصلی"
+ "رفتن به بالا"
+ "گزینههای بیشتر"
+ "تمام"
+ "دیدن همه"
+ "انتخاب برنامه"
+ "خاموش"
+ "روشن"
+ "Alt+"
+ "Ctrl+"
+ "حذف"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "فاصله"
+ "Sym+"
+ "منو+"
+ "جستجو…"
+ "پاک کردن پُرسمان"
+ "درخواست جستجو"
+ "جستجو"
+ "ارسال پُرسمان"
+ "جستجوی گفتاری"
+ "همرسانی با"
+ "همرسانی با %s "
+ "کوچک کردن"
+ "پاسخ دادن"
+ "ویدیو"
+ "رد کردن"
+ "قطع تماس"
+ "تماس ورودی"
+ "تماس درحال انجام"
+ "درحال غربال کردن تماس ورودی"
+ "جستجو"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml
new file mode 100644
index 0000000..87e7d9e
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml
@@ -0,0 +1,39 @@
+
+
+ "Siirry etusivulle"
+ "Siirry ylös"
+ "Lisäasetukset"
+ "Valmis"
+ "Näytä kaikki"
+ "Valitse sovellus"
+ "POIS PÄÄLTÄ"
+ "PÄÄLLÄ"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Fn+"
+ "Meta+"
+ "Vaihto+"
+ "välilyönti"
+ "Sym+"
+ "Valikko+"
+ "Haku…"
+ "Tyhjennä kysely"
+ "Hakukysely"
+ "Haku"
+ "Lähetä kysely"
+ "Puhehaku"
+ "Jaa…"
+ "Jaa: %s "
+ "Tiivistä"
+ "Vastaa"
+ "Video"
+ "Hylkää"
+ "Lopeta puhelu"
+ "Saapuva puhelu"
+ "Käynnissä oleva puhelu"
+ "Seulotaan saapuvaa puhelua"
+ "Haku"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml
new file mode 100644
index 0000000..5474a56
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml
@@ -0,0 +1,39 @@
+
+
+ "Revenir à l\'accueil"
+ "Revenir en arrière"
+ "Autres options"
+ "Terminé"
+ "Tout afficher"
+ "Sélectionner une application"
+ "DÉSACTIVER"
+ "ACTIVER"
+ "Alt+"
+ "Ctrl+"
+ "supprimer"
+ "entrée"
+ "Fonction+"
+ "Méta+"
+ "Maj+"
+ "espace"
+ "Sym+"
+ "Menu+"
+ "Rechercher…"
+ "Effacer la requête"
+ "Requête de recherche"
+ "Rechercher"
+ "Envoyer la requête"
+ "Recherche vocale"
+ "Partager avec"
+ "Partager avec %s "
+ "Réduire"
+ "Répondre"
+ "Vidéo"
+ "Refuser"
+ "Raccrocher"
+ "Appel entrant"
+ "Appel en cours"
+ "Filtrer un appel entrant"
+ "Rechercher"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml
new file mode 100644
index 0000000..073f345
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml
@@ -0,0 +1,39 @@
+
+
+ "Revenir à l\'accueil"
+ "Revenir en haut de la page"
+ "Autres options"
+ "OK"
+ "Tout afficher"
+ "Sélectionner une application"
+ "NON"
+ "OUI"
+ "Alt+"
+ "Ctrl+"
+ "supprimer"
+ "entrée"
+ "Fonction+"
+ "Méta+"
+ "Maj+"
+ "espace"
+ "Sym+"
+ "Menu+"
+ "Rechercher…"
+ "Effacer la requête"
+ "Requête de recherche"
+ "Rechercher"
+ "Envoyer la requête"
+ "Recherche vocale"
+ "Partager avec"
+ "Partager avec %s "
+ "Réduire"
+ "Répondre"
+ "Vidéo"
+ "Refuser"
+ "Raccrocher"
+ "Appel entrant"
+ "Appel en cours"
+ "Filtrage d\'un appel entrant"
+ "Rechercher"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml
new file mode 100644
index 0000000..25d4cff
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml
@@ -0,0 +1,39 @@
+
+
+ "Vai ao inicio"
+ "Vai cara arriba"
+ "Máis opcións"
+ "Feito"
+ "Ver todo"
+ "Selecciona unha aplicación"
+ "DESACTIVADO"
+ "ACTIVADO"
+ "Alt +"
+ "Ctrl +"
+ "eliminar"
+ "intro"
+ "Función +"
+ "Meta +"
+ "Maiús +"
+ "espazo"
+ "Sym +"
+ "Menú +"
+ "Busca…"
+ "Borra a consulta"
+ "Busca a consulta"
+ "Realiza buscas"
+ "Envía a consulta"
+ "Busca por voz"
+ "Comparte contido con"
+ "Comparte contido coa aplicación %s "
+ "Contrae"
+ "Contestar"
+ "Vídeo"
+ "Rexeitar"
+ "Colgar"
+ "Chamada entrante"
+ "Chamada en curso"
+ "Filtrando chamada entrante"
+ "Buscar"
+ ">999"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml
new file mode 100644
index 0000000..ea7d9fa
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml
@@ -0,0 +1,39 @@
+
+
+ "ઘરનો રસ્તો બતાવો"
+ "ઉપર નૅવિગેટ કરો"
+ "વધુ વિકલ્પો"
+ "થઈ ગયું"
+ "બધી જુઓ"
+ "ઍપ્લિકેશન પસંદ કરો"
+ "બંધ"
+ "ચાલુ"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "શોધો…"
+ "ક્વેરી સાફ કરો"
+ "શોધ ક્વેરી"
+ "શોધો"
+ "ક્વેરી સબમિટ કરો"
+ "વૉઇસ શોધ"
+ "આની સાથે શેર કરો"
+ "%s ની સાથે શેર કરો"
+ "સંકુચિત કરો"
+ "જવાબ"
+ "વીડિયો"
+ "નકારો"
+ "સમાપ્ત કરો"
+ "ઇનકમિંગ કૉલ"
+ "ચાલુ કૉલ"
+ "ઇનકમિંગ કૉલનું સ્ક્રીનિંગ થાય છે"
+ "શોધો"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml
new file mode 100644
index 0000000..e38bb90
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml
@@ -0,0 +1,4 @@
+
+
+ 54dip
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml
new file mode 100644
index 0000000..d5a138e
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml
new file mode 100644
index 0000000..4d92fd9
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml
@@ -0,0 +1,39 @@
+
+
+ "होम पेज पर जाएं"
+ "वापस जाएं"
+ "ज़्यादा विकल्प"
+ "हो गया"
+ "सभी देखें"
+ "कोई ऐप्लिकेशन चुनें"
+ "बंद"
+ "चालू"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "खोजें…"
+ "क्वेरी हटाएं"
+ "सर्च क्वेरी"
+ "खोजें"
+ "क्वेरी सबमिट करें"
+ "बोलकर खोजें"
+ "इससे शेयर करें:"
+ "%s से शेयर करें"
+ "छोटा करें"
+ "जवाब दें"
+ "वीडियो"
+ "अस्वीकार करें"
+ "कॉल काटें"
+ "आने वाला (इनकमिंग) कॉल"
+ "पहले से जारी कॉल"
+ "इनकमिंग कॉल को स्क्रीन किया जा रहा है"
+ "खोजें"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml
new file mode 100644
index 0000000..fc1710f
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml
@@ -0,0 +1,39 @@
+
+
+ "Idi na početnu"
+ "Natrag"
+ "Više opcija"
+ "Gotovo"
+ "Prikaži sve"
+ "Odabir aplikacije"
+ "ISKLJUČENO"
+ "UKLJUČENO"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "svemir"
+ "Sym+"
+ "Menu+"
+ "Pretražite…"
+ "Izbriši upit"
+ "Upit za pretraživanje"
+ "Pretraži"
+ "Pošalji upit"
+ "Glasovno pretraživanje"
+ "Dijeli s"
+ "Dijeli putem aplikacije %s "
+ "Sažmi"
+ "Odgovori"
+ "Videozapis"
+ "Odbij"
+ "Prekini"
+ "Dolazni poziv"
+ "Poziv u tijeku"
+ "Filtriranje dolaznog poziva"
+ "Pretraži"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml
new file mode 100644
index 0000000..d29095d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml
@@ -0,0 +1,39 @@
+
+
+ "Ugrás a főoldalra"
+ "Fel"
+ "További lehetőségek"
+ "Kész"
+ "Az összes megtekintése"
+ "Válasszon alkalmazást"
+ "KI"
+ "BE"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "Szóköz"
+ "Sym+"
+ "Menu+"
+ "Keresés…"
+ "Lekérdezés törlése"
+ "Keresési lekérdezés"
+ "Keresés"
+ "Lekérdezés küldése"
+ "Hangalapú keresés"
+ "Megosztás a következővel:"
+ "Megosztás a következő alkalmazással: %s "
+ "Összecsukás"
+ "Fogadás"
+ "Videó"
+ "Elutasítás"
+ "Befejezés"
+ "Bejövő hívás"
+ "Hívás folyamatban"
+ "Bejövő hívás szűrése"
+ "Keresés"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml
new file mode 100644
index 0000000..0f92273
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml
@@ -0,0 +1,39 @@
+
+
+ "Անցնել գլխավոր էջ"
+ "Անցնել վերև"
+ "Այլ ընտրանքներ"
+ "Պատրաստ է"
+ "Տեսնել բոլորը"
+ "Ընտրել հավելված"
+ "ԱՆՋԱՏԵԼ"
+ "ՄԻԱՑՆԵԼ"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "բացատ"
+ "Sym+"
+ "Menu+"
+ "Որոնում…"
+ "Ջնջել հարցումը"
+ "Որոնման հարցում"
+ "Որոնել"
+ "Ուղարկել հարցումը"
+ "Ձայնային որոնում"
+ "Կիսվել…"
+ "Կիսվել %s հավելվածի միջոցով"
+ "Ծալել"
+ "Պատասխանել"
+ "Տեսազանգ"
+ "Մերժել"
+ "Ավարտել"
+ "Մուտքային զանգ"
+ "Ընթացիկ զանգ"
+ "Մուտքային զանգի զտում"
+ "Որոնել"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml
new file mode 100644
index 0000000..eda1ec7
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml
@@ -0,0 +1,39 @@
+
+
+ "Tunjukkan jalan ke rumah"
+ "Kembali ke atas"
+ "Opsi lainnya"
+ "Selesai"
+ "Lihat semua"
+ "Pilih aplikasi"
+ "NONAKTIF"
+ "AKTIF"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "spasi"
+ "Sym+"
+ "Menu+"
+ "Telusuri..."
+ "Hapus kueri"
+ "Telusuri kueri"
+ "Telusuri"
+ "Kirim kueri"
+ "Penelusuran suara"
+ "Bagikan dengan"
+ "Bagikan dengan %s "
+ "Ciutkan"
+ "Jawab"
+ "Video"
+ "Tolak"
+ "Tutup"
+ "Panggilan masuk"
+ "Panggilan sedang berlangsung"
+ "Menyaring panggilan masuk"
+ "Telusuri"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml
new file mode 100644
index 0000000..e44b25f
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml
@@ -0,0 +1,39 @@
+
+
+ "Fara heim"
+ "Fara upp"
+ "Fleiri valkostir"
+ "Lokið"
+ "Sjá allt"
+ "Veldu forrit"
+ "SLÖKKT"
+ "KVEIKT"
+ "Alt+"
+ "Ctrl+"
+ "eyða"
+ "enter"
+ "Aðgerðarlykill+"
+ "Meta+"
+ "Shift+"
+ "bilslá"
+ "Sym+"
+ "Valmynd+"
+ "Leita…"
+ "Hreinsa fyrirspurn"
+ "Leitarfyrirspurn"
+ "Leit"
+ "Senda fyrirspurn"
+ "Raddleit"
+ "Deila með"
+ "Deila með %s "
+ "Minnka"
+ "Svara"
+ "Myndsímtal"
+ "Hafna"
+ "Leggja á"
+ "Símtal berst"
+ "Símtal í gangi"
+ "Síar símtal sem berst"
+ "Leit"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml
new file mode 100644
index 0000000..1ba307a
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml
@@ -0,0 +1,39 @@
+
+
+ "Portami a casa"
+ "Torna indietro"
+ "Altre opzioni"
+ "Fine"
+ "Mostra tutto"
+ "Scelta di un\'app"
+ "OFF"
+ "ON"
+ "ALT +"
+ "CTRL +"
+ "CANC"
+ "INVIO"
+ "FUNZIONE +"
+ "META +"
+ "MAIUSC +"
+ "SPAZIO"
+ "SYM +"
+ "MENU +"
+ "Cerca…"
+ "Cancella query"
+ "Query di ricerca"
+ "Cerca"
+ "Invia query"
+ "Ricerca vocale"
+ "Condividi con"
+ "Condividi tramite %s "
+ "Comprimi"
+ "Rispondi"
+ "Video"
+ "Rifiuta"
+ "Riaggancia"
+ "Chiamata in arrivo"
+ "Chiamata in corso"
+ "Applicazione filtro a chiamata in arrivo"
+ "Cerca"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml
new file mode 100644
index 0000000..8610f52
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml
@@ -0,0 +1,39 @@
+
+
+ "ניווט לדף הבית"
+ "ניווט למעלה"
+ "עוד אפשרויות"
+ "סיום"
+ "הצגת הכול"
+ "בחירת אפליקציה"
+ "כבוי"
+ "מופעל"
+ "Alt+"
+ "Ctrl+"
+ "מחיקה"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "רווח"
+ "Sym+"
+ "תפריט+"
+ "חיפוש…"
+ "מחיקת השאילתה"
+ "שאילתת חיפוש"
+ "חיפוש"
+ "שליחת שאילתה"
+ "חיפוש קולי"
+ "שיתוף עם"
+ "שיתוף עם %s "
+ "כיווץ"
+ "מענה"
+ "וידאו"
+ "דחייה"
+ "ניתוק"
+ "שיחה נכנסת"
+ "שיחה פעילה"
+ "סינון שיחה נכנסת"
+ "חיפוש"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml
new file mode 100644
index 0000000..5fa4754
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml
@@ -0,0 +1,39 @@
+
+
+ "ホームに戻る"
+ "前に戻る"
+ "その他のオプション"
+ "完了"
+ "すべて表示"
+ "アプリの選択"
+ "OFF"
+ "ON"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "Space"
+ "Sym+"
+ "Menu+"
+ "検索…"
+ "検索キーワードを削除"
+ "検索キーワード"
+ "検索"
+ "検索キーワードを送信"
+ "音声検索"
+ "共有"
+ "%s と共有"
+ "折りたたむ"
+ "応答"
+ "ビデオ"
+ "拒否"
+ "通話終了"
+ "着信"
+ "通話中"
+ "着信をスクリーニング中"
+ "検索"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml
new file mode 100644
index 0000000..50a5ace
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml
@@ -0,0 +1,39 @@
+
+
+ "მთავარზე გადასვლა"
+ "ზემოთ გადასვლა"
+ "სხვა ვარიანტები"
+ "მზადაა"
+ "ყველას ნახვა"
+ "აირჩიეთ აპი"
+ "გამორთვა"
+ "ჩართვა"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "შორისი"
+ "Sym+"
+ "Menu+"
+ "ძიება…"
+ "მოთხოვნის გასუფთავება"
+ "მოთხოვნის ძიება"
+ "ძიება"
+ "მოთხოვნის გადაგზავნა"
+ "ხმოვანი ძიება"
+ "გაზიარება:"
+ "%s -ით გაზიარება"
+ "ჩაკეცვა"
+ "პასუხი"
+ "ვიდეო"
+ "უარყოფა"
+ "გათიშვა"
+ "შემომავალი ზარი"
+ "მიმდინარე ზარი"
+ "შემომავალი ზარების გაცხრილვა"
+ "ძიება"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml
new file mode 100644
index 0000000..c58eab0
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml
@@ -0,0 +1,39 @@
+
+
+ "Негізгі бетке өту"
+ "Жоғары қарай өту"
+ "Басқа опциялар"
+ "Дайын"
+ "Барлығын көру"
+ "Қолданбаны таңдау"
+ "ӨШІРУ"
+ "ҚОСУ"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "бос орын"
+ "Sym+"
+ "Menu+"
+ "Іздеу…"
+ "Сұрауды өшіру"
+ "Іздеу сұрауы"
+ "Іздеу"
+ "Сұрауды жіберу"
+ "Дауыспен іздеу"
+ "Бөлісу"
+ "%s қолданбасымен бөлісу"
+ "Жию"
+ "Жауап"
+ "Бейне"
+ "Қабылдамау"
+ "Тұтқаны қою"
+ "Кіріс қоңырау"
+ "Қоңырау"
+ "Келген қоңырауды сүзу"
+ "Іздеу"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml
new file mode 100644
index 0000000..1b59086
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml
@@ -0,0 +1,39 @@
+
+
+ "ទៅទំព័រដើម"
+ "រំកិលឡើងលើ"
+ "ជម្រើសច្រើនទៀត"
+ "រួចរាល់"
+ "មើលទាំងអស់"
+ "ជ្រើសរើសកម្មវិធី"
+ "បិទ"
+ "បើក"
+ "Alt+"
+ "Ctrl+"
+ "លុប"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ស្វែងរក…"
+ "សម្អាតសំណួរ"
+ "ស្វែងរកសំណួរ"
+ "ស្វែងរក"
+ "ដាក់បញ្ជូនសំណួរ"
+ "ស្វែងរកតាមសំឡេង"
+ "ចែករំលែកជាមួយ"
+ "ចែករំលែកជាមួយ %s "
+ "បង្រួម"
+ "ឆ្លើយ"
+ "វីដេអូ"
+ "បដិសេធ"
+ "ដាក់ចុះ"
+ "ការហៅចូល"
+ "ការហៅដែលកំពុងដំណើរការ"
+ "កំពុងពិនិត្យការហៅចូល"
+ "ស្វែងរក"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml
new file mode 100644
index 0000000..86331ed
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml
@@ -0,0 +1,39 @@
+
+
+ "ಹೋಮ್ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"
+ "ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"
+ "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"
+ "ಆಯಿತು"
+ "ಎಲ್ಲವನ್ನೂ ನೋಡಿ"
+ "ಆ್ಯಪ್ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ"
+ "ಆಫ್"
+ "ಆನ್"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ಹುಡುಕಿ…"
+ "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ"
+ "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ"
+ "ಹುಡುಕಿ"
+ "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸಿ"
+ "ಧ್ವನಿ ಹುಡುಕಾಟ"
+ "ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"
+ "%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"
+ "ಕುಗ್ಗಿಸಿ"
+ "ಉತ್ತರಿಸಿ"
+ "ವೀಡಿಯೊ"
+ "ನಿರಾಕರಿಸಿ"
+ "ಕರೆ ಕೊನೆಗೊಳಿಸಿ"
+ "ಒಳಬರುವ ಕರೆ"
+ "ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"
+ "ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+ "ಹುಡುಕಿ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml
new file mode 100644
index 0000000..3bd0a8f
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml
@@ -0,0 +1,39 @@
+
+
+ "홈으로 이동"
+ "위로 이동"
+ "추가 옵션"
+ "완료"
+ "전체 보기"
+ "앱 선택"
+ "사용 중지"
+ "사용"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "스페이스바"
+ "Sym+"
+ "Menu+"
+ "검색..."
+ "검색어 삭제"
+ "검색어"
+ "검색"
+ "검색어 보내기"
+ "음성 검색"
+ "공유 대상:"
+ "%s 과(와) 공유"
+ "접기"
+ "통화"
+ "동영상"
+ "거절"
+ "전화 끊기"
+ "수신 전화"
+ "진행 중인 통화"
+ "수신 전화 검사 중"
+ "검색"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml
new file mode 100644
index 0000000..72fc520
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml
@@ -0,0 +1,39 @@
+
+
+ "Башкы бетке чабыттоо"
+ "Мурунку экранга өтүү"
+ "Дагы параметрлер"
+ "Бүттү"
+ "Баарын көрүү"
+ "Колдонмо тандоо"
+ "ӨЧҮК"
+ "КҮЙҮК"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "боштук"
+ "Sym+"
+ "Menu+"
+ "Издөө…"
+ "Сурамды өчүрүү"
+ "Изделген сурам"
+ "Издөө"
+ "Сурам тапшыруу"
+ "Айтып издөө"
+ "Төмөнкү менен бөлүшүү"
+ "%s аркылуу бөлүшүү"
+ "Жыйыштыруу"
+ "Жооп берүү"
+ "Видео"
+ "Четке кагуу"
+ "Чалууну бүтүрүү"
+ "Кирүүчү чалуу"
+ "Учурдагы чалуу"
+ "Кирүүчү чалууну иргөө"
+ "Издөө"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml
new file mode 100644
index 0000000..a12899f
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml
@@ -0,0 +1,6 @@
+
+
+ 48dp
+ 12dp
+ 14dp
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml
new file mode 100644
index 0000000..cc236eb
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml
@@ -0,0 +1,12 @@
+
+
+ 440dp
+ - 60%
+ - 90%
+ - 60%
+ - 90%
+ - 55%
+ - 80%
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ldltr-v21/values-ldltr-v21.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ldltr-v21/values-ldltr-v21.xml
new file mode 100644
index 0000000..1bdd835
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ldltr-v21/values-ldltr-v21.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lo/values-lo.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lo/values-lo.xml
new file mode 100644
index 0000000..25ad23d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lo/values-lo.xml
@@ -0,0 +1,39 @@
+
+
+ "ກັບໄປໜ້າຫຼັກ"
+ "ເລື່ອນຂຶ້ນເທິງ"
+ "ຕົວເລືອກເພີ່ມເຕີມ"
+ "ແລ້ວໆ"
+ "ເບິ່ງທັງໝົດ"
+ "ເລືອກແອັບ"
+ "ປິດ"
+ "ເປີດ"
+ "Alt+"
+ "Ctrl+"
+ "ລຶບ"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "ຍະຫວ່າງ"
+ "Sym+"
+ "Menu+"
+ "ຊອກຫາ…"
+ "ລຶບຂໍ້ຄວາມຊອກຫາ"
+ "ຄຳສຳລັບຄົ້ນຫາ"
+ "ຊອກຫາ"
+ "ສົ່ງຂໍ້ມູນ"
+ "ຊອກຫາດ້ວຍສຽງ"
+ "ແບ່ງປັນກັບ"
+ "ແບ່ງປັນດ້ວຍ %s "
+ "ຫຍໍ້ລົງ"
+ "ຮັບສາຍ"
+ "ວິດີໂອ"
+ "ປະຕິເສດ"
+ "ວາງສາຍ"
+ "ສາຍໂທເຂົ້າ"
+ "ສາຍໂທອອກ"
+ "ກຳລັງກວດສອບສາຍໂທເຂົ້າ"
+ "ຊອກຫາ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lt/values-lt.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lt/values-lt.xml
new file mode 100644
index 0000000..e6f2706
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lt/values-lt.xml
@@ -0,0 +1,39 @@
+
+
+ "Eiti į pagrindinį puslapį"
+ "Naršyti aukštyn"
+ "Daugiau parinkčių"
+ "Atlikta"
+ "Žr. viską"
+ "Pasirinkite programą"
+ "IŠJUNGTI"
+ "ĮJUNGTI"
+ "„Alt“ +"
+ "„Ctrl“ +"
+ "„delete“"
+ "„enter“"
+ "„Function“ +"
+ "„Meta“ +"
+ "„Shift“ +"
+ "„space“"
+ "„Sym“ +"
+ "„Menu“ +"
+ "Ieškoti…"
+ "Išvalyti užklausą"
+ "Paieškos užklausa"
+ "Ieškoti"
+ "Pateikti užklausą"
+ "Paieška balsu"
+ "Bendrinti su"
+ "Bendrinti naudojant programą „%s “"
+ "Sutraukti"
+ "Atsakyti"
+ "Vaizdo įrašas"
+ "Atmesti"
+ "Baigti pok."
+ "Gaunamasis skambutis"
+ "Vykstantis skambutis"
+ "Gaunamojo skambučio tikrinimas"
+ "Ieškoti"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lv/values-lv.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lv/values-lv.xml
new file mode 100644
index 0000000..44ceefd
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-lv/values-lv.xml
@@ -0,0 +1,39 @@
+
+
+ "Pārvietoties uz sākuma ekrānu"
+ "Pārvietoties uz augšu"
+ "Citas opcijas"
+ "Gatavs"
+ "Skatīt visu"
+ "Izvēlieties lietotni"
+ "IZSLĒGT"
+ "IESLĒGT"
+ "Alternēšanas taustiņš +"
+ "Vadīšanas taustiņš +"
+ "dzēšanas taustiņš"
+ "ievadīšanas taustiņš"
+ "Funkcijas taustiņš +"
+ "Meta taustiņš +"
+ "Pārslēgšanas taustiņš +"
+ "atstarpes taustiņš"
+ "Simbolu taustiņš +"
+ "Poga Izvēlne +"
+ "Meklējiet…"
+ "Notīrīt vaicājumu"
+ "Meklēšanas vaicājums"
+ "Meklēt"
+ "Iesniegt vaicājumu"
+ "Meklēt ar balsi"
+ "Kopīgot ar:"
+ "Kopīgot ar lietojumprogrammu %s "
+ "Sakļaut"
+ "Atbildēt"
+ "Video"
+ "Noraidīt"
+ "Pārtraukt"
+ "Ienākošais zvans"
+ "Pašreizējais zvans"
+ "Ienākošā zvana filtrēšana"
+ "Meklēt"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mk/values-mk.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mk/values-mk.xml
new file mode 100644
index 0000000..bedbaea
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mk/values-mk.xml
@@ -0,0 +1,39 @@
+
+
+ "Движи се кон дома"
+ "Движи се нагоре"
+ "Повеќе опции"
+ "Готово"
+ "Прикажи ги сите"
+ "Избери апликација"
+ "ИСКЛУЧЕНО"
+ "ВКЛУЧЕНО"
+ "Alt+"
+ "Ctrl+"
+ "избриши"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "вселена"
+ "Sym+"
+ "Menu+"
+ "Пребарување…"
+ "Исчисти барање"
+ "Пребарај барање"
+ "Пребарај"
+ "Испрати барање"
+ "Гласовно пребарување"
+ "Сподели со"
+ "Сподели со %s "
+ "Собери"
+ "Одговори"
+ "Видео"
+ "Одбиј"
+ "Спушти"
+ "Дојдовен повик"
+ "Тековен повик"
+ "Проверка на дојдовен повик"
+ "Пребарување"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ml/values-ml.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ml/values-ml.xml
new file mode 100644
index 0000000..02dba39
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ml/values-ml.xml
@@ -0,0 +1,39 @@
+
+
+ "ഹോമിലേക്ക് പോവുക"
+ "മുകളിലേക്ക് പോവുക"
+ "കൂടുതൽ ഓപ്ഷനുകൾ"
+ "പൂർത്തിയായി"
+ "എല്ലാം കാണുക"
+ "ആപ്പ് തിരഞ്ഞെടുക്കുക"
+ "ഓഫ്"
+ "ഓൺ"
+ "Alt+"
+ "Ctrl+"
+ "ഇല്ലാതാക്കുക"
+ "enter"
+ "ഫംഗ്ഷന്+"
+ "മെറ്റ+"
+ "Shift+"
+ "സ്പെയ്സ്"
+ "Sym+"
+ "മെനു+"
+ "തിരയുക…"
+ "ചോദ്യം മായ്ക്കുക"
+ "ചോദ്യം തിരയുക"
+ "തിരയുക"
+ "ചോദ്യം സമർപ്പിക്കുക"
+ "സംസാരത്തിലൂടെ തിരയുക"
+ "ഇനിപ്പറയുന്നതുമായി പങ്കിടുക"
+ "%s എന്നതുമായി പങ്കിടുക"
+ "ചുരുക്കുക"
+ "മറുപടി നൽകുക"
+ "വീഡിയോ"
+ "നിരസിക്കുക"
+ "കോൾ നിർത്തുക"
+ "ഇൻകമിംഗ് കോൾ"
+ "സജീവമായ കോൾ"
+ "ഇൻകമിംഗ് കോൾ സ്ക്രീൻ ചെയ്യുന്നു"
+ "തിരയുക"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mn/values-mn.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mn/values-mn.xml
new file mode 100644
index 0000000..61cf05f
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mn/values-mn.xml
@@ -0,0 +1,39 @@
+
+
+ "Нүүр хуудас уруу шилжих"
+ "Дээш шилжих"
+ "Бусад сонголт"
+ "Болсон"
+ "Бүгдийг харах"
+ "Аппыг сонгох"
+ "ИДЭВХГҮЙ"
+ "ИДЭВХТЭЙ"
+ "Alt+"
+ "Ctrl+"
+ "устгах"
+ "оруулах"
+ "Функц+"
+ "Мета+"
+ "Шифт+"
+ "зай"
+ "Sym+"
+ "Цэс+"
+ "Хайх…"
+ "Асуулга арилгах"
+ "Хайх асуулга"
+ "Хайх"
+ "Асуулга илгээх"
+ "Дуут хайлт"
+ "Дараахтай хуваалцах"
+ "%s -тай хуваалцах"
+ "Буулгах"
+ "Хариулах"
+ "Видео"
+ "Татгалзах"
+ "Таслах"
+ "Ирсэн дуудлага"
+ "Дуудлага хийгдэж байна"
+ "Ирсэн дуудлагыг харуулж байна"
+ "Хайх"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mr/values-mr.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mr/values-mr.xml
new file mode 100644
index 0000000..7e4ddc3
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-mr/values-mr.xml
@@ -0,0 +1,39 @@
+
+
+ "घराकडे नेव्हिगेट करा"
+ "वर नेव्हिगेट करा"
+ "आणखी पर्याय"
+ "पूर्ण झाले"
+ "सर्व पहा"
+ "अॅप निवडा"
+ "बंद"
+ "सुरू"
+ "Alt+"
+ "Ctrl+"
+ "हटवा"
+ "एंटर करा"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "मेनू+"
+ "शोधा…"
+ "क्वेरी साफ करा"
+ "शोध क्वेरी"
+ "शोधा"
+ "क्वेरी सबमिट करा"
+ "व्हॉइस शोध"
+ "यांच्यासोबत शेअर करा"
+ "%s सह शेअर करा"
+ "कोलॅप्स करा"
+ "उत्तर द्या"
+ "व्हिडिओ"
+ "नकार द्या"
+ "कॉल बंद करा"
+ "इनकमिंग कॉल"
+ "सुरू असलेला कॉल"
+ "इनकमिंग कॉल स्क्रीन करत आहे"
+ "शोध"
+ "९९९+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ms/values-ms.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ms/values-ms.xml
new file mode 100644
index 0000000..20684a4
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ms/values-ms.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigasi laman utama"
+ "Navigasi ke atas"
+ "Lagi pilihan"
+ "Selesai"
+ "Lihat semua"
+ "Pilih apl"
+ "MATI"
+ "HIDUP"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Fungsi+"
+ "Meta+"
+ "Shift+"
+ "ruang"
+ "Sym+"
+ "Menu+"
+ "Cari…"
+ "Kosongkan pertanyaan"
+ "Pertanyaan carian"
+ "Cari"
+ "Serah pertanyaan"
+ "Carian suara"
+ "Kongsi dengan"
+ "Kongsi dengan %s "
+ "Runtuhkan"
+ "Jawab"
+ "Video"
+ "Tolak"
+ "Tamatkan Panggilan"
+ "Panggilan masuk"
+ "Panggilan sedang berlangsung"
+ "Menyaring panggilan masuk"
+ "Cari"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-my/values-my.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-my/values-my.xml
new file mode 100644
index 0000000..562a385
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-my/values-my.xml
@@ -0,0 +1,39 @@
+
+
+ "မူလနေရာကို ပြန်သွားရန်"
+ "အပေါ်သို့ ရွှေ့ရန်"
+ "နောက်ထပ် ရွေးစရာများ"
+ "ပြီးပြီ"
+ "အားလုံး ကြည့်ရန်"
+ "အက်ပ်တစ်ခုကို ရွေးရန်"
+ "ပိတ်"
+ "ဖွင့်"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ရှာဖွေရန်…"
+ "ရှာဖွေမှုကို ဖယ်ရှားရန်"
+ "ရှာဖွေရန် မေးခွန်း"
+ "ရှာရန်"
+ "ရှာဖွေစရာ အချက်အလက်ကို ပေးပို့ရန်"
+ "အသံဖြင့် ရှာရန်"
+ "နှင့် မျှဝေရန်"
+ "%s ဖြင့် မျှဝေရန်"
+ "လျှော့ပြရန်"
+ "ဖုန်းကိုင်ရန်"
+ "ဗီဒီယို"
+ "ငြင်းပယ်ရန်"
+ "ဖုန်းချရန်"
+ "အဝင်ခေါ်ဆိုမှု"
+ "လက်ရှိခေါ်ဆိုမှု"
+ "အဝင်ခေါ်ဆိုမှုကို စစ်ဆေးနေသည်"
+ "ရှာဖွေမှု"
+ "၉၉၉+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nb/values-nb.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nb/values-nb.xml
new file mode 100644
index 0000000..ad7c7f1
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nb/values-nb.xml
@@ -0,0 +1,39 @@
+
+
+ "Naviger hjem"
+ "Gå opp"
+ "Flere alternativer"
+ "Ferdig"
+ "Se alle"
+ "Velg en app"
+ "AV"
+ "PÅ"
+ "Alt+"
+ "Ctrl+"
+ "slett"
+ "enter"
+ "Funksjon+"
+ "Meta+"
+ "Shift+"
+ "mellomrom"
+ "Sym+"
+ "Meny+"
+ "Søk"
+ "Slett søket"
+ "Søkeord"
+ "Søk"
+ "Utfør søket"
+ "Talesøk"
+ "Del med"
+ "Del med %s "
+ "Skjul"
+ "Svar"
+ "Video"
+ "Avvis"
+ "Legg på"
+ "Innkommende anrop"
+ "Pågående samtale"
+ "Filtrerer et innkommende anrop"
+ "Søk"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ne/values-ne.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ne/values-ne.xml
new file mode 100644
index 0000000..1877f42
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ne/values-ne.xml
@@ -0,0 +1,39 @@
+
+
+ "होम पेजमा जानुहोस्"
+ "माथि नेभिगेट गर्नुहोस्"
+ "थप विकल्पहरू"
+ "सम्पन्न भयो"
+ "सबै हेर्नुहोस्"
+ "एउटा एप छान्नुहोस्"
+ "निष्क्रिय"
+ "सक्रिय"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "खोज्नुहोस्…"
+ "क्वेरी खाली गर्नुहोस्"
+ "खोज प्रश्न"
+ "खोज्नुहोस्"
+ "क्वेरी पेस गर्नुहोस्"
+ "आवाजमा आधारित खोजी"
+ "यसमार्फत सेयर गर्नुहोस्"
+ "%s मार्फत सेयर गर्नुहोस्"
+ "संक्षिप्त गर्नुहोस्"
+ "जवाफ दिनुहोस्"
+ "भिडियो"
+ "काट्नुहोस्"
+ "फोन राख्नुहोस्"
+ "आगमन कल"
+ "भइरहेको कल"
+ "आगमन कल जाँचिँदै छ"
+ "खोज"
+ "९९९+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-night-v8/values-night-v8.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-night-v8/values-night-v8.xml
new file mode 100644
index 0000000..4185030
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-night-v8/values-night-v8.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nl/values-nl.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nl/values-nl.xml
new file mode 100644
index 0000000..7c71ece
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-nl/values-nl.xml
@@ -0,0 +1,39 @@
+
+
+ "Navigeren naar startpositie"
+ "Omhoog navigeren"
+ "Meer opties"
+ "Klaar"
+ "Alles tonen"
+ "Een app selecteren"
+ "UIT"
+ "AAN"
+ "Alt +"
+ "Ctrl +"
+ "Delete"
+ "Enter"
+ "Functie +"
+ "Meta +"
+ "Shift +"
+ "spatie"
+ "Sym +"
+ "Menu +"
+ "Zoeken…"
+ "Zoekopdracht wissen"
+ "Zoekopdracht"
+ "Zoeken"
+ "Zoekopdracht verzenden"
+ "Gesproken zoekopdracht"
+ "Delen met"
+ "Delen met %s "
+ "Samenvouwen"
+ "Beantwoorden"
+ "Video"
+ "Weigeren"
+ "Ophangen"
+ "Inkomend gesprek"
+ "Actief gesprek"
+ "Een inkomend gesprek screenen"
+ "Zoeken"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-or/values-or.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-or/values-or.xml
new file mode 100644
index 0000000..b304f80
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-or/values-or.xml
@@ -0,0 +1,39 @@
+
+
+ "ହୋମକୁ ନେଭିଗେଟ କରନ୍ତୁ"
+ "ଉପରକୁ ନେଭିଗେଟ୍ କରନ୍ତୁ"
+ "ଅଧିକ ବିକଳ୍ପ"
+ "ହୋଇଗଲା"
+ "ସବୁ ଦେଖନ୍ତୁ"
+ "ଗୋଟିଏ ଆପ୍ ବାଛନ୍ତୁ"
+ "ବନ୍ଦ"
+ "ଚାଲୁ ଅଛି"
+ "Alt+"
+ "Ctrl+"
+ "ଡିଲିଟ କରନ୍ତୁ"
+ "ଏଣ୍ଟର୍"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "ସ୍ପେସ୍"
+ "Sym+"
+ "ମେନୁ"
+ "ସର୍ଚ୍ଚ କରନ୍ତୁ…"
+ "କ୍ୱେରୀ ଖାଲି କରନ୍ତୁ"
+ "ସର୍ଚ୍ଚ କ୍ୱେରୀ"
+ "ସର୍ଚ୍ଚ କରନ୍ତୁ"
+ "କ୍ୱେରୀ ଦାଖଲ କରନ୍ତୁ"
+ "ଭଏସ ସର୍ଚ୍ଚ"
+ "ଏହାଙ୍କ ସହ ସେୟାର୍ କରନ୍ତୁ"
+ "%s ସହ ସେୟାର୍ କରନ୍ତୁ"
+ "ସଂକୁଚିତ କରନ୍ତୁ"
+ "ଉତ୍ତର ଦିଅନ୍ତୁ"
+ "ଭିଡିଓ"
+ "ଅଗ୍ରାହ୍ୟ କର"
+ "ସମାପ୍ତ କରନ୍ତୁ"
+ "ଇନକମିଂ କଲ୍"
+ "ଚାଲିଥିବା କଲ୍"
+ "ଏକ ଇନକମିଂ କଲକୁ ସ୍କ୍ରିନ୍ କରୁଛି"
+ "ସର୍ଚ୍ଚ କରନ୍ତୁ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pa/values-pa.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pa/values-pa.xml
new file mode 100644
index 0000000..f85637a
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pa/values-pa.xml
@@ -0,0 +1,39 @@
+
+
+ "ਹੋਮ \'ਤੇ ਜਾਓ"
+ "ਉੱਪਰ ਜਾਓ"
+ "ਹੋਰ ਵਿਕਲਪ"
+ "ਹੋ ਗਿਆ"
+ "ਸਭ ਦੇਖੋ"
+ "ਇੱਕ ਐਪ ਚੁਣੋ"
+ "ਬੰਦ"
+ "ਚਾਲੂ"
+ "Alt+"
+ "Ctrl+"
+ "ਮਿਟਾਓ"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ਖੋਜ…"
+ "ਪੁੱਛਗਿੱਛ ਕਲੀਅਰ ਕਰੋ"
+ "ਖੋਜ ਪੁੱਛਗਿੱਛ"
+ "ਖੋਜ"
+ "ਪੁੱਛਗਿੱਛ ਸਪੁਰਦ ਕਰੋ"
+ "ਅਵਾਜ਼ੀ ਖੋਜ"
+ "ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"
+ "%s ਨਾਲ ਸਾਂਝਾ ਕਰੋ"
+ "ਸਮੇਟੋ"
+ "ਜਵਾਬ ਦਿਓ"
+ "ਵੀਡੀਓ"
+ "ਅਸਵੀਕਾਰ ਕਰੋ"
+ "ਸਮਾਪਤ ਕਰੋ"
+ "ਇਨਕਮਿੰਗ ਕਾਲ"
+ "ਜਾਰੀ ਕਾਲ"
+ "ਇਨਕਮਿੰਗ ਕਾਲ ਦੀ ਸਕ੍ਰੀਨਿੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+ "ਖੋਜ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pl/values-pl.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pl/values-pl.xml
new file mode 100644
index 0000000..ce5480c
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-pl/values-pl.xml
@@ -0,0 +1,39 @@
+
+
+ "Przejdź na stronę główną"
+ "Przejdź wyżej"
+ "Więcej opcji"
+ "Gotowe"
+ "Pokaż wszystko"
+ "Wybierz aplikację"
+ "WYŁ."
+ "WŁ."
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Funkcyjny+"
+ "Meta+"
+ "Shift+"
+ "spacja"
+ "Sym+"
+ "Menu+"
+ "Szukaj…"
+ "Wyczyść zapytanie"
+ "Zapytanie"
+ "Szukaj"
+ "Wyślij zapytanie"
+ "Wyszukiwanie głosowe"
+ "Udostępnij przez:"
+ "Udostępnij przez: %s "
+ "Zwiń"
+ "Odbierz"
+ "Wideo"
+ "Odrzuć"
+ "Rozłącz"
+ "Połączenie przychodzące"
+ "Trwa połączenie"
+ "Filtruję połączenie przychodzące"
+ "Szukaj"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-port/values-port.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-port/values-port.xml
new file mode 100644
index 0000000..7a925dc
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-port/values-port.xml
@@ -0,0 +1,4 @@
+
+
+ false
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tl/values-tl.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tl/values-tl.xml
new file mode 100644
index 0000000..460c9d8
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tl/values-tl.xml
@@ -0,0 +1,39 @@
+
+
+ "Mag-navigate sa home"
+ "Mag-navigate pataas"
+ "Higit pang opsyon"
+ "Tapos na"
+ "Tingnan lahat"
+ "Pumili ng app"
+ "I-OFF"
+ "I-ON"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "Maghanap…"
+ "I-clear ang query"
+ "Query sa paghahanap"
+ "Maghanap"
+ "Isumite ang query"
+ "Paghahanap gamit ang boses"
+ "Ibahagi sa/kay"
+ "Ibahagi gamit ang %s "
+ "I-collapse"
+ "Sagutin"
+ "Video"
+ "Tanggihan"
+ "Ibaba"
+ "Papasok na tawag"
+ "Kasalukuyang tawag"
+ "Nagsi-screen ng papasok na tawag"
+ "Maghanap"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tr/values-tr.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tr/values-tr.xml
new file mode 100644
index 0000000..9f570cc
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-tr/values-tr.xml
@@ -0,0 +1,39 @@
+
+
+ "Eve gidiş yolunu göster"
+ "Yukarı git"
+ "Diğer seçenekler"
+ "Bitti"
+ "Tümünü göster"
+ "Bir uygulama seçin"
+ "KAPAT"
+ "AÇ"
+ "Alt+"
+ "Ctrl+"
+ "sil"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Üst Karakter+"
+ "boşluk"
+ "Sym+"
+ "Menü+"
+ "Ara…"
+ "Sorguyu temizle"
+ "Arama sorgusu"
+ "Ara"
+ "Sorguyu gönder"
+ "Sesli arama"
+ "Şununla paylaş:"
+ "%s ile paylaş"
+ "Daralt"
+ "Yanıtla"
+ "Video"
+ "Reddet"
+ "Kapat"
+ "Gelen arama"
+ "Devam eden arama"
+ "Gelen arama süzülüyor"
+ "Ara"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uk/values-uk.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uk/values-uk.xml
new file mode 100644
index 0000000..5829859
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uk/values-uk.xml
@@ -0,0 +1,39 @@
+
+
+ "Перейти на головну"
+ "Перейти вгору"
+ "Більше опцій"
+ "Готово"
+ "Показати всі"
+ "Вибрати програму"
+ "ВИМКНЕНО"
+ "УВІМКНЕНО"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "пробіл"
+ "Sym+"
+ "Menu+"
+ "Введіть пошуковий запит…"
+ "Очистити запит"
+ "Пошуковий запит"
+ "Пошук"
+ "Наіслати запит"
+ "Голосовий пошук"
+ "Поділитися:"
+ "Поділитися через додаток %s "
+ "Згорнути"
+ "Відповісти"
+ "Відео"
+ "Відхилити"
+ "Завершити"
+ "Вхідний виклик"
+ "Активний виклик"
+ "Вхідний виклик (Фільтр)"
+ "Пошук"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ur/values-ur.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ur/values-ur.xml
new file mode 100644
index 0000000..8b29f1d
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ur/values-ur.xml
@@ -0,0 +1,39 @@
+
+
+ "گھر کی طرف نیویگیٹ کریں"
+ "اوپر نیویگیٹ کریں"
+ "مزید اختیارات"
+ "ہو گیا"
+ "سبھی دیکھیں"
+ "ایک ایپ منتخب کریں"
+ "آف"
+ "آن"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "تلاش کریں…"
+ "استفسار صاف کریں"
+ "تلاش کا استفسار"
+ "تلاش کریں"
+ "استفسار جمع کرائیں"
+ "صوتی تلاش"
+ "اس کے ساتھ اشتراک کریں"
+ "%s کے ساتھ اشتراک کریں"
+ "سکیڑیں"
+ "جواب دیں"
+ "ویڈیو"
+ "مسترد کریں"
+ "منقطع کر دیں"
+ "اِن کمنگ کال"
+ "جاری کال"
+ "اِن کمنگ کال کی اسکریننگ"
+ "تلاش کریں"
+ "+999"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uz/values-uz.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uz/values-uz.xml
new file mode 100644
index 0000000..e239730
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-uz/values-uz.xml
@@ -0,0 +1,39 @@
+
+
+ "Boshiga o‘tish"
+ "Yopish"
+ "Yana"
+ "OK"
+ "Hammasi"
+ "Ilovani tanlang"
+ "YOQILMAGAN"
+ "YONIQ"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Fn+"
+ "Meta+"
+ "Shift+"
+ "Probel"
+ "Sym+"
+ "Menyu+"
+ "Qidirish…"
+ "So‘rovni o‘chirish"
+ "Qidiruv so‘rovi"
+ "Qidiruv"
+ "So‘rov yaratish"
+ "Ovozli qidiruv"
+ "Ulashish"
+ "%s orqali ulashish"
+ "Yig‘ish"
+ "Javob berish"
+ "Video"
+ "Rad etish"
+ "Tugatish"
+ "Kiruvchi chaqiruv"
+ "Joriy chaqiruv"
+ "Kiruvchi chaqiruvni filtrlash"
+ "Qidiruv"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v16/values-v16.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v16/values-v16.xml
new file mode 100644
index 0000000..3ba0ed0
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v16/values-v16.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml
new file mode 100644
index 0000000..f85a197
--- /dev/null
+++ b/autolayout/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class
new file mode 100644
index 0000000..00c4e55
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class
new file mode 100644
index 0000000..d5e9722
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class
new file mode 100644
index 0000000..febbbca
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class
new file mode 100644
index 0000000..b06ef2f
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class
new file mode 100644
index 0000000..e5e8ed3
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class
new file mode 100644
index 0000000..d5cc319
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class
new file mode 100644
index 0000000..6ee792b
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/L.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/L.class
new file mode 100644
index 0000000..64d7fe3
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/L.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class
new file mode 100644
index 0000000..be6f1fe
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class
new file mode 100644
index 0000000..49d3de7
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class
new file mode 100644
index 0000000..18e7e51
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class
new file mode 100644
index 0000000..7691a04
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class differ
diff --git a/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class
new file mode 100644
index 0000000..28af952
Binary files /dev/null and b/autolayout/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class
new file mode 100644
index 0000000..2b41e60
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout.class
new file mode 100644
index 0000000..142e7aa
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/AutoFrameLayout.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinHeightAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinHeightAttr.class
new file mode 100644
index 0000000..e3e812b
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinHeightAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinWidthAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinWidthAttr.class
new file mode 100644
index 0000000..a90f583
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/MinWidthAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingAttr.class
new file mode 100644
index 0000000..a891450
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingBottomAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingBottomAttr.class
new file mode 100644
index 0000000..59b47f3
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingBottomAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingLeftAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingLeftAttr.class
new file mode 100644
index 0000000..2a8fa16
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingLeftAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingRightAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingRightAttr.class
new file mode 100644
index 0000000..d765cde
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingRightAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingTopAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingTopAttr.class
new file mode 100644
index 0000000..cbcf2d6
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/PaddingTopAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/TextSizeAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/TextSizeAttr.class
new file mode 100644
index 0000000..d0a0136
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/TextSizeAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class
new file mode 100644
index 0000000..00c4e55
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/attr/WidthAttr.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class
new file mode 100644
index 0000000..d5e9722
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/AutoLayoutConifg.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class
new file mode 100644
index 0000000..febbbca
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/config/UseLandscape.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class
new file mode 100644
index 0000000..b06ef2f
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper$AutoLayoutParams.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class
new file mode 100644
index 0000000..e5e8ed3
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoLayoutHelper.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class
new file mode 100644
index 0000000..d5cc319
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/AutoUtils.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class
new file mode 100644
index 0000000..6ee792b
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/DimenUtils.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/L.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/L.class
new file mode 100644
index 0000000..64d7fe3
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/L.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class
new file mode 100644
index 0000000..be6f1fe
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/utils/ScreenUtils.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class
new file mode 100644
index 0000000..49d3de7
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$1.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class
new file mode 100644
index 0000000..18e7e51
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class
new file mode 100644
index 0000000..7691a04
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout$MetroBlock.class differ
diff --git a/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class
new file mode 100644
index 0000000..28af952
Binary files /dev/null and b/autolayout/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/zhy/autolayout/widget/MetroLayout.class differ
diff --git a/autolayout/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/autolayout/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
new file mode 100644
index 0000000..a38f154
--- /dev/null
+++ b/autolayout/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
@@ -0,0 +1,11 @@
+R_DEF: Internal format may change without notice
+local
+attr? layout_auto_baseheight
+attr? layout_auto_basewidth
+attr? metro_divider
+id id_tag_autolayout_margin
+id id_tag_autolayout_padding
+id id_tag_autolayout_size
+string app_name
+styleable AutoLayout_Layout layout_auto_basewidth layout_auto_baseheight
+styleable MetroLayout metro_divider
diff --git a/autolayout/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt b/autolayout/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
new file mode 100644
index 0000000..a38f154
--- /dev/null
+++ b/autolayout/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
@@ -0,0 +1,11 @@
+R_DEF: Internal format may change without notice
+local
+attr? layout_auto_baseheight
+attr? layout_auto_basewidth
+attr? metro_divider
+id id_tag_autolayout_margin
+id id_tag_autolayout_padding
+id id_tag_autolayout_size
+string app_name
+styleable AutoLayout_Layout layout_auto_basewidth layout_auto_baseheight
+styleable MetroLayout metro_divider
diff --git a/autolayout/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/autolayout/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
new file mode 100644
index 0000000..9204238
--- /dev/null
+++ b/autolayout/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/autolayout/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt b/autolayout/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
new file mode 100644
index 0000000..9204238
--- /dev/null
+++ b/autolayout/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/autolayout/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-autolayout.jar b/autolayout/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-autolayout.jar
new file mode 100644
index 0000000..15cb0ec
Binary files /dev/null and b/autolayout/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-autolayout.jar differ
diff --git a/autolayout/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-autolayout.jar b/autolayout/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-autolayout.jar
new file mode 100644
index 0000000..15cb0ec
Binary files /dev/null and b/autolayout/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-autolayout.jar differ
diff --git a/autolayout/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/autolayout/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
new file mode 100644
index 0000000..9f123fb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml b/autolayout/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
new file mode 100644
index 0000000..9f123fb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml
new file mode 100644
index 0000000..97b9de9
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml
new file mode 100644
index 0000000..da7ee29
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml
@@ -0,0 +1,20 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml
new file mode 100644
index 0000000..c81b39a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml
@@ -0,0 +1,20 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml
new file mode 100644
index 0000000..79d02d4
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml
new file mode 100644
index 0000000..91664da
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml
new file mode 100644
index 0000000..db7e807
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml
new file mode 100644
index 0000000..9a23cd2
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml
new file mode 100644
index 0000000..1afa8fe
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml
new file mode 100644
index 0000000..ab824f2
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml
new file mode 100644
index 0000000..b309fe8
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml
new file mode 100644
index 0000000..e84d1c7
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml
new file mode 100644
index 0000000..134d9d7
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml
new file mode 100644
index 0000000..67f6af8
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml
new file mode 100644
index 0000000..8d892c1
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml
new file mode 100644
index 0000000..57fc365
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml
new file mode 100644
index 0000000..a6ef064
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml
new file mode 100644
index 0000000..0f13aaf
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml
new file mode 100644
index 0000000..188e706
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml
new file mode 100644
index 0000000..8b63d01
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml
new file mode 100644
index 0000000..22bb845
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml
new file mode 100644
index 0000000..51154c1
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml
new file mode 100644
index 0000000..c889ae6
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml
new file mode 100644
index 0000000..f0b9d7d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml
new file mode 100644
index 0000000..3269f8b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml
new file mode 100644
index 0000000..0215835
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml
new file mode 100644
index 0000000..1408ac6
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml
new file mode 100644
index 0000000..4c50d20
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml
new file mode 100644
index 0000000..b948a22
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml
new file mode 100644
index 0000000..841049d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml
new file mode 100644
index 0000000..01bd5c0
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml
new file mode 100644
index 0000000..dc27998
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml
new file mode 100644
index 0000000..468b155
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml
new file mode 100644
index 0000000..abe3880
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml
new file mode 100644
index 0000000..0e05e07
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml
new file mode 100644
index 0000000..4fc9626
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml
new file mode 100644
index 0000000..0e05e07
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml
new file mode 100644
index 0000000..e663772
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml
new file mode 100644
index 0000000..e016076
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml
new file mode 100644
index 0000000..290faf1
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml
new file mode 100644
index 0000000..fe86872
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml
new file mode 100644
index 0000000..1bef5af
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml
new file mode 100644
index 0000000..724c255
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml
new file mode 100644
index 0000000..7395e68
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml
new file mode 100644
index 0000000..7d66d02
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml
new file mode 100644
index 0000000..105b643
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml
new file mode 100644
index 0000000..0631d5d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml
new file mode 100644
index 0000000..6399b1d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml
new file mode 100644
index 0000000..87c015a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
new file mode 100644
index 0000000..1f1cdad
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png
new file mode 100644
index 0000000..ffb0096
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png
new file mode 100644
index 0000000..e54950e
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png
new file mode 100644
index 0000000..0da5b1d
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png
new file mode 100644
index 0000000..f8063b2
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png
new file mode 100644
index 0000000..4b0b10a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png
new file mode 100644
index 0000000..d3556a8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png
new file mode 100644
index 0000000..183c9ac
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png
new file mode 100644
index 0000000..9b67079
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png
new file mode 100644
index 0000000..5b13bc1
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png
new file mode 100644
index 0000000..5440b1a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png
new file mode 100644
index 0000000..05d6920
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
new file mode 100644
index 0000000..6282df4
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png
new file mode 100644
index 0000000..7aca1a1
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png
new file mode 100644
index 0000000..7aca1a1
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png
new file mode 100644
index 0000000..8eafb01
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png
new file mode 100644
index 0000000..c888ee0
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png
new file mode 100644
index 0000000..588161e
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png
new file mode 100644
index 0000000..7cf976d
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png
new file mode 100644
index 0000000..4c0f0b3
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png
new file mode 100644
index 0000000..fa0ed8f
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png
new file mode 100644
index 0000000..7a9fcbc
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png
new file mode 100644
index 0000000..8e6c271
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png
new file mode 100644
index 0000000..9f0d2c8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png
new file mode 100644
index 0000000..6e18d40
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..d0a41a5
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..bebb1e2
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png
new file mode 100644
index 0000000..038e000
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png
new file mode 100644
index 0000000..6086f9c
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png
new file mode 100644
index 0000000..c2264a8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png
new file mode 100644
index 0000000..addb54a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png
new file mode 100644
index 0000000..5fcd5b2
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml
new file mode 100644
index 0000000..595c56c
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml
@@ -0,0 +1,18 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml
new file mode 100644
index 0000000..10251aa
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml
new file mode 100644
index 0000000..7ef438b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml
new file mode 100644
index 0000000..d98b008
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml
new file mode 100644
index 0000000..5ed2121
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml
new file mode 100644
index 0000000..a9ea90a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml
new file mode 100644
index 0000000..0b54039
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml
@@ -0,0 +1,19 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml
new file mode 100644
index 0000000..242761b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png
new file mode 100644
index 0000000..6284eaa
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png
new file mode 100644
index 0000000..4902520
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png
new file mode 100644
index 0000000..59a683a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png
new file mode 100644
index 0000000..03bf49c
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png
new file mode 100644
index 0000000..342323b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..1d29f9a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..92b43ba
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png
new file mode 100644
index 0000000..600178a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png
new file mode 100644
index 0000000..32e00be
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png
new file mode 100644
index 0000000..bdf477b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png
new file mode 100644
index 0000000..5c4da74
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png
new file mode 100644
index 0000000..9128e62
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png
new file mode 100644
index 0000000..4eae28f
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png
new file mode 100644
index 0000000..d934b60
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png
new file mode 100644
index 0000000..8c82ec3
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png
new file mode 100644
index 0000000..8fc0a9b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png
new file mode 100644
index 0000000..3038d70
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..c079867
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..3b9dc7c
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png
new file mode 100644
index 0000000..f6d2f32
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png
new file mode 100644
index 0000000..fe826b7
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png
new file mode 100644
index 0000000..987b2bc
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png
new file mode 100644
index 0000000..8b050e8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png
new file mode 100644
index 0000000..00e370a
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png
new file mode 100644
index 0000000..d186a5b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png
new file mode 100644
index 0000000..4d3d3a4
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png
new file mode 100644
index 0000000..c5acb84
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png
new file mode 100644
index 0000000..30328ae
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
new file mode 100644
index 0000000..bc21142
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png
new file mode 100644
index 0000000..949da2b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png
new file mode 100644
index 0000000..949da2b
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png
new file mode 100644
index 0000000..35e3bc8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png
new file mode 100644
index 0000000..35e3bc8
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png
new file mode 100644
index 0000000..15aeec0
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png
new file mode 100644
index 0000000..15aeec0
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png
new file mode 100644
index 0000000..e40fa4e
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png
new file mode 100644
index 0000000..4e18de2
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png
new file mode 100644
index 0000000..5fa3266
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png
new file mode 100644
index 0000000..c11cb2e
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..639e6cb
Binary files /dev/null and b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml
new file mode 100644
index 0000000..ce7a968
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml
new file mode 100644
index 0000000..c50d4b1
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml
new file mode 100644
index 0000000..6e9f9cf
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml
new file mode 100644
index 0000000..64cebc2
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml
new file mode 100644
index 0000000..9faf60a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml
new file mode 100644
index 0000000..0922395
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml
new file mode 100644
index 0000000..5a89523
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml
new file mode 100644
index 0000000..68547eb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml
new file mode 100644
index 0000000..e6d106b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml
new file mode 100644
index 0000000..0c88119
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml
new file mode 100644
index 0000000..60ebf76
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml
new file mode 100644
index 0000000..592bd60
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml
new file mode 100644
index 0000000..1420edd
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml
new file mode 100644
index 0000000..5404374
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml
new file mode 100644
index 0000000..d0de4ae
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml
new file mode 100644
index 0000000..597a1b3
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml
new file mode 100644
index 0000000..ba1dc57
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml
new file mode 100644
index 0000000..ee96ec2
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml
new file mode 100644
index 0000000..1a8de1b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml
new file mode 100644
index 0000000..43c2f99
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml
new file mode 100644
index 0000000..20966d5
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..3db122b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml
new file mode 100644
index 0000000..47f65a0
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..3db122b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml
new file mode 100644
index 0000000..47f65a0
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..956d389
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..956d389
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml
new file mode 100644
index 0000000..14950d3
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml
new file mode 100644
index 0000000..7199c25
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml
new file mode 100644
index 0000000..7ef38fa
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml
new file mode 100644
index 0000000..9e3666e
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml
new file mode 100644
index 0000000..8fadd67
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_expanded_menu_layout.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_expanded_menu_layout.xml
new file mode 100644
index 0000000..ef53055
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_expanded_menu_layout.xml
@@ -0,0 +1,21 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_checkbox.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_checkbox.xml
new file mode 100644
index 0000000..d9c3f06
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_checkbox.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_icon.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_icon.xml
new file mode 100644
index 0000000..d6b71db
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_icon.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_layout.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_layout.xml
new file mode 100644
index 0000000..c84e04e
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_layout.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_radio.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_radio.xml
new file mode 100644
index 0000000..0ca8d7a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_radio.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_header_item_layout.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_header_item_layout.xml
new file mode 100644
index 0000000..9545b11
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_header_item_layout.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_item_layout.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_item_layout.xml
new file mode 100644
index 0000000..5b6b87b
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_item_layout.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_content_include.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_content_include.xml
new file mode 100644
index 0000000..9d079f7
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_content_include.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple.xml
new file mode 100644
index 0000000..894fbda
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple_overlay_action_mode.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple_overlay_action_mode.xml
new file mode 100644
index 0000000..ede2834
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple_overlay_action_mode.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_toolbar.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_toolbar.xml
new file mode 100644
index 0000000..64d7321
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_toolbar.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_dropdown_item_icons_2line.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_dropdown_item_icons_2line.xml
new file mode 100644
index 0000000..b81d5d8
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_dropdown_item_icons_2line.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_view.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_view.xml
new file mode 100644
index 0000000..33d25d9
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_view.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_select_dialog_material.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_select_dialog_material.xml
new file mode 100644
index 0000000..5891c81
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_select_dialog_material.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_tooltip.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_tooltip.xml
new file mode 100644
index 0000000..1421cd4
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_tooltip.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/custom_dialog.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/custom_dialog.xml
new file mode 100644
index 0000000..47a1b12
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/layout/custom_dialog.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fa/values-fa.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fa/values-fa.xml
new file mode 100644
index 0000000..384236d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fa/values-fa.xml
@@ -0,0 +1,39 @@
+
+
+ "پیمایش به صفحه اصلی"
+ "رفتن به بالا"
+ "گزینههای بیشتر"
+ "تمام"
+ "دیدن همه"
+ "انتخاب برنامه"
+ "خاموش"
+ "روشن"
+ "Alt+"
+ "Ctrl+"
+ "حذف"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "فاصله"
+ "Sym+"
+ "منو+"
+ "جستجو…"
+ "پاک کردن پُرسمان"
+ "درخواست جستجو"
+ "جستجو"
+ "ارسال پُرسمان"
+ "جستجوی گفتاری"
+ "همرسانی با"
+ "همرسانی با %s "
+ "کوچک کردن"
+ "پاسخ دادن"
+ "ویدیو"
+ "رد کردن"
+ "قطع تماس"
+ "تماس ورودی"
+ "تماس درحال انجام"
+ "درحال غربال کردن تماس ورودی"
+ "جستجو"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fi/values-fi.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fi/values-fi.xml
new file mode 100644
index 0000000..87e7d9e
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fi/values-fi.xml
@@ -0,0 +1,39 @@
+
+
+ "Siirry etusivulle"
+ "Siirry ylös"
+ "Lisäasetukset"
+ "Valmis"
+ "Näytä kaikki"
+ "Valitse sovellus"
+ "POIS PÄÄLTÄ"
+ "PÄÄLLÄ"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Fn+"
+ "Meta+"
+ "Vaihto+"
+ "välilyönti"
+ "Sym+"
+ "Valikko+"
+ "Haku…"
+ "Tyhjennä kysely"
+ "Hakukysely"
+ "Haku"
+ "Lähetä kysely"
+ "Puhehaku"
+ "Jaa…"
+ "Jaa: %s "
+ "Tiivistä"
+ "Vastaa"
+ "Video"
+ "Hylkää"
+ "Lopeta puhelu"
+ "Saapuva puhelu"
+ "Käynnissä oleva puhelu"
+ "Seulotaan saapuvaa puhelua"
+ "Haku"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fr-rCA/values-fr-rCA.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fr-rCA/values-fr-rCA.xml
new file mode 100644
index 0000000..5474a56
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-fr-rCA/values-fr-rCA.xml
@@ -0,0 +1,39 @@
+
+
+ "Revenir à l\'accueil"
+ "Revenir en arrière"
+ "Autres options"
+ "Terminé"
+ "Tout afficher"
+ "Sélectionner une application"
+ "DÉSACTIVER"
+ "ACTIVER"
+ "Alt+"
+ "Ctrl+"
+ "supprimer"
+ "entrée"
+ "Fonction+"
+ "Méta+"
+ "Maj+"
+ "espace"
+ "Sym+"
+ "Menu+"
+ "Rechercher…"
+ "Effacer la requête"
+ "Requête de recherche"
+ "Rechercher"
+ "Envoyer la requête"
+ "Recherche vocale"
+ "Partager avec"
+ "Partager avec %s "
+ "Réduire"
+ "Répondre"
+ "Vidéo"
+ "Refuser"
+ "Raccrocher"
+ "Appel entrant"
+ "Appel en cours"
+ "Filtrer un appel entrant"
+ "Rechercher"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-km/values-km.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-km/values-km.xml
new file mode 100644
index 0000000..1b59086
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-km/values-km.xml
@@ -0,0 +1,39 @@
+
+
+ "ទៅទំព័រដើម"
+ "រំកិលឡើងលើ"
+ "ជម្រើសច្រើនទៀត"
+ "រួចរាល់"
+ "មើលទាំងអស់"
+ "ជ្រើសរើសកម្មវិធី"
+ "បិទ"
+ "បើក"
+ "Alt+"
+ "Ctrl+"
+ "លុប"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ស្វែងរក…"
+ "សម្អាតសំណួរ"
+ "ស្វែងរកសំណួរ"
+ "ស្វែងរក"
+ "ដាក់បញ្ជូនសំណួរ"
+ "ស្វែងរកតាមសំឡេង"
+ "ចែករំលែកជាមួយ"
+ "ចែករំលែកជាមួយ %s "
+ "បង្រួម"
+ "ឆ្លើយ"
+ "វីដេអូ"
+ "បដិសេធ"
+ "ដាក់ចុះ"
+ "ការហៅចូល"
+ "ការហៅដែលកំពុងដំណើរការ"
+ "កំពុងពិនិត្យការហៅចូល"
+ "ស្វែងរក"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-kn/values-kn.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-kn/values-kn.xml
new file mode 100644
index 0000000..86331ed
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-kn/values-kn.xml
@@ -0,0 +1,39 @@
+
+
+ "ಹೋಮ್ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"
+ "ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"
+ "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"
+ "ಆಯಿತು"
+ "ಎಲ್ಲವನ್ನೂ ನೋಡಿ"
+ "ಆ್ಯಪ್ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ"
+ "ಆಫ್"
+ "ಆನ್"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "space"
+ "Sym+"
+ "Menu+"
+ "ಹುಡುಕಿ…"
+ "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ"
+ "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ"
+ "ಹುಡುಕಿ"
+ "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸಿ"
+ "ಧ್ವನಿ ಹುಡುಕಾಟ"
+ "ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"
+ "%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"
+ "ಕುಗ್ಗಿಸಿ"
+ "ಉತ್ತರಿಸಿ"
+ "ವೀಡಿಯೊ"
+ "ನಿರಾಕರಿಸಿ"
+ "ಕರೆ ಕೊನೆಗೊಳಿಸಿ"
+ "ಒಳಬರುವ ಕರೆ"
+ "ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"
+ "ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+ "ಹುಡುಕಿ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ko/values-ko.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ko/values-ko.xml
new file mode 100644
index 0000000..3bd0a8f
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ko/values-ko.xml
@@ -0,0 +1,39 @@
+
+
+ "홈으로 이동"
+ "위로 이동"
+ "추가 옵션"
+ "완료"
+ "전체 보기"
+ "앱 선택"
+ "사용 중지"
+ "사용"
+ "Alt+"
+ "Ctrl+"
+ "Delete"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "스페이스바"
+ "Sym+"
+ "Menu+"
+ "검색..."
+ "검색어 삭제"
+ "검색어"
+ "검색"
+ "검색어 보내기"
+ "음성 검색"
+ "공유 대상:"
+ "%s 과(와) 공유"
+ "접기"
+ "통화"
+ "동영상"
+ "거절"
+ "전화 끊기"
+ "수신 전화"
+ "진행 중인 통화"
+ "수신 전화 검사 중"
+ "검색"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ky/values-ky.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ky/values-ky.xml
new file mode 100644
index 0000000..72fc520
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ky/values-ky.xml
@@ -0,0 +1,39 @@
+
+
+ "Башкы бетке чабыттоо"
+ "Мурунку экранга өтүү"
+ "Дагы параметрлер"
+ "Бүттү"
+ "Баарын көрүү"
+ "Колдонмо тандоо"
+ "ӨЧҮК"
+ "КҮЙҮК"
+ "Alt+"
+ "Ctrl+"
+ "delete"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "боштук"
+ "Sym+"
+ "Menu+"
+ "Издөө…"
+ "Сурамды өчүрүү"
+ "Изделген сурам"
+ "Издөө"
+ "Сурам тапшыруу"
+ "Айтып издөө"
+ "Төмөнкү менен бөлүшүү"
+ "%s аркылуу бөлүшүү"
+ "Жыйыштыруу"
+ "Жооп берүү"
+ "Видео"
+ "Четке кагуу"
+ "Чалууну бүтүрүү"
+ "Кирүүчү чалуу"
+ "Учурдагы чалуу"
+ "Кирүүчү чалууну иргөө"
+ "Издөө"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-land/values-land.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-land/values-land.xml
new file mode 100644
index 0000000..a12899f
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-land/values-land.xml
@@ -0,0 +1,6 @@
+
+
+ 48dp
+ 12dp
+ 14dp
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-large-v4/values-large-v4.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-large-v4/values-large-v4.xml
new file mode 100644
index 0000000..cc236eb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-large-v4/values-large-v4.xml
@@ -0,0 +1,12 @@
+
+
+ 440dp
+ - 60%
+ - 90%
+ - 60%
+ - 90%
+ - 55%
+ - 80%
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ldltr-v21/values-ldltr-v21.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ldltr-v21/values-ldltr-v21.xml
new file mode 100644
index 0000000..1bdd835
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ldltr-v21/values-ldltr-v21.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lo/values-lo.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lo/values-lo.xml
new file mode 100644
index 0000000..25ad23d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lo/values-lo.xml
@@ -0,0 +1,39 @@
+
+
+ "ກັບໄປໜ້າຫຼັກ"
+ "ເລື່ອນຂຶ້ນເທິງ"
+ "ຕົວເລືອກເພີ່ມເຕີມ"
+ "ແລ້ວໆ"
+ "ເບິ່ງທັງໝົດ"
+ "ເລືອກແອັບ"
+ "ປິດ"
+ "ເປີດ"
+ "Alt+"
+ "Ctrl+"
+ "ລຶບ"
+ "enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "ຍະຫວ່າງ"
+ "Sym+"
+ "Menu+"
+ "ຊອກຫາ…"
+ "ລຶບຂໍ້ຄວາມຊອກຫາ"
+ "ຄຳສຳລັບຄົ້ນຫາ"
+ "ຊອກຫາ"
+ "ສົ່ງຂໍ້ມູນ"
+ "ຊອກຫາດ້ວຍສຽງ"
+ "ແບ່ງປັນກັບ"
+ "ແບ່ງປັນດ້ວຍ %s "
+ "ຫຍໍ້ລົງ"
+ "ຮັບສາຍ"
+ "ວິດີໂອ"
+ "ປະຕິເສດ"
+ "ວາງສາຍ"
+ "ສາຍໂທເຂົ້າ"
+ "ສາຍໂທອອກ"
+ "ກຳລັງກວດສອບສາຍໂທເຂົ້າ"
+ "ຊອກຫາ"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lt/values-lt.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lt/values-lt.xml
new file mode 100644
index 0000000..e6f2706
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lt/values-lt.xml
@@ -0,0 +1,39 @@
+
+
+ "Eiti į pagrindinį puslapį"
+ "Naršyti aukštyn"
+ "Daugiau parinkčių"
+ "Atlikta"
+ "Žr. viską"
+ "Pasirinkite programą"
+ "IŠJUNGTI"
+ "ĮJUNGTI"
+ "„Alt“ +"
+ "„Ctrl“ +"
+ "„delete“"
+ "„enter“"
+ "„Function“ +"
+ "„Meta“ +"
+ "„Shift“ +"
+ "„space“"
+ "„Sym“ +"
+ "„Menu“ +"
+ "Ieškoti…"
+ "Išvalyti užklausą"
+ "Paieškos užklausa"
+ "Ieškoti"
+ "Pateikti užklausą"
+ "Paieška balsu"
+ "Bendrinti su"
+ "Bendrinti naudojant programą „%s “"
+ "Sutraukti"
+ "Atsakyti"
+ "Vaizdo įrašas"
+ "Atmesti"
+ "Baigti pok."
+ "Gaunamasis skambutis"
+ "Vykstantis skambutis"
+ "Gaunamojo skambučio tikrinimas"
+ "Ieškoti"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lv/values-lv.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lv/values-lv.xml
new file mode 100644
index 0000000..44ceefd
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-lv/values-lv.xml
@@ -0,0 +1,39 @@
+
+
+ "Pārvietoties uz sākuma ekrānu"
+ "Pārvietoties uz augšu"
+ "Citas opcijas"
+ "Gatavs"
+ "Skatīt visu"
+ "Izvēlieties lietotni"
+ "IZSLĒGT"
+ "IESLĒGT"
+ "Alternēšanas taustiņš +"
+ "Vadīšanas taustiņš +"
+ "dzēšanas taustiņš"
+ "ievadīšanas taustiņš"
+ "Funkcijas taustiņš +"
+ "Meta taustiņš +"
+ "Pārslēgšanas taustiņš +"
+ "atstarpes taustiņš"
+ "Simbolu taustiņš +"
+ "Poga Izvēlne +"
+ "Meklējiet…"
+ "Notīrīt vaicājumu"
+ "Meklēšanas vaicājums"
+ "Meklēt"
+ "Iesniegt vaicājumu"
+ "Meklēt ar balsi"
+ "Kopīgot ar:"
+ "Kopīgot ar lietojumprogrammu %s "
+ "Sakļaut"
+ "Atbildēt"
+ "Video"
+ "Noraidīt"
+ "Pārtraukt"
+ "Ienākošais zvans"
+ "Pašreizējais zvans"
+ "Ienākošā zvana filtrēšana"
+ "Meklēt"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mk/values-mk.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mk/values-mk.xml
new file mode 100644
index 0000000..bedbaea
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mk/values-mk.xml
@@ -0,0 +1,39 @@
+
+
+ "Движи се кон дома"
+ "Движи се нагоре"
+ "Повеќе опции"
+ "Готово"
+ "Прикажи ги сите"
+ "Избери апликација"
+ "ИСКЛУЧЕНО"
+ "ВКЛУЧЕНО"
+ "Alt+"
+ "Ctrl+"
+ "избриши"
+ "Enter"
+ "Function+"
+ "Meta+"
+ "Shift+"
+ "вселена"
+ "Sym+"
+ "Menu+"
+ "Пребарување…"
+ "Исчисти барање"
+ "Пребарај барање"
+ "Пребарај"
+ "Испрати барање"
+ "Гласовно пребарување"
+ "Сподели со"
+ "Сподели со %s "
+ "Собери"
+ "Одговори"
+ "Видео"
+ "Одбиј"
+ "Спушти"
+ "Дојдовен повик"
+ "Тековен повик"
+ "Проверка на дојдовен повик"
+ "Пребарување"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ml/values-ml.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ml/values-ml.xml
new file mode 100644
index 0000000..02dba39
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-ml/values-ml.xml
@@ -0,0 +1,39 @@
+
+
+ "ഹോമിലേക്ക് പോവുക"
+ "മുകളിലേക്ക് പോവുക"
+ "കൂടുതൽ ഓപ്ഷനുകൾ"
+ "പൂർത്തിയായി"
+ "എല്ലാം കാണുക"
+ "ആപ്പ് തിരഞ്ഞെടുക്കുക"
+ "ഓഫ്"
+ "ഓൺ"
+ "Alt+"
+ "Ctrl+"
+ "ഇല്ലാതാക്കുക"
+ "enter"
+ "ഫംഗ്ഷന്+"
+ "മെറ്റ+"
+ "Shift+"
+ "സ്പെയ്സ്"
+ "Sym+"
+ "മെനു+"
+ "തിരയുക…"
+ "ചോദ്യം മായ്ക്കുക"
+ "ചോദ്യം തിരയുക"
+ "തിരയുക"
+ "ചോദ്യം സമർപ്പിക്കുക"
+ "സംസാരത്തിലൂടെ തിരയുക"
+ "ഇനിപ്പറയുന്നതുമായി പങ്കിടുക"
+ "%s എന്നതുമായി പങ്കിടുക"
+ "ചുരുക്കുക"
+ "മറുപടി നൽകുക"
+ "വീഡിയോ"
+ "നിരസിക്കുക"
+ "കോൾ നിർത്തുക"
+ "ഇൻകമിംഗ് കോൾ"
+ "സജീവമായ കോൾ"
+ "ഇൻകമിംഗ് കോൾ സ്ക്രീൻ ചെയ്യുന്നു"
+ "തിരയുക"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mn/values-mn.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mn/values-mn.xml
new file mode 100644
index 0000000..61cf05f
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-mn/values-mn.xml
@@ -0,0 +1,39 @@
+
+
+ "Нүүр хуудас уруу шилжих"
+ "Дээш шилжих"
+ "Бусад сонголт"
+ "Болсон"
+ "Бүгдийг харах"
+ "Аппыг сонгох"
+ "ИДЭВХГҮЙ"
+ "ИДЭВХТЭЙ"
+ "Alt+"
+ "Ctrl+"
+ "устгах"
+ "оруулах"
+ "Функц+"
+ "Мета+"
+ "Шифт+"
+ "зай"
+ "Sym+"
+ "Цэс+"
+ "Хайх…"
+ "Асуулга арилгах"
+ "Хайх асуулга"
+ "Хайх"
+ "Асуулга илгээх"
+ "Дуут хайлт"
+ "Дараахтай хуваалцах"
+ "%s -тай хуваалцах"
+ "Буулгах"
+ "Хариулах"
+ "Видео"
+ "Татгалзах"
+ "Таслах"
+ "Ирсэн дуудлага"
+ "Дуудлага хийгдэж байна"
+ "Ирсэн дуудлагыг харуулж байна"
+ "Хайх"
+ "999+"
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v16/values-v16.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v16/values-v16.xml
new file mode 100644
index 0000000..3ba0ed0
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v16/values-v16.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v17/values-v17.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v17/values-v17.xml
new file mode 100644
index 0000000..f85a197
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v17/values-v17.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v18/values-v18.xml b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v18/values-v18.xml
new file mode 100644
index 0000000..7dad77f
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res/release/mergeReleaseResources/values-v18/values-v18.xml
@@ -0,0 +1,4 @@
+
+
+ 0px
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-af.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-af.json
new file mode 100644
index 0000000..771d2ec
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-af.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-af/values-af.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-af\\values-af.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,2777",
+ "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80",
+ "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,2853"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,3509",
+ "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80",
+ "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,3585"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-af\\values-af.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,353,451,558,667,787",
+ "endColumns": "97,101,97,97,106,108,119,100",
+ "endOffsets": "148,250,348,446,553,662,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2777,2875,2977,3075,3173,3280,3389,3590",
+ "endColumns": "97,101,97,97,106,108,119,100",
+ "endOffsets": "2870,2972,3070,3168,3275,3384,3504,3686"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-af/values-af.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-af\\values-af.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,2777",
+ "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80",
+ "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,2853"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,3509",
+ "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80",
+ "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,3585"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-af\\values-af.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,353,451,558,667,787",
+ "endColumns": "97,101,97,97,106,108,119,100",
+ "endOffsets": "148,250,348,446,553,662,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2777,2875,2977,3075,3173,3280,3389,3590",
+ "endColumns": "97,101,97,97,106,108,119,100",
+ "endOffsets": "2870,2972,3070,3168,3275,3384,3504,3686"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-am.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-am.json
new file mode 100644
index 0000000..70f6441
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-am.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-am/values-am.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-am\\values-am.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,2723",
+ "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79",
+ "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,2798"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,3410",
+ "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79",
+ "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,3485"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-am\\values-am.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,148,248,345,444,540,642,742",
+ "endColumns": "92,99,96,98,95,101,99,100",
+ "endOffsets": "143,243,340,439,535,637,737,838"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2723,2816,2916,3013,3112,3208,3310,3490",
+ "endColumns": "92,99,96,98,95,101,99,100",
+ "endOffsets": "2811,2911,3008,3107,3203,3305,3405,3586"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-am/values-am.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-am\\values-am.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,2723",
+ "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79",
+ "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,2798"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,3410",
+ "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79",
+ "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,3485"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-am\\values-am.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,148,248,345,444,540,642,742",
+ "endColumns": "92,99,96,98,95,101,99,100",
+ "endOffsets": "143,243,340,439,535,637,737,838"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2723,2816,2916,3013,3112,3208,3310,3490",
+ "endColumns": "92,99,96,98,95,101,99,100",
+ "endOffsets": "2811,2911,3008,3107,3203,3305,3405,3586"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ar.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ar.json
new file mode 100644
index 0000000..81fef76
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ar.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ar/values-ar.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ar\\values-ar.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,148,250,345,448,551,653,767",
+ "endColumns": "92,101,94,102,102,101,113,100",
+ "endOffsets": "143,245,340,443,546,648,762,863"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2759,2852,2954,3049,3152,3255,3357,3553",
+ "endColumns": "92,101,94,102,102,101,113,100",
+ "endOffsets": "2847,2949,3044,3147,3250,3352,3466,3649"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ar\\values-ar.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,2759",
+ "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81",
+ "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,2836"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,3471",
+ "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81",
+ "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,3548"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ar/values-ar.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ar\\values-ar.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,148,250,345,448,551,653,767",
+ "endColumns": "92,101,94,102,102,101,113,100",
+ "endOffsets": "143,245,340,443,546,648,762,863"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2759,2852,2954,3049,3152,3255,3357,3553",
+ "endColumns": "92,101,94,102,102,101,113,100",
+ "endOffsets": "2847,2949,3044,3147,3250,3352,3466,3649"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ar\\values-ar.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,2759",
+ "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81",
+ "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,2836"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,3471",
+ "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81",
+ "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,3548"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-as.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-as.json
new file mode 100644
index 0000000..43e9114
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-as.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-as/values-as.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-as\\values-as.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,156,259,367,472,576,676,805",
+ "endColumns": "100,102,107,104,103,99,128,100",
+ "endOffsets": "151,254,362,467,571,671,800,901"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2848,2949,3052,3160,3265,3369,3469,3681",
+ "endColumns": "100,102,107,104,103,99,128,100",
+ "endOffsets": "2944,3047,3155,3260,3364,3464,3593,3777"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-as\\values-as.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,2848",
+ "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82",
+ "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,2926"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,3598",
+ "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82",
+ "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,3676"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-as/values-as.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-as\\values-as.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,156,259,367,472,576,676,805",
+ "endColumns": "100,102,107,104,103,99,128,100",
+ "endOffsets": "151,254,362,467,571,671,800,901"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2848,2949,3052,3160,3265,3369,3469,3681",
+ "endColumns": "100,102,107,104,103,99,128,100",
+ "endOffsets": "2944,3047,3155,3260,3364,3464,3593,3777"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-as\\values-as.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,2848",
+ "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82",
+ "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,2926"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,3598",
+ "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82",
+ "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,3676"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-az.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-az.json
new file mode 100644
index 0000000..7e940ee
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-az.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-az/values-az.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-az\\values-az.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,2813",
+ "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83",
+ "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,2892"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,3540",
+ "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83",
+ "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,3619"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-az\\values-az.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,156,258,361,465,566,671,782",
+ "endColumns": "100,101,102,103,100,104,110,100",
+ "endOffsets": "151,253,356,460,561,666,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2813,2914,3016,3119,3223,3324,3429,3624",
+ "endColumns": "100,101,102,103,100,104,110,100",
+ "endOffsets": "2909,3011,3114,3218,3319,3424,3535,3720"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-az/values-az.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-az\\values-az.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,2813",
+ "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83",
+ "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,2892"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,3540",
+ "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83",
+ "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,3619"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-az\\values-az.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,156,258,361,465,566,671,782",
+ "endColumns": "100,101,102,103,100,104,110,100",
+ "endOffsets": "151,253,356,460,561,666,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2813,2914,3016,3119,3223,3324,3429,3624",
+ "endColumns": "100,101,102,103,100,104,110,100",
+ "endOffsets": "2909,3011,3114,3218,3319,3424,3535,3720"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-b+sr+Latn.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-b+sr+Latn.json
new file mode 100644
index 0000000..6e86237
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-b+sr+Latn.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-b+sr+Latn/values-b+sr+Latn.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,2836",
+ "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,2918"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,3562",
+ "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,3644"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,352,456,560,665,781",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "148,250,347,451,555,660,776,877"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2836,2934,3036,3133,3237,3341,3446,3649",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "2929,3031,3128,3232,3336,3441,3557,3745"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-b+sr+Latn/values-b+sr+Latn.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,2836",
+ "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,2918"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,3562",
+ "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,3644"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-b+sr+Latn\\values-b+sr+Latn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,352,456,560,665,781",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "148,250,347,451,555,660,776,877"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2836,2934,3036,3133,3237,3341,3446,3649",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "2929,3031,3128,3232,3336,3441,3557,3745"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-be.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-be.json
new file mode 100644
index 0000000..7b01bf4
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-be.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-be/values-be.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-be\\values-be.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,2835",
+ "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81",
+ "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,2912"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,3566",
+ "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81",
+ "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,3643"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-be\\values-be.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,355,456,562,665,786",
+ "endColumns": "97,101,99,100,105,102,120,100",
+ "endOffsets": "148,250,350,451,557,660,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2933,3035,3135,3236,3342,3445,3648",
+ "endColumns": "97,101,99,100,105,102,120,100",
+ "endOffsets": "2928,3030,3130,3231,3337,3440,3561,3744"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-be/values-be.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-be\\values-be.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,2835",
+ "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81",
+ "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,2912"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,3566",
+ "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81",
+ "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,3643"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-be\\values-be.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,355,456,562,665,786",
+ "endColumns": "97,101,99,100,105,102,120,100",
+ "endOffsets": "148,250,350,451,557,660,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2933,3035,3135,3236,3342,3445,3648",
+ "endColumns": "97,101,99,100,105,102,120,100",
+ "endOffsets": "2928,3030,3130,3231,3337,3440,3561,3744"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bg.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bg.json
new file mode 100644
index 0000000..1f40efb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bg.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-bg/values-bg.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bg\\values-bg.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,262,364,465,572,677,796",
+ "endColumns": "96,109,101,100,106,104,118,100",
+ "endOffsets": "147,257,359,460,567,672,791,892"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2854,2951,3061,3163,3264,3371,3476,3679",
+ "endColumns": "96,109,101,100,106,104,118,100",
+ "endOffsets": "2946,3056,3158,3259,3366,3471,3590,3775"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bg\\values-bg.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,2854",
+ "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83",
+ "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,2933"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,3595",
+ "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83",
+ "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,3674"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-bg/values-bg.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bg\\values-bg.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,262,364,465,572,677,796",
+ "endColumns": "96,109,101,100,106,104,118,100",
+ "endOffsets": "147,257,359,460,567,672,791,892"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2854,2951,3061,3163,3264,3371,3476,3679",
+ "endColumns": "96,109,101,100,106,104,118,100",
+ "endOffsets": "2946,3056,3158,3259,3366,3471,3590,3775"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bg\\values-bg.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,2854",
+ "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83",
+ "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,2933"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,3595",
+ "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83",
+ "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,3674"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bn.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bn.json
new file mode 100644
index 0000000..d1ebf39
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bn.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-bn/values-bn.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bn\\values-bn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,2835",
+ "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86",
+ "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,3564",
+ "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86",
+ "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,3646"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bn\\values-bn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,154,256,358,461,562,664,784",
+ "endColumns": "98,101,101,102,100,101,119,100",
+ "endOffsets": "149,251,353,456,557,659,779,880"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2934,3036,3138,3241,3342,3444,3651",
+ "endColumns": "98,101,101,102,100,101,119,100",
+ "endOffsets": "2929,3031,3133,3236,3337,3439,3559,3747"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-bn/values-bn.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bn\\values-bn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,2835",
+ "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86",
+ "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,3564",
+ "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86",
+ "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,3646"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bn\\values-bn.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,154,256,358,461,562,664,784",
+ "endColumns": "98,101,101,102,100,101,119,100",
+ "endOffsets": "149,251,353,456,557,659,779,880"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2934,3036,3138,3241,3342,3444,3651",
+ "endColumns": "98,101,101,102,100,101,119,100",
+ "endOffsets": "2929,3031,3133,3236,3337,3439,3559,3747"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bs.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bs.json
new file mode 100644
index 0000000..b482770
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-bs.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-bs/values-bs.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bs\\values-bs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,2835",
+ "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86",
+ "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,3560",
+ "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86",
+ "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,3642"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bs\\values-bs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,353,457,561,663,780",
+ "endColumns": "97,101,97,103,103,101,116,100",
+ "endOffsets": "148,250,348,452,556,658,775,876"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2933,3035,3133,3237,3341,3443,3647",
+ "endColumns": "97,101,97,103,103,101,116,100",
+ "endOffsets": "2928,3030,3128,3232,3336,3438,3555,3743"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-bs/values-bs.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-bs\\values-bs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,2835",
+ "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86",
+ "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,3560",
+ "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86",
+ "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,3642"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-bs\\values-bs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,353,457,561,663,780",
+ "endColumns": "97,101,97,103,103,101,116,100",
+ "endOffsets": "148,250,348,452,556,658,775,876"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2835,2933,3035,3133,3237,3341,3443,3647",
+ "endColumns": "97,101,97,103,103,101,116,100",
+ "endOffsets": "2928,3030,3128,3232,3336,3438,3555,3743"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ca.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ca.json
new file mode 100644
index 0000000..77a9456
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ca.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ca/values-ca.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ca\\values-ca.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,352,449,555,660,786",
+ "endColumns": "95,101,98,96,105,104,125,100",
+ "endOffsets": "146,248,347,444,550,655,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2830,2926,3028,3127,3224,3330,3435,3643",
+ "endColumns": "95,101,98,96,105,104,125,100",
+ "endOffsets": "2921,3023,3122,3219,3325,3430,3556,3739"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ca\\values-ca.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,2830",
+ "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81",
+ "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,2907"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,3561",
+ "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81",
+ "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,3638"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ca/values-ca.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ca\\values-ca.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,352,449,555,660,786",
+ "endColumns": "95,101,98,96,105,104,125,100",
+ "endOffsets": "146,248,347,444,550,655,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2830,2926,3028,3127,3224,3330,3435,3643",
+ "endColumns": "95,101,98,96,105,104,125,100",
+ "endOffsets": "2921,3023,3122,3219,3325,3430,3556,3739"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ca\\values-ca.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,2830",
+ "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81",
+ "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,2907"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,3561",
+ "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81",
+ "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,3638"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-cs.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-cs.json
new file mode 100644
index 0000000..c07e7a3
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-cs.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-cs/values-cs.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-cs\\values-cs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,2799",
+ "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82",
+ "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,2877"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,3530",
+ "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82",
+ "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,3608"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-cs\\values-cs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,356,455,560,667,786",
+ "endColumns": "97,101,100,98,104,106,118,100",
+ "endOffsets": "148,250,351,450,555,662,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2799,2897,2999,3100,3199,3304,3411,3613",
+ "endColumns": "97,101,100,98,104,106,118,100",
+ "endOffsets": "2892,2994,3095,3194,3299,3406,3525,3709"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-cs/values-cs.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-cs\\values-cs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,2799",
+ "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82",
+ "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,2877"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,3530",
+ "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82",
+ "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,3608"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-cs\\values-cs.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,356,455,560,667,786",
+ "endColumns": "97,101,100,98,104,106,118,100",
+ "endOffsets": "148,250,351,450,555,662,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2799,2897,2999,3100,3199,3304,3411,3613",
+ "endColumns": "97,101,100,98,104,106,118,100",
+ "endOffsets": "2892,2994,3095,3194,3299,3406,3525,3709"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-da.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-da.json
new file mode 100644
index 0000000..762d75e
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-da.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-da/values-da.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-da\\values-da.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,2757",
+ "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79",
+ "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,2832"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,3484",
+ "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79",
+ "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,3559"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-da\\values-da.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,350,448,555,664,782",
+ "endColumns": "95,101,96,97,106,108,117,100",
+ "endOffsets": "146,248,345,443,550,659,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2757,2853,2955,3052,3150,3257,3366,3564",
+ "endColumns": "95,101,96,97,106,108,117,100",
+ "endOffsets": "2848,2950,3047,3145,3252,3361,3479,3660"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-da/values-da.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-da\\values-da.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,2757",
+ "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79",
+ "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,2832"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,3484",
+ "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79",
+ "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,3559"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-da\\values-da.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,350,448,555,664,782",
+ "endColumns": "95,101,96,97,106,108,117,100",
+ "endOffsets": "146,248,345,443,550,659,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2757,2853,2955,3052,3150,3257,3366,3564",
+ "endColumns": "95,101,96,97,106,108,117,100",
+ "endOffsets": "2848,2950,3047,3145,3252,3361,3479,3660"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ko.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ko.json
new file mode 100644
index 0000000..59232d8
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ko.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ko/values-ko.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ko\\values-ko.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,2685",
+ "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78",
+ "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,2759"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,3362",
+ "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78",
+ "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,3436"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ko\\values-ko.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,147,247,341,438,534,632,732",
+ "endColumns": "91,99,93,96,95,97,99,100",
+ "endOffsets": "142,242,336,433,529,627,727,828"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2685,2777,2877,2971,3068,3164,3262,3441",
+ "endColumns": "91,99,93,96,95,97,99,100",
+ "endOffsets": "2772,2872,2966,3063,3159,3257,3357,3537"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ko/values-ko.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ko\\values-ko.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,2685",
+ "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78",
+ "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,2759"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,3362",
+ "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78",
+ "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,3436"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ko\\values-ko.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,147,247,341,438,534,632,732",
+ "endColumns": "91,99,93,96,95,97,99,100",
+ "endOffsets": "142,242,336,433,529,627,727,828"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2685,2777,2877,2971,3068,3164,3262,3441",
+ "endColumns": "91,99,93,96,95,97,99,100",
+ "endOffsets": "2772,2872,2966,3063,3159,3257,3357,3537"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ky.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ky.json
new file mode 100644
index 0000000..2f43ecd
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ky.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ky/values-ky.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ky\\values-ky.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,155,257,360,467,571,675,786",
+ "endColumns": "99,101,102,106,103,103,110,100",
+ "endOffsets": "150,252,355,462,566,670,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2917,3019,3122,3229,3333,3437,3630",
+ "endColumns": "99,101,102,106,103,103,110,100",
+ "endOffsets": "2912,3014,3117,3224,3328,3432,3543,3726"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ky\\values-ky.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,2817",
+ "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81",
+ "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,2894"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,3548",
+ "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81",
+ "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,3625"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ky/values-ky.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ky\\values-ky.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,155,257,360,467,571,675,786",
+ "endColumns": "99,101,102,106,103,103,110,100",
+ "endOffsets": "150,252,355,462,566,670,781,882"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2917,3019,3122,3229,3333,3437,3630",
+ "endColumns": "99,101,102,106,103,103,110,100",
+ "endOffsets": "2912,3014,3117,3224,3328,3432,3543,3726"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ky\\values-ky.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,2817",
+ "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81",
+ "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,2894"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,3548",
+ "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81",
+ "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,3625"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-land.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-land.json
new file mode 100644
index 0000000..ba4678c
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-land.json
@@ -0,0 +1,34 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-land/values-land.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-land\\values-land.xml",
+ "from": {
+ "startLines": "2,3,4",
+ "startColumns": "4,4,4",
+ "startOffsets": "55,125,196",
+ "endColumns": "69,70,67",
+ "endOffsets": "120,191,259"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-land/values-land.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-land\\values-land.xml",
+ "from": {
+ "startLines": "2,3,4",
+ "startColumns": "4,4,4",
+ "startOffsets": "55,125,196",
+ "endColumns": "69,70,67",
+ "endOffsets": "120,191,259"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pa.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pa.json
new file mode 100644
index 0000000..d258edf
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pa.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-pa/values-pa.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pa\\values-pa.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,358,459,561,659,788",
+ "endColumns": "97,101,102,100,101,97,128,100",
+ "endOffsets": "148,250,353,454,556,654,783,884"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2767,2865,2967,3070,3171,3273,3371,3580",
+ "endColumns": "97,101,102,100,101,97,128,100",
+ "endOffsets": "2860,2962,3065,3166,3268,3366,3495,3676"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pa\\values-pa.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,2767",
+ "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79",
+ "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,2842"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,3500",
+ "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79",
+ "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,3575"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-pa/values-pa.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pa\\values-pa.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,358,459,561,659,788",
+ "endColumns": "97,101,102,100,101,97,128,100",
+ "endOffsets": "148,250,353,454,556,654,783,884"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2767,2865,2967,3070,3171,3273,3371,3580",
+ "endColumns": "97,101,102,100,101,97,128,100",
+ "endOffsets": "2860,2962,3065,3166,3268,3366,3495,3676"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pa\\values-pa.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,2767",
+ "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79",
+ "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,2842"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,3500",
+ "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79",
+ "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,3575"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pl.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pl.json
new file mode 100644
index 0000000..cafd188
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pl.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-pl/values-pl.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pl\\values-pl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,2817",
+ "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82",
+ "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,2895"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,3554",
+ "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82",
+ "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,3632"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pl\\values-pl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,352,451,565,670,792",
+ "endColumns": "96,101,97,98,113,104,121,100",
+ "endOffsets": "147,249,347,446,560,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2914,3016,3114,3213,3327,3432,3637",
+ "endColumns": "96,101,97,98,113,104,121,100",
+ "endOffsets": "2909,3011,3109,3208,3322,3427,3549,3733"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-pl/values-pl.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pl\\values-pl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,2817",
+ "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82",
+ "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,2895"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,3554",
+ "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82",
+ "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,3632"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pl\\values-pl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,352,451,565,670,792",
+ "endColumns": "96,101,97,98,113,104,121,100",
+ "endOffsets": "147,249,347,446,560,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2914,3016,3114,3213,3327,3432,3637",
+ "endColumns": "96,101,97,98,113,104,121,100",
+ "endOffsets": "2909,3011,3109,3208,3322,3427,3549,3733"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-port.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-port.json
new file mode 100644
index 0000000..c59b927
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-port.json
@@ -0,0 +1,34 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-port/values-port.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-port\\values-port.xml",
+ "from": {
+ "startLines": "2",
+ "startColumns": "4",
+ "startOffsets": "55",
+ "endColumns": "55",
+ "endOffsets": "106"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-port/values-port.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-port\\values-port.xml",
+ "from": {
+ "startLines": "2",
+ "startColumns": "4",
+ "startOffsets": "55",
+ "endColumns": "55",
+ "endOffsets": "106"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rBR.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rBR.json
new file mode 100644
index 0000000..9f62d1a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rBR.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-pt-rBR/values-pt-rBR.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt-rBR\\values-pt-rBR.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt-rBR\\values-pt-rBR.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,670,790",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "147,249,348,448,555,665,785,886"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-pt-rBR/values-pt-rBR.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt-rBR\\values-pt-rBR.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt-rBR\\values-pt-rBR.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,670,790",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "147,249,348,448,555,665,785,886"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rPT.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rPT.json
new file mode 100644
index 0000000..6328e41
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt-rPT.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-pt-rPT/values-pt-rPT.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt-rPT\\values-pt-rPT.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,666,787",
+ "endColumns": "96,101,98,99,106,105,120,100",
+ "endOffsets": "147,249,348,448,555,661,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2836,2933,3035,3134,3234,3341,3447,3654",
+ "endColumns": "96,101,98,99,106,105,120,100",
+ "endOffsets": "2928,3030,3129,3229,3336,3442,3563,3750"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt-rPT\\values-pt-rPT.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,2836",
+ "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85",
+ "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,3568",
+ "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85",
+ "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,3649"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-pt-rPT/values-pt-rPT.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt-rPT\\values-pt-rPT.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,666,787",
+ "endColumns": "96,101,98,99,106,105,120,100",
+ "endOffsets": "147,249,348,448,555,661,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2836,2933,3035,3134,3234,3341,3447,3654",
+ "endColumns": "96,101,98,99,106,105,120,100",
+ "endOffsets": "2928,3030,3129,3229,3336,3442,3563,3750"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt-rPT\\values-pt-rPT.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,2836",
+ "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85",
+ "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,3568",
+ "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85",
+ "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,3649"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt.json
new file mode 100644
index 0000000..e6d760a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-pt.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-pt/values-pt.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt\\values-pt.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt\\values-pt.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,670,790",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "147,249,348,448,555,665,785,886"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-pt/values-pt.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-pt\\values-pt.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578",
+ "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85",
+ "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-pt\\values-pt.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,353,453,560,670,790",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "147,249,348,448,555,665,785,886"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664",
+ "endColumns": "96,101,98,99,106,109,119,100",
+ "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ro.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ro.json
new file mode 100644
index 0000000..fc1e85f
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ro.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ro/values-ro.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ro\\values-ro.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,2840",
+ "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81",
+ "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,3567",
+ "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81",
+ "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,3644"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ro\\values-ro.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,355,454,556,665,782",
+ "endColumns": "97,101,99,98,101,108,116,100",
+ "endOffsets": "148,250,350,449,551,660,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2840,2938,3040,3140,3239,3341,3450,3649",
+ "endColumns": "97,101,99,98,101,108,116,100",
+ "endOffsets": "2933,3035,3135,3234,3336,3445,3562,3745"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ro/values-ro.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ro\\values-ro.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,2840",
+ "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81",
+ "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,2917"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,3567",
+ "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81",
+ "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,3644"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ro\\values-ro.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,355,454,556,665,782",
+ "endColumns": "97,101,99,98,101,108,116,100",
+ "endOffsets": "148,250,350,449,551,660,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2840,2938,3040,3140,3239,3341,3450,3649",
+ "endColumns": "97,101,99,98,101,108,116,100",
+ "endOffsets": "2933,3035,3135,3234,3336,3445,3562,3745"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ru.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ru.json
new file mode 100644
index 0000000..4c09094
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-ru.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-ru/values-ru.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ru\\values-ru.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,356,457,562,665,782",
+ "endColumns": "97,101,100,100,104,102,116,100",
+ "endOffsets": "148,250,351,452,557,660,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2822,2920,3022,3123,3224,3329,3432,3631",
+ "endColumns": "97,101,100,100,104,102,116,100",
+ "endOffsets": "2915,3017,3118,3219,3324,3427,3544,3727"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ru\\values-ru.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,2822",
+ "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81",
+ "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,2899"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,3549",
+ "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81",
+ "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,3626"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-ru/values-ru.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-ru\\values-ru.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,356,457,562,665,782",
+ "endColumns": "97,101,100,100,104,102,116,100",
+ "endOffsets": "148,250,351,452,557,660,777,878"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2822,2920,3022,3123,3224,3329,3432,3631",
+ "endColumns": "97,101,100,100,104,102,116,100",
+ "endOffsets": "2915,3017,3118,3219,3324,3427,3544,3727"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-ru\\values-ru.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,2822",
+ "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81",
+ "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,2899"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,3549",
+ "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81",
+ "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,3626"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-si.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-si.json
new file mode 100644
index 0000000..dbb2742
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-si.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-si/values-si.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-si\\values-si.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,157,260,365,470,569,673,787",
+ "endColumns": "101,102,104,104,98,103,113,100",
+ "endOffsets": "152,255,360,465,564,668,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2821,2923,3026,3131,3236,3335,3439,3635",
+ "endColumns": "101,102,104,104,98,103,113,100",
+ "endOffsets": "2918,3021,3126,3231,3330,3434,3548,3731"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-si\\values-si.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,2821",
+ "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81",
+ "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,2898"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,3553",
+ "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81",
+ "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,3630"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-si/values-si.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-si\\values-si.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,157,260,365,470,569,673,787",
+ "endColumns": "101,102,104,104,98,103,113,100",
+ "endOffsets": "152,255,360,465,564,668,782,883"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2821,2923,3026,3131,3236,3335,3439,3635",
+ "endColumns": "101,102,104,104,98,103,113,100",
+ "endOffsets": "2918,3021,3126,3231,3330,3434,3548,3731"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-si\\values-si.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,2821",
+ "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81",
+ "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,2898"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,3553",
+ "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81",
+ "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,3630"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sk.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sk.json
new file mode 100644
index 0000000..0199cac
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sk.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-sk/values-sk.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sk\\values-sk.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,2817",
+ "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82",
+ "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,2895"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,3554",
+ "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82",
+ "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,3632"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sk\\values-sk.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,354,452,562,670,792",
+ "endColumns": "95,101,100,97,109,107,121,100",
+ "endOffsets": "146,248,349,447,557,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2913,3015,3116,3214,3324,3432,3637",
+ "endColumns": "95,101,100,97,109,107,121,100",
+ "endOffsets": "2908,3010,3111,3209,3319,3427,3549,3733"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-sk/values-sk.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sk\\values-sk.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,2817",
+ "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82",
+ "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,2895"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,3554",
+ "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82",
+ "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,3632"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sk\\values-sk.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,151,253,354,452,562,670,792",
+ "endColumns": "95,101,100,97,109,107,121,100",
+ "endOffsets": "146,248,349,447,557,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2817,2913,3015,3116,3214,3324,3432,3637",
+ "endColumns": "95,101,100,97,109,107,121,100",
+ "endOffsets": "2908,3010,3111,3209,3319,3427,3549,3733"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sl.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sl.json
new file mode 100644
index 0000000..6b839d4
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sl.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-sl/values-sl.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sl\\values-sl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,352,456,559,661,778",
+ "endColumns": "96,101,97,103,102,101,116,100",
+ "endOffsets": "147,249,347,451,554,656,773,874"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2845,2942,3044,3142,3246,3349,3451,3652",
+ "endColumns": "96,101,97,103,102,101,116,100",
+ "endOffsets": "2937,3039,3137,3241,3344,3446,3563,3748"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sl\\values-sl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,2845",
+ "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83",
+ "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,3568",
+ "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83",
+ "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,3647"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-sl/values-sl.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sl\\values-sl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,152,254,352,456,559,661,778",
+ "endColumns": "96,101,97,103,102,101,116,100",
+ "endOffsets": "147,249,347,451,554,656,773,874"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2845,2942,3044,3142,3246,3349,3451,3652",
+ "endColumns": "96,101,97,103,102,101,116,100",
+ "endOffsets": "2937,3039,3137,3241,3344,3446,3563,3748"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sl\\values-sl.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,2845",
+ "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83",
+ "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,2924"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,3568",
+ "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83",
+ "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,3647"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sq.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sq.json
new file mode 100644
index 0000000..2d5d443
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sq.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-sq/values-sq.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sq\\values-sq.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,154,256,354,451,559,670,792",
+ "endColumns": "98,101,97,96,107,110,121,100",
+ "endOffsets": "149,251,349,446,554,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2801,2900,3002,3100,3197,3305,3416,3620",
+ "endColumns": "98,101,97,96,107,110,121,100",
+ "endOffsets": "2895,2997,3095,3192,3300,3411,3533,3716"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sq\\values-sq.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,2801",
+ "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81",
+ "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,2878"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,3538",
+ "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81",
+ "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,3615"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-sq/values-sq.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sq\\values-sq.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,154,256,354,451,559,670,792",
+ "endColumns": "98,101,97,96,107,110,121,100",
+ "endOffsets": "149,251,349,446,554,665,787,888"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2801,2900,3002,3100,3197,3305,3416,3620",
+ "endColumns": "98,101,97,96,107,110,121,100",
+ "endOffsets": "2895,2997,3095,3192,3300,3411,3533,3716"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sq\\values-sq.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,2801",
+ "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81",
+ "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,2878"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,3538",
+ "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81",
+ "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,3615"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sr.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sr.json
new file mode 100644
index 0000000..bd07996
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-sr.json
@@ -0,0 +1,82 @@
+{
+ "logs": [
+ {
+ "outputFile": "com.zhy.autolayout-mergeReleaseResources-20:/values-sr/values-sr.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sr\\values-sr.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,2833",
+ "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,2915"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,3559",
+ "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,3641"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sr\\values-sr.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,352,456,560,665,781",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "148,250,347,451,555,660,776,877"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2833,2931,3033,3130,3234,3338,3443,3646",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "2926,3028,3125,3229,3333,3438,3554,3742"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "com.zhy.autolayout-release-22:/values-sr/values-sr.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\4cc74053d56b37c7d35d741588290919\\transformed\\appcompat-1.7.0\\res\\values-sr\\values-sr.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,2833",
+ "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,2915"
+ },
+ "to": {
+ "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36",
+ "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
+ "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,3559",
+ "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86",
+ "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,3641"
+ }
+ },
+ {
+ "source": "C:\\Users\\admin\\.gradle\\caches\\transforms-4\\14c1a295df9eb0a343c2d0c03c202db9\\transformed\\core-1.13.0\\res\\values-sr\\values-sr.xml",
+ "from": {
+ "startLines": "2,3,4,5,6,7,8,9",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "55,153,255,352,456,560,665,781",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "148,250,347,451,555,660,776,877"
+ },
+ "to": {
+ "startLines": "29,30,31,32,33,34,35,37",
+ "startColumns": "4,4,4,4,4,4,4,4",
+ "startOffsets": "2833,2931,3033,3130,3234,3338,3443,3646",
+ "endColumns": "97,101,96,103,103,104,115,100",
+ "endOffsets": "2926,3028,3125,3229,3333,3438,3554,3742"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/animator.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/animator.json
new file mode 100644
index 0000000..5200d5d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/animator.json
@@ -0,0 +1,26 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_open_enter.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_open_enter.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_close_exit.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_close_exit.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_fade_enter.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_fade_enter.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_close_enter.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_close_enter.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_fade_exit.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_fade_exit.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/animator/fragment_open_exit.xml",
+ "source": "com.zhy.autolayout-fragment-1.5.4-18:/animator/fragment_open_exit.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color-v23.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color-v23.json
new file mode 100644
index 0000000..685996d
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color-v23.json
@@ -0,0 +1,38 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_switch_track.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_switch_track.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_btn_colored_text_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_btn_colored_text_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_edittext.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_edittext.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_btn_colored_borderless_text_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_btn_colored_borderless_text_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_default.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_default.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_btn_checkable.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_btn_checkable.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_spinner.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_spinner.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_color_highlight_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_color_highlight_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color-v23/abc_tint_seek_thumb.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color-v23/abc_tint_seek_thumb.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color.json
new file mode 100644
index 0000000..7d82781
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color.json
@@ -0,0 +1,54 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_primary_text_disable_only_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_primary_text_disable_only_material_light.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/switch_thumb_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/switch_thumb_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/switch_thumb_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/switch_thumb_material_light.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_background_cache_hint_selector_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_background_cache_hint_selector_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_background_cache_hint_selector_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_background_cache_hint_selector_material_light.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_primary_text_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_primary_text_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_secondary_text_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_secondary_text_material_light.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_search_url_text.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_search_url_text.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_primary_text_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_primary_text_material_light.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_hint_foreground_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_hint_foreground_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_primary_text_disable_only_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_primary_text_disable_only_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_secondary_text_material_dark.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_secondary_text_material_dark.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/color/abc_hint_foreground_material_light.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/color/abc_hint_foreground_material_light.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/interpolator.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/interpolator.json
new file mode 100644
index 0000000..32a3174
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/interpolator.json
@@ -0,0 +1,30 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/interpolator/fast_out_slow_in.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/interpolator/fast_out_slow_in.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v21.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v21.json
new file mode 100644
index 0000000..e86aafb
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v21.json
@@ -0,0 +1,18 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-v21/notification_action.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout-v21/notification_action.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-v21/notification_template_custom_big.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout-v21/notification_template_custom_big.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-v21/notification_template_icon_group.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout-v21/notification_template_icon_group.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-v21/notification_action_tombstone.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout-v21/notification_action_tombstone.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v26.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v26.json
new file mode 100644
index 0000000..de4fbf4
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v26.json
@@ -0,0 +1,6 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-v26/abc_screen_toolbar.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout-v26/abc_screen_toolbar.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-watch-v20.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-watch-v20.json
new file mode 100644
index 0000000..2cc529a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-watch-v20.json
@@ -0,0 +1,10 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-watch-v20/abc_alert_dialog_button_bar_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout-watch-v20/abc_alert_dialog_button_bar_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout-watch-v20/abc_alert_dialog_title_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout-watch-v20/abc_alert_dialog_title_material.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout.json b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout.json
new file mode 100644
index 0000000..085a57a
--- /dev/null
+++ b/autolayout/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout.json
@@ -0,0 +1,150 @@
+[
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/select_dialog_multichoice_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/select_dialog_multichoice_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/notification_template_part_time.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout/notification_template_part_time.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_screen_content_include.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_screen_content_include.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_popup_menu_item_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_popup_menu_item_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_select_dialog_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_select_dialog_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_screen_toolbar.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_screen_toolbar.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_dialog_title_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_dialog_title_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/support_simple_spinner_dropdown_item.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/support_simple_spinner_dropdown_item.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/custom_dialog.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout/custom_dialog.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_alert_dialog_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_alert_dialog_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/ime_base_split_test_activity.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout/ime_base_split_test_activity.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_list_menu_item_checkbox.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_list_menu_item_checkbox.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/notification_template_part_chronometer.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout/notification_template_part_chronometer.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_list_menu_item_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_list_menu_item_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_menu_item_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_menu_item_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_activity_chooser_view.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_activity_chooser_view.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_expanded_menu_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_expanded_menu_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_mode_close_item_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_mode_close_item_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_alert_dialog_button_bar_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_alert_dialog_button_bar_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_cascading_menu_item_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_cascading_menu_item_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_search_dropdown_item_icons_2line.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_search_dropdown_item_icons_2line.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_bar_up_container.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_bar_up_container.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_search_view.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_search_view.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_screen_simple_overlay_action_mode.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_screen_simple_overlay_action_mode.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/select_dialog_item_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/select_dialog_item_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_activity_chooser_view_list_item.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_activity_chooser_view_list_item.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_screen_simple.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_screen_simple.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_popup_menu_header_item_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_popup_menu_header_item_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/ime_secondary_split_test_activity.xml",
+ "source": "com.zhy.autolayout-core-1.13.0-3:/layout/ime_secondary_split_test_activity.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_list_menu_item_icon.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_list_menu_item_icon.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_list_menu_item_radio.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_list_menu_item_radio.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_bar_title_item.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_bar_title_item.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/select_dialog_singlechoice_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/select_dialog_singlechoice_material.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_tooltip.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_tooltip.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_mode_bar.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_mode_bar.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_action_menu_layout.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_action_menu_layout.xml"
+ },
+ {
+ "merged": "com.zhy.autolayout-release-22:/layout/abc_alert_dialog_title_material.xml",
+ "source": "com.zhy.autolayout-appcompat-1.7.0-9:/layout/abc_alert_dialog_title_material.xml"
+ }
+]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/autolayout/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/autolayout/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json b/autolayout/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/autolayout/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/autolayout/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/autolayout/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/autolayout/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/autolayout/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt b/autolayout/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/autolayout/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/autolayout/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml b/autolayout/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
new file mode 100644
index 0000000..7f7f6fc
--- /dev/null
+++ b/autolayout/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+ autolayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml b/autolayout/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml
new file mode 100644
index 0000000..7f7f6fc
--- /dev/null
+++ b/autolayout/build/intermediates/packaged_res/release/packageReleaseResources/values/values.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+ autolayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class
new file mode 100644
index 0000000..2b41e60
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout$LayoutParams.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout.class b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout.class
new file mode 100644
index 0000000..142e7aa
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/AutoFrameLayout.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/utils/ScreenUtils.class b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/utils/ScreenUtils.class
new file mode 100644
index 0000000..be6f1fe
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/utils/ScreenUtils.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$1.class b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$1.class
new file mode 100644
index 0000000..49d3de7
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$1.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class
new file mode 100644
index 0000000..18e7e51
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/zhy/autolayout/widget/MetroLayout$LayoutParams.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginRightAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginRightAttr.class
new file mode 100644
index 0000000..1adc796
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginRightAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginTopAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginTopAttr.class
new file mode 100644
index 0000000..a1fc329
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MarginTopAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxHeightAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxHeightAttr.class
new file mode 100644
index 0000000..51363c0
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxHeightAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxWidthAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxWidthAttr.class
new file mode 100644
index 0000000..9556797
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MaxWidthAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinHeightAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinHeightAttr.class
new file mode 100644
index 0000000..e3e812b
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinHeightAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinWidthAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinWidthAttr.class
new file mode 100644
index 0000000..a90f583
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/MinWidthAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingAttr.class
new file mode 100644
index 0000000..a891450
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingBottomAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingBottomAttr.class
new file mode 100644
index 0000000..59b47f3
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingBottomAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingLeftAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingLeftAttr.class
new file mode 100644
index 0000000..2a8fa16
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingLeftAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingRightAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingRightAttr.class
new file mode 100644
index 0000000..d765cde
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingRightAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingTopAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingTopAttr.class
new file mode 100644
index 0000000..cbcf2d6
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/PaddingTopAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/TextSizeAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/TextSizeAttr.class
new file mode 100644
index 0000000..d0a0136
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/TextSizeAttr.class differ
diff --git a/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/WidthAttr.class b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/WidthAttr.class
new file mode 100644
index 0000000..00c4e55
Binary files /dev/null and b/autolayout/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/zhy/autolayout/attr/WidthAttr.class differ
diff --git a/autolayout/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt b/autolayout/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt
new file mode 100644
index 0000000..39e00bd
--- /dev/null
+++ b/autolayout/build/intermediates/symbol_list_with_package_name/release/generateReleaseRFile/package-aware-r.txt
@@ -0,0 +1,10 @@
+com.zhy.autolayout
+attr layout_auto_baseheight
+attr layout_auto_basewidth
+attr metro_divider
+id id_tag_autolayout_margin
+id id_tag_autolayout_padding
+id id_tag_autolayout_size
+string app_name
+styleable AutoLayout_Layout layout_auto_baseheight layout_auto_basewidth
+styleable MetroLayout metro_divider
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim-v21_fragment_fast_out_extra_slow_in.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim-v21_fragment_fast_out_extra_slow_in.xml.flat
new file mode 100644
index 0000000..57239f2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim-v21_fragment_fast_out_extra_slow_in.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_abc_fade_in.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_abc_fade_in.xml.flat
new file mode 100644
index 0000000..09efa72
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_abc_fade_in.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_checkbox_to_unchecked_icon_null_animation.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_checkbox_to_unchecked_icon_null_animation.xml.flat
new file mode 100644
index 0000000..8e57fcc
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_checkbox_to_unchecked_icon_null_animation.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_radio_to_off_mtrl_dot_group_animation.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_radio_to_off_mtrl_dot_group_animation.xml.flat
new file mode 100644
index 0000000..97f84b7
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/anim_btn_radio_to_off_mtrl_dot_group_animation.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat
new file mode 100644
index 0000000..67133d9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..6605d7f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat
new file mode 100644
index 0000000..6ffb0e5
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_focused_holo.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat
new file mode 100644
index 0000000..3502c5b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_longpressed_holo.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat
new file mode 100644
index 0000000..3597a33
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_dark.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat
new file mode 100644
index 0000000..c99c046
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_pressed_holo_light.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat
new file mode 100644
index 0000000..0e1607c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat
new file mode 100644
index 0000000..789b83f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat
new file mode 100644
index 0000000..97bc013
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_menu_hardkey_panel_mtrl_mult.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat
new file mode 100644
index 0000000..ff557d9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_popup_background_mtrl_mult.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat
new file mode 100644
index 0000000..5e298d7
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video.png.flat
new file mode 100644
index 0000000..ab1ef1e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video_low.png.flat
new file mode 100644
index 0000000..85376e1
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_answer_video_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline.png.flat
new file mode 100644
index 0000000..e8af1f8
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline_low.png.flat
new file mode 100644
index 0000000..c925cee
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-hdpi-v4_ic_call_decline_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat
new file mode 100644
index 0000000..967e0ed
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-ldrtl-xxxhdpi-v17_abc_spinner_mtrl_am_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..c891db1
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..427fb79
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..e2f7889
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..0fe6efd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..af459b9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat
new file mode 100644
index 0000000..1a44d78
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat
new file mode 100644
index 0000000..53fa67a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..2d7336a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat
new file mode 100644
index 0000000..beaa0de
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..9c2df60
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat
new file mode 100644
index 0000000..004d147
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_list_focused_holo.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl.png.flat
new file mode 100644
index 0000000..3535bbe
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_middle_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_right_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_right_mtrl.png.flat
new file mode 100644
index 0000000..353c7d9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_text_select_handle_right_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..7787ee4
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..91326f2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..86b26be
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..39ca4a2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer.png.flat
new file mode 100644
index 0000000..2c0f07b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_low.png.flat
new file mode 100644
index 0000000..2144b3c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video.png.flat
new file mode 100644
index 0000000..ebda2f9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video_low.png.flat
new file mode 100644
index 0000000..8539b64
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_answer_video_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline.png.flat
new file mode 100644
index 0000000..4724625
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline_low.png.flat
new file mode 100644
index 0000000..3c6e6d8
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_ic_call_decline_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat
new file mode 100644
index 0000000..6353a1d
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_normal.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat
new file mode 100644
index 0000000..88b853c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_low_pressed.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal.9.png.flat
new file mode 100644
index 0000000..b61a43f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat
new file mode 100644
index 0000000..06c045a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-mdpi-v4_notification_bg_normal_pressed.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v21_notification_action_background.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v21_notification_action_background.xml.flat
new file mode 100644
index 0000000..f2a907a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v21_notification_action_background.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v23_abc_control_background_material.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v23_abc_control_background_material.xml.flat
new file mode 100644
index 0000000..44850e6
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-v23_abc_control_background_material.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-watch-v20_abc_dialog_material_background.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-watch-v20_abc_dialog_material_background.xml.flat
new file mode 100644
index 0000000..f30f8c6
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-watch-v20_abc_dialog_material_background.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..390aa93
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ab_share_pack_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..0f1ba61
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..cd1cd4f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..b718473
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..52816df
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat
new file mode 100644
index 0000000..ad4651b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat
new file mode 100644
index 0000000..aa47017
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..8cbb5f9
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_cab_background_top_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat
new file mode 100644
index 0000000..4dc7dfa
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_ic_commit_search_api_mtrl_alpha.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..c9dbe1a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_list_divider_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl.png.flat
new file mode 100644
index 0000000..76391e6
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_left_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat
new file mode 100644
index 0000000..e19d8dd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl.png.flat
new file mode 100644
index 0000000..6d9e690
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_text_select_handle_right_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..9dd6ab0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..66936d0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..9d21fee
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..df25b16
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer.png.flat
new file mode 100644
index 0000000..f53ad32
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_low.png.flat
new file mode 100644
index 0000000..dd55137
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video.png.flat
new file mode 100644
index 0000000..4775c35
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video_low.png.flat
new file mode 100644
index 0000000..9b21729
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_answer_video_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline.png.flat
new file mode 100644
index 0000000..e54078a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline_low.png.flat
new file mode 100644
index 0000000..7014739
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_ic_call_decline_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat
new file mode 100644
index 0000000..eb798b0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_normal.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat
new file mode 100644
index 0000000..eaebb6e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_low_pressed.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_normal.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_normal.9.png.flat
new file mode 100644
index 0000000..6161dbd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xhdpi-v4_notification_bg_normal.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat
new file mode 100644
index 0000000..49330fa
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_dark.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat
new file mode 100644
index 0000000..fcaee6d
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_list_selector_disabled_holo_light.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat
new file mode 100644
index 0000000..70919a0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_popup_background_mtrl_mult.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat
new file mode 100644
index 0000000..ee5de60
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_off_mtrl_alpha.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat
new file mode 100644
index 0000000..ed216ce
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat
new file mode 100644
index 0000000..da560de
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..b6abdc1
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_primary_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..7620d93
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_scrubber_track_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat
new file mode 100644
index 0000000..eadb3e2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..7df7847
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..d0a8f44
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat
new file mode 100644
index 0000000..5d51d90
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat
new file mode 100644
index 0000000..4714e9e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_middle_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat
new file mode 100644
index 0000000..2019ff0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..bdca87f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..eca6242
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..3533645
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_activated_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..539fd3a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_abc_textfield_search_default_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer.png.flat
new file mode 100644
index 0000000..e8a2815
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_low.png.flat
new file mode 100644
index 0000000..a58dc70
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video.png.flat
new file mode 100644
index 0000000..17759e4
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video_low.png.flat
new file mode 100644
index 0000000..abdcfd1
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_answer_video_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline.png.flat
new file mode 100644
index 0000000..8c1ec56
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline_low.png.flat
new file mode 100644
index 0000000..e7cb3ce
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxhdpi-v4_ic_call_decline_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..7c26522
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..5841a1f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_check_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat
new file mode 100644
index 0000000..e9ef59f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat
new file mode 100644
index 0000000..0694b32
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_radio_to_on_mtrl_015.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat
new file mode 100644
index 0000000..4a10bfd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00001.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat
new file mode 100644
index 0000000..0895d60
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_btn_switch_to_on_mtrl_00012.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat
new file mode 100644
index 0000000..2d00f2f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_000.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat
new file mode 100644
index 0000000..faf958f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_scrubber_control_to_pressed_mtrl_005.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat
new file mode 100644
index 0000000..5c88edb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_spinner_mtrl_am_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..7918d01
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_switch_track_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat
new file mode 100644
index 0000000..bbc7736
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_tab_indicator_mtrl_alpha.9.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat
new file mode 100644
index 0000000..204d60e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_left_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat
new file mode 100644
index 0000000..7961e22
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_abc_text_select_handle_right_mtrl.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer.png.flat
new file mode 100644
index 0000000..f00c957
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_low.png.flat
new file mode 100644
index 0000000..f882c66
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video.png.flat
new file mode 100644
index 0000000..d409d39
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video_low.png.flat
new file mode 100644
index 0000000..e5179f0
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_answer_video_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline.png.flat
new file mode 100644
index 0000000..53eb5ee
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline_low.png.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline_low.png.flat
new file mode 100644
index 0000000..856d27e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable-xxxhdpi-v4_ic_call_decline_low.png.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_borderless_material.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_borderless_material.xml.flat
new file mode 100644
index 0000000..3055159
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_borderless_material.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material.xml.flat
new file mode 100644
index 0000000..f5a338e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material_anim.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material_anim.xml.flat
new file mode 100644
index 0000000..29caf91
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_check_material_anim.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_default_mtrl_shape.xml.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_default_mtrl_shape.xml.flat
new file mode 100644
index 0000000..2b27d62
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/drawable_abc_btn_default_mtrl_shape.xml.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr-rCA_values-fr-rCA.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr-rCA_values-fr-rCA.arsc.flat
new file mode 100644
index 0000000..dcd06d3
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr-rCA_values-fr-rCA.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr_values-fr.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr_values-fr.arsc.flat
new file mode 100644
index 0000000..4c572aa
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-fr_values-fr.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gl_values-gl.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gl_values-gl.arsc.flat
new file mode 100644
index 0000000..2f82afb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gl_values-gl.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gu_values-gu.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gu_values-gu.arsc.flat
new file mode 100644
index 0000000..f8502da
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-gu_values-gu.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-h720dp-v13_values-h720dp-v13.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-h720dp-v13_values-h720dp-v13.arsc.flat
new file mode 100644
index 0000000..f299490
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-h720dp-v13_values-h720dp-v13.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hdpi-v4_values-hdpi-v4.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hdpi-v4_values-hdpi-v4.arsc.flat
new file mode 100644
index 0000000..8fc66b8
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hdpi-v4_values-hdpi-v4.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hi_values-hi.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hi_values-hi.arsc.flat
new file mode 100644
index 0000000..884e662
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hi_values-hi.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hr_values-hr.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hr_values-hr.arsc.flat
new file mode 100644
index 0000000..60b8288
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hr_values-hr.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hu_values-hu.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hu_values-hu.arsc.flat
new file mode 100644
index 0000000..c4e12fb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hu_values-hu.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hy_values-hy.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hy_values-hy.arsc.flat
new file mode 100644
index 0000000..5169cfc
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-hy_values-hy.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-in_values-in.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-in_values-in.arsc.flat
new file mode 100644
index 0000000..9cc24e6
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-in_values-in.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-is_values-is.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-is_values-is.arsc.flat
new file mode 100644
index 0000000..463eebf
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-is_values-is.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-it_values-it.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-it_values-it.arsc.flat
new file mode 100644
index 0000000..9badb98
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-it_values-it.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-iw_values-iw.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-iw_values-iw.arsc.flat
new file mode 100644
index 0000000..b3c87d8
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-iw_values-iw.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ja_values-ja.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ja_values-ja.arsc.flat
new file mode 100644
index 0000000..86e1b78
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ja_values-ja.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ka_values-ka.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ka_values-ka.arsc.flat
new file mode 100644
index 0000000..dd5e934
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ka_values-ka.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kk_values-kk.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kk_values-kk.arsc.flat
new file mode 100644
index 0000000..048f913
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kk_values-kk.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-km_values-km.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-km_values-km.arsc.flat
new file mode 100644
index 0000000..7f8352c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-km_values-km.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kn_values-kn.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kn_values-kn.arsc.flat
new file mode 100644
index 0000000..5388570
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-kn_values-kn.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ko_values-ko.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ko_values-ko.arsc.flat
new file mode 100644
index 0000000..22836c7
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ko_values-ko.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ky_values-ky.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ky_values-ky.arsc.flat
new file mode 100644
index 0000000..4d4a742
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ky_values-ky.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-land_values-land.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-land_values-land.arsc.flat
new file mode 100644
index 0000000..88f1002
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-land_values-land.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-large-v4_values-large-v4.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-large-v4_values-large-v4.arsc.flat
new file mode 100644
index 0000000..89ba9f5
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-large-v4_values-large-v4.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ldltr-v21_values-ldltr-v21.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ldltr-v21_values-ldltr-v21.arsc.flat
new file mode 100644
index 0000000..878421d
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ldltr-v21_values-ldltr-v21.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lo_values-lo.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lo_values-lo.arsc.flat
new file mode 100644
index 0000000..f7aa2bd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lo_values-lo.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lt_values-lt.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lt_values-lt.arsc.flat
new file mode 100644
index 0000000..90793ed
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lt_values-lt.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lv_values-lv.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lv_values-lv.arsc.flat
new file mode 100644
index 0000000..944bdec
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-lv_values-lv.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mk_values-mk.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mk_values-mk.arsc.flat
new file mode 100644
index 0000000..fe8d259
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mk_values-mk.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ml_values-ml.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ml_values-ml.arsc.flat
new file mode 100644
index 0000000..18dd430
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ml_values-ml.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mn_values-mn.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mn_values-mn.arsc.flat
new file mode 100644
index 0000000..2ce98ea
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mn_values-mn.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mr_values-mr.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mr_values-mr.arsc.flat
new file mode 100644
index 0000000..366ab3d
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-mr_values-mr.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ms_values-ms.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ms_values-ms.arsc.flat
new file mode 100644
index 0000000..dc718fb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ms_values-ms.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-my_values-my.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-my_values-my.arsc.flat
new file mode 100644
index 0000000..9616ec7
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-my_values-my.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nb_values-nb.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nb_values-nb.arsc.flat
new file mode 100644
index 0000000..869352a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nb_values-nb.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ne_values-ne.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ne_values-ne.arsc.flat
new file mode 100644
index 0000000..e96b5c5
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ne_values-ne.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-night-v8_values-night-v8.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-night-v8_values-night-v8.arsc.flat
new file mode 100644
index 0000000..852f059
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-night-v8_values-night-v8.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nl_values-nl.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nl_values-nl.arsc.flat
new file mode 100644
index 0000000..e9c38ff
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-nl_values-nl.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-or_values-or.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-or_values-or.arsc.flat
new file mode 100644
index 0000000..3135f7f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-or_values-or.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pa_values-pa.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pa_values-pa.arsc.flat
new file mode 100644
index 0000000..e856130
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pa_values-pa.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pl_values-pl.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pl_values-pl.arsc.flat
new file mode 100644
index 0000000..496f76b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pl_values-pl.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-port_values-port.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-port_values-port.arsc.flat
new file mode 100644
index 0000000..1cfc535
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-port_values-port.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rBR_values-pt-rBR.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rBR_values-pt-rBR.arsc.flat
new file mode 100644
index 0000000..df8cfbd
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rBR_values-pt-rBR.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rPT_values-pt-rPT.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rPT_values-pt-rPT.arsc.flat
new file mode 100644
index 0000000..12925ac
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt-rPT_values-pt-rPT.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt_values-pt.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt_values-pt.arsc.flat
new file mode 100644
index 0000000..def49bb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-pt_values-pt.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ro_values-ro.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ro_values-ro.arsc.flat
new file mode 100644
index 0000000..35bdc2b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ro_values-ro.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ru_values-ru.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ru_values-ru.arsc.flat
new file mode 100644
index 0000000..e109970
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ru_values-ru.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-si_values-si.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-si_values-si.arsc.flat
new file mode 100644
index 0000000..3e5aa2b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-si_values-si.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sk_values-sk.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sk_values-sk.arsc.flat
new file mode 100644
index 0000000..41457be
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sk_values-sk.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sl_values-sl.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sl_values-sl.arsc.flat
new file mode 100644
index 0000000..97df814
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sl_values-sl.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sq_values-sq.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sq_values-sq.arsc.flat
new file mode 100644
index 0000000..02323b3
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sq_values-sq.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sr_values-sr.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sr_values-sr.arsc.flat
new file mode 100644
index 0000000..44b76f2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sr_values-sr.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sv_values-sv.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sv_values-sv.arsc.flat
new file mode 100644
index 0000000..64eb54c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sv_values-sv.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw600dp-v13_values-sw600dp-v13.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw600dp-v13_values-sw600dp-v13.arsc.flat
new file mode 100644
index 0000000..496b86f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw600dp-v13_values-sw600dp-v13.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw_values-sw.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw_values-sw.arsc.flat
new file mode 100644
index 0000000..9359320
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-sw_values-sw.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ta_values-ta.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ta_values-ta.arsc.flat
new file mode 100644
index 0000000..fb1235e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ta_values-ta.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-te_values-te.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-te_values-te.arsc.flat
new file mode 100644
index 0000000..3d25784
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-te_values-te.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-th_values-th.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-th_values-th.arsc.flat
new file mode 100644
index 0000000..496bd1a
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-th_values-th.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tl_values-tl.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tl_values-tl.arsc.flat
new file mode 100644
index 0000000..f168b01
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tl_values-tl.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tr_values-tr.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tr_values-tr.arsc.flat
new file mode 100644
index 0000000..5958193
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-tr_values-tr.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uk_values-uk.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uk_values-uk.arsc.flat
new file mode 100644
index 0000000..0867d6c
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uk_values-uk.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ur_values-ur.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ur_values-ur.arsc.flat
new file mode 100644
index 0000000..20a6908
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-ur_values-ur.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uz_values-uz.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uz_values-uz.arsc.flat
new file mode 100644
index 0000000..c7ac597
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-uz_values-uz.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v16_values-v16.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v16_values-v16.arsc.flat
new file mode 100644
index 0000000..2ae44f4
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v16_values-v16.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v17_values-v17.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v17_values-v17.arsc.flat
new file mode 100644
index 0000000..9c304ed
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v17_values-v17.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v18_values-v18.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v18_values-v18.arsc.flat
new file mode 100644
index 0000000..4479348
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v18_values-v18.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v21_values-v21.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v21_values-v21.arsc.flat
new file mode 100644
index 0000000..a1e62d2
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v21_values-v21.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v22_values-v22.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v22_values-v22.arsc.flat
new file mode 100644
index 0000000..ec90bee
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v22_values-v22.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v23_values-v23.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v23_values-v23.arsc.flat
new file mode 100644
index 0000000..5323778
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v23_values-v23.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v24_values-v24.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v24_values-v24.arsc.flat
new file mode 100644
index 0000000..99c106b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v24_values-v24.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v25_values-v25.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v25_values-v25.arsc.flat
new file mode 100644
index 0000000..efb51e1
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v25_values-v25.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v26_values-v26.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v26_values-v26.arsc.flat
new file mode 100644
index 0000000..50bee63
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v26_values-v26.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v28_values-v28.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v28_values-v28.arsc.flat
new file mode 100644
index 0000000..54bdf19
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-v28_values-v28.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-vi_values-vi.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-vi_values-vi.arsc.flat
new file mode 100644
index 0000000..8cd0c75
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-vi_values-vi.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v20_values-watch-v20.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v20_values-watch-v20.arsc.flat
new file mode 100644
index 0000000..836d86f
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v20_values-watch-v20.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v21_values-watch-v21.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v21_values-watch-v21.arsc.flat
new file mode 100644
index 0000000..d4743f3
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-watch-v21_values-watch-v21.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-xlarge-v4_values-xlarge-v4.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-xlarge-v4_values-xlarge-v4.arsc.flat
new file mode 100644
index 0000000..23d1064
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-xlarge-v4_values-xlarge-v4.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rCN_values-zh-rCN.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rCN_values-zh-rCN.arsc.flat
new file mode 100644
index 0000000..c579a9e
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rCN_values-zh-rCN.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rHK_values-zh-rHK.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rHK_values-zh-rHK.arsc.flat
new file mode 100644
index 0000000..e342826
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rHK_values-zh-rHK.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rTW_values-zh-rTW.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rTW_values-zh-rTW.arsc.flat
new file mode 100644
index 0000000..108a993
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zh-rTW_values-zh-rTW.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zu_values-zu.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zu_values-zu.arsc.flat
new file mode 100644
index 0000000..b219fbb
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values-zu_values-zu.arsc.flat differ
diff --git a/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values_values.arsc.flat b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values_values.arsc.flat
new file mode 100644
index 0000000..9d0080b
Binary files /dev/null and b/autolayout/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/values_values.arsc.flat differ
diff --git a/autolayout/build/outputs/aar/autolayout-debug.aar b/autolayout/build/outputs/aar/autolayout-debug.aar
new file mode 100644
index 0000000..7f4c754
Binary files /dev/null and b/autolayout/build/outputs/aar/autolayout-debug.aar differ
diff --git a/autolayout/build/outputs/aar/autolayout-release.aar b/autolayout/build/outputs/aar/autolayout-release.aar
new file mode 100644
index 0000000..0392655
Binary files /dev/null and b/autolayout/build/outputs/aar/autolayout-release.aar differ
diff --git a/autolayout/build/outputs/logs/manifest-merger-debug-report.txt b/autolayout/build/outputs/logs/manifest-merger-debug-report.txt
new file mode 100644
index 0000000..e6ab697
--- /dev/null
+++ b/autolayout/build/outputs/logs/manifest-merger-debug-report.txt
@@ -0,0 +1,16 @@
+-- Merging decision tree log ---
+manifest
+ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:1-3:12
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:1-3:12
+ package
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ xmlns:android
+ ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:11-69
+uses-sdk
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
diff --git a/autolayout/build/outputs/logs/manifest-merger-release-report.txt b/autolayout/build/outputs/logs/manifest-merger-release-report.txt
new file mode 100644
index 0000000..e6ab697
--- /dev/null
+++ b/autolayout/build/outputs/logs/manifest-merger-release-report.txt
@@ -0,0 +1,16 @@
+-- Merging decision tree log ---
+manifest
+ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:1-3:12
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:1-3:12
+ package
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ xmlns:android
+ ADDED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml:1:11-69
+uses-sdk
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from C:\Users\admin\AndroidStudioProjects\ZHDCOA\autolayout\src\main\AndroidManifest.xml
diff --git a/autolayout/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/autolayout/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 0000000..6cb550c
Binary files /dev/null and b/autolayout/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/autolayout/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin b/autolayout/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 0000000..6cb550c
Binary files /dev/null and b/autolayout/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin differ
diff --git a/autolayout/src/main/AndroidManifest.xml b/autolayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..972c3a8
--- /dev/null
+++ b/autolayout/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java
new file mode 100644
index 0000000..595d933
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.zhy.autolayout;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+public class AutoFrameLayout extends FrameLayout
+{
+ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoFrameLayout(Context context)
+ {
+ super(context);
+ }
+
+ public AutoFrameLayout(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+ public AutoFrameLayout(Context context, AttributeSet attrs, int defStyleAttr)
+ {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ {
+ mHelper.adjustChildren();
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom)
+ {
+ super.onLayout(changed, left, top, right, bottom);
+ }
+
+ public static class LayoutParams extends FrameLayout.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+ public LayoutParams(int width, int height, int gravity)
+ {
+ super(width, height, gravity);
+ }
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(FrameLayout.LayoutParams source)
+ {
+ super((MarginLayoutParams) source);
+ gravity = source.gravity;
+ }
+
+ public LayoutParams(LayoutParams source)
+ {
+ this((FrameLayout.LayoutParams) source);
+ mAutoLayoutInfo = source.mAutoLayoutInfo;
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutActivity.java b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutActivity.java
new file mode 100644
index 0000000..1138d9c
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutActivity.java
@@ -0,0 +1,45 @@
+package com.zhy.autolayout;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+;import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * Created by zhy on 15/11/19.
+ */
+public class AutoLayoutActivity extends AppCompatActivity
+{
+ private static final String LAYOUT_LINEARLAYOUT = "LinearLayout";
+ private static final String LAYOUT_FRAMELAYOUT = "FrameLayout";
+ private static final String LAYOUT_RELATIVELAYOUT = "RelativeLayout";
+
+
+ @Override
+ public View onCreateView(String name, Context context, AttributeSet attrs)
+ {
+ View view = null;
+ if (name.equals(LAYOUT_FRAMELAYOUT))
+ {
+ view = new AutoFrameLayout(context, attrs);
+ }
+
+ if (name.equals(LAYOUT_LINEARLAYOUT))
+ {
+ view = new AutoLinearLayout(context, attrs);
+ }
+
+ if (name.equals(LAYOUT_RELATIVELAYOUT))
+ {
+ view = new AutoRelativeLayout(context, attrs);
+ }
+
+ if (view != null) return view;
+
+ return super.onCreateView(name, context, attrs);
+ }
+
+
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java
new file mode 100644
index 0000000..ebe2a2a
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java
@@ -0,0 +1,155 @@
+package com.zhy.autolayout;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.zhy.autolayout.attr.Attrs;
+import com.zhy.autolayout.attr.AutoAttr;
+import com.zhy.autolayout.attr.HeightAttr;
+import com.zhy.autolayout.attr.MarginBottomAttr;
+import com.zhy.autolayout.attr.MarginLeftAttr;
+import com.zhy.autolayout.attr.MarginRightAttr;
+import com.zhy.autolayout.attr.MarginTopAttr;
+import com.zhy.autolayout.attr.MaxHeightAttr;
+import com.zhy.autolayout.attr.MaxWidthAttr;
+import com.zhy.autolayout.attr.MinHeightAttr;
+import com.zhy.autolayout.attr.MinWidthAttr;
+import com.zhy.autolayout.attr.PaddingBottomAttr;
+import com.zhy.autolayout.attr.PaddingLeftAttr;
+import com.zhy.autolayout.attr.PaddingRightAttr;
+import com.zhy.autolayout.attr.PaddingTopAttr;
+import com.zhy.autolayout.attr.TextSizeAttr;
+import com.zhy.autolayout.attr.WidthAttr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AutoLayoutInfo
+{
+ private List autoAttrs = new ArrayList<>();
+
+ public void addAttr(AutoAttr autoAttr)
+ {
+ autoAttrs.add(autoAttr);
+ }
+
+
+ public void fillAttrs(View view)
+ {
+ for (AutoAttr autoAttr : autoAttrs)
+ {
+ autoAttr.apply(view);
+ }
+ }
+
+
+ public static AutoLayoutInfo getAttrFromView(View view, int attrs, int base)
+ {
+ ViewGroup.LayoutParams params = view.getLayoutParams();
+ if (params == null) return null;
+ AutoLayoutInfo autoLayoutInfo = new AutoLayoutInfo();
+
+ // width & height
+ if ((attrs & Attrs.WIDTH) != 0 && params.width > 0)
+ {
+ autoLayoutInfo.addAttr(WidthAttr.generate(params.width, base));
+ }
+
+ if ((attrs & Attrs.HEIGHT) != 0 && params.height > 0)
+ {
+ autoLayoutInfo.addAttr(HeightAttr.generate(params.height, base));
+ }
+
+ //margin
+ if (params instanceof ViewGroup.MarginLayoutParams)
+ {
+ if ((attrs & Attrs.MARGIN) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(((ViewGroup.MarginLayoutParams) params).leftMargin, base));
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(((ViewGroup.MarginLayoutParams) params).topMargin, base));
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(((ViewGroup.MarginLayoutParams) params).rightMargin, base));
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(((ViewGroup.MarginLayoutParams) params).bottomMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_LEFT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(((ViewGroup.MarginLayoutParams) params).leftMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_TOP) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(((ViewGroup.MarginLayoutParams) params).topMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_RIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(((ViewGroup.MarginLayoutParams) params).rightMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_BOTTOM) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(((ViewGroup.MarginLayoutParams) params).bottomMargin, base));
+ }
+ }
+
+ //padding
+ if ((attrs & Attrs.PADDING) != 0)
+ {
+ autoLayoutInfo.addAttr(PaddingLeftAttr.generate(view.getPaddingLeft(), base));
+ autoLayoutInfo.addAttr(PaddingTopAttr.generate(view.getPaddingTop(), base));
+ autoLayoutInfo.addAttr(PaddingRightAttr.generate(view.getPaddingRight(), base));
+ autoLayoutInfo.addAttr(PaddingBottomAttr.generate(view.getPaddingBottom(), base));
+ }
+ if ((attrs & Attrs.PADDING_LEFT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(view.getPaddingLeft(), base));
+ }
+ if ((attrs & Attrs.PADDING_TOP) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(view.getPaddingTop(), base));
+ }
+ if ((attrs & Attrs.PADDING_RIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(view.getPaddingRight(), base));
+ }
+ if ((attrs & Attrs.PADDING_BOTTOM) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(view.getPaddingBottom(), base));
+ }
+
+ //minWidth ,maxWidth , minHeight , maxHeight
+ if ((attrs & Attrs.MIN_WIDTH) != 0)
+ {
+ autoLayoutInfo.addAttr(MinWidthAttr.generate(MinWidthAttr.getMinWidth(view), base));
+ }
+ if ((attrs & Attrs.MAX_WIDTH) != 0)
+ {
+ autoLayoutInfo.addAttr(MaxWidthAttr.generate(MaxWidthAttr.getMaxWidth(view), base));
+ }
+ if ((attrs & Attrs.MIN_HEIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MinHeightAttr.generate(MinHeightAttr.getMinHeight(view), base));
+ }
+ if ((attrs & Attrs.MAX_HEIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MaxHeightAttr.generate(MaxHeightAttr.getMaxHeight(view), base));
+ }
+
+ //textsize
+
+ if (view instanceof TextView)
+ {
+ if ((attrs & Attrs.TEXTSIZE) != 0)
+ {
+ autoLayoutInfo.addAttr(TextSizeAttr.generate((int) ((TextView) view).getTextSize(), base));
+ }
+ }
+ return autoLayoutInfo;
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "AutoLayoutInfo{" +
+ "autoAttrs=" + autoAttrs +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java
new file mode 100644
index 0000000..f0f93d6
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java
@@ -0,0 +1,97 @@
+package com.zhy.autolayout;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+/**
+ * Created by zhy on 15/6/30.
+ */
+public class AutoLinearLayout extends LinearLayout
+{
+
+ private AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoLinearLayout(Context context) {
+ super(context);
+ }
+
+ public AutoLinearLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public AutoLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+ super.onLayout(changed, l, t, r, b);
+ }
+
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new AutoLinearLayout.LayoutParams(getContext(), attrs);
+ }
+
+
+ public static class LayoutParams extends LinearLayout.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java
new file mode 100644
index 0000000..c107e57
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.zhy.autolayout;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+public class AutoRelativeLayout extends RelativeLayout
+{
+ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoRelativeLayout(Context context)
+ {
+ super(context);
+ }
+
+ public AutoRelativeLayout(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+ public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyle)
+ {
+ super(context, attrs, defStyle);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom)
+ {
+ super.onLayout(changed, left, top, right, bottom);
+ }
+
+
+ public static class LayoutParams extends RelativeLayout.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java b/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java
new file mode 100644
index 0000000..774d803
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java
@@ -0,0 +1,28 @@
+package com.zhy.autolayout.attr;
+
+/**
+ * Created by zhy on 15/12/5.
+ *
+ * 与attrs.xml中数值对应
+ */
+public interface Attrs
+{
+ public static final int WIDTH = 1;
+ public static final int HEIGHT = WIDTH << 1;
+ public static final int TEXTSIZE = HEIGHT << 1;
+ public static final int PADDING = TEXTSIZE << 1;
+ public static final int MARGIN = PADDING << 1;
+ public static final int MARGIN_LEFT = MARGIN << 1;
+ public static final int MARGIN_TOP = MARGIN_LEFT << 1;
+ public static final int MARGIN_RIGHT = MARGIN_TOP << 1;
+ public static final int MARGIN_BOTTOM = MARGIN_RIGHT << 1;
+ public static final int PADDING_LEFT = MARGIN_BOTTOM << 1;
+ public static final int PADDING_TOP = PADDING_LEFT << 1;
+ public static final int PADDING_RIGHT = PADDING_TOP << 1;
+ public static final int PADDING_BOTTOM = PADDING_RIGHT << 1;
+ public static final int MIN_WIDTH = PADDING_BOTTOM << 1;
+ public static final int MAX_WIDTH = MIN_WIDTH << 1;
+ public static final int MIN_HEIGHT = MAX_WIDTH << 1;
+ public static final int MAX_HEIGHT = MIN_HEIGHT << 1;
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java
new file mode 100644
index 0000000..0f1259f
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java
@@ -0,0 +1,126 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.autolayout.utils.L;
+
+
+/**
+ * Created by zhy on 15/12/4.
+ */
+public abstract class AutoAttr
+{
+ public static final int BASE_WIDTH = 1;
+ public static final int BASE_HEIGHT = 2;
+ public static final int BASE_DEFAULT = 3;
+
+ protected int pxVal;
+ protected int baseWidth;
+ protected int baseHeight;
+
+ /*
+ protected boolean isBaseWidth;
+ protected boolean isBaseDefault;
+
+ public AutoAttr(int pxVal)
+ {
+ this.pxVal = pxVal;
+ isBaseDefault = true;
+ }
+
+ public AutoAttr(int pxVal, boolean isBaseWidth)
+ {
+ this.pxVal = pxVal;
+ this.isBaseWidth = isBaseWidth;
+ }
+ */
+
+ public AutoAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ this.pxVal = pxVal;
+ this.baseWidth = baseWidth;
+ this.baseHeight = baseHeight;
+ }
+
+ public void apply(View view)
+ {
+
+ boolean log = view.getTag() != null && view.getTag().toString().equals("auto");
+
+ if (log)
+ {
+ L.e(" pxVal = " + pxVal + " ," + this.getClass().getSimpleName());
+ }
+ int val;
+ if (useDefault())
+ {
+ val = defaultBaseWidth() ? getPercentWidthSize() : getPercentHeightSize();
+ if (log)
+ {
+ L.e(" useDefault val= " + val);
+ }
+ } else if (baseWidth())
+ {
+ val = getPercentWidthSize();
+ if (log)
+ {
+ L.e(" baseWidth val= " + val);
+ }
+ } else
+ {
+ val = getPercentHeightSize();
+ if (log)
+ {
+ L.e(" baseHeight val= " + val);
+ }
+ }
+
+ if (val > 0)
+ val = Math.max(val, 1);//for very thin divider
+ execute(view, val);
+ }
+
+ protected int getPercentWidthSize()
+ {
+ return AutoUtils.getPercentWidthSizeBigger(pxVal);
+ }
+
+ protected int getPercentHeightSize()
+ {
+ return AutoUtils.getPercentHeightSizeBigger(pxVal);
+ }
+
+
+ protected boolean baseWidth()
+ {
+ return contains(baseWidth, attrVal());
+ }
+
+ protected boolean useDefault()
+ {
+ return !contains(baseHeight, attrVal()) && !contains(baseWidth, attrVal());
+ }
+
+ protected boolean contains(int baseVal, int flag)
+ {
+ return (baseVal & flag) != 0;
+ }
+
+ protected abstract int attrVal();
+
+ protected abstract boolean defaultBaseWidth();
+
+ protected abstract void execute(View view, int val);
+
+
+ @Override
+ public String toString()
+ {
+ return "AutoAttr{" +
+ "pxVal=" + pxVal +
+ ", baseWidth=" + baseWidth() +
+ ", defaultBaseWidth=" + defaultBaseWidth() +
+ '}';
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java
new file mode 100644
index 0000000..c754c90
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java
@@ -0,0 +1,54 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class HeightAttr extends AutoAttr
+{
+ public HeightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.HEIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ ViewGroup.LayoutParams lp = view.getLayoutParams();
+ lp.height = val;
+ }
+
+ public static HeightAttr generate(int val, int baseFlag)
+ {
+ HeightAttr heightAttr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ heightAttr = new HeightAttr(val, Attrs.HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ heightAttr = new HeightAttr(val, 0, Attrs.HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ heightAttr = new HeightAttr(val, 0, 0);
+ break;
+ }
+ return heightAttr;
+ }
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java
new file mode 100644
index 0000000..8769fbe
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java
@@ -0,0 +1,52 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class MarginAttr extends AutoAttr
+{
+ public MarginAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MARGIN;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ public void apply(View view)
+ {
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ {
+ return;
+ }
+ if (useDefault())
+ {
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.leftMargin = lp.rightMargin = getPercentWidthSize();
+ lp.topMargin = lp.bottomMargin = getPercentHeightSize();
+ return;
+ }
+ super.apply(view);
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.leftMargin = lp.rightMargin = lp.topMargin = lp.bottomMargin = val;
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java
new file mode 100644
index 0000000..7d78272
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java
@@ -0,0 +1,56 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class MarginBottomAttr extends AutoAttr
+{
+ public MarginBottomAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MARGIN_BOTTOM;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ if(!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ {
+ return ;
+ }
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.bottomMargin = val;
+ }
+
+ public static MarginBottomAttr generate(int val, int baseFlag)
+ {
+ MarginBottomAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginBottomAttr(val, Attrs.MARGIN_BOTTOM, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginBottomAttr(val, 0, Attrs.MARGIN_BOTTOM);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginBottomAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java
new file mode 100644
index 0000000..4bc5feb
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java
@@ -0,0 +1,56 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class MarginLeftAttr extends AutoAttr
+{
+ public MarginLeftAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MARGIN_LEFT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ {
+ return;
+ }
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.leftMargin = val;
+ }
+
+ public static MarginLeftAttr generate(int val, int baseFlag)
+ {
+ MarginLeftAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginLeftAttr(val, Attrs.MARGIN_LEFT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginLeftAttr(val, 0, Attrs.MARGIN_LEFT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginLeftAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java
new file mode 100644
index 0000000..4f80198
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java
@@ -0,0 +1,57 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class MarginRightAttr extends AutoAttr
+{
+ public MarginRightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MARGIN_RIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ {
+ return;
+ }
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.rightMargin = val;
+ }
+
+
+ public static MarginRightAttr generate(int val, int baseFlag)
+ {
+ MarginRightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginRightAttr(val, Attrs.MARGIN_RIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginRightAttr(val, 0, Attrs.MARGIN_RIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginRightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java
new file mode 100644
index 0000000..d0821b5
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java
@@ -0,0 +1,58 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class MarginTopAttr extends AutoAttr
+{
+ public MarginTopAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MARGIN_TOP;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ {
+ return;
+ }
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+ lp.topMargin = val;
+
+ }
+
+
+ public static MarginTopAttr generate(int val, int baseFlag)
+ {
+ MarginTopAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginTopAttr(val, Attrs.MARGIN_TOP, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginTopAttr(val, 0, Attrs.MARGIN_TOP);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginTopAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java
new file mode 100644
index 0000000..9af66af
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java
@@ -0,0 +1,70 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MaxHeightAttr extends AutoAttr
+{
+ public MaxHeightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MAX_HEIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("setMaxHeight", int.class);
+ setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MaxHeightAttr generate(int val, int baseFlag)
+ {
+ MaxHeightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MaxHeightAttr(val, Attrs.MAX_HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MaxHeightAttr(val, 0, Attrs.MAX_HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MaxHeightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMaxHeight(View view)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("getMaxHeight");
+ return (int) setMaxWidthMethod.invoke(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java
new file mode 100644
index 0000000..51a4a95
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java
@@ -0,0 +1,70 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MaxWidthAttr extends AutoAttr
+{
+ public MaxWidthAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MAX_WIDTH;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("setMaxWidth", int.class);
+ setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MaxWidthAttr generate(int val, int baseFlag)
+ {
+ MaxWidthAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MaxWidthAttr(val, Attrs.MAX_WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MaxWidthAttr(val, 0, Attrs.MAX_WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MaxWidthAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMaxWidth(View view)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("getMaxWidth");
+ return (int) setMaxWidthMethod.invoke(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java
new file mode 100644
index 0000000..4b271bb
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java
@@ -0,0 +1,81 @@
+package com.zhy.autolayout.attr;
+
+import android.os.Build;
+import android.view.View;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MinHeightAttr extends AutoAttr
+{
+ public MinHeightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MIN_HEIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ view.setMinimumHeight(val);
+// Method setMaxWidthMethod = view.getClass().getMethod("setMinHeight", int.class);
+// setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MinHeightAttr generate(int val, int baseFlag)
+ {
+ MinHeightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MinHeightAttr(val, Attrs.MIN_HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MinHeightAttr(val, 0, Attrs.MIN_HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MinHeightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMinHeight(View view)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ {
+ return view.getMinimumHeight();
+ } else
+ {
+ try
+ {
+ Field minHeight = view.getClass().getField("mMinHeight");
+ minHeight.setAccessible(true);
+ return (int) minHeight.get(view);
+ } catch (Exception e)
+ {
+ }
+ }
+
+ return 0;
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java
new file mode 100644
index 0000000..438ef59
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java
@@ -0,0 +1,77 @@
+package com.zhy.autolayout.attr;
+
+import android.os.Build;
+import android.view.View;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MinWidthAttr extends AutoAttr
+{
+ public MinWidthAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MIN_WIDTH;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+// Method setMaxWidthMethod = view.getClass().getMethod("setMinWidth", int.class);
+// setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+
+ view.setMinimumWidth(val);
+ }
+
+ public static int getMinWidth(View view)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ return view.getMinimumWidth();
+ try
+ {
+ Field minWidth = view.getClass().getField("mMinWidth");
+ minWidth.setAccessible(true);
+ return (int) minWidth.get(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+
+
+ public static MinWidthAttr generate(int val, int baseFlag)
+ {
+ MinWidthAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MinWidthAttr(val, Attrs.MIN_WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MinWidthAttr(val, 0, Attrs.MIN_WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MinWidthAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java
new file mode 100644
index 0000000..b0869af
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java
@@ -0,0 +1,49 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class PaddingAttr extends AutoAttr
+{
+ public PaddingAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.PADDING;
+ }
+
+ @Override
+ public void apply(View view)
+ {
+ int l, t, r, b;
+ if (useDefault())
+ {
+ l = r = getPercentWidthSize();
+ t = b = getPercentHeightSize();
+ view.setPadding(l, t, r, b);
+ return;
+ }
+ super.apply(view);
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ view.setPadding(val, val, val, val);
+ }
+
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java
new file mode 100644
index 0000000..cbb4af9
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java
@@ -0,0 +1,56 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class PaddingBottomAttr extends AutoAttr
+{
+ public PaddingBottomAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.PADDING_BOTTOM;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ int l = view.getPaddingLeft();
+ int t = view.getPaddingTop();
+ int r = view.getPaddingRight();
+ int b = val;
+ view.setPadding(l, t, r, b);
+
+ }
+
+
+ public static PaddingBottomAttr generate(int val, int baseFlag)
+ {
+ PaddingBottomAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingBottomAttr(val, Attrs.PADDING_BOTTOM, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingBottomAttr(val, 0, Attrs.PADDING_BOTTOM);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingBottomAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java
new file mode 100644
index 0000000..960fbd2
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java
@@ -0,0 +1,56 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class PaddingLeftAttr extends AutoAttr
+{
+ public PaddingLeftAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.PADDING_LEFT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ int l = val;
+ int t = view.getPaddingTop();
+ int r = view.getPaddingRight();
+ int b = view.getPaddingBottom();
+ view.setPadding(l, t, r, b);
+
+ }
+
+
+ public static PaddingLeftAttr generate(int val, int baseFlag)
+ {
+ PaddingLeftAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingLeftAttr(val, Attrs.PADDING_LEFT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingLeftAttr(val, 0, Attrs.PADDING_LEFT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingLeftAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java
new file mode 100644
index 0000000..a7db5a9
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java
@@ -0,0 +1,56 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class PaddingRightAttr extends AutoAttr
+{
+ public PaddingRightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.PADDING_RIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ int l = view.getPaddingLeft();
+ int t = view.getPaddingTop();
+ int r = val;
+ int b = view.getPaddingBottom();
+ view.setPadding(l, t, r, b);
+
+ }
+
+
+ public static PaddingRightAttr generate(int val, int baseFlag)
+ {
+ PaddingRightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingRightAttr(val, Attrs.PADDING_RIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingRightAttr(val, 0, Attrs.PADDING_RIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingRightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java
new file mode 100644
index 0000000..d8a5e15
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java
@@ -0,0 +1,54 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class PaddingTopAttr extends AutoAttr
+{
+ public PaddingTopAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.PADDING_TOP;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ int l = view.getPaddingLeft();
+ int t = val;
+ int r = view.getPaddingRight();
+ int b = view.getPaddingBottom();
+ view.setPadding(l, t, r, b);
+ }
+
+ public static PaddingTopAttr generate(int val, int baseFlag)
+ {
+ PaddingTopAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingTopAttr(val, Attrs.PADDING_TOP, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingTopAttr(val, 0, Attrs.PADDING_TOP);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingTopAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java
new file mode 100644
index 0000000..bb4e2a5
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java
@@ -0,0 +1,58 @@
+package com.zhy.autolayout.attr;
+
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Created by zhy on 15/12/4.
+ */
+public class TextSizeAttr extends AutoAttr
+{
+
+ public TextSizeAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.TEXTSIZE;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ if (!(view instanceof TextView))
+ return;
+ ((TextView) view).setIncludeFontPadding(false);
+ ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX, val);
+ }
+
+ public static TextSizeAttr generate(int val, int baseFlag)
+ {
+ TextSizeAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new TextSizeAttr(val, Attrs.TEXTSIZE, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new TextSizeAttr(val, 0, Attrs.TEXTSIZE);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new TextSizeAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java
new file mode 100644
index 0000000..2de66c9
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java
@@ -0,0 +1,53 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Created by zhy on 15/12/5.
+ */
+public class WidthAttr extends AutoAttr
+{
+ public WidthAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.WIDTH;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ ViewGroup.LayoutParams lp = view.getLayoutParams();
+ lp.width = val;
+ }
+
+ public static WidthAttr generate(int val, int baseFlag)
+ {
+ WidthAttr widthAttr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ widthAttr = new WidthAttr(val, Attrs.WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ widthAttr = new WidthAttr(val, 0, Attrs.WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ widthAttr = new WidthAttr(val, 0, 0);
+ break;
+ }
+ return widthAttr;
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java b/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java
new file mode 100644
index 0000000..3261b67
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java
@@ -0,0 +1,111 @@
+package com.zhy.autolayout.config;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+import com.zhy.autolayout.utils.L;
+import com.zhy.autolayout.utils.ScreenUtils;
+
+/**
+ * Created by zhy on 15/11/18.
+ */
+public class AutoLayoutConifg
+{
+
+ private static AutoLayoutConifg sIntance = new AutoLayoutConifg();
+
+
+ private static final String KEY_DESIGN_WIDTH = "design_width";
+ private static final String KEY_DESIGN_HEIGHT = "design_height";
+
+ private int mScreenWidth;
+ private int mScreenHeight;
+
+ private int mDesignWidth;
+ private int mDesignHeight;
+
+ private boolean useDeviceSize;
+
+
+ private AutoLayoutConifg()
+ {
+ }
+
+ public void checkParams()
+ {
+ if (mDesignHeight <= 0 || mDesignWidth <= 0)
+ {
+ throw new RuntimeException(
+ "you must set " + KEY_DESIGN_WIDTH + " and " + KEY_DESIGN_HEIGHT + " in your manifest file.");
+ }
+ }
+
+ public AutoLayoutConifg useDeviceSize()
+ {
+ useDeviceSize = true;
+ return this;
+ }
+
+
+ public static AutoLayoutConifg getInstance()
+ {
+ return sIntance;
+ }
+
+
+ public int getScreenWidth()
+ {
+ return mScreenWidth;
+ }
+
+ public int getScreenHeight()
+ {
+ return mScreenHeight;
+ }
+
+ public int getDesignWidth()
+ {
+ return mDesignWidth;
+ }
+
+ public int getDesignHeight()
+ {
+ return mDesignHeight;
+ }
+
+
+ public void init(Context context)
+ {
+ getMetaData(context);
+
+ int[] screenSize = ScreenUtils.getScreenSize(context, useDeviceSize);
+ mScreenWidth = screenSize[0];
+ mScreenHeight = screenSize[1];
+ L.e(" screenWidth =" + mScreenWidth + " ,screenHeight = " + mScreenHeight);
+ }
+
+ private void getMetaData(Context context)
+ {
+ PackageManager packageManager = context.getPackageManager();
+ ApplicationInfo applicationInfo;
+ try
+ {
+ applicationInfo = packageManager.getApplicationInfo(context
+ .getPackageName(), PackageManager.GET_META_DATA);
+ if (applicationInfo != null && applicationInfo.metaData != null)
+ {
+ mDesignWidth = (int) applicationInfo.metaData.get(KEY_DESIGN_WIDTH);
+ mDesignHeight = (int) applicationInfo.metaData.get(KEY_DESIGN_HEIGHT);
+ }
+ } catch (PackageManager.NameNotFoundException e)
+ {
+ throw new RuntimeException(
+ "you must set " + KEY_DESIGN_WIDTH + " and " + KEY_DESIGN_HEIGHT + " in your manifest file.", e);
+ }
+
+ L.e(" designWidth =" + mDesignWidth + " , designHeight = " + mDesignHeight);
+ }
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/config/UseLandscape.java b/autolayout/src/main/java/com/zhy/autolayout/config/UseLandscape.java
new file mode 100644
index 0000000..34fbdab
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/config/UseLandscape.java
@@ -0,0 +1,9 @@
+package com.zhy.autolayout.config;
+
+/**
+ * Created by zhy on 15/12/5.
+ * 如果Activity设计稿是横屏,继承该接口即可
+ */
+public interface UseLandscape
+{
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java
new file mode 100644
index 0000000..9ac666e
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.zhy.autolayout.utils;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.R;
+import com.zhy.autolayout.attr.HeightAttr;
+import com.zhy.autolayout.attr.MarginAttr;
+import com.zhy.autolayout.attr.MarginBottomAttr;
+import com.zhy.autolayout.attr.MarginLeftAttr;
+import com.zhy.autolayout.attr.MarginRightAttr;
+import com.zhy.autolayout.attr.MarginTopAttr;
+import com.zhy.autolayout.attr.MaxHeightAttr;
+import com.zhy.autolayout.attr.MaxWidthAttr;
+import com.zhy.autolayout.attr.MinHeightAttr;
+import com.zhy.autolayout.attr.MinWidthAttr;
+import com.zhy.autolayout.attr.PaddingAttr;
+import com.zhy.autolayout.attr.PaddingBottomAttr;
+import com.zhy.autolayout.attr.PaddingLeftAttr;
+import com.zhy.autolayout.attr.PaddingRightAttr;
+import com.zhy.autolayout.attr.PaddingTopAttr;
+import com.zhy.autolayout.attr.TextSizeAttr;
+import com.zhy.autolayout.attr.WidthAttr;
+import com.zhy.autolayout.config.AutoLayoutConifg;
+
+public class AutoLayoutHelper
+{
+ private final ViewGroup mHost;
+
+ private static final int[] LL = new int[]
+ { //
+ android.R.attr.textSize,
+ android.R.attr.padding,//
+ android.R.attr.paddingLeft,//
+ android.R.attr.paddingTop,//
+ android.R.attr.paddingRight,//
+ android.R.attr.paddingBottom,//
+ android.R.attr.layout_width,//
+ android.R.attr.layout_height,//
+ android.R.attr.layout_margin,//
+ android.R.attr.layout_marginLeft,//
+ android.R.attr.layout_marginTop,//
+ android.R.attr.layout_marginRight,//
+ android.R.attr.layout_marginBottom,//
+ android.R.attr.maxWidth,//
+ android.R.attr.maxHeight,//
+ android.R.attr.minWidth,//
+ android.R.attr.minHeight,//16843072
+
+
+ };
+
+ private static final int INDEX_TEXT_SIZE = 0;
+ private static final int INDEX_PADDING = 1;
+ private static final int INDEX_PADDING_LEFT = 2;
+ private static final int INDEX_PADDING_TOP = 3;
+ private static final int INDEX_PADDING_RIGHT = 4;
+ private static final int INDEX_PADDING_BOTTOM = 5;
+ private static final int INDEX_WIDTH = 6;
+ private static final int INDEX_HEIGHT = 7;
+ private static final int INDEX_MARGIN = 8;
+ private static final int INDEX_MARGIN_LEFT = 9;
+ private static final int INDEX_MARGIN_TOP = 10;
+ private static final int INDEX_MARGIN_RIGHT = 11;
+ private static final int INDEX_MARGIN_BOTTOM = 12;
+ private static final int INDEX_MAX_WIDTH = 13;
+ private static final int INDEX_MAX_HEIGHT = 14;
+ private static final int INDEX_MIN_WIDTH = 15;
+ private static final int INDEX_MIN_HEIGHT = 16;
+
+
+ /**
+ * move to other place?
+ */
+ private static AutoLayoutConifg mAutoLayoutConifg;
+
+ public AutoLayoutHelper(ViewGroup host)
+ {
+ mHost = host;
+
+ if (mAutoLayoutConifg == null)
+ {
+ initAutoLayoutConfig(host);
+ }
+
+ }
+
+ private void initAutoLayoutConfig(ViewGroup host)
+ {
+ mAutoLayoutConifg = AutoLayoutConifg.getInstance();
+ mAutoLayoutConifg.init(host.getContext());
+ }
+
+
+ public void adjustChildren()
+ {
+ AutoLayoutConifg.getInstance().checkParams();
+
+ for (int i = 0, n = mHost.getChildCount(); i < n; i++)
+ {
+ View view = mHost.getChildAt(i);
+ ViewGroup.LayoutParams params = view.getLayoutParams();
+
+ if (params instanceof AutoLayoutParams)
+ {
+ AutoLayoutInfo info =
+ ((AutoLayoutParams) params).getAutoLayoutInfo();
+ if (info != null)
+ {
+ info.fillAttrs(view);
+ }
+ }
+ }
+
+ }
+
+ public static AutoLayoutInfo getAutoLayoutInfo(Context context,
+ AttributeSet attrs)
+ {
+
+ AutoLayoutInfo info = new AutoLayoutInfo();
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AutoLayout_Layout);
+ int baseWidth = a.getInt(R.styleable.AutoLayout_Layout_layout_auto_basewidth, 0);
+ int baseHeight = a.getInt(R.styleable.AutoLayout_Layout_layout_auto_baseheight, 0);
+ a.recycle();
+
+ TypedArray array = context.obtainStyledAttributes(attrs, LL);
+
+ int n = array.getIndexCount();
+
+
+ for (int i = 0; i < n; i++)
+ {
+ int index = array.getIndex(i);
+// String val = array.getString(index);
+// if (!isPxVal(val)) continue;
+
+ if (!DimenUtils.isPxVal(array.peekValue(index))) continue;
+
+ int pxVal = 0;
+ try
+ {
+ pxVal = array.getDimensionPixelOffset(index, 0);
+ } catch (Exception ignore)//not dimension
+ {
+ continue;
+ }
+ switch (index)
+ {
+ case INDEX_TEXT_SIZE:
+ info.addAttr(new TextSizeAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_PADDING:
+ info.addAttr(new PaddingAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_PADDING_LEFT:
+ info.addAttr(new PaddingLeftAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_PADDING_TOP:
+ info.addAttr(new PaddingTopAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_PADDING_RIGHT:
+ info.addAttr(new PaddingRightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_PADDING_BOTTOM:
+ info.addAttr(new PaddingBottomAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_WIDTH:
+ info.addAttr(new WidthAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_HEIGHT:
+ info.addAttr(new HeightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MARGIN:
+ info.addAttr(new MarginAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MARGIN_LEFT:
+ info.addAttr(new MarginLeftAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MARGIN_TOP:
+ info.addAttr(new MarginTopAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MARGIN_RIGHT:
+ info.addAttr(new MarginRightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MARGIN_BOTTOM:
+ info.addAttr(new MarginBottomAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MAX_WIDTH:
+ info.addAttr(new MaxWidthAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MAX_HEIGHT:
+ info.addAttr(new MaxHeightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MIN_WIDTH:
+ info.addAttr(new MinWidthAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MIN_HEIGHT:
+ info.addAttr(new MinHeightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ }
+ }
+ array.recycle();
+ L.e(" getAutoLayoutInfo " + info.toString());
+ return info;
+ }
+
+ public interface AutoLayoutParams
+ {
+ AutoLayoutInfo getAutoLayoutInfo();
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java
new file mode 100644
index 0000000..1252648
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java
@@ -0,0 +1,151 @@
+package com.zhy.autolayout.utils;
+
+import android.view.View;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.R;
+import com.zhy.autolayout.attr.Attrs;
+import com.zhy.autolayout.attr.AutoAttr;
+import com.zhy.autolayout.config.AutoLayoutConifg;
+
+/**
+ * Created by zhy on 15/12/4.
+ */
+public class AutoUtils
+{
+
+ /**
+ * 会直接将view的LayoutParams上设置的width,height直接进行百分比处理
+ *
+ * @param view
+ */
+ public static void auto(View view)
+ {
+ autoSize(view);
+ autoPadding(view);
+ autoMargin(view);
+ autoTextSize(view, AutoAttr.BASE_DEFAULT);
+ }
+
+ /**
+ * @param view
+ * @param attrs #Attrs.WIDTH|Attrs.HEIGHT
+ * @param base AutoAttr.BASE_WIDTH|AutoAttr.BASE_HEIGHT|AutoAttr.BASE_DEFAULT
+ */
+ public static void auto(View view, int attrs, int base)
+ {
+ AutoLayoutInfo autoLayoutInfo = AutoLayoutInfo.getAttrFromView(view, attrs, base);
+ if (autoLayoutInfo != null)
+ autoLayoutInfo.fillAttrs(view);
+ }
+
+ public static void autoTextSize(View view)
+ {
+ auto(view, Attrs.TEXTSIZE, AutoAttr.BASE_DEFAULT);
+ }
+
+ public static void autoTextSize(View view, int base)
+ {
+ auto(view, Attrs.TEXTSIZE, base);
+ }
+
+ public static void autoMargin(View view)
+ {
+ auto(view, Attrs.MARGIN, AutoAttr.BASE_DEFAULT);
+ }
+
+ public static void autoMargin(View view, int base)
+ {
+ auto(view, Attrs.MARGIN, base);
+ }
+
+ public static void autoPadding(View view)
+ {
+ auto(view, Attrs.PADDING, AutoAttr.BASE_DEFAULT);
+ }
+
+ public static void autoPadding(View view, int base)
+ {
+ auto(view, Attrs.PADDING, base);
+ }
+
+ public static void autoSize(View view)
+ {
+ auto(view, Attrs.WIDTH | Attrs.HEIGHT, AutoAttr.BASE_DEFAULT);
+ }
+
+ public static void autoSize(View view, int base)
+ {
+ auto(view, Attrs.WIDTH | Attrs.HEIGHT, base);
+ }
+
+ public static boolean autoed(View view)
+ {
+ Object tag = view.getTag(R.id.id_tag_autolayout_size);
+ if (tag != null) return true;
+ view.setTag(R.id.id_tag_autolayout_size, "Just Identify");
+ return false;
+ }
+
+ public static float getPercentWidth1px()
+ {
+ int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
+ int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
+ return 1.0f * screenWidth / designWidth;
+ }
+
+ public static float getPercentHeight1px()
+ {
+ int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
+ int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
+ return 1.0f * screenHeight / designHeight;
+ }
+
+
+ public static int getPercentWidthSize(int val)
+ {
+ int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
+ int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
+ return (int) (val * 1.0f / designWidth * screenWidth);
+ }
+
+
+ public static int getPercentWidthSizeBigger(int val)
+ {
+ int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
+ int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
+
+ int res = val * screenWidth;
+ if (res % designWidth == 0)
+ {
+ return res / designWidth;
+ } else
+ {
+ return res / designWidth + 1;
+ }
+
+ }
+
+ public static int getPercentHeightSizeBigger(int val)
+ {
+ int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
+ int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
+
+ int res = val * screenHeight;
+ if (res % designHeight == 0)
+ {
+ return res / designHeight;
+ } else
+ {
+ return res / designHeight + 1;
+ }
+ }
+
+ public static int getPercentHeightSize(int val)
+ {
+ int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
+ int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
+
+ return (int) (val * 1.0f / designHeight * screenHeight);
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java
new file mode 100644
index 0000000..a055670
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java
@@ -0,0 +1,24 @@
+package com.zhy.autolayout.utils;
+
+import android.util.TypedValue;
+
+/**
+ * Created by zhy on 16/3/3.
+ */
+public class DimenUtils
+{
+ private static int getComplexUnit(int data)
+ {
+ return TypedValue.COMPLEX_UNIT_MASK & (data >> TypedValue.COMPLEX_UNIT_SHIFT);
+ }
+
+ public static boolean isPxVal(TypedValue val)
+ {
+ if (val != null && val.type == TypedValue.TYPE_DIMENSION &&
+ getComplexUnit(val.data) == TypedValue.COMPLEX_UNIT_PX)
+ {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/L.java b/autolayout/src/main/java/com/zhy/autolayout/utils/L.java
new file mode 100644
index 0000000..11db454
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/L.java
@@ -0,0 +1,22 @@
+package com.zhy.autolayout.utils;
+
+import android.util.Log;
+
+/**
+ * Created by zhy on 15/11/18.
+ */
+public class L
+{
+ public static boolean debug = false;
+ private static final String TAG = "AUTO_LAYOUT";
+
+ public static void e(String msg)
+ {
+ if (debug)
+ {
+ Log.e(TAG, msg);
+ }
+ }
+
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java
new file mode 100644
index 0000000..d7db439
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java
@@ -0,0 +1,82 @@
+package com.zhy.autolayout.utils;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.os.Build;
+import android.util.DisplayMetrics;
+import android.view.Display;
+import android.view.WindowManager;
+
+/**
+ * Created by zhy on 15/12/4.
+ * form http://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels/15699681#15699681
+ */
+public class ScreenUtils
+{
+
+ public static int getStatusBarHeight(Context context)
+ {
+ int result = 0;
+ try
+ {
+ int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+ if (resourceId > 0)
+ {
+ result = context.getResources().getDimensionPixelSize(resourceId);
+ }
+ } catch (Resources.NotFoundException e)
+ {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+
+ public static int[] getScreenSize(Context context, boolean useDeviceSize)
+ {
+
+ int[] size = new int[2];
+
+ WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ Display d = w.getDefaultDisplay();
+ DisplayMetrics metrics = new DisplayMetrics();
+ d.getMetrics(metrics);
+// since SDK_INT = 1;
+ int widthPixels = metrics.widthPixels;
+ int heightPixels = metrics.heightPixels;
+
+ if (!useDeviceSize)
+ {
+ size[0] = widthPixels;
+ size[1] = heightPixels - getStatusBarHeight(context);
+
+ return size;
+ }
+
+// includes window decorations (statusbar bar/menu bar)
+ if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
+ try
+ {
+ widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
+ heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
+ } catch (Exception ignored)
+ {
+ }
+// includes window decorations (statusbar bar/menu bar)
+ if (Build.VERSION.SDK_INT >= 17)
+ try
+ {
+ Point realSize = new Point();
+ Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
+ widthPixels = realSize.x;
+ heightPixels = realSize.y;
+ } catch (Exception ignored)
+ {
+ }
+ size[0] = widthPixels;
+ size[1] = heightPixels;
+ return size;
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java b/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java
new file mode 100644
index 0000000..44c732e
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java
@@ -0,0 +1,233 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.R;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+import com.zhy.autolayout.utils.AutoUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Created by zhy on 15/12/10.
+ *
+ * //do not use
+ */
+public class MetroLayout extends ViewGroup
+{
+
+ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ private static class MetroBlock
+ {
+ int left;
+ int top;
+ int width;
+ }
+
+ private List mAvailablePos = new ArrayList<>();
+ private int mDivider;
+
+ public MetroLayout(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MetroLayout);
+ mDivider = a.getDimensionPixelOffset(R.styleable.MetroLayout_metro_divider, 0);
+ mDivider = AutoUtils.getPercentWidthSizeBigger(mDivider);
+ a.recycle();
+
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+
+ if (true)
+ randomColor();
+
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+
+ measureChildren(widthMeasureSpec, heightMeasureSpec);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ }
+
+ private void randomColor()
+ {
+ Random r = new Random(255);
+
+ for (int i = 0, n = getChildCount(); i < n; i++)
+ {
+ View v = getChildAt(i);
+
+ v.setBackgroundColor(Color.argb(100, r.nextInt(), r.nextInt(), r.nextInt()));
+ }
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+
+ initAvailablePosition();
+
+ int left = 0;
+ int top = 0;
+ int divider = mDivider;
+
+ for (int i = 0, n = getChildCount(); i < n; i++)
+ {
+ View v = getChildAt(i);
+ if (v.getVisibility() == View.GONE) continue;
+
+ MetroBlock newPos = findAvailablePos(v);
+ left = newPos.left;
+ top = newPos.top;
+
+ int childWidth = v.getMeasuredWidth();
+ int childHeight = v.getMeasuredHeight();
+
+ int right = left + childWidth;
+ int bottom = top + childHeight;
+
+ v.layout(left, top, right, bottom);
+
+ if (childWidth + divider < newPos.width)
+ {
+ newPos.left += childWidth + divider;
+ newPos.width -= childWidth + divider;
+ } else
+ {
+ mAvailablePos.remove(newPos);
+ }
+
+ MetroBlock p = new MetroBlock();
+ p.left = left;
+ p.top = bottom + divider;
+ p.width = childWidth;
+ mAvailablePos.add(p);
+
+ mergeAvailablePosition();
+
+ }
+ }
+
+ private void mergeAvailablePosition()
+ {
+ if (mAvailablePos.size() <= 1) return;
+
+ List needRemoveBlocks = new ArrayList<>();
+
+ MetroBlock one = mAvailablePos.get(0);
+ MetroBlock two = mAvailablePos.get(1);
+
+ for (int i = 1, n = mAvailablePos.size(); i < n - 1; i++)
+ {
+ if (one.top == two.top)
+ {
+ one.width = one.width + two.width;
+ needRemoveBlocks.add(one);
+ two.left = one.left;
+ two = mAvailablePos.get(i + 1);
+ } else
+ {
+ one = mAvailablePos.get(i);
+ two = mAvailablePos.get(i + 1);
+ }
+ }
+
+ mAvailablePos.removeAll(needRemoveBlocks);
+
+ }
+
+ private void initAvailablePosition()
+ {
+ mAvailablePos.clear();
+ MetroBlock first = new MetroBlock();
+ first.left = getPaddingLeft();
+ first.top = getPaddingTop();
+ first.width = getMeasuredWidth();
+ mAvailablePos.add(first);
+ }
+
+ private MetroBlock findAvailablePos(View view)
+ {
+ MetroBlock p = new MetroBlock();
+ if (mAvailablePos.size() == 0)
+ {
+ p.left = getPaddingLeft();
+ p.top = getPaddingTop();
+ p.width = getMeasuredWidth();
+ return p;
+ }
+ int min = mAvailablePos.get(0).top;
+ MetroBlock minHeightPos = mAvailablePos.get(0);
+ for (MetroBlock _p : mAvailablePos)
+ {
+ if (_p.top < min)
+ {
+ min = _p.top;
+ minHeightPos = _p;
+ }
+ }
+ return minHeightPos;
+ }
+
+
+ @Override
+ public MetroLayout.LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ public static class LayoutParams extends ViewGroup.MarginLayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(LayoutParams source)
+ {
+ this((ViewGroup.LayoutParams) source);
+ mAutoLayoutInfo = source.mAutoLayoutInfo;
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ }
+
+}
diff --git a/autolayout/src/main/res/values/attrs.xml b/autolayout/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..c1d75c7
--- /dev/null
+++ b/autolayout/src/main/res/values/attrs.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/src/main/res/values/ids.xml b/autolayout/src/main/res/values/ids.xml
new file mode 100644
index 0000000..fd14abe
--- /dev/null
+++ b/autolayout/src/main/res/values/ids.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout/src/main/res/values/strings.xml b/autolayout/src/main/res/values/strings.xml
new file mode 100644
index 0000000..d9ea580
--- /dev/null
+++ b/autolayout/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ autolayout
+
diff --git a/build.gradle b/build.gradle
index 4b286e6..5006951 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
- id 'com.android.application' version '8.4.0' apply false
+ id 'com.android.application' version '8.6.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}
\ No newline at end of file
diff --git a/calendarview/build.gradle b/calendarview/build.gradle
new file mode 100644
index 0000000..74952e5
--- /dev/null
+++ b/calendarview/build.gradle
@@ -0,0 +1,64 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdk 34
+ defaultConfig {
+ minSdk 24
+ targetSdk 34
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ namespace 'com.haibin.calendarview'
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.recyclerview:recyclerview:1.1.0'
+}
+
+
+//
+//android {
+// compileSdkVersion 28
+//
+// defaultConfig {
+// minSdkVersion 14
+// //noinspection OldTargetApi
+// targetSdkVersion 28
+// versionCode 371
+// versionName "3.7.1"
+// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+//
+// }
+// buildTypes {
+// release {
+// minifyEnabled false
+// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+// }
+// }
+// android {
+// lintOptions {
+// abortOnError false
+// }
+// }
+// task intoJar(type: Copy) {
+// delete 'build/libs/CalendarView.jar'
+// from('build/intermediates/bundles/release/')
+// into('build/libs/')
+// include('classes.jar')
+// rename ('classes.jar', 'CalendarView.jar')
+// }
+// intoJar.dependsOn(build)
+//}
+//
+//dependencies {
+// implementation fileTree(dir: 'libs', include: ['*.jar'])
+// androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
+// exclude group: 'com.android.support', module: 'support-annotations'
+// })
+//
+// implementation 'androidx.appcompat:appcompat:1.2.0'
+// implementation 'androidx.recyclerview:recyclerview:1.1.0'
+// testImplementation 'junit:junit:4.12'
+//}
+//apply from: '../script/gradle-jcenter-push.gradle'
\ No newline at end of file
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/results.bin b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/results.bin
new file mode 100644
index 0000000..7ed749e
--- /dev/null
+++ b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseMonthView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseMonthView.dex
new file mode 100644
index 0000000..9f42457
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseMonthView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex
new file mode 100644
index 0000000..7efbadb
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex
new file mode 100644
index 0000000..4196fb3
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex
new file mode 100644
index 0000000..2294a2b
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex
new file mode 100644
index 0000000..70bc306
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseView.dex
new file mode 100644
index 0000000..80b859c
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseWeekView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseWeekView.dex
new file mode 100644
index 0000000..e5e2346
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/BaseWeekView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar$Scheme.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar$Scheme.dex
new file mode 100644
index 0000000..85e4842
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar$Scheme.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar.dex
new file mode 100644
index 0000000..dbf6959
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/Calendar.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$1.dex
new file mode 100644
index 0000000..c896f25
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$10.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$10.dex
new file mode 100644
index 0000000..9a875ae
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$10.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$2.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$2.dex
new file mode 100644
index 0000000..d533c09
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$2.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$3.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$3.dex
new file mode 100644
index 0000000..c0074e0
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$3.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$4.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$4.dex
new file mode 100644
index 0000000..9019242
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$4.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$5.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$5.dex
new file mode 100644
index 0000000..3cd1838
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$5.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$6.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$6.dex
new file mode 100644
index 0000000..e81f2d2
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$6.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$1.dex
new file mode 100644
index 0000000..d6b83b3
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$2.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$2.dex
new file mode 100644
index 0000000..06698bf
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7$2.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7.dex
new file mode 100644
index 0000000..05cb995
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$7.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$8.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$8.dex
new file mode 100644
index 0000000..5893916
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$8.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$9.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$9.dex
new file mode 100644
index 0000000..28bcfc6
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$9.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$CalendarScrollView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$CalendarScrollView.dex
new file mode 100644
index 0000000..1110dc6
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout$CalendarScrollView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout.dex
new file mode 100644
index 0000000..3bbc3d5
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarLayout.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarUtil.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarUtil.dex
new file mode 100644
index 0000000..ea278b4
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarUtil.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$1.dex
new file mode 100644
index 0000000..c62f2cc
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$2.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$2.dex
new file mode 100644
index 0000000..b92651f
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$2.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$3.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$3.dex
new file mode 100644
index 0000000..8bd1274
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$3.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$4.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$4.dex
new file mode 100644
index 0000000..70cb84b
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$4.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$5.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$5.dex
new file mode 100644
index 0000000..0d23d81
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$5.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$6.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$6.dex
new file mode 100644
index 0000000..8971619
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$6.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$7.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$7.dex
new file mode 100644
index 0000000..0471c24
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$7.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarInterceptListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarInterceptListener.dex
new file mode 100644
index 0000000..40e173c
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarInterceptListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex
new file mode 100644
index 0000000..a018a33
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex
new file mode 100644
index 0000000..9d4093d
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex
new file mode 100644
index 0000000..effacbc
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthView.dex
new file mode 100644
index 0000000..44cc542
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$1.dex
new file mode 100644
index 0000000..0face55
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex
new file mode 100644
index 0000000..ab528b7
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager.dex
new file mode 100644
index 0000000..ef6d09a
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MonthViewPager.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiMonthView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiMonthView.dex
new file mode 100644
index 0000000..4f36bef
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiMonthView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiWeekView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiWeekView.dex
new file mode 100644
index 0000000..b48f07b
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/MultiWeekView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeMonthView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeMonthView.dex
new file mode 100644
index 0000000..0f7a067
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeMonthView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeWeekView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeWeekView.dex
new file mode 100644
index 0000000..705a6c8
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/RangeWeekView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$1.dex
new file mode 100644
index 0000000..6108192
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$1.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex
new file mode 100644
index 0000000..2a9d999
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Time.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Time.dex
new file mode 100644
index 0000000..5786f54
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil$Time.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil.dex
new file mode 100644
index 0000000..bf4d4ab
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/SolarTermUtil.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/TrunkBranchAnnals.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/TrunkBranchAnnals.dex
new file mode 100644
index 0000000..9649b17
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/TrunkBranchAnnals.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekBar.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekBar.dex
new file mode 100644
index 0000000..11d2189
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekBar.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekView.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekView.dex
new file mode 100644
index 0000000..78cd5cc
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekView.dex differ
diff --git a/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekViewPager$1.dex b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekViewPager$1.dex
new file mode 100644
index 0000000..961a098
Binary files /dev/null and b/calendarview/build/.transforms/2e5683297cfdb4edf8c980c261253322/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/haibin/calendarview/WeekViewPager$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseMonthView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseMonthView.dex
new file mode 100644
index 0000000..1ddcdcc
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseMonthView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex
new file mode 100644
index 0000000..39bf50c
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex
new file mode 100644
index 0000000..f30643b
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnClickListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex
new file mode 100644
index 0000000..3a9f2cf
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter$OnItemClickListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex
new file mode 100644
index 0000000..396b1ba
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseRecyclerAdapter.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseView.dex
new file mode 100644
index 0000000..677c0d2
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseWeekView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseWeekView.dex
new file mode 100644
index 0000000..95efdab
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/BaseWeekView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar$Scheme.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar$Scheme.dex
new file mode 100644
index 0000000..759422b
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar$Scheme.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar.dex
new file mode 100644
index 0000000..4d8df87
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Calendar.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$1.dex
new file mode 100644
index 0000000..310518e
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$10.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$10.dex
new file mode 100644
index 0000000..2822d75
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$10.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$2.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$2.dex
new file mode 100644
index 0000000..01fd789
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$2.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$3.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$3.dex
new file mode 100644
index 0000000..f9c7808
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$3.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$4.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$4.dex
new file mode 100644
index 0000000..117ebe5
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$4.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$5.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$5.dex
new file mode 100644
index 0000000..f55d642
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$5.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$6.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$6.dex
new file mode 100644
index 0000000..17c1371
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarLayout$6.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex
new file mode 100644
index 0000000..e921c3f
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarLongClickListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex
new file mode 100644
index 0000000..bcd503f
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarMultiSelectListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex
new file mode 100644
index 0000000..7445369
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarRangeSelectListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarSelectListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarSelectListener.dex
new file mode 100644
index 0000000..66fe5e3
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnCalendarSelectListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnClickCalendarPaddingListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnClickCalendarPaddingListener.dex
new file mode 100644
index 0000000..bde4a4a
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnClickCalendarPaddingListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnInnerDateSelectedListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnInnerDateSelectedListener.dex
new file mode 100644
index 0000000..323cf04
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnInnerDateSelectedListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnMonthChangeListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnMonthChangeListener.dex
new file mode 100644
index 0000000..942dcee
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnMonthChangeListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnViewChangeListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnViewChangeListener.dex
new file mode 100644
index 0000000..84c6fc7
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnViewChangeListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnWeekChangeListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnWeekChangeListener.dex
new file mode 100644
index 0000000..b761fa3
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnWeekChangeListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearChangeListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearChangeListener.dex
new file mode 100644
index 0000000..624b975
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearChangeListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearViewChangeListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearViewChangeListener.dex
new file mode 100644
index 0000000..61164d2
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView$OnYearViewChangeListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView.dex
new file mode 100644
index 0000000..891df9f
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarViewDelegate.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarViewDelegate.dex
new file mode 100644
index 0000000..8f6dd75
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/CalendarViewDelegate.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultMonthView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultMonthView.dex
new file mode 100644
index 0000000..445d8a5
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultMonthView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultWeekView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultWeekView.dex
new file mode 100644
index 0000000..32930ad
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultWeekView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultYearView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultYearView.dex
new file mode 100644
index 0000000..ae1c848
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/DefaultYearView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarCalendar.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarCalendar.dex
new file mode 100644
index 0000000..387a6c1
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarCalendar.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarUtil.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarUtil.dex
new file mode 100644
index 0000000..32e6656
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/LunarUtil.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Month.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Month.dex
new file mode 100644
index 0000000..d346246
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/Month.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthView.dex
new file mode 100644
index 0000000..0f2e4b9
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$1.dex
new file mode 100644
index 0000000..f43c492
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex
new file mode 100644
index 0000000..7a1673d
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager$MonthViewPagerAdapter.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager.dex
new file mode 100644
index 0000000..5462f95
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MonthViewPager.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiMonthView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiMonthView.dex
new file mode 100644
index 0000000..3aa6823
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiMonthView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiWeekView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiWeekView.dex
new file mode 100644
index 0000000..71a7207
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/MultiWeekView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeMonthView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeMonthView.dex
new file mode 100644
index 0000000..0c05828
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeMonthView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeWeekView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeWeekView.dex
new file mode 100644
index 0000000..7f0f8f8
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/RangeWeekView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$1.dex
new file mode 100644
index 0000000..f62c550
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex
new file mode 100644
index 0000000..af6cedd
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Nutation.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Time.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Time.dex
new file mode 100644
index 0000000..65e2032
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil$Time.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil.dex
new file mode 100644
index 0000000..e6f285b
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/SolarTermUtil.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/TrunkBranchAnnals.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/TrunkBranchAnnals.dex
new file mode 100644
index 0000000..feac946
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/TrunkBranchAnnals.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekBar.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekBar.dex
new file mode 100644
index 0000000..6b03803
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekBar.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekView.dex
new file mode 100644
index 0000000..5c7c492
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$1.dex
new file mode 100644
index 0000000..6343b19
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$WeekViewPagerAdapter.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$WeekViewPagerAdapter.dex
new file mode 100644
index 0000000..0ffccb4
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager$WeekViewPagerAdapter.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager.dex
new file mode 100644
index 0000000..2084e44
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/WeekViewPager.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$1.dex
new file mode 100644
index 0000000..bd80c32
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$OnMonthSelectedListener.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$OnMonthSelectedListener.dex
new file mode 100644
index 0000000..4446a35
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView$OnMonthSelectedListener.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView.dex
new file mode 100644
index 0000000..9106e9e
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearRecyclerView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearView.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearView.dex
new file mode 100644
index 0000000..f882fc2
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearView.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter$YearViewHolder.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter$YearViewHolder.dex
new file mode 100644
index 0000000..edcfdcc
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter$YearViewHolder.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter.dex
new file mode 100644
index 0000000..ee53d0e
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewAdapter.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager$1.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager$1.dex
new file mode 100644
index 0000000..23d47f9
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager$1.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager.dex b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager.dex
new file mode 100644
index 0000000..8f105aa
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/haibin/calendarview/YearViewPager.dex differ
diff --git a/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/calendarview/build/.transforms/9f0b11dd2c4fa3c01f37c8a313121592/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin differ
diff --git a/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..b9e8032
--- /dev/null
+++ b/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..0079b66
--- /dev/null
+++ b/calendarview/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.haibin.calendarview",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..b9e8032
--- /dev/null
+++ b/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json b/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..e9425fc
--- /dev/null
+++ b/calendarview/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.haibin.calendarview",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/calendarview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/calendarview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/calendarview/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/calendarview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties b/calendarview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/calendarview/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/calendarview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/calendarview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/calendarview/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/calendarview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/calendarview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/calendarview/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/calendarview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/calendarview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 0000000..e5c4dfc
Binary files /dev/null and b/calendarview/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/calendarview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/calendarview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar
new file mode 100644
index 0000000..e5c4dfc
Binary files /dev/null and b/calendarview/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ
diff --git a/calendarview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/calendarview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 0000000..c1a13e4
Binary files /dev/null and b/calendarview/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/calendarview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/calendarview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar
new file mode 100644
index 0000000..c1a13e4
Binary files /dev/null and b/calendarview/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ
diff --git a/calendarview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/calendarview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 0000000..0dca25b
--- /dev/null
+++ b/calendarview/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
@@ -0,0 +1,191 @@
+int array branch_integer_array 0x0
+int array branch_string_array 0x0
+int array lunar_first_of_month 0x0
+int array lunar_str 0x0
+int array month_string_array 0x0
+int array solar_festival 0x0
+int array solar_term 0x0
+int array special_festivals 0x0
+int array tradition_festival 0x0
+int array trunk_integer_array 0x0
+int array trunk_string_array 0x0
+int array week_string_array 0x0
+int array year_view_week_string_array 0x0
+int attr calendar_content_view_id 0x0
+int attr calendar_height 0x0
+int attr calendar_match_parent 0x0
+int attr calendar_padding 0x0
+int attr calendar_padding_left 0x0
+int attr calendar_padding_right 0x0
+int attr calendar_show_mode 0x0
+int attr current_day_lunar_text_color 0x0
+int attr current_day_text_color 0x0
+int attr current_month_lunar_text_color 0x0
+int attr current_month_text_color 0x0
+int attr day_text_size 0x0
+int attr default_status 0x0
+int attr gesture_mode 0x0
+int attr lunar_text_size 0x0
+int attr max_multi_select_size 0x0
+int attr max_select_range 0x0
+int attr max_year 0x0
+int attr max_year_day 0x0
+int attr max_year_month 0x0
+int attr min_select_range 0x0
+int attr min_year 0x0
+int attr min_year_day 0x0
+int attr min_year_month 0x0
+int attr month_view 0x0
+int attr month_view_auto_select_day 0x0
+int attr month_view_scrollable 0x0
+int attr month_view_show_mode 0x0
+int attr other_month_lunar_text_color 0x0
+int attr other_month_text_color 0x0
+int attr scheme_lunar_text_color 0x0
+int attr scheme_month_text_color 0x0
+int attr scheme_text 0x0
+int attr scheme_text_color 0x0
+int attr scheme_theme_color 0x0
+int attr select_mode 0x0
+int attr selected_lunar_text_color 0x0
+int attr selected_text_color 0x0
+int attr selected_theme_color 0x0
+int attr week_background 0x0
+int attr week_bar_height 0x0
+int attr week_bar_view 0x0
+int attr week_line_background 0x0
+int attr week_line_margin 0x0
+int attr week_start_with 0x0
+int attr week_text_color 0x0
+int attr week_text_size 0x0
+int attr week_view 0x0
+int attr week_view_scrollable 0x0
+int attr year_view 0x0
+int attr year_view_background 0x0
+int attr year_view_current_day_text_color 0x0
+int attr year_view_day_text_color 0x0
+int attr year_view_day_text_size 0x0
+int attr year_view_month_height 0x0
+int attr year_view_month_padding_bottom 0x0
+int attr year_view_month_padding_left 0x0
+int attr year_view_month_padding_right 0x0
+int attr year_view_month_padding_top 0x0
+int attr year_view_month_text_color 0x0
+int attr year_view_month_text_size 0x0
+int attr year_view_padding 0x0
+int attr year_view_padding_left 0x0
+int attr year_view_padding_right 0x0
+int attr year_view_scheme_color 0x0
+int attr year_view_scrollable 0x0
+int attr year_view_select_text_color 0x0
+int attr year_view_week_height 0x0
+int attr year_view_week_text_color 0x0
+int attr year_view_week_text_size 0x0
+int drawable cv_bg_material 0x0
+int id both_month_week_view 0x0
+int id default_mode 0x0
+int id disabled 0x0
+int id expand 0x0
+int id first_day_of_month 0x0
+int id frameContent 0x0
+int id last_select_day 0x0
+int id last_select_day_ignore_current 0x0
+int id line 0x0
+int id ll_week 0x0
+int id mode_all 0x0
+int id mode_fix 0x0
+int id mode_only_current 0x0
+int id mon 0x0
+int id multi_mode 0x0
+int id only_month_view 0x0
+int id only_week_view 0x0
+int id range_mode 0x0
+int id sat 0x0
+int id selectLayout 0x0
+int id shrink 0x0
+int id single_mode 0x0
+int id sun 0x0
+int id vp_month 0x0
+int id vp_week 0x0
+int layout cv_layout_calendar_view 0x0
+int layout cv_week_bar 0x0
+int string cv_app_name 0x0
+int string fri 0x0
+int string mon 0x0
+int string sat 0x0
+int string sun 0x0
+int string thu 0x0
+int string tue 0x0
+int string wed 0x0
+int[] styleable CalendarLayout { 0x0, 0x0, 0x0, 0x0 }
+int styleable CalendarLayout_calendar_content_view_id 0
+int styleable CalendarLayout_calendar_show_mode 1
+int styleable CalendarLayout_default_status 2
+int styleable CalendarLayout_gesture_mode 3
+int[] styleable CalendarView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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 CalendarView_calendar_height 0
+int styleable CalendarView_calendar_match_parent 1
+int styleable CalendarView_calendar_padding 2
+int styleable CalendarView_calendar_padding_left 3
+int styleable CalendarView_calendar_padding_right 4
+int styleable CalendarView_current_day_lunar_text_color 5
+int styleable CalendarView_current_day_text_color 6
+int styleable CalendarView_current_month_lunar_text_color 7
+int styleable CalendarView_current_month_text_color 8
+int styleable CalendarView_day_text_size 9
+int styleable CalendarView_lunar_text_size 10
+int styleable CalendarView_max_multi_select_size 11
+int styleable CalendarView_max_select_range 12
+int styleable CalendarView_max_year 13
+int styleable CalendarView_max_year_day 14
+int styleable CalendarView_max_year_month 15
+int styleable CalendarView_min_select_range 16
+int styleable CalendarView_min_year 17
+int styleable CalendarView_min_year_day 18
+int styleable CalendarView_min_year_month 19
+int styleable CalendarView_month_view 20
+int styleable CalendarView_month_view_auto_select_day 21
+int styleable CalendarView_month_view_scrollable 22
+int styleable CalendarView_month_view_show_mode 23
+int styleable CalendarView_other_month_lunar_text_color 24
+int styleable CalendarView_other_month_text_color 25
+int styleable CalendarView_scheme_lunar_text_color 26
+int styleable CalendarView_scheme_month_text_color 27
+int styleable CalendarView_scheme_text 28
+int styleable CalendarView_scheme_text_color 29
+int styleable CalendarView_scheme_theme_color 30
+int styleable CalendarView_select_mode 31
+int styleable CalendarView_selected_lunar_text_color 32
+int styleable CalendarView_selected_text_color 33
+int styleable CalendarView_selected_theme_color 34
+int styleable CalendarView_week_background 35
+int styleable CalendarView_week_bar_height 36
+int styleable CalendarView_week_bar_view 37
+int styleable CalendarView_week_line_background 38
+int styleable CalendarView_week_line_margin 39
+int styleable CalendarView_week_start_with 40
+int styleable CalendarView_week_text_color 41
+int styleable CalendarView_week_text_size 42
+int styleable CalendarView_week_view 43
+int styleable CalendarView_week_view_scrollable 44
+int styleable CalendarView_year_view 45
+int styleable CalendarView_year_view_background 46
+int styleable CalendarView_year_view_current_day_text_color 47
+int styleable CalendarView_year_view_day_text_color 48
+int styleable CalendarView_year_view_day_text_size 49
+int styleable CalendarView_year_view_month_height 50
+int styleable CalendarView_year_view_month_padding_bottom 51
+int styleable CalendarView_year_view_month_padding_left 52
+int styleable CalendarView_year_view_month_padding_right 53
+int styleable CalendarView_year_view_month_padding_top 54
+int styleable CalendarView_year_view_month_text_color 55
+int styleable CalendarView_year_view_month_text_size 56
+int styleable CalendarView_year_view_padding 57
+int styleable CalendarView_year_view_padding_left 58
+int styleable CalendarView_year_view_padding_right 59
+int styleable CalendarView_year_view_scheme_color 60
+int styleable CalendarView_year_view_scrollable 61
+int styleable CalendarView_year_view_select_text_color 62
+int styleable CalendarView_year_view_week_height 63
+int styleable CalendarView_year_view_week_text_color 64
+int styleable CalendarView_year_view_week_text_size 65
diff --git a/calendarview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/calendarview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
new file mode 100644
index 0000000..0dca25b
--- /dev/null
+++ b/calendarview/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
@@ -0,0 +1,191 @@
+int array branch_integer_array 0x0
+int array branch_string_array 0x0
+int array lunar_first_of_month 0x0
+int array lunar_str 0x0
+int array month_string_array 0x0
+int array solar_festival 0x0
+int array solar_term 0x0
+int array special_festivals 0x0
+int array tradition_festival 0x0
+int array trunk_integer_array 0x0
+int array trunk_string_array 0x0
+int array week_string_array 0x0
+int array year_view_week_string_array 0x0
+int attr calendar_content_view_id 0x0
+int attr calendar_height 0x0
+int attr calendar_match_parent 0x0
+int attr calendar_padding 0x0
+int attr calendar_padding_left 0x0
+int attr calendar_padding_right 0x0
+int attr calendar_show_mode 0x0
+int attr current_day_lunar_text_color 0x0
+int attr current_day_text_color 0x0
+int attr current_month_lunar_text_color 0x0
+int attr current_month_text_color 0x0
+int attr day_text_size 0x0
+int attr default_status 0x0
+int attr gesture_mode 0x0
+int attr lunar_text_size 0x0
+int attr max_multi_select_size 0x0
+int attr max_select_range 0x0
+int attr max_year 0x0
+int attr max_year_day 0x0
+int attr max_year_month 0x0
+int attr min_select_range 0x0
+int attr min_year 0x0
+int attr min_year_day 0x0
+int attr min_year_month 0x0
+int attr month_view 0x0
+int attr month_view_auto_select_day 0x0
+int attr month_view_scrollable 0x0
+int attr month_view_show_mode 0x0
+int attr other_month_lunar_text_color 0x0
+int attr other_month_text_color 0x0
+int attr scheme_lunar_text_color 0x0
+int attr scheme_month_text_color 0x0
+int attr scheme_text 0x0
+int attr scheme_text_color 0x0
+int attr scheme_theme_color 0x0
+int attr select_mode 0x0
+int attr selected_lunar_text_color 0x0
+int attr selected_text_color 0x0
+int attr selected_theme_color 0x0
+int attr week_background 0x0
+int attr week_bar_height 0x0
+int attr week_bar_view 0x0
+int attr week_line_background 0x0
+int attr week_line_margin 0x0
+int attr week_start_with 0x0
+int attr week_text_color 0x0
+int attr week_text_size 0x0
+int attr week_view 0x0
+int attr week_view_scrollable 0x0
+int attr year_view 0x0
+int attr year_view_background 0x0
+int attr year_view_current_day_text_color 0x0
+int attr year_view_day_text_color 0x0
+int attr year_view_day_text_size 0x0
+int attr year_view_month_height 0x0
+int attr year_view_month_padding_bottom 0x0
+int attr year_view_month_padding_left 0x0
+int attr year_view_month_padding_right 0x0
+int attr year_view_month_padding_top 0x0
+int attr year_view_month_text_color 0x0
+int attr year_view_month_text_size 0x0
+int attr year_view_padding 0x0
+int attr year_view_padding_left 0x0
+int attr year_view_padding_right 0x0
+int attr year_view_scheme_color 0x0
+int attr year_view_scrollable 0x0
+int attr year_view_select_text_color 0x0
+int attr year_view_week_height 0x0
+int attr year_view_week_text_color 0x0
+int attr year_view_week_text_size 0x0
+int drawable cv_bg_material 0x0
+int id both_month_week_view 0x0
+int id default_mode 0x0
+int id disabled 0x0
+int id expand 0x0
+int id first_day_of_month 0x0
+int id frameContent 0x0
+int id last_select_day 0x0
+int id last_select_day_ignore_current 0x0
+int id line 0x0
+int id ll_week 0x0
+int id mode_all 0x0
+int id mode_fix 0x0
+int id mode_only_current 0x0
+int id mon 0x0
+int id multi_mode 0x0
+int id only_month_view 0x0
+int id only_week_view 0x0
+int id range_mode 0x0
+int id sat 0x0
+int id selectLayout 0x0
+int id shrink 0x0
+int id single_mode 0x0
+int id sun 0x0
+int id vp_month 0x0
+int id vp_week 0x0
+int layout cv_layout_calendar_view 0x0
+int layout cv_week_bar 0x0
+int string cv_app_name 0x0
+int string fri 0x0
+int string mon 0x0
+int string sat 0x0
+int string sun 0x0
+int string thu 0x0
+int string tue 0x0
+int string wed 0x0
+int[] styleable CalendarLayout { 0x0, 0x0, 0x0, 0x0 }
+int styleable CalendarLayout_calendar_content_view_id 0
+int styleable CalendarLayout_calendar_show_mode 1
+int styleable CalendarLayout_default_status 2
+int styleable CalendarLayout_gesture_mode 3
+int[] styleable CalendarView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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 CalendarView_calendar_height 0
+int styleable CalendarView_calendar_match_parent 1
+int styleable CalendarView_calendar_padding 2
+int styleable CalendarView_calendar_padding_left 3
+int styleable CalendarView_calendar_padding_right 4
+int styleable CalendarView_current_day_lunar_text_color 5
+int styleable CalendarView_current_day_text_color 6
+int styleable CalendarView_current_month_lunar_text_color 7
+int styleable CalendarView_current_month_text_color 8
+int styleable CalendarView_day_text_size 9
+int styleable CalendarView_lunar_text_size 10
+int styleable CalendarView_max_multi_select_size 11
+int styleable CalendarView_max_select_range 12
+int styleable CalendarView_max_year 13
+int styleable CalendarView_max_year_day 14
+int styleable CalendarView_max_year_month 15
+int styleable CalendarView_min_select_range 16
+int styleable CalendarView_min_year 17
+int styleable CalendarView_min_year_day 18
+int styleable CalendarView_min_year_month 19
+int styleable CalendarView_month_view 20
+int styleable CalendarView_month_view_auto_select_day 21
+int styleable CalendarView_month_view_scrollable 22
+int styleable CalendarView_month_view_show_mode 23
+int styleable CalendarView_other_month_lunar_text_color 24
+int styleable CalendarView_other_month_text_color 25
+int styleable CalendarView_scheme_lunar_text_color 26
+int styleable CalendarView_scheme_month_text_color 27
+int styleable CalendarView_scheme_text 28
+int styleable CalendarView_scheme_text_color 29
+int styleable CalendarView_scheme_theme_color 30
+int styleable CalendarView_select_mode 31
+int styleable CalendarView_selected_lunar_text_color 32
+int styleable CalendarView_selected_text_color 33
+int styleable CalendarView_selected_theme_color 34
+int styleable CalendarView_week_background 35
+int styleable CalendarView_week_bar_height 36
+int styleable CalendarView_week_bar_view 37
+int styleable CalendarView_week_line_background 38
+int styleable CalendarView_week_line_margin 39
+int styleable CalendarView_week_start_with 40
+int styleable CalendarView_week_text_color 41
+int styleable CalendarView_week_text_size 42
+int styleable CalendarView_week_view 43
+int styleable CalendarView_week_view_scrollable 44
+int styleable CalendarView_year_view 45
+int styleable CalendarView_year_view_background 46
+int styleable CalendarView_year_view_current_day_text_color 47
+int styleable CalendarView_year_view_day_text_color 48
+int styleable CalendarView_year_view_day_text_size 49
+int styleable CalendarView_year_view_month_height 50
+int styleable CalendarView_year_view_month_padding_bottom 51
+int styleable CalendarView_year_view_month_padding_left 52
+int styleable CalendarView_year_view_month_padding_right 53
+int styleable CalendarView_year_view_month_padding_top 54
+int styleable CalendarView_year_view_month_text_color 55
+int styleable CalendarView_year_view_month_text_size 56
+int styleable CalendarView_year_view_padding 57
+int styleable CalendarView_year_view_padding_left 58
+int styleable CalendarView_year_view_padding_right 59
+int styleable CalendarView_year_view_scheme_color 60
+int styleable CalendarView_year_view_scrollable 61
+int styleable CalendarView_year_view_select_text_color 62
+int styleable CalendarView_year_view_week_height 63
+int styleable CalendarView_year_view_week_text_color 64
+int styleable CalendarView_year_view_week_text_size 65
diff --git a/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-v21_cv_bg_material.xml.flat b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-v21_cv_bg_material.xml.flat
new file mode 100644
index 0000000..9c2f100
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-v21_cv_bg_material.xml.flat differ
diff --git a/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_layout_calendar_view.xml.flat b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_layout_calendar_view.xml.flat
new file mode 100644
index 0000000..59cdc0e
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_layout_calendar_view.xml.flat differ
diff --git a/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_week_bar.xml.flat b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_week_bar.xml.flat
new file mode 100644
index 0000000..f208524
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_cv_week_bar.xml.flat differ
diff --git a/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/drawable-v21_cv_bg_material.xml.flat b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/drawable-v21_cv_bg_material.xml.flat
new file mode 100644
index 0000000..a27a37f
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/drawable-v21_cv_bg_material.xml.flat differ
diff --git a/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_layout_calendar_view.xml.flat b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_layout_calendar_view.xml.flat
new file mode 100644
index 0000000..417ab35
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_layout_calendar_view.xml.flat differ
diff --git a/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_week_bar.xml.flat b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_week_bar.xml.flat
new file mode 100644
index 0000000..5b1445a
Binary files /dev/null and b/calendarview/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/layout_cv_week_bar.xml.flat differ
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/calendarview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000..6c8172e
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1,4 @@
+#Sat Sep 21 19:38:38 CST 2024
+com.haibin.calendarview-main-6\:/drawable-v21/cv_bg_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-v21\\cv_bg_material.xml
+com.haibin.calendarview-main-6\:/layout/cv_layout_calendar_view.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\cv_layout_calendar_view.xml
+com.haibin.calendarview-main-6\:/layout/cv_week_bar.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\cv_week_bar.xml
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml
new file mode 100644
index 0000000..9c8cc92
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml
@@ -0,0 +1,194 @@
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0504青年節
+ - 0701香港回歸
+ - 0801建军节
+ - 0910教師節
+ - 1001國慶日
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+
+ - 母親節
+ - 父親節
+ - 感恩節
+
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ CalendarView
+ 五
+ 一
+ 六
+ 日
+ 四
+ 二
+ 三
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml
new file mode 100644
index 0000000..705dbed
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml
@@ -0,0 +1,197 @@
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0903軍人節
+ - 0928教師節
+ - 0501勞動節
+ - 0504青年節
+ - 0601兒童節
+ - 0701建黨節
+ - 0801建軍節
+ - 0928教師節
+ - 1001國慶節
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+
+ - 母親節
+ - 父親節
+ - 感恩節
+
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ CalendarView
+ 五
+ 一
+ 六
+ 日
+ 四
+ 二
+ 三
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh/values-zh.xml b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh/values-zh.xml
new file mode 100644
index 0000000..1fa58e4
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values-zh/values-zh.xml
@@ -0,0 +1,203 @@
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
+ - 春节
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 腊月
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+ - 0101元旦
+ - 0214情人节
+ - 0308妇女节
+ - 0312植树节
+ - 0315消权日
+ - 0401愚人节
+ - 0422地球日
+ - 0501劳动节
+ - 0504青年节
+ - 0601儿童节
+ - 0701建党节
+ - 0801建军节
+ - 0910教师节
+ - 1001国庆节
+ - 1031万圣节
+ - 1111光棍节
+ - 1224平安夜
+ - 1225圣诞节
+
+
+ - 春分
+ - 清明
+ - 谷雨
+ - 立夏
+ - 小满
+ - 芒种
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 处暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 惊蛰
+
+
+ - 母亲节
+ - 父亲节
+ - 感恩节
+
+
+ - 除夕
+ - 0101春节
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重阳
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ CalendarView
+ 五
+ 一
+ 六
+ 日
+ 四
+ 二
+ 三
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..7e3178c
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
@@ -0,0 +1,340 @@
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
+ - 春节
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 腊月
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+ - JAN
+ - FEB
+ - MAR
+ - APR
+ - MAY
+ - JUN
+ - JUL
+ - AUG
+ - SEP
+ - OCT
+ - NOV
+ - DEC
+
+
+ - 0101元旦
+ - 0214情人节
+ - 0308妇女节
+ - 0312植树节
+ - 0315消权日
+ - 0401愚人节
+ - 0422地球日
+ - 0501劳动节
+ - 0504青年节
+ - 0601儿童节
+ - 0701建党节
+ - 0801建军节
+ - 0910教师节
+ - 1001国庆节
+ - 1031万圣节
+ - 1111光棍节
+ - 1224平安夜
+ - 1225圣诞节
+
+
+ - 春分
+ - 清明
+ - 谷雨
+ - 立夏
+ - 小满
+ - 芒种
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 处暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 惊蛰
+
+
+ - 母亲节
+ - 父亲节
+ - 感恩节
+
+
+ - 除夕
+ - 0101春节
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重阳
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+
+
+ - S
+ - M
+ - T
+ - W
+ - T
+ - F
+ - S
+
+ CalendarView
+ Fri
+ Mon
+ Sat
+ Sun
+ Thu
+ Tue
+ Wed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 0000000..15430e6
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,975 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CalendarView
+ - 春节
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 腊月
+
+ - 除夕
+ - 0101春节
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重阳
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+ - 0101元旦
+ - 0214情人节
+ - 0308妇女节
+ - 0312植树节
+ - 0315消权日
+ - 0401愚人节
+ - 0422地球日
+ - 0501劳动节
+ - 0504青年节
+ - 0601儿童节
+ - 0701建党节
+ - 0801建军节
+ - 0910教师节
+ - 1001国庆节
+ - 1031万圣节
+ - 1111光棍节
+ - 1224平安夜
+ - 1225圣诞节
+
+ - 春分
+ - 清明
+ - 谷雨
+ - 立夏
+ - 小满
+ - 芒种
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 处暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 惊蛰
+
+ - 母亲节
+ - 父亲节
+ - 感恩节
+ Sun Mon Tue Wed Thu Fri Sat
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+
+ - S
+ - M
+ - T
+ - W
+ - T
+ - F
+ - S
+
+ - JAN
+ - FEB
+ - MAR
+ - APR
+ - MAY
+ - JUN
+ - JUL
+ - AUG
+ - SEP
+ - OCT
+ - NOV
+ - DEC
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+ CalendarView
+ - 春节
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 腊月
+
+ - 除夕
+ - 0101春节
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重阳
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+ - 0101元旦
+ - 0214情人节
+ - 0308妇女节
+ - 0312植树节
+ - 0315消权日
+ - 0401愚人节
+ - 0422地球日
+ - 0501劳动节
+ - 0504青年节
+ - 0601儿童节
+ - 0701建党节
+ - 0801建军节
+ - 0910教师节
+ - 1001国庆节
+ - 1031万圣节
+ - 1111光棍节
+ - 1224平安夜
+ - 1225圣诞节
+
+ - 春分
+ - 清明
+ - 谷雨
+ - 立夏
+ - 小满
+ - 芒种
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 处暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 惊蛰
+
+ - 母亲节
+ - 父亲节
+ - 感恩节
+ 日 一 二 三 四 五 六
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+ CalendarView
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0504青年節
+ - 0701香港回歸
+ - 0801建军节
+ - 0910教師節
+ - 1001國慶日
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+ - 母親節
+ - 父親節
+ - 感恩節
+ 日 一 二 三 四 五 六
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+ CalendarView
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0903軍人節
+ - 0928教師節
+ - 0501勞動節
+ - 0504青年節
+ - 0601兒童節
+ - 0701建黨節
+ - 0801建軍節
+ - 0928教師節
+ - 1001國慶節
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+ - 母親節
+ - 父親節
+ - 感恩節
+ 日 一 二 三 四 五 六
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/calendarview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000..b957a92
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/mergeDebugShaders/merger.xml b/calendarview/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000..973bc14
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/calendarview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
new file mode 100644
index 0000000..582283b
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/calendarview/build/intermediates/incremental/mergeReleaseShaders/merger.xml
new file mode 100644
index 0000000..38338ea
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/mergeReleaseShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/packageDebugAssets/merger.xml b/calendarview/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000..743821a
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/packageReleaseAssets/merger.xml b/calendarview/build/intermediates/incremental/packageReleaseAssets/merger.xml
new file mode 100644
index 0000000..3882507
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/packageReleaseAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties b/calendarview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..b52649a
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
@@ -0,0 +1,4 @@
+#Sat Sep 21 19:38:48 CST 2024
+com.haibin.calendarview-main-5\:/drawable-v21/cv_bg_material.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\release\\packageReleaseResources\\drawable-v21\\cv_bg_material.xml
+com.haibin.calendarview-main-5\:/layout/cv_layout_calendar_view.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\release\\packageReleaseResources\\layout\\cv_layout_calendar_view.xml
+com.haibin.calendarview-main-5\:/layout/cv_week_bar.xml=C\:\\Users\\admin\\AndroidStudioProjects\\ZHDCOA\\calendarview\\build\\intermediates\\packaged_res\\release\\packageReleaseResources\\layout\\cv_week_bar.xml
diff --git a/calendarview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml b/calendarview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml
new file mode 100644
index 0000000..9c8cc92
--- /dev/null
+++ b/calendarview/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml
@@ -0,0 +1,194 @@
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0504青年節
+ - 0701香港回歸
+ - 0801建军节
+ - 0910教師節
+ - 1001國慶日
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+
+ - 母親節
+ - 父親節
+ - 感恩節
+
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ CalendarView
+ 五
+ 一
+ 六
+ 日
+ 四
+ 二
+ 三
+
\ No newline at end of file
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$3.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$3.class
new file mode 100644
index 0000000..98edfd9
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$3.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$4.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$4.class
new file mode 100644
index 0000000..ff47e4b
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$4.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$5.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$5.class
new file mode 100644
index 0000000..60ce470
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$5.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$6.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$6.class
new file mode 100644
index 0000000..07e2562
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$6.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$1.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$1.class
new file mode 100644
index 0000000..0f92346
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$1.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$2.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$2.class
new file mode 100644
index 0000000..c01b533
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7$2.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7.class
new file mode 100644
index 0000000..66b51b5
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$7.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$8.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$8.class
new file mode 100644
index 0000000..2bc36c7
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$8.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$9.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$9.class
new file mode 100644
index 0000000..33c9880
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$9.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$CalendarScrollView.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$CalendarScrollView.class
new file mode 100644
index 0000000..0cbdbbd
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout$CalendarScrollView.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout.class
new file mode 100644
index 0000000..dd5cf34
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarLayout.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarUtil.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarUtil.class
new file mode 100644
index 0000000..43e7849
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarUtil.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$1.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$1.class
new file mode 100644
index 0000000..b4b4f19
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$1.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$2.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$2.class
new file mode 100644
index 0000000..5985925
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$2.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$3.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$3.class
new file mode 100644
index 0000000..a534524
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$3.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$4.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$4.class
new file mode 100644
index 0000000..30d85f8
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$4.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$5.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$5.class
new file mode 100644
index 0000000..1c97924
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$5.class differ
diff --git a/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$6.class b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$6.class
new file mode 100644
index 0000000..b061b37
Binary files /dev/null and b/calendarview/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/haibin/calendarview/CalendarView$6.class differ
diff --git a/calendarview/src/main/AndroidManifest.xml b/calendarview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..972c3a8
--- /dev/null
+++ b/calendarview/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/BaseMonthView.java
new file mode 100644
index 0000000..711d2f5
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/BaseMonthView.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+
+/**
+ * 月视图基础控件,可自由继承实现
+ * 可通过此扩展各种视图如:MonthView、RangeMonthView、MultiMonthView
+ */
+public abstract class BaseMonthView extends BaseView {
+
+ MonthViewPager mMonthViewPager;
+
+ /**
+ * 当前日历卡年份
+ */
+ protected int mYear;
+
+ /**
+ * 当前日历卡月份
+ */
+ protected int mMonth;
+
+
+ /**
+ * 日历的行数
+ */
+ protected int mLineCount;
+
+ /**
+ * 日历高度
+ */
+ protected int mHeight;
+
+
+ /**
+ * 下个月偏移的数量
+ */
+ protected int mNextDiff;
+
+
+ public BaseMonthView(Context context) {
+ super(context);
+ }
+
+ /**
+ * 初始化日期
+ *
+ * @param year year
+ * @param month month
+ */
+ final void initMonthWithDate(int year, int month) {
+ mYear = year;
+ mMonth = month;
+ initCalendar();
+ mHeight = CalendarUtil.getMonthViewHeight(year, month, mItemHeight, mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+
+ }
+
+ /**
+ * 初始化日历
+ */
+ @SuppressLint("WrongConstant")
+ private void initCalendar() {
+
+ mNextDiff = CalendarUtil.getMonthEndDiff(mYear, mMonth, mDelegate.getWeekStart());
+ int preDiff = CalendarUtil.getMonthViewStartDiff(mYear, mMonth, mDelegate.getWeekStart());
+ int monthDayCount = CalendarUtil.getMonthDaysCount(mYear, mMonth);
+
+ mItems = CalendarUtil.initCalendarForMonthView(mYear, mMonth, mDelegate.getCurrentDay(), mDelegate.getWeekStart());
+
+ if (mItems.contains(mDelegate.getCurrentDay())) {
+ mCurrentItem = mItems.indexOf(mDelegate.getCurrentDay());
+ } else {
+ mCurrentItem = mItems.indexOf(mDelegate.mSelectedCalendar);
+ }
+
+ if (mCurrentItem > 0 &&
+ mDelegate.mCalendarInterceptListener != null &&
+ mDelegate.mCalendarInterceptListener.onCalendarIntercept(mDelegate.mSelectedCalendar)) {
+ mCurrentItem = -1;
+ }
+
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {
+ mLineCount = 6;
+ } else {
+ mLineCount = (preDiff + monthDayCount + mNextDiff) / 7;
+ }
+ addSchemesFromMap();
+ invalidate();
+ }
+
+ /**
+ * 获取点击选中的日期
+ *
+ * @return return
+ */
+ protected Calendar getIndex() {
+ if (mItemWidth == 0 || mItemHeight == 0) {
+ return null;
+ }
+ if (mX <= mDelegate.getCalendarPaddingLeft() || mX >= getWidth() - mDelegate.getCalendarPaddingRight()) {
+ onClickCalendarPadding();
+ return null;
+ }
+ int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth;
+ if (indexX >= 7) {
+ indexX = 6;
+ }
+ int indexY = (int) mY / mItemHeight;
+ int position = indexY * 7 + indexX;// 选择项
+ if (position >= 0 && position < mItems.size()) {
+ return mItems.get(position);
+ }
+ return null;
+ }
+
+ private void onClickCalendarPadding() {
+ if (mDelegate.mClickCalendarPaddingListener == null) {
+ return;
+ }
+ Calendar calendar = null;
+ int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth;
+ if (indexX >= 7) {
+ indexX = 6;
+ }
+ int indexY = (int) mY / mItemHeight;
+ int position = indexY * 7 + indexX;// 选择项
+ if (position >= 0 && position < mItems.size()) {
+ calendar = mItems.get(position);
+ }
+ if (calendar == null) {
+ return;
+ }
+ mDelegate.mClickCalendarPaddingListener.onClickCalendarPadding(mX, mY, true, calendar,
+ getClickCalendarPaddingObject(mX, mY, calendar));
+ }
+
+ /**
+ * 获取点击事件处的对象
+ *
+ * @param x x
+ * @param y y
+ * @param adjacentCalendar adjacent calendar
+ * @return obj can as null
+ */
+ @SuppressWarnings("unused")
+ protected Object getClickCalendarPaddingObject(float x, float y, Calendar adjacentCalendar) {
+ return null;
+ }
+
+ /**
+ * 记录已经选择的日期
+ *
+ * @param calendar calendar
+ */
+ final void setSelectedCalendar(Calendar calendar) {
+ mCurrentItem = mItems.indexOf(calendar);
+ }
+
+
+ /**
+ * 更新显示模式
+ */
+ final void updateShowMode() {
+ mLineCount = CalendarUtil.getMonthViewLineCount(mYear, mMonth,
+ mDelegate.getWeekStart(), mDelegate.getMonthViewShowMode());
+ mHeight = CalendarUtil.getMonthViewHeight(mYear, mMonth, mItemHeight, mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ invalidate();
+ }
+
+ /**
+ * 更新周起始
+ */
+ final void updateWeekStart() {
+ initCalendar();
+ mHeight = CalendarUtil.getMonthViewHeight(mYear, mMonth, mItemHeight, mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ }
+
+ @Override
+ void updateItemHeight() {
+ super.updateItemHeight();
+ mHeight = CalendarUtil.getMonthViewHeight(mYear, mMonth, mItemHeight, mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ }
+
+
+ @Override
+ void updateCurrentDate() {
+ if (mItems == null)
+ return;
+ if (mItems.contains(mDelegate.getCurrentDay())) {
+ for (Calendar a : mItems) {//添加操作
+ a.setCurrentDay(false);
+ }
+ int index = mItems.indexOf(mDelegate.getCurrentDay());
+ mItems.get(index).setCurrentDay(true);
+ }
+ invalidate();
+ }
+
+
+ /**
+ * 获取选中的下标
+ *
+ * @param calendar calendar
+ * @return 获取选中的下标
+ */
+ protected final int getSelectedIndex(Calendar calendar) {
+ return mItems.indexOf(calendar);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mLineCount != 0) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY);
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * 开始绘制前的钩子,这里做一些初始化的操作,每次绘制只调用一次,性能高效
+ * 没有需要可忽略不实现
+ * 例如:
+ * 1、需要绘制圆形标记事件背景,可以在这里计算半径
+ * 2、绘制矩形选中效果,也可以在这里计算矩形宽和高
+ */
+ protected void onPreviewHook() {
+ // TODO: 2017/11/16
+ }
+
+
+ /**
+ * 循环绘制开始的回调,不需要可忽略
+ * 绘制每个日历项的循环,用来计算baseLine、圆心坐标等都可以在这里实现
+ *
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ */
+ protected void onLoopStart(int x, int y) {
+ // TODO: 2017/11/16
+ }
+
+ @Override
+ protected void onDestroy() {
+
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseRecyclerAdapter.java b/calendarview/src/main/java/com/haibin/calendarview/BaseRecyclerAdapter.java
new file mode 100644
index 0000000..eb3902b
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/BaseRecyclerAdapter.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 基本的适配器
+ */
+abstract class BaseRecyclerAdapter extends RecyclerView.Adapter {
+
+ @SuppressWarnings("all")
+ LayoutInflater mInflater;
+ private List mItems;
+ private OnItemClickListener onItemClickListener;
+ private OnClickListener onClickListener;
+ Context mContext;
+
+ BaseRecyclerAdapter(Context context) {
+ mContext = context;
+ this.mItems = new ArrayList<>();
+ mInflater = LayoutInflater.from(context);
+ onClickListener = new OnClickListener() {
+ @Override
+ public void onClick(int position, long itemId) {
+ if (onItemClickListener != null)
+ onItemClickListener.onItemClick(position, itemId);
+ }
+ };
+
+ }
+
+ @SuppressWarnings("ConstantConditions")
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType);
+ if (holder != null) {
+ holder.itemView.setTag(holder);
+ holder.itemView.setOnClickListener(onClickListener);
+ }
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ onBindViewHolder(holder, mItems.get(position), position);
+ }
+
+ abstract RecyclerView.ViewHolder onCreateDefaultViewHolder(ViewGroup parent, int type);
+
+ abstract void onBindViewHolder(RecyclerView.ViewHolder holder, T item, int position);
+
+ @Override
+ public int getItemCount() {
+ return mItems.size();
+ }
+
+ void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+ this.onItemClickListener = onItemClickListener;
+ }
+
+ @SuppressWarnings("unused")
+ void addAll(List items) {
+ if (items != null && items.size() > 0) {
+ mItems.addAll(items);
+ notifyItemRangeInserted(mItems.size(), items.size());
+ }
+ }
+
+ final void addItem(T item) {
+ if (item != null) {
+ this.mItems.add(item);
+ notifyItemChanged(mItems.size());
+ }
+ }
+
+ @SuppressWarnings("unused")
+ final List getItems() {
+ return mItems;
+ }
+
+
+ final T getItem(int position) {
+ if (position < 0 || position >= mItems.size())
+ return null;
+ return mItems.get(position);
+ }
+
+ static abstract class OnClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag();
+ onClick(holder.getAdapterPosition(), holder.getItemId());
+ }
+
+ public abstract void onClick(int position, long itemId);
+ }
+
+
+ interface OnItemClickListener {
+ void onItemClick(int position, long itemId);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseView.java b/calendarview/src/main/java/com/haibin/calendarview/BaseView.java
new file mode 100644
index 0000000..1b9270a
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/BaseView.java
@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * 基本的日历View,派生出MonthView 和 WeekView
+ * Created by huanghaibin on 2018/1/23.
+ */
+
+public abstract class BaseView extends View implements View.OnClickListener, View.OnLongClickListener {
+
+ CalendarViewDelegate mDelegate;
+
+ /**
+ * 当前月份日期的笔
+ */
+ protected Paint mCurMonthTextPaint = new Paint();
+
+ /**
+ * 其它月份日期颜色
+ */
+ protected Paint mOtherMonthTextPaint = new Paint();
+
+ /**
+ * 当前月份农历文本颜色
+ */
+ protected Paint mCurMonthLunarTextPaint = new Paint();
+
+ /**
+ * 当前月份农历文本颜色
+ */
+ protected Paint mSelectedLunarTextPaint = new Paint();
+
+ /**
+ * 其它月份农历文本颜色
+ */
+ protected Paint mOtherMonthLunarTextPaint = new Paint();
+
+ /**
+ * 其它月份农历文本颜色
+ */
+ protected Paint mSchemeLunarTextPaint = new Paint();
+
+ /**
+ * 标记的日期背景颜色画笔
+ */
+ protected Paint mSchemePaint = new Paint();
+
+ /**
+ * 被选择的日期背景色
+ */
+ protected Paint mSelectedPaint = new Paint();
+
+ /**
+ * 标记的文本画笔
+ */
+ protected Paint mSchemeTextPaint = new Paint();
+
+ /**
+ * 选中的文本画笔
+ */
+ protected Paint mSelectTextPaint = new Paint();
+
+ /**
+ * 当前日期文本颜色画笔
+ */
+ protected Paint mCurDayTextPaint = new Paint();
+
+ /**
+ * 当前日期文本颜色画笔
+ */
+ protected Paint mCurDayLunarTextPaint = new Paint();
+
+ /**
+ * 日历布局,需要在日历下方放自己的布局
+ */
+ CalendarLayout mParentLayout;
+
+ /**
+ * 日历项
+ */
+ protected List mItems;
+
+ /**
+ * 每一项的高度
+ */
+ protected int mItemHeight;
+
+ /**
+ * 每一项的宽度
+ */
+ protected int mItemWidth;
+
+ /**
+ * Text的基线
+ */
+ protected float mTextBaseLine;
+
+ /**
+ * 点击的x、y坐标
+ */
+ protected float mX, mY;
+
+ /**
+ * 是否点击
+ */
+ boolean isClick = true;
+
+ /**
+ * 字体大小
+ */
+ static final int TEXT_SIZE = 14;
+
+ /**
+ * 当前点击项
+ */
+ int mCurrentItem = -1;
+
+ /**
+ * 周起始
+ */
+ int mWeekStartWidth;
+
+ public BaseView(Context context) {
+ this(context, null);
+ }
+
+ public BaseView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ initPaint(context);
+ }
+
+ /**
+ * 初始化配置
+ *
+ * @param context context
+ */
+ private void initPaint(Context context) {
+ mCurMonthTextPaint.setAntiAlias(true);
+ mCurMonthTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurMonthTextPaint.setColor(0xFF111111);
+ mCurMonthTextPaint.setFakeBoldText(true);
+ mCurMonthTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mOtherMonthTextPaint.setAntiAlias(true);
+ mOtherMonthTextPaint.setTextAlign(Paint.Align.CENTER);
+ mOtherMonthTextPaint.setColor(0xFFe1e1e1);
+ mOtherMonthTextPaint.setFakeBoldText(true);
+ mOtherMonthTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mCurMonthLunarTextPaint.setAntiAlias(true);
+ mCurMonthLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mSelectedLunarTextPaint.setAntiAlias(true);
+ mSelectedLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mOtherMonthLunarTextPaint.setAntiAlias(true);
+ mOtherMonthLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+
+ mSchemeLunarTextPaint.setAntiAlias(true);
+ mSchemeLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mSchemeTextPaint.setAntiAlias(true);
+ mSchemeTextPaint.setStyle(Paint.Style.FILL);
+ mSchemeTextPaint.setTextAlign(Paint.Align.CENTER);
+ mSchemeTextPaint.setColor(0xffed5353);
+ mSchemeTextPaint.setFakeBoldText(true);
+ mSchemeTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mSelectTextPaint.setAntiAlias(true);
+ mSelectTextPaint.setStyle(Paint.Style.FILL);
+ mSelectTextPaint.setTextAlign(Paint.Align.CENTER);
+ mSelectTextPaint.setColor(0xffed5353);
+ mSelectTextPaint.setFakeBoldText(true);
+ mSelectTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mSchemePaint.setAntiAlias(true);
+ mSchemePaint.setStyle(Paint.Style.FILL);
+ mSchemePaint.setStrokeWidth(2);
+ mSchemePaint.setColor(0xffefefef);
+
+ mCurDayTextPaint.setAntiAlias(true);
+ mCurDayTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurDayTextPaint.setColor(Color.RED);
+ mCurDayTextPaint.setFakeBoldText(true);
+ mCurDayTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mCurDayLunarTextPaint.setAntiAlias(true);
+ mCurDayLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurDayLunarTextPaint.setColor(Color.RED);
+ mCurDayLunarTextPaint.setFakeBoldText(true);
+ mCurDayLunarTextPaint.setTextSize(CalendarUtil.dipToPx(context, TEXT_SIZE));
+
+ mSelectedPaint.setAntiAlias(true);
+ mSelectedPaint.setStyle(Paint.Style.FILL);
+ mSelectedPaint.setStrokeWidth(2);
+
+ setOnClickListener(this);
+ setOnLongClickListener(this);
+ }
+
+ /**
+ * 初始化所有UI配置
+ *
+ * @param delegate delegate
+ */
+ final void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ mWeekStartWidth = mDelegate.getWeekStart();
+ updateStyle();
+ updateItemHeight();
+
+ initPaint();
+ }
+
+
+ final void updateStyle() {
+ if (mDelegate == null) {
+ return;
+ }
+ this.mCurDayTextPaint.setColor(mDelegate.getCurDayTextColor());
+ this.mCurDayLunarTextPaint.setColor(mDelegate.getCurDayLunarTextColor());
+ this.mCurMonthTextPaint.setColor(mDelegate.getCurrentMonthTextColor());
+ this.mOtherMonthTextPaint.setColor(mDelegate.getOtherMonthTextColor());
+ this.mCurMonthLunarTextPaint.setColor(mDelegate.getCurrentMonthLunarTextColor());
+ this.mSelectedLunarTextPaint.setColor(mDelegate.getSelectedLunarTextColor());
+ this.mSelectTextPaint.setColor(mDelegate.getSelectedTextColor());
+ this.mOtherMonthLunarTextPaint.setColor(mDelegate.getOtherMonthLunarTextColor());
+ this.mSchemeLunarTextPaint.setColor(mDelegate.getSchemeLunarTextColor());
+ this.mSchemePaint.setColor(mDelegate.getSchemeThemeColor());
+ this.mSchemeTextPaint.setColor(mDelegate.getSchemeTextColor());
+ this.mCurMonthTextPaint.setTextSize(mDelegate.getDayTextSize());
+ this.mOtherMonthTextPaint.setTextSize(mDelegate.getDayTextSize());
+ this.mCurDayTextPaint.setTextSize(mDelegate.getDayTextSize());
+ this.mSchemeTextPaint.setTextSize(mDelegate.getDayTextSize());
+ this.mSelectTextPaint.setTextSize(mDelegate.getDayTextSize());
+
+ this.mCurMonthLunarTextPaint.setTextSize(mDelegate.getLunarTextSize());
+ this.mSelectedLunarTextPaint.setTextSize(mDelegate.getLunarTextSize());
+ this.mCurDayLunarTextPaint.setTextSize(mDelegate.getLunarTextSize());
+ this.mOtherMonthLunarTextPaint.setTextSize(mDelegate.getLunarTextSize());
+ this.mSchemeLunarTextPaint.setTextSize(mDelegate.getLunarTextSize());
+
+ this.mSelectedPaint.setStyle(Paint.Style.FILL);
+ this.mSelectedPaint.setColor(mDelegate.getSelectedThemeColor());
+ }
+
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ void updateItemHeight() {
+ this.mItemHeight = mDelegate.getCalendarItemHeight();
+ Paint.FontMetrics metrics = mCurMonthTextPaint.getFontMetrics();
+ mTextBaseLine = mItemHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2;
+ }
+
+
+ /**
+ * 移除事件
+ */
+ final void removeSchemes() {
+ for (Calendar a : mItems) {
+ a.setScheme("");
+ a.setSchemeColor(0);
+ a.setSchemes(null);
+ }
+ }
+
+ /**
+ * 添加事件标记,来自Map
+ */
+ final void addSchemesFromMap() {
+ if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) {
+ return;
+ }
+ for (Calendar a : mItems) {
+ if (mDelegate.mSchemeDatesMap.containsKey(a.toString())) {
+ Calendar d = mDelegate.mSchemeDatesMap.get(a.toString());
+ if (d == null) {
+ continue;
+ }
+ a.setScheme(TextUtils.isEmpty(d.getScheme()) ? mDelegate.getSchemeText() : d.getScheme());
+ a.setSchemeColor(d.getSchemeColor());
+ a.setSchemes(d.getSchemes());
+ } else {
+ a.setScheme("");
+ a.setSchemeColor(0);
+ a.setSchemes(null);
+ }
+ }
+ }
+
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (event.getPointerCount() > 1)
+ return false;
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mX = event.getX();
+ mY = event.getY();
+ isClick = true;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ float mDY;
+ if (isClick) {
+ mDY = event.getY() - mY;
+ isClick = Math.abs(mDY) <= 50;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ mX = event.getX();
+ mY = event.getY();
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+
+
+ /**
+ * 开始绘制前的钩子,这里做一些初始化的操作,每次绘制只调用一次,性能高效
+ * 没有需要可忽略不实现
+ * 例如:
+ * 1、需要绘制圆形标记事件背景,可以在这里计算半径
+ * 2、绘制矩形选中效果,也可以在这里计算矩形宽和高
+ */
+ protected void onPreviewHook() {
+ // TODO: 2017/11/16
+ }
+
+ /**
+ * 是否是选中的
+ *
+ * @param calendar calendar
+ * @return true or false
+ */
+ protected boolean isSelected(Calendar calendar) {
+ return mItems != null && mItems.indexOf(calendar) == mCurrentItem;
+ }
+
+ /**
+ * 更新事件
+ */
+ final void update() {
+ if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) {//清空操作
+ removeSchemes();
+ invalidate();
+ return;
+ }
+ addSchemesFromMap();
+ invalidate();
+ }
+
+
+ /**
+ * 是否拦截日期,此设置续设置mCalendarInterceptListener
+ *
+ * @param calendar calendar
+ * @return 是否拦截日期
+ */
+ protected final boolean onCalendarIntercept(Calendar calendar) {
+ return mDelegate.mCalendarInterceptListener != null &&
+ mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar);
+ }
+
+ /**
+ * 是否在日期范围内
+ *
+ * @param calendar calendar
+ * @return 是否在日期范围内
+ */
+ protected final boolean isInRange(Calendar calendar) {
+ return mDelegate != null && CalendarUtil.isCalendarInRange(calendar, mDelegate);
+ }
+
+ /**
+ * 跟新当前日期
+ */
+ abstract void updateCurrentDate();
+
+ /**
+ * 销毁
+ */
+ protected abstract void onDestroy();
+
+ protected int getWeekStartWith() {
+ return mDelegate != null ? mDelegate.getWeekStart() : CalendarViewDelegate.WEEK_START_WITH_SUN;
+ }
+
+
+ protected int getCalendarPaddingLeft() {
+ return mDelegate != null ? mDelegate.getCalendarPaddingLeft() : 0;
+ }
+
+
+ protected int getCalendarPaddingRight() {
+ return mDelegate != null ? mDelegate.getCalendarPaddingRight() : 0;
+ }
+
+
+ /**
+ * 初始化画笔相关
+ */
+ protected void initPaint() {
+
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java
new file mode 100644
index 0000000..1db6622
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+
+/**
+ * 最基础周视图,因为日历UI采用热插拔实现,所以这里必须继承实现,达到UI一致即可
+ * 可通过此扩展各种视图如:WeekView、RangeWeekView
+ */
+
+public abstract class BaseWeekView extends BaseView {
+
+ public BaseWeekView(Context context) {
+ super(context);
+ }
+
+ /**
+ * 初始化周视图控件
+ *
+ * @param calendar calendar
+ */
+ final void setup(Calendar calendar) {
+ mItems = CalendarUtil.initCalendarForWeekView(calendar, mDelegate, mDelegate.getWeekStart());
+ addSchemesFromMap();
+ invalidate();
+ }
+
+
+ /**
+ * 记录已经选择的日期
+ *
+ * @param calendar calendar
+ */
+ final void setSelectedCalendar(Calendar calendar) {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_SINGLE &&
+ !calendar.equals(mDelegate.mSelectedCalendar)) {
+ return;
+ }
+ mCurrentItem = mItems.indexOf(calendar);
+ }
+
+
+ /**
+ * 周视图切换点击默认位置
+ *
+ * @param calendar calendar
+ * @param isNotice isNotice
+ */
+ final void performClickCalendar(Calendar calendar, boolean isNotice) {
+
+ if (mParentLayout == null ||
+ mDelegate.mInnerListener == null ||
+ mItems == null || mItems.size() == 0) {
+ return;
+ }
+
+ int week = CalendarUtil.getWeekViewIndexFromCalendar(calendar, mDelegate.getWeekStart());
+ if (mItems.contains(mDelegate.getCurrentDay())) {
+ week = CalendarUtil.getWeekViewIndexFromCalendar(mDelegate.getCurrentDay(), mDelegate.getWeekStart());
+ }
+
+ int curIndex = week;
+
+ Calendar currentCalendar = mItems.get(week);
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ if (mItems.contains(mDelegate.mSelectedCalendar)) {
+ currentCalendar = mDelegate.mSelectedCalendar;
+ } else {
+ mCurrentItem = -1;
+ }
+ }
+
+ if (!isInRange(currentCalendar)) {
+ curIndex = getEdgeIndex(isMinRangeEdge(currentCalendar));
+ currentCalendar = mItems.get(curIndex);
+ }
+
+
+ currentCalendar.setCurrentDay(currentCalendar.equals(mDelegate.getCurrentDay()));
+ mDelegate.mInnerListener.onWeekDateSelected(currentCalendar, false);
+ int i = CalendarUtil.getWeekFromDayInMonth(currentCalendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+
+
+ if (mDelegate.mCalendarSelectListener != null
+ && isNotice
+ && mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(currentCalendar, false);
+ }
+
+ mParentLayout.updateContentViewTranslateY();
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ mCurrentItem = curIndex;
+ }
+
+ if (!mDelegate.isShowYearSelectedLayout &&
+ mDelegate.mIndexCalendar != null &&
+ calendar.getYear() != mDelegate.mIndexCalendar.getYear() &&
+ mDelegate.mYearChangeListener != null) {
+ mDelegate.mYearChangeListener.onYearChange(mDelegate.mIndexCalendar.getYear());
+ }
+
+ mDelegate.mIndexCalendar = currentCalendar;
+ invalidate();
+ }
+
+ /**
+ * 是否是最小访问边界了
+ *
+ * @param calendar calendar
+ * @return 是否是最小访问边界了
+ */
+ final boolean isMinRangeEdge(Calendar calendar) {
+ java.util.Calendar c = java.util.Calendar.getInstance();
+ c.set(mDelegate.getMinYear(), mDelegate.getMinYearMonth() - 1, mDelegate.getMinYearDay());
+ long minTime = c.getTimeInMillis();
+ c.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay());
+ long curTime = c.getTimeInMillis();
+ return curTime < minTime;
+ }
+
+ /**
+ * 获得边界范围内下标
+ *
+ * @param isMinEdge isMinEdge
+ * @return 获得边界范围内下标
+ */
+ final int getEdgeIndex(boolean isMinEdge) {
+ for (int i = 0; i < mItems.size(); i++) {
+ Calendar item = mItems.get(i);
+ boolean isInRange = isInRange(item);
+ if (isMinEdge && isInRange) {
+ return i;
+ } else if (!isMinEdge && !isInRange) {
+ return i - 1;
+ }
+ }
+ return isMinEdge ? 6 : 0;
+ }
+
+
+ /**
+ * 获取点击的日历
+ *
+ * @return 获取点击的日历
+ */
+ protected Calendar getIndex() {
+ if (mX <= mDelegate.getCalendarPaddingLeft() || mX >= getWidth() - mDelegate.getCalendarPaddingRight()) {
+ onClickCalendarPadding();
+ return null;
+ }
+
+ int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth;
+ if (indexX >= 7) {
+ indexX = 6;
+ }
+ int indexY = (int) mY / mItemHeight;
+ int position = indexY * 7 + indexX;// 选择项
+ if (position >= 0 && position < mItems.size())
+ return mItems.get(position);
+ return null;
+ }
+
+
+ private void onClickCalendarPadding() {
+ if (mDelegate.mClickCalendarPaddingListener == null) {
+ return;
+ }
+ Calendar calendar = null;
+ int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth;
+ if (indexX >= 7) {
+ indexX = 6;
+ }
+ int indexY = (int) mY / mItemHeight;
+ int position = indexY * 7 + indexX;// 选择项
+ if (position >= 0 && position < mItems.size()) {
+ calendar = mItems.get(position);
+ }
+ if (calendar == null) {
+ return;
+ }
+ mDelegate.mClickCalendarPaddingListener.onClickCalendarPadding(mX, mY, false, calendar,
+ getClickCalendarPaddingObject(mX, mY, calendar));
+ }
+
+ /**
+ * /**
+ * 获取点击事件处的对象
+ *
+ * @param x x
+ * @param y y
+ * @param adjacentCalendar adjacent calendar
+ * @return obj can as null
+ */
+ @SuppressWarnings("unused")
+ protected Object getClickCalendarPaddingObject(float x, float y, Calendar adjacentCalendar) {
+ return null;
+ }
+
+
+ /**
+ * 更新显示模式
+ */
+ final void updateShowMode() {
+ invalidate();
+ }
+
+ /**
+ * 更新周起始
+ */
+ final void updateWeekStart() {
+
+ int position = (int) getTag();
+ Calendar calendar = CalendarUtil.getFirstCalendarStartWithMinCalendar(mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ position + 1,
+ mDelegate.getWeekStart());
+ setSelectedCalendar(mDelegate.mSelectedCalendar);
+ setup(calendar);
+ }
+
+ /**
+ * 更新当选模式
+ */
+ final void updateSingleSelect() {
+ if (!mItems.contains(mDelegate.mSelectedCalendar)) {
+ mCurrentItem = -1;
+ invalidate();
+ }
+ }
+
+ @Override
+ void updateCurrentDate() {
+ if (mItems == null)
+ return;
+ if (mItems.contains(mDelegate.getCurrentDay())) {
+ for (Calendar a : mItems) {//添加操作
+ a.setCurrentDay(false);
+ }
+ int index = mItems.indexOf(mDelegate.getCurrentDay());
+ mItems.get(index).setCurrentDay(true);
+ }
+ invalidate();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * 开始绘制前的钩子,这里做一些初始化的操作,每次绘制只调用一次,性能高效
+ * 没有需要可忽略不实现
+ * 例如:
+ * 1、需要绘制圆形标记事件背景,可以在这里计算半径
+ * 2、绘制矩形选中效果,也可以在这里计算矩形宽和高
+ */
+ protected void onPreviewHook() {
+ // TODO: 2017/11/16
+ }
+
+
+ /**
+ * 循环绘制开始的回调,不需要可忽略
+ * 绘制每个日历项的循环,用来计算baseLine、圆心坐标等都可以在这里实现
+ *
+ * @param x 日历Card x起点坐标
+ */
+ @SuppressWarnings("unused")
+ protected void onLoopStart(int x) {
+ // TODO: 2017/11/16
+ }
+
+ @Override
+ protected void onDestroy() {
+
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/Calendar.java b/calendarview/src/main/java/com/haibin/calendarview/Calendar.java
new file mode 100644
index 0000000..a71f03c
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/Calendar.java
@@ -0,0 +1,484 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.text.TextUtils;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 日历对象、
+ */
+@SuppressWarnings("all")
+public final class Calendar implements Serializable, Comparable {
+ private static final long serialVersionUID = 141315161718191143L;
+
+
+ /**
+ * 年
+ */
+ private int year;
+
+ /**
+ * 月1-12
+ */
+ private int month;
+
+ /**
+ * 如果是闰月,则返回闰月
+ */
+ private int leapMonth;
+
+ /**
+ * 日1-31
+ */
+ private int day;
+
+ /**
+ * 是否是闰年
+ */
+ private boolean isLeapYear;
+
+ /**
+ * 是否是本月,这里对应的是月视图的本月,而非当前月份,请注意
+ */
+ private boolean isCurrentMonth;
+
+ /**
+ * 是否是今天
+ */
+ private boolean isCurrentDay;
+
+ /**
+ * 农历字符串,没有特别大的意义,用来做简单的农历或者节日标记
+ * 建议通过lunarCakendar获取完整的农历日期
+ */
+ private String lunar;
+
+
+ /**
+ * 24节气
+ */
+ private String solarTerm;
+
+
+ /**
+ * 公历节日
+ */
+ private String gregorianFestival;
+
+ /**
+ * 传统农历节日
+ */
+ private String traditionFestival;
+
+ /**
+ * 计划,可以用来标记当天是否有任务,这里是默认的,如果使用多标记,请使用下面API
+ * using addScheme(int schemeColor,String scheme); multi scheme
+ */
+ private String scheme;
+
+ /**
+ * 各种自定义标记颜色、没有则选择默认颜色,如果使用多标记,请使用下面API
+ * using addScheme(int schemeColor,String scheme); multi scheme
+ */
+ private int schemeColor;
+
+
+ /**
+ * 多标记
+ * multi scheme,using addScheme();
+ */
+ private List schemes;
+
+ /**
+ * 是否是周末
+ */
+ private boolean isWeekend;
+
+ /**
+ * 星期,0-6 对应周日到周一
+ */
+ private int week;
+
+ /**
+ * 获取完整的农历日期
+ */
+ private Calendar lunarCalendar;
+
+
+ public int getYear() {
+ return year;
+ }
+
+ public void setYear(int year) {
+ this.year = year;
+ }
+
+ public int getMonth() {
+ return month;
+ }
+
+ public void setMonth(int month) {
+ this.month = month;
+ }
+
+ public int getDay() {
+ return day;
+ }
+
+ public void setDay(int day) {
+ this.day = day;
+ }
+
+ public boolean isCurrentMonth() {
+ return isCurrentMonth;
+ }
+
+
+ public void setCurrentMonth(boolean currentMonth) {
+ this.isCurrentMonth = currentMonth;
+ }
+
+ public boolean isCurrentDay() {
+ return isCurrentDay;
+ }
+
+ public void setCurrentDay(boolean currentDay) {
+ isCurrentDay = currentDay;
+ }
+
+
+ public String getLunar() {
+ return lunar;
+ }
+
+ public void setLunar(String lunar) {
+ this.lunar = lunar;
+ }
+
+
+ public String getScheme() {
+ return scheme;
+ }
+
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
+
+ public int getSchemeColor() {
+ return schemeColor;
+ }
+
+ public void setSchemeColor(int schemeColor) {
+ this.schemeColor = schemeColor;
+ }
+
+
+ public List getSchemes() {
+ return schemes;
+ }
+
+ public void setSchemes(List schemes) {
+ this.schemes = schemes;
+ }
+
+
+ public void addScheme(Scheme scheme) {
+ if (schemes == null) {
+ schemes = new ArrayList<>();
+ }
+ schemes.add(scheme);
+ }
+
+ public void addScheme(int schemeColor, String scheme) {
+ if (schemes == null) {
+ schemes = new ArrayList<>();
+ }
+ schemes.add(new Scheme(schemeColor, scheme));
+ }
+
+ public void addScheme(int type, int schemeColor, String scheme) {
+ if (schemes == null) {
+ schemes = new ArrayList<>();
+ }
+ schemes.add(new Scheme(type, schemeColor, scheme));
+ }
+
+ public void addScheme(int type, int schemeColor, String scheme, String other) {
+ if (schemes == null) {
+ schemes = new ArrayList<>();
+ }
+ schemes.add(new Scheme(type, schemeColor, scheme, other));
+ }
+
+ public void addScheme(int schemeColor, String scheme, String other) {
+ if (schemes == null) {
+ schemes = new ArrayList<>();
+ }
+ schemes.add(new Scheme(schemeColor, scheme, other));
+ }
+
+ public boolean isWeekend() {
+ return isWeekend;
+ }
+
+ public void setWeekend(boolean weekend) {
+ isWeekend = weekend;
+ }
+
+ public int getWeek() {
+ return week;
+ }
+
+ public void setWeek(int week) {
+ this.week = week;
+ }
+
+ public Calendar getLunarCalendar() {
+ return lunarCalendar;
+ }
+
+ public void setLunarCalendar(Calendar lunarCakendar) {
+ this.lunarCalendar = lunarCakendar;
+ }
+
+ public String getSolarTerm() {
+ return solarTerm;
+ }
+
+ public void setSolarTerm(String solarTerm) {
+ this.solarTerm = solarTerm;
+ }
+
+ public String getGregorianFestival() {
+ return gregorianFestival;
+ }
+
+ public void setGregorianFestival(String gregorianFestival) {
+ this.gregorianFestival = gregorianFestival;
+ }
+
+
+ public int getLeapMonth() {
+ return leapMonth;
+ }
+
+ public void setLeapMonth(int leapMonth) {
+ this.leapMonth = leapMonth;
+ }
+
+ public boolean isLeapYear() {
+ return isLeapYear;
+ }
+
+ public void setLeapYear(boolean leapYear) {
+ isLeapYear = leapYear;
+ }
+
+ public String getTraditionFestival() {
+ return traditionFestival;
+ }
+
+ public void setTraditionFestival(String traditionFestival) {
+ this.traditionFestival = traditionFestival;
+ }
+
+ public boolean hasScheme() {
+ if (schemes != null && schemes.size() != 0) {
+ return true;
+ }
+ if (!TextUtils.isEmpty(scheme)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 是否是相同月份
+ *
+ * @param calendar 日期
+ * @return 是否是相同月份
+ */
+ public boolean isSameMonth(Calendar calendar) {
+ return year == calendar.getYear() && month == calendar.getMonth();
+ }
+
+ /**
+ * 比较日期
+ *
+ * @param calendar 日期
+ * @return <0 0 >0
+ */
+ public int compareTo(Calendar calendar) {
+ if (calendar == null) {
+ return 1;
+ }
+ return toString().compareTo(calendar.toString());
+ }
+
+ /**
+ * 运算差距多少天
+ *
+ * @param calendar calendar
+ * @return 运算差距多少天
+ */
+ public final int differ(Calendar calendar) {
+ return CalendarUtil.differ(this, calendar);
+ }
+
+ /**
+ * 日期是否可用
+ *
+ * @return 日期是否可用
+ */
+ public boolean isAvailable() {
+ return year > 0 & month > 0 & day > 0 & day <=31 & month <= 12 & year >= 1900 & year <= 2099;
+ }
+
+ /**
+ * 获取当前日历对应时间戳
+ *
+ * @return getTimeInMillis
+ */
+ public long getTimeInMillis() {
+ java.util.Calendar calendar = java.util.Calendar.getInstance();
+ calendar.set(java.util.Calendar.YEAR, year);
+ calendar.set(java.util.Calendar.MONTH, month - 1);
+ calendar.set(java.util.Calendar.DAY_OF_MONTH, day);
+ return calendar.getTimeInMillis();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o != null && o instanceof Calendar) {
+ if (((Calendar) o).getYear() == year && ((Calendar) o).getMonth() == month && ((Calendar) o).getDay() == day)
+ return true;
+ }
+ return super.equals(o);
+ }
+
+ @Override
+ public String toString() {
+ return year + "" + (month < 10 ? "0" + month : month) + "" + (day < 10 ? "0" + day : day);
+ }
+
+// @Override
+// public int compare(Calendar lhs, Calendar rhs) {
+// if (lhs == null || rhs == null) {
+// return 0;
+// }
+// int result = lhs.compareTo(rhs);
+// return result;
+// }
+
+ final void mergeScheme(Calendar calendar, String defaultScheme) {
+ if (calendar == null)
+ return;
+ setScheme(TextUtils.isEmpty(calendar.getScheme()) ?
+ defaultScheme : calendar.getScheme());
+ setSchemeColor(calendar.getSchemeColor());
+ setSchemes(calendar.getSchemes());
+ }
+
+ final void clearScheme() {
+ setScheme("");
+ setSchemeColor(0);
+ setSchemes(null);
+ }
+
+ /**
+ * 事件标记服务,现在多类型的事务标记建议使用这个
+ */
+ public final static class Scheme implements Serializable {
+ private int type;
+ private int shcemeColor;
+ private String scheme;
+ private String other;
+ private Object obj;
+
+ public Scheme() {
+ }
+
+ public Scheme(int type, int shcemeColor, String scheme, String other) {
+ this.type = type;
+ this.shcemeColor = shcemeColor;
+ this.scheme = scheme;
+ this.other = other;
+ }
+
+ public Scheme(int type, int shcemeColor, String scheme) {
+ this.type = type;
+ this.shcemeColor = shcemeColor;
+ this.scheme = scheme;
+ }
+
+ public Scheme(int shcemeColor, String scheme) {
+ this.shcemeColor = shcemeColor;
+ this.scheme = scheme;
+ }
+
+ public Scheme(int shcemeColor, String scheme, String other) {
+ this.shcemeColor = shcemeColor;
+ this.scheme = scheme;
+ this.other = other;
+ }
+
+ public int getShcemeColor() {
+ return shcemeColor;
+ }
+
+ public void setShcemeColor(int shcemeColor) {
+ this.shcemeColor = shcemeColor;
+ }
+
+ public String getScheme() {
+ return scheme;
+ }
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
+ public String getOther() {
+ return other;
+ }
+
+ public void setOther(String other) {
+ this.other = other;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public Object getObj() {
+ return obj;
+ }
+
+ public void setObj(Object obj) {
+ this.obj = obj;
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java
new file mode 100644
index 0000000..8685e85
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java
@@ -0,0 +1,958 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.animation.LinearInterpolator;
+import android.widget.AbsListView;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+
+/**
+ * 日历布局
+ */
+@SuppressWarnings("unused")
+public class CalendarLayout extends LinearLayout {
+
+ /**
+ * 多点触控支持
+ */
+ private int mActivePointerId;
+
+ private static final int ACTIVE_POINTER = 1;
+
+ private static final int INVALID_POINTER = -1;
+
+ /**
+ * 周月视图
+ */
+ private static final int CALENDAR_SHOW_MODE_BOTH_MONTH_WEEK_VIEW = 0;
+
+
+ /**
+ * 仅周视图
+ */
+ private static final int CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW = 1;
+
+ /**
+ * 仅月视图
+ */
+ private static final int CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW = 2;
+
+ /**
+ * 默认展开
+ */
+ private static final int STATUS_EXPAND = 0;
+
+ /**
+ * 默认收缩
+ */
+ private static final int STATUS_SHRINK = 1;
+
+ /**
+ * 默认状态
+ */
+ private int mDefaultStatus;
+
+ private boolean isWeekView;
+
+ /**
+ * 星期栏
+ */
+ WeekBar mWeekBar;
+
+ /**
+ * 自定义ViewPager,月视图
+ */
+ MonthViewPager mMonthView;
+
+ /**
+ * 日历
+ */
+ CalendarView mCalendarView;
+
+ /**
+ * 自定义的周视图
+ */
+ WeekViewPager mWeekPager;
+
+ /**
+ * 年视图
+ */
+ YearViewPager mYearView;
+
+ /**
+ * ContentView
+ */
+ ViewGroup mContentView;
+
+ /**
+ * 默认手势
+ */
+ private static final int GESTURE_MODE_DEFAULT = 0;
+
+// /**
+ // * 仅日历有效
+ // */
+// private static final int GESTURE_MODE_ONLY_CALENDAR = 1;
+
+ /**
+ * 禁用手势
+ */
+ private static final int GESTURE_MODE_DISABLED = 2;
+
+ /**
+ * 手势模式
+ */
+ private int mGestureMode;
+
+
+ private int mCalendarShowMode;
+
+ private int mContentViewTranslateY; //ContentView 可滑动的最大距离距离 , 固定
+ private int mViewPagerTranslateY = 0;// ViewPager可以平移的距离,不代表mMonthView的平移距离
+
+ private float downY;
+ private float mLastY;
+ private float mLastX;
+ private boolean isAnimating = false;
+
+ /**
+ * 内容布局id
+ */
+ private int mContentViewId;
+
+ /**
+ * 手速判断
+ */
+ private VelocityTracker mVelocityTracker;
+ private int mMaximumVelocity;
+
+ private int mItemHeight;
+
+ private CalendarViewDelegate mDelegate;
+
+ public CalendarLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setOrientation(LinearLayout.VERTICAL);
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CalendarLayout);
+ mContentViewId = array.getResourceId(R.styleable.CalendarLayout_calendar_content_view_id, 0);
+ mDefaultStatus = array.getInt(R.styleable.CalendarLayout_default_status, STATUS_EXPAND);
+ mCalendarShowMode = array.getInt(R.styleable.CalendarLayout_calendar_show_mode, CALENDAR_SHOW_MODE_BOTH_MONTH_WEEK_VIEW);
+ mGestureMode = array.getInt(R.styleable.CalendarLayout_gesture_mode, GESTURE_MODE_DEFAULT);
+ array.recycle();
+ mVelocityTracker = VelocityTracker.obtain();
+ final ViewConfiguration configuration = ViewConfiguration.get(context);
+ int mTouchSlop = configuration.getScaledTouchSlop();
+ mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+ }
+
+ /**
+ * 初始化
+ *
+ * @param delegate delegate
+ */
+ final void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ mItemHeight = mDelegate.getCalendarItemHeight();
+ initCalendarPosition(delegate.mSelectedCalendar.isAvailable() ?
+ delegate.mSelectedCalendar :
+ delegate.createCurrentDate());
+ updateContentViewTranslateY();
+ }
+
+ /**
+ * 初始化当前时间的位置
+ *
+ * @param cur 当前日期时间
+ */
+ private void initCalendarPosition(Calendar cur) {
+ int diff = CalendarUtil.getMonthViewStartDiff(cur, mDelegate.getWeekStart());
+ int size = diff + cur.getDay() - 1;
+ updateSelectPosition(size);
+ }
+
+ /**
+ * 当前第几项被选中,更新平移量
+ *
+ * @param selectPosition 月视图被点击的position
+ */
+ final void updateSelectPosition(int selectPosition) {
+ int line = (selectPosition + 7) / 7;
+ mViewPagerTranslateY = (line - 1) * mItemHeight;
+ }
+
+ /**
+ * 设置选中的周,更新位置
+ *
+ * @param week week
+ */
+ final void updateSelectWeek(int week) {
+ mViewPagerTranslateY = (week - 1) * mItemHeight;
+ }
+
+
+ /**
+ * 更新内容ContentView可平移的最大距离
+ */
+ void updateContentViewTranslateY() {
+ Calendar calendar = mDelegate.mIndexCalendar;
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {
+ mContentViewTranslateY = 5 * mItemHeight;
+ } else {
+ mContentViewTranslateY = CalendarUtil.getMonthViewHeight(calendar.getYear(),
+ calendar.getMonth(), mItemHeight, mDelegate.getWeekStart())
+ - mItemHeight;
+ }
+ //已经显示周视图,则需要动态平移contentView的高度
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ if (mContentView == null)
+ return;
+ mContentView.setTranslationY(-mContentViewTranslateY);
+ }
+ }
+
+ /**
+ * 更新日历项高度
+ */
+ final void updateCalendarItemHeight() {
+ mItemHeight = mDelegate.getCalendarItemHeight();
+ if (mContentView == null)
+ return;
+ Calendar calendar = mDelegate.mIndexCalendar;
+ updateSelectWeek(CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart()));
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {
+ mContentViewTranslateY = 5 * mItemHeight;
+ } else {
+ mContentViewTranslateY = CalendarUtil.getMonthViewHeight(calendar.getYear(), calendar.getMonth(),
+ mItemHeight, mDelegate.getWeekStart()) - mItemHeight;
+ }
+ translationViewPager();
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ mContentView.setTranslationY(-mContentViewTranslateY);
+ }
+ }
+
+ /**
+ * 隐藏日历
+ */
+ public void hideCalendarView() {
+ if (mCalendarView == null) {
+ return;
+ }
+ mCalendarView.setVisibility(GONE);
+ if (!isExpand()) {
+ expand(0);
+ }
+ requestLayout();
+ }
+
+ /**
+ * 显示日历
+ */
+ public void showCalendarView() {
+
+ mCalendarView.setVisibility(VISIBLE);
+ requestLayout();
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (mGestureMode == GESTURE_MODE_DISABLED ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW) {//禁用手势,或者只显示某种视图
+ return false;
+ }
+ if (mDelegate == null) {
+ return false;
+ }
+ if (mDelegate.isShowYearSelectedLayout) {
+ return false;
+ }
+
+ if (mContentView == null || mCalendarView == null || mCalendarView.getVisibility() == GONE) {
+ return false;
+ }
+
+ int action = event.getAction();
+ float y = event.getY();
+ mVelocityTracker.addMovement(event);
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ int index = event.getActionIndex();
+ mActivePointerId = event.getPointerId(index);
+ mLastY = downY = y;
+ return true;
+ case MotionEvent.ACTION_POINTER_DOWN: {
+ final int indexx = event.getActionIndex();
+ mActivePointerId = event.getPointerId(indexx);
+ if (mActivePointerId == 0) {
+ //核心代码:就是让下面的 dy = y- mLastY == 0,避免抖动
+ mLastY = event.getY(mActivePointerId);
+ }
+ break;
+ }
+ case MotionEvent.ACTION_MOVE:
+
+ getPointerIndex(event, mActivePointerId);
+ if (mActivePointerId == INVALID_POINTER) {
+ //如果切换了手指,那把mLastY换到最新手指的y坐标即可,核心就是让下面的 dy== 0,避免抖动
+ mLastY = y;
+ mActivePointerId = ACTIVE_POINTER;
+ }
+ float dy = y - mLastY;
+
+ //向上滑动,并且contentView平移到最大距离,显示周视图
+ if (dy < 0 && mContentView.getTranslationY() == -mContentViewTranslateY) {
+ mLastY = y;
+ event.setAction(MotionEvent.ACTION_DOWN);
+ dispatchTouchEvent(event);
+ mWeekPager.setVisibility(VISIBLE);
+ mMonthView.setVisibility(INVISIBLE);
+ if (!isWeekView && mDelegate.mViewChangeListener != null) {
+ mDelegate.mViewChangeListener.onViewChange(false);
+ }
+ isWeekView = true;
+ return true;
+ }
+ hideWeek(false);
+
+ //向下滑动,并且contentView已经完全平移到底部
+ if (dy > 0 && mContentView.getTranslationY() + dy >= 0) {
+ mContentView.setTranslationY(0);
+ translationViewPager();
+ mLastY = y;
+ return super.onTouchEvent(event);
+ }
+
+ //向上滑动,并且contentView已经平移到最大距离,则contentView平移到最大的距离
+ if (dy < 0 && mContentView.getTranslationY() + dy <= -mContentViewTranslateY) {
+ mContentView.setTranslationY(-mContentViewTranslateY);
+ translationViewPager();
+ mLastY = y;
+ return super.onTouchEvent(event);
+ }
+ //否则按比例平移
+ mContentView.setTranslationY(mContentView.getTranslationY() + dy);
+ translationViewPager();
+ mLastY = y;
+ break;
+ case MotionEvent.ACTION_CANCEL:
+
+ case MotionEvent.ACTION_POINTER_UP:
+ int pointerIndex = getPointerIndex(event, mActivePointerId);
+ if (mActivePointerId == INVALID_POINTER)
+ break;
+ mLastY = event.getY(pointerIndex);
+ break;
+ case MotionEvent.ACTION_UP:
+
+ final VelocityTracker velocityTracker = mVelocityTracker;
+ velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+ float mYVelocity = velocityTracker.getYVelocity();
+ if (mContentView.getTranslationY() == 0
+ || mContentView.getTranslationY() == mContentViewTranslateY) {
+ expand();
+ break;
+ }
+ if (Math.abs(mYVelocity) >= 800) {
+ if (mYVelocity < 0) {
+ shrink();
+ } else {
+ expand();
+ }
+ return super.onTouchEvent(event);
+ }
+ if (event.getY() - downY > 0) {
+ expand();
+ } else {
+ shrink();
+ }
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (isAnimating) {
+ return super.dispatchTouchEvent(ev);
+ }
+ if (mGestureMode == GESTURE_MODE_DISABLED) {
+ return super.dispatchTouchEvent(ev);
+ }
+ if (mYearView == null ||
+ mCalendarView == null || mCalendarView.getVisibility() == GONE ||
+ mContentView == null ||
+ mContentView.getVisibility() != VISIBLE) {
+ return super.dispatchTouchEvent(ev);
+ }
+
+ if (mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW) {
+ return super.dispatchTouchEvent(ev);
+ }
+
+ if (mYearView.getVisibility() == VISIBLE || mDelegate.isShowYearSelectedLayout) {
+ return super.dispatchTouchEvent(ev);
+ }
+ final int action = ev.getAction();
+ float y = ev.getY();
+ if (action == MotionEvent.ACTION_MOVE) {
+ float dy = y - mLastY;
+ /*
+ * 如果向下滚动,有 2 种情况处理 且y在ViewPager下方
+ * 1、RecyclerView 或者其它滚动的View,当mContentView滚动到顶部时,拦截事件
+ * 2、非滚动控件,直接拦截事件
+ */
+ if (dy > 0 && mContentView.getTranslationY() == -mContentViewTranslateY) {
+ if (isScrollTop()) {
+ requestDisallowInterceptTouchEvent(false);//父View向子View拦截分发事件
+ return super.dispatchTouchEvent(ev);
+ }
+ }
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (isAnimating) {
+ return true;
+ }
+ if (mGestureMode == GESTURE_MODE_DISABLED) {
+ return false;
+ }
+ if (mYearView == null ||
+ mCalendarView == null || mCalendarView.getVisibility() == GONE ||
+ mContentView == null ||
+ mContentView.getVisibility() != VISIBLE) {
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ if (mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW) {
+ return false;
+ }
+
+ if (mYearView.getVisibility() == VISIBLE || mDelegate.isShowYearSelectedLayout) {
+ return super.onInterceptTouchEvent(ev);
+ }
+ final int action = ev.getAction();
+ float y = ev.getY();
+ float x = ev.getX();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ int index = ev.getActionIndex();
+ mActivePointerId = ev.getPointerId(index);
+ mLastY = downY = y;
+ mLastX = x;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ float dy = y - mLastY;
+ float dx = x - mLastX;
+ /*
+ 如果向上滚动,且ViewPager已经收缩,不拦截事件
+ */
+ if (dy < 0 && mContentView.getTranslationY() == -mContentViewTranslateY) {
+ return false;
+ }
+ /*
+ * 如果向下滚动,有 2 种情况处理 且y在ViewPager下方
+ * 1、RecyclerView 或者其它滚动的View,当mContentView滚动到顶部时,拦截事件
+ * 2、非滚动控件,直接拦截事件
+ */
+ if (dy > 0 && mContentView.getTranslationY() == -mContentViewTranslateY
+ && y >= mDelegate.getCalendarItemHeight() + mDelegate.getWeekBarHeight()) {
+ if (!isScrollTop()) {
+ return false;
+ }
+ }
+
+ if (dy > 0 && mContentView.getTranslationY() == 0 && y >= CalendarUtil.dipToPx(getContext(), 98)) {
+ return false;
+ }
+
+ if (Math.abs(dy) > Math.abs(dx) ) { //纵向滑动距离大于横向滑动距离,拦截滑动事件
+ if ((dy > 0 && mContentView.getTranslationY() <= 0)
+ || (dy < 0 && mContentView.getTranslationY() >= -mContentViewTranslateY)) {
+ mLastY = y;
+ return true;
+ }
+ }
+ break;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+
+ private int getPointerIndex(MotionEvent ev, int id) {
+ int activePointerIndex = ev.findPointerIndex(id);
+ if (activePointerIndex == -1) {
+ mActivePointerId = INVALID_POINTER;
+ }
+ return activePointerIndex;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ if (mContentView == null || mCalendarView == null) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ return;
+ }
+
+ int year = mDelegate.mIndexCalendar.getYear();
+ int month = mDelegate.mIndexCalendar.getMonth();
+ int weekBarHeight = CalendarUtil.dipToPx(getContext(), 1)
+ + mDelegate.getWeekBarHeight();
+
+ int monthHeight = CalendarUtil.getMonthViewHeight(year, month,
+ mDelegate.getCalendarItemHeight(),
+ mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode())
+ + weekBarHeight;
+
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+
+ if (mDelegate.isFullScreenCalendar()) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int heightSpec = MeasureSpec.makeMeasureSpec(height - weekBarHeight - mDelegate.getCalendarItemHeight(),
+ MeasureSpec.EXACTLY);
+ mContentView.measure(widthMeasureSpec, heightSpec);
+ mContentView.layout(mContentView.getLeft(), mContentView.getTop(), mContentView.getRight(), mContentView.getBottom());
+ return;
+ }
+
+ if (monthHeight >= height && mMonthView.getHeight() > 0) {
+ height = monthHeight;
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(monthHeight +
+ weekBarHeight +
+ mDelegate.getWeekBarHeight(), MeasureSpec.EXACTLY);
+ } else if (monthHeight < height && mMonthView.getHeight() > 0) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+ }
+
+ int h;
+ if (mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW ||
+ mCalendarView.getVisibility() == GONE) {
+ h = height - (mCalendarView.getVisibility() == GONE ? 0 : mCalendarView.getHeight());
+ } else if (mGestureMode == GESTURE_MODE_DISABLED && !isAnimating) {
+ if (isExpand()) {
+ h = height - monthHeight;
+ } else {
+ h = height - weekBarHeight - mItemHeight;
+ }
+ } else {
+ h = height - weekBarHeight - mItemHeight;
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int heightSpec = MeasureSpec.makeMeasureSpec(h,
+ MeasureSpec.EXACTLY);
+ mContentView.measure(widthMeasureSpec, heightSpec);
+ mContentView.layout(mContentView.getLeft(), mContentView.getTop(), mContentView.getRight(), mContentView.getBottom());
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mMonthView = findViewById(R.id.vp_month);
+ mWeekPager = findViewById(R.id.vp_week);
+ if (getChildCount() > 0) {
+ mCalendarView = (CalendarView) getChildAt(0);
+ }
+ mContentView = findViewById(mContentViewId);
+ mYearView = findViewById(R.id.selectLayout);
+ }
+
+
+ /**
+ * 平移ViewPager月视图
+ */
+ private void translationViewPager() {
+ float percent = mContentView.getTranslationY() * 1.0f / mContentViewTranslateY;
+ mMonthView.setTranslationY(mViewPagerTranslateY * percent);
+ }
+
+
+ public void setModeBothMonthWeekView() {
+ mCalendarShowMode = CALENDAR_SHOW_MODE_BOTH_MONTH_WEEK_VIEW;
+ requestLayout();
+ }
+
+ public void setModeOnlyWeekView() {
+ mCalendarShowMode = CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW;
+ requestLayout();
+ }
+
+ public void setModeOnlyMonthView() {
+ mCalendarShowMode = CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW;
+ requestLayout();
+ }
+
+
+ @Nullable
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ Parcelable parcelable = super.onSaveInstanceState();
+ bundle.putParcelable("super", parcelable);
+ bundle.putBoolean("isExpand", isExpand());
+ return bundle;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ Bundle bundle = (Bundle) state;
+ Parcelable superData = bundle.getParcelable("super");
+ boolean isExpand = bundle.getBoolean("isExpand");
+ if (isExpand) {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ expand(0);
+ }
+ });
+ } else {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ shrink(0);
+ }
+ });
+
+ }
+ super.onRestoreInstanceState(superData);
+ }
+
+ /**
+ * 是否展开了
+ *
+ * @return isExpand
+ */
+ public final boolean isExpand() {
+ return mMonthView.getVisibility() == VISIBLE;
+ }
+
+
+ public boolean expand() {
+ return expand(240);
+ }
+
+
+ /**
+ * 展开
+ *
+ * @param duration 时长
+ * @return 展开是否成功
+ */
+ public boolean expand(int duration) {
+ if (isAnimating ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW ||
+ mContentView == null)
+ return false;
+ if (mMonthView.getVisibility() != VISIBLE) {
+ mWeekPager.setVisibility(GONE);
+ onShowMonthView();
+ isWeekView = false;
+ mMonthView.setVisibility(VISIBLE);
+ }
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mContentView,
+ "translationY", mContentView.getTranslationY(), 0f);
+ objectAnimator.setDuration(duration);
+ objectAnimator.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float currentValue = (Float) animation.getAnimatedValue();
+ float percent = currentValue * 1.0f / mContentViewTranslateY;
+ mMonthView.setTranslationY(mViewPagerTranslateY * percent);
+ isAnimating = true;
+ }
+ });
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ isAnimating = false;
+ if (mGestureMode == GESTURE_MODE_DISABLED) {
+ requestLayout();
+ }
+ hideWeek(true);
+ if (mDelegate.mViewChangeListener != null && isWeekView) {
+ mDelegate.mViewChangeListener.onViewChange(true);
+ }
+ isWeekView = false;
+
+ }
+ });
+ objectAnimator.start();
+ return true;
+ }
+
+ public boolean shrink() {
+ return shrink(240);
+ }
+
+ /**
+ * 收缩
+ *
+ * @param duration 时长
+ * @return 成功或者失败
+ */
+ public boolean shrink(int duration) {
+ if (mGestureMode == GESTURE_MODE_DISABLED) {
+ requestLayout();
+ }
+ if (isAnimating || mContentView == null) {
+ return false;
+ }
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mContentView,
+ "translationY", mContentView.getTranslationY(), -mContentViewTranslateY);
+ objectAnimator.setDuration(duration);
+ objectAnimator.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float currentValue = (Float) animation.getAnimatedValue();
+ float percent = currentValue * 1.0f / mContentViewTranslateY;
+ mMonthView.setTranslationY(mViewPagerTranslateY * percent);
+ isAnimating = true;
+ }
+ });
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ isAnimating = false;
+ showWeek();
+ isWeekView = true;
+
+ }
+ });
+ objectAnimator.start();
+ return true;
+ }
+
+ /**
+ * 初始化状态
+ */
+ final void initStatus() {
+
+ if ((mDefaultStatus == STATUS_SHRINK ||
+ mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_WEEK_VIEW) &&
+ mCalendarShowMode != CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW) {
+ if (mContentView == null) {
+ mWeekPager.setVisibility(VISIBLE);
+ mMonthView.setVisibility(GONE);
+ return;
+ }
+ post(new Runnable() {
+ @Override
+ public void run() {
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mContentView,
+ "translationY", mContentView.getTranslationY(), -mContentViewTranslateY);
+ objectAnimator.setDuration(0);
+ objectAnimator.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float currentValue = (Float) animation.getAnimatedValue();
+ float percent = currentValue * 1.0f / mContentViewTranslateY;
+ mMonthView.setTranslationY(mViewPagerTranslateY * percent);
+ isAnimating = true;
+ }
+ });
+ objectAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ isAnimating = false;
+ isWeekView = true;
+ showWeek();
+ if (mDelegate == null || mDelegate.mViewChangeListener == null) {
+ return;
+ }
+ mDelegate.mViewChangeListener.onViewChange(false);
+
+ }
+ });
+ objectAnimator.start();
+ }
+ });
+ } else {
+ if (mDelegate.mViewChangeListener == null) {
+ return;
+ }
+ post(new Runnable() {
+ @Override
+ public void run() {
+ mDelegate.mViewChangeListener.onViewChange(true);
+ }
+ });
+ }
+ }
+
+ /**
+ * 隐藏周视图
+ */
+ private void hideWeek(boolean isNotify) {
+ if (isNotify) {
+ onShowMonthView();
+ }
+ mWeekPager.setVisibility(GONE);
+ mMonthView.setVisibility(VISIBLE);
+ }
+
+ /**
+ * 显示周视图
+ */
+ private void showWeek() {
+ onShowWeekView();
+ if (mWeekPager != null && mWeekPager.getAdapter() != null) {
+ mWeekPager.getAdapter().notifyDataSetChanged();
+ mWeekPager.setVisibility(VISIBLE);
+ }
+ mMonthView.setVisibility(INVISIBLE);
+ }
+
+ /**
+ * 周视图显示事件
+ */
+ private void onShowWeekView() {
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ return;
+ }
+ if (mDelegate != null && mDelegate.mViewChangeListener != null && !isWeekView) {
+ mDelegate.mViewChangeListener.onViewChange(false);
+ }
+ }
+
+
+ /**
+ * 周视图显示事件
+ */
+ private void onShowMonthView() {
+ if (mMonthView.getVisibility() == VISIBLE) {
+ return;
+ }
+ if (mDelegate != null && mDelegate.mViewChangeListener != null && isWeekView) {
+ mDelegate.mViewChangeListener.onViewChange(true);
+ }
+ }
+
+ /**
+ * ContentView是否滚动到顶部 如果完全不适合,就复写这个方法
+ *
+ * @return 是否滚动到顶部
+ */
+ protected boolean isScrollTop() {
+ if (mContentView instanceof CalendarScrollView) {
+ return ((CalendarScrollView) mContentView).isScrollToTop();
+ }
+ if (mContentView instanceof RecyclerView)
+ return ((RecyclerView) mContentView).computeVerticalScrollOffset() == 0;
+ if (mContentView instanceof AbsListView) {
+ boolean result = false;
+ AbsListView listView = (AbsListView) mContentView;
+ if (listView.getFirstVisiblePosition() == 0) {
+ final View topChildView = listView.getChildAt(0);
+ result = topChildView.getTop() == 0;
+ }
+ return result;
+ }
+ return mContentView.getScrollY() == 0;
+ }
+
+
+ /**
+ * 隐藏内容布局
+ */
+ @SuppressLint("NewApi")
+ final void hideContentView() {
+ if (mContentView == null)
+ return;
+ mContentView.animate()
+ .translationY(getHeight() - mMonthView.getHeight())
+ .setDuration(220)
+ .setInterpolator(new LinearInterpolator())
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ mContentView.setVisibility(INVISIBLE);
+ mContentView.clearAnimation();
+ }
+ });
+ }
+
+ /**
+ * 显示内容布局
+ */
+ @SuppressLint("NewApi")
+ final void showContentView() {
+ if (mContentView == null)
+ return;
+ mContentView.setTranslationY(getHeight() - mMonthView.getHeight());
+ mContentView.setVisibility(VISIBLE);
+ mContentView.animate()
+ .translationY(0)
+ .setDuration(180)
+ .setInterpolator(new LinearInterpolator())
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ }
+ });
+ }
+
+
+ @SuppressWarnings("unused")
+ private int getCalendarViewHeight() {
+ return mMonthView.getVisibility() == VISIBLE ? mDelegate.getWeekBarHeight() + mMonthView.getHeight() :
+ mDelegate.getWeekBarHeight() + mDelegate.getCalendarItemHeight();
+ }
+
+ /**
+ * 如果有十分特别的ContentView,可以自定义实现这个接口
+ */
+ public interface CalendarScrollView {
+ /**
+ * 是否滚动到顶部
+ *
+ * @return 是否滚动到顶部
+ */
+ boolean isScrollToTop();
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java
new file mode 100644
index 0000000..a77157c
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java
@@ -0,0 +1,815 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 一些日期辅助计算工具
+ */
+@SuppressWarnings("all")
+public final class CalendarUtil {
+
+ private static final long ONE_DAY = 1000 * 3600 * 24;
+
+ @SuppressLint("SimpleDateFormat")
+ static int getDate(String formatStr, Date date) {
+ SimpleDateFormat format = new SimpleDateFormat(formatStr);
+ return Integer.parseInt(format.format(date));
+ }
+
+ /**
+ * 判断一个日期是否是周末,即周六日
+ *
+ * @param calendar calendar
+ * @return 判断一个日期是否是周末,即周六日
+ */
+ public static boolean isWeekend(Calendar calendar) {
+ int week = getWeekFormCalendar(calendar);
+ return week == 0 || week == 6;
+ }
+
+ /**
+ * 获取某月的天数
+ *
+ * @param year 年
+ * @param month 月
+ * @return 某月的天数
+ */
+ public static int getMonthDaysCount(int year, int month) {
+ int count = 0;
+ //判断大月份
+ if (month == 1 || month == 3 || month == 5 || month == 7
+ || month == 8 || month == 10 || month == 12) {
+ count = 31;
+ }
+
+ //判断小月
+ if (month == 4 || month == 6 || month == 9 || month == 11) {
+ count = 30;
+ }
+
+ //判断平年与闰年
+ if (month == 2) {
+ if (isLeapYear(year)) {
+ count = 29;
+ } else {
+ count = 28;
+ }
+ }
+ return count;
+ }
+
+
+ /**
+ * 是否是闰年
+ *
+ * @param year year
+ * @return 是否是闰年
+ */
+ public static boolean isLeapYear(int year) {
+ return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
+ }
+
+
+ public static int getMonthViewLineCount(int year, int month, int weekStartWith, int mode) {
+ if (mode == CalendarViewDelegate.MODE_ALL_MONTH) {
+ return 6;
+ }
+ int nextDiff = CalendarUtil.getMonthEndDiff(year, month, weekStartWith);
+ int preDiff = CalendarUtil.getMonthViewStartDiff(year, month, weekStartWith);
+ int monthDayCount = CalendarUtil.getMonthDaysCount(year, month);
+ return (preDiff + monthDayCount + nextDiff) / 7;
+ }
+
+ /**
+ * 获取月视图的确切高度
+ * Test pass
+ *
+ * @param year 年
+ * @param month 月
+ * @param itemHeight 每项的高度
+ * @param weekStartWith 周起始
+ * @return 不需要多余行的高度
+ */
+ public static int getMonthViewHeight(int year, int month, int itemHeight, int weekStartWith) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, month - 1, 1, 12, 0, 0);
+ int preDiff = getMonthViewStartDiff(year, month, weekStartWith);
+ int monthDaysCount = getMonthDaysCount(year, month);
+ int nextDiff = getMonthEndDiff(year, month, monthDaysCount, weekStartWith);
+ return (preDiff + monthDaysCount + nextDiff) / 7 * itemHeight;
+ }
+
+ /**
+ * 获取月视图的确切高度
+ * Test pass
+ *
+ * @param year 年
+ * @param month 月
+ * @param itemHeight 每项的高度
+ * @param weekStartWith weekStartWith
+ * @param mode mode
+ * @return 不需要多余行的高度
+ */
+ public static int getMonthViewHeight(int year, int month, int itemHeight, int weekStartWith, int mode) {
+ if (mode == CalendarViewDelegate.MODE_ALL_MONTH) {
+ return itemHeight * 6;
+ }
+ return getMonthViewHeight(year, month, itemHeight, weekStartWith);
+ }
+
+ /**
+ * 获取某天在该月的第几周,换言之就是获取这一天在该月视图的第几行,第几周,根据周起始动态获取
+ * Test pass,单元测试通过
+ *
+ * @param calendar calendar
+ * @param weekStart 其实星期是哪一天?
+ * @return 获取某天在该月的第几周 the week line in MonthView
+ */
+ public static int getWeekFromDayInMonth(Calendar calendar, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(calendar.getYear(), calendar.getMonth() - 1, 1, 12, 0, 0);
+ //该月第一天为星期几,星期天 == 0
+ int diff = getMonthViewStartDiff(calendar, weekStart);
+ return (calendar.getDay() + diff - 1) / 7 + 1;
+ }
+
+ /**
+ * 获取上一个日子
+ *
+ * @param calendar calendar
+ * @return 获取上一个日子
+ */
+ public static Calendar getPreCalendar(Calendar calendar) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay(), 12, 0, 0);//
+
+ long timeMills = date.getTimeInMillis();//获得起始时间戳
+
+ date.setTimeInMillis(timeMills - ONE_DAY);
+
+ Calendar preCalendar = new Calendar();
+ preCalendar.setYear(date.get(java.util.Calendar.YEAR));
+ preCalendar.setMonth(date.get(java.util.Calendar.MONTH) + 1);
+ preCalendar.setDay(date.get(java.util.Calendar.DAY_OF_MONTH));
+
+ return preCalendar;
+ }
+
+ public static Calendar getNextCalendar(Calendar calendar) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay(), 12, 0, 0);//
+
+ long timeMills = date.getTimeInMillis();//获得起始时间戳
+
+ date.setTimeInMillis(timeMills + ONE_DAY);
+
+ Calendar nextCalendar = new Calendar();
+ nextCalendar.setYear(date.get(java.util.Calendar.YEAR));
+ nextCalendar.setMonth(date.get(java.util.Calendar.MONTH) + 1);
+ nextCalendar.setDay(date.get(java.util.Calendar.DAY_OF_MONTH));
+
+ return nextCalendar;
+ }
+
+ /**
+ * DAY_OF_WEEK return 1 2 3 4 5 6 7,偏移了一位
+ * 获取日期所在月视图对应的起始偏移量
+ * Test pass
+ *
+ * @param calendar calendar
+ * @param weekStart weekStart 星期的起始
+ * @return 获取日期所在月视图对应的起始偏移量 the start diff with MonthView
+ */
+ static int getMonthViewStartDiff(Calendar calendar, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(calendar.getYear(), calendar.getMonth() - 1, 1, 12, 0, 0);
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_SUN) {
+ return week - 1;
+ }
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_MON) {
+ return week == 1 ? 6 : week - weekStart;
+ }
+ return week == CalendarViewDelegate.WEEK_START_WITH_SAT ? 0 : week;
+ }
+
+
+ /**
+ * DAY_OF_WEEK return 1 2 3 4 5 6 7,偏移了一位
+ * 获取日期所在月视图对应的起始偏移量
+ * Test pass
+ *
+ * @param year 年
+ * @param month 月
+ * @param weekStart 周起始
+ * @return 获取日期所在月视图对应的起始偏移量 the start diff with MonthView
+ */
+ static int getMonthViewStartDiff(int year, int month, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, month - 1, 1, 12, 0, 0);
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_SUN) {
+ return week - 1;
+ }
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_MON) {
+ return week == 1 ? 6 : week - weekStart;
+ }
+ return week == CalendarViewDelegate.WEEK_START_WITH_SAT ? 0 : week;
+ }
+
+
+ /**
+ * DAY_OF_WEEK return 1 2 3 4 5 6 7,偏移了一位
+ * 获取日期月份对应的结束偏移量,用于计算两个年份之间总共有多少周,不用于MonthView
+ * Test pass
+ *
+ * @param year 年
+ * @param month 月
+ * @param weekStart 周起始
+ * @return 获取日期月份对应的结束偏移量 the end diff in Month not MonthView
+ */
+ static int getMonthEndDiff(int year, int month, int weekStart) {
+ return getMonthEndDiff(year, month, getMonthDaysCount(year, month), weekStart);
+ }
+
+
+ /**
+ * DAY_OF_WEEK return 1 2 3 4 5 6 7,偏移了一位
+ * 获取日期月份对应的结束偏移量,用于计算两个年份之间总共有多少周,不用于MonthView
+ * Test pass
+ *
+ * @param year 年
+ * @param month 月
+ * @param weekStart 周起始
+ * @return 获取日期月份对应的结束偏移量 the end diff in Month not MonthView
+ */
+ private static int getMonthEndDiff(int year, int month, int day, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, month - 1, day);
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_SUN) {
+ return 7 - week;
+ }
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_MON) {
+ return week == 1 ? 0 : 7 - week + 1;
+ }
+ return week == 7 ? 6 : 7 - week - 1;
+ }
+
+ /**
+ * 获取某个日期是星期几
+ * 测试通过
+ *
+ * @param calendar 某个日期
+ * @return 返回某个日期是星期几
+ */
+ static int getWeekFormCalendar(Calendar calendar) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay());
+ return date.get(java.util.Calendar.DAY_OF_WEEK) - 1;
+ }
+
+
+ /**
+ * 获取周视图的切换默认选项位置 WeekView index
+ * 测试通过 test pass
+ *
+ * @param calendar calendar
+ * @param weekStart weekStart
+ * @return 获取周视图的切换默认选项位置
+ */
+ static int getWeekViewIndexFromCalendar(Calendar calendar, int weekStart) {
+ return getWeekViewStartDiff(calendar.getYear(), calendar.getMonth(), calendar.getDay(), weekStart);
+ }
+
+ /**
+ * 是否在日期范围內
+ * 测试通过 test pass
+ *
+ * @param calendar calendar
+ * @param minYear minYear
+ * @param minYearDay 最小年份天
+ * @param minYearMonth minYearMonth
+ * @param maxYear maxYear
+ * @param maxYearMonth maxYearMonth
+ * @param maxYearDay 最大年份天
+ * @return 是否在日期范围內
+ */
+ static boolean isCalendarInRange(Calendar calendar,
+ int minYear, int minYearMonth, int minYearDay,
+ int maxYear, int maxYearMonth, int maxYearDay) {
+ java.util.Calendar c = java.util.Calendar.getInstance();
+ c.set(minYear, minYearMonth - 1, minYearDay);
+ long minTime = c.getTimeInMillis();
+ c.set(maxYear, maxYearMonth - 1, maxYearDay);
+ long maxTime = c.getTimeInMillis();
+ c.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay());
+ long curTime = c.getTimeInMillis();
+ return curTime >= minTime && curTime <= maxTime;
+ }
+
+ /**
+ * 获取两个日期之间一共有多少周,
+ * 注意周起始周一、周日、周六
+ * 测试通过 test pass
+ *
+ * @param minYear minYear 最小年份
+ * @param minYearMonth maxYear 最小年份月份
+ * @param minYearDay 最小年份天
+ * @param maxYear maxYear 最大年份
+ * @param maxYearMonth maxYear 最大年份月份
+ * @param maxYearDay 最大年份天
+ * @param weekStart 周起始
+ * @return 周数用于WeekViewPager itemCount
+ */
+ public static int getWeekCountBetweenBothCalendar(int minYear, int minYearMonth, int minYearDay,
+ int maxYear, int maxYearMonth, int maxYearDay,
+ int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(minYear, minYearMonth - 1, minYearDay);
+ long minTimeMills = date.getTimeInMillis();//给定时间戳
+ int preDiff = getWeekViewStartDiff(minYear, minYearMonth, minYearDay, weekStart);
+
+ date.set(maxYear, maxYearMonth - 1, maxYearDay);
+
+ long maxTimeMills = date.getTimeInMillis();//给定时间戳
+
+ int nextDiff = getWeekViewEndDiff(maxYear, maxYearMonth, maxYearDay, weekStart);
+
+ int count = preDiff + nextDiff;
+
+ int c = (int) ((maxTimeMills - minTimeMills) / ONE_DAY) + 1;
+ count += c;
+ return count / 7;
+ }
+
+
+ /**
+ * 根据日期获取距离最小日期在第几周
+ * 用来设置 WeekView currentItem
+ * 测试通过 test pass
+ *
+ * @param calendar calendar
+ * @param minYear minYear 最小年份
+ * @param minYearMonth maxYear 最小年份月份
+ * @param minYearDay 最小年份天
+ * @param weekStart 周起始
+ * @return 返回两个年份中第几周 the WeekView currentItem
+ */
+ public static int getWeekFromCalendarStartWithMinCalendar(Calendar calendar,
+ int minYear, int minYearMonth, int minYearDay,
+ int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(minYear, minYearMonth - 1, minYearDay);//起始日期
+ long firstTimeMill = date.getTimeInMillis();//获得范围起始时间戳
+
+ int preDiff = getWeekViewStartDiff(minYear, minYearMonth, minYearDay, weekStart);//范围起始的周偏移量
+
+ int weekStartDiff = getWeekViewStartDiff(calendar.getYear(),
+ calendar.getMonth(),
+ calendar.getDay(),
+ weekStart);//获取点击的日子在周视图的起始,为了兼容全球时区,最大日差为一天,如果周起始偏差weekStartDiff=0,则日期加1
+
+ date.set(calendar.getYear(),
+ calendar.getMonth() - 1,
+ weekStartDiff == 0 ? calendar.getDay() + 1 : calendar.getDay());
+
+ long curTimeMills = date.getTimeInMillis();//给定时间戳
+
+ int c = (int) ((curTimeMills - firstTimeMill) / ONE_DAY);
+
+ int count = preDiff + c;
+
+ return count / 7 + 1;
+ }
+
+ /**
+ * 根据星期数和最小日期推算出该星期的第一天,
+ * 为了防止夏令时,导致的时间提前和延后1-2小时,导致日期出现误差1天,因此吧hourOfDay = 12
+ * //测试通过 Test pass
+ *
+ * @param minYear 最小年份如2017
+ * @param minYearMonth maxYear 最小年份月份,like : 2017-07
+ * @param minYearDay 最小年份天
+ * @param week 从最小年份minYear月minYearMonth 日1 开始的第几周 week > 0
+ * @param weekStart 周起始
+ * @return 该星期的第一天日期
+ */
+ public static Calendar getFirstCalendarStartWithMinCalendar(int minYear, int minYearMonth, int minYearDay, int week, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(minYear, minYearMonth - 1, minYearDay, 12, 0);//
+
+ long firstTimeMills = date.getTimeInMillis();//获得起始时间戳
+
+
+ long weekTimeMills = (week - 1) * 7 * ONE_DAY;
+
+ long timeCountMills = weekTimeMills + firstTimeMills;
+
+ date.setTimeInMillis(timeCountMills);
+
+ int startDiff = getWeekViewStartDiff(date.get(java.util.Calendar.YEAR),
+ date.get(java.util.Calendar.MONTH) + 1,
+ date.get(java.util.Calendar.DAY_OF_MONTH), weekStart);
+
+ timeCountMills -= startDiff * ONE_DAY;
+ date.setTimeInMillis(timeCountMills);
+
+ Calendar calendar = new Calendar();
+ calendar.setYear(date.get(java.util.Calendar.YEAR));
+ calendar.setMonth(date.get(java.util.Calendar.MONTH) + 1);
+ calendar.setDay(date.get(java.util.Calendar.DAY_OF_MONTH));
+
+ return calendar;
+ }
+
+
+ /**
+ * 是否在日期范围内
+ *
+ * @param calendar calendar
+ * @param delegate delegate
+ * @return 是否在日期范围内
+ */
+ static boolean isCalendarInRange(Calendar calendar, CalendarViewDelegate delegate) {
+ return isCalendarInRange(calendar,
+ delegate.getMinYear(), delegate.getMinYearMonth(), delegate.getMinYearDay(),
+ delegate.getMaxYear(), delegate.getMaxYearMonth(), delegate.getMaxYearDay());
+ }
+
+ /**
+ * 是否在日期范围內
+ *
+ * @param year year
+ * @param month month
+ * @param minYear minYear
+ * @param minYearMonth minYearMonth
+ * @param maxYear maxYear
+ * @param maxYearMonth maxYearMonth
+ * @return 是否在日期范围內
+ */
+ static boolean isMonthInRange(int year, int month, int minYear, int minYearMonth, int maxYear, int maxYearMonth) {
+ return !(year < minYear || year > maxYear) &&
+ !(year == minYear && month < minYearMonth) &&
+ !(year == maxYear && month > maxYearMonth);
+ }
+
+ /**
+ * 运算 calendar1 - calendar2
+ * test Pass
+ *
+ * @param calendar1 calendar1
+ * @param calendar2 calendar2
+ * @return calendar1 - calendar2
+ */
+ public static int differ(Calendar calendar1, Calendar calendar2) {
+ if (calendar1 == null) {
+ return Integer.MIN_VALUE;
+ }
+ if (calendar2 == null) {
+ return Integer.MAX_VALUE;
+ }
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(calendar1.getYear(), calendar1.getMonth() - 1, calendar1.getDay(), 12, 0, 0);//
+
+ long startTimeMills = date.getTimeInMillis();//获得起始时间戳
+
+ date.set(calendar2.getYear(), calendar2.getMonth() - 1, calendar2.getDay(), 12, 0, 0);//
+
+ long endTimeMills = date.getTimeInMillis();//获得结束时间戳
+
+ return (int) ((startTimeMills - endTimeMills) / ONE_DAY);
+ }
+
+ /**
+ * 比较日期大小
+ *
+ * @param minYear minYear
+ * @param minYearMonth minYearMonth
+ * @param minYearDay minYearDay
+ * @param maxYear maxYear
+ * @param maxYearMonth maxYearMonth
+ * @param maxYearDay maxYearDay
+ * @return <0 0 >0
+ */
+ public static int compareTo(int minYear, int minYearMonth, int minYearDay,
+ int maxYear, int maxYearMonth, int maxYearDay) {
+ Calendar first = new Calendar();
+ first.setYear(minYear);
+ first.setMonth(minYearMonth);
+ first.setDay(minYearDay);
+
+ Calendar second = new Calendar();
+ second.setYear(maxYear);
+ second.setMonth(maxYearMonth);
+ second.setDay(maxYearDay);
+ return first.compareTo(second);
+ }
+
+ /**
+ * 为月视图初始化日历
+ *
+ * @param year year
+ * @param month month
+ * @param currentDate currentDate
+ * @param weekStar weekStar
+ * @return 为月视图初始化日历项
+ */
+ static List initCalendarForMonthView(int year, int month, Calendar currentDate, int weekStar) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(year, month - 1, 1);
+
+ int mPreDiff = getMonthViewStartDiff(year, month, weekStar);//获取月视图其实偏移量
+
+ int monthDayCount = getMonthDaysCount(year, month);//获取月份真实天数
+
+ int preYear, preMonth;
+ int nextYear, nextMonth;
+
+ int size = 42;
+
+ List mItems = new ArrayList<>();
+
+ int preMonthDaysCount;
+ if (month == 1) {//如果是1月
+ preYear = year - 1;
+ preMonth = 12;
+ nextYear = year;
+ nextMonth = month + 1;
+ preMonthDaysCount = mPreDiff == 0 ? 0 : CalendarUtil.getMonthDaysCount(preYear, preMonth);
+ } else if (month == 12) {//如果是12月
+ preYear = year;
+ preMonth = month - 1;
+ nextYear = year + 1;
+ nextMonth = 1;
+ preMonthDaysCount = mPreDiff == 0 ? 0 : CalendarUtil.getMonthDaysCount(preYear, preMonth);
+ } else {//平常
+ preYear = year;
+ preMonth = month - 1;
+ nextYear = year;
+ nextMonth = month + 1;
+ preMonthDaysCount = mPreDiff == 0 ? 0 : CalendarUtil.getMonthDaysCount(preYear, preMonth);
+ }
+ int nextDay = 1;
+ for (int i = 0; i < size; i++) {
+ Calendar calendarDate = new Calendar();
+ if (i < mPreDiff) {
+ calendarDate.setYear(preYear);
+ calendarDate.setMonth(preMonth);
+ calendarDate.setDay(preMonthDaysCount - mPreDiff + i + 1);
+ } else if (i >= monthDayCount + mPreDiff) {
+ calendarDate.setYear(nextYear);
+ calendarDate.setMonth(nextMonth);
+ calendarDate.setDay(nextDay);
+ ++nextDay;
+ } else {
+ calendarDate.setYear(year);
+ calendarDate.setMonth(month);
+ calendarDate.setCurrentMonth(true);
+ calendarDate.setDay(i - mPreDiff + 1);
+ }
+ if (calendarDate.equals(currentDate)) {
+ calendarDate.setCurrentDay(true);
+ }
+ LunarCalendar.setupLunarCalendar(calendarDate);
+ mItems.add(calendarDate);
+ }
+ return mItems;
+ }
+
+ static List getWeekCalendars(Calendar calendar, CalendarViewDelegate mDelegate) {
+ long curTime = calendar.getTimeInMillis();
+
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(calendar.getYear(),
+ calendar.getMonth() - 1,
+ calendar.getDay(), 12, 0);//
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ int startDiff;
+ if (mDelegate.getWeekStart() == 1) {
+ startDiff = week - 1;
+ } else if (mDelegate.getWeekStart() == 2) {
+ startDiff = week == 1 ? 6 : week - mDelegate.getWeekStart();
+ } else {
+ startDiff = week == 7 ? 0 : week;
+ }
+
+ curTime -= startDiff * ONE_DAY;
+ java.util.Calendar minCalendar = java.util.Calendar.getInstance();
+ minCalendar.setTimeInMillis(curTime);
+ Calendar startCalendar = new Calendar();
+ startCalendar.setYear(minCalendar.get(java.util.Calendar.YEAR));
+ startCalendar.setMonth(minCalendar.get(java.util.Calendar.MONTH) + 1);
+ startCalendar.setDay(minCalendar.get(java.util.Calendar.DAY_OF_MONTH));
+ return initCalendarForWeekView(startCalendar, mDelegate, mDelegate.getWeekStart());
+ }
+
+ /**
+ * 生成周视图的7个item
+ *
+ * @param calendar 周视图的第一个日子calendar,所以往后推迟6天,生成周视图
+ * @param mDelegate mDelegate
+ * @param weekStart weekStart
+ * @return 生成周视图的7个item
+ */
+ @SuppressWarnings("unused")
+ static List initCalendarForWeekView(Calendar calendar, CalendarViewDelegate mDelegate, int weekStart) {
+
+ java.util.Calendar date = java.util.Calendar.getInstance();//当天时间
+ date.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay(), 12, 0);
+ long curDateMills = date.getTimeInMillis();//生成选择的日期时间戳
+
+ //int weekEndDiff = getWeekViewEndDiff(calendar.getYear(), calendar.getMonth(), calendar.getDay(), weekStart);
+ //weekEndDiff 例如周起始为周日1,当前为2020-04-01,周三,则weekEndDiff为本周结束相差今天三天,weekEndDiff=3
+ int weekEndDiff = 6;
+ List mItems = new ArrayList<>();
+
+ date.setTimeInMillis(curDateMills);
+ Calendar selectCalendar = new Calendar();
+ selectCalendar.setYear(calendar.getYear());
+ selectCalendar.setMonth(calendar.getMonth());
+ selectCalendar.setDay(calendar.getDay());
+ if (selectCalendar.equals(mDelegate.getCurrentDay())) {
+ selectCalendar.setCurrentDay(true);
+ }
+ LunarCalendar.setupLunarCalendar(selectCalendar);
+ selectCalendar.setCurrentMonth(true);
+ mItems.add(selectCalendar);
+
+
+ for (int i = 1; i <= weekEndDiff; i++) {
+ date.setTimeInMillis(curDateMills + i * ONE_DAY);
+ Calendar calendarDate = new Calendar();
+ calendarDate.setYear(date.get(java.util.Calendar.YEAR));
+ calendarDate.setMonth(date.get(java.util.Calendar.MONTH) + 1);
+ calendarDate.setDay(date.get(java.util.Calendar.DAY_OF_MONTH));
+ if (calendarDate.equals(mDelegate.getCurrentDay())) {
+ calendarDate.setCurrentDay(true);
+ }
+ LunarCalendar.setupLunarCalendar(calendarDate);
+ calendarDate.setCurrentMonth(true);
+ mItems.add(calendarDate);
+ }
+ return mItems;
+ }
+
+ /**
+ * 单元测试通过
+ * 从选定的日期,获取周视图起始偏移量,用来生成周视图布局
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ * @param weekStart 周起始,1,2,7 日 一 六
+ * @return 获取周视图起始偏移量,用来生成周视图布局
+ */
+ private static int getWeekViewStartDiff(int year, int month, int day, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, month - 1, day, 12, 0);//
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ if (weekStart == 1) {
+ return week - 1;
+ }
+ if (weekStart == 2) {
+ return week == 1 ? 6 : week - weekStart;
+ }
+ return week == 7 ? 0 : week;
+ }
+
+
+ /**
+ * 单元测试通过
+ * 从选定的日期,获取周视图结束偏移量,用来生成周视图布局
+ * 为了兼容DST,DST时区可能出现时间偏移1-2小时,从而导致凌晨时候实际获得的日期往前或者往后推移了一天,
+ * 日历没有时和分的概念,因此把日期的时间强制在12:00,可以避免DST兼容问题
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ * @param weekStart 周起始,1,2,7 日 一 六
+ * @return 获取周视图结束偏移量,用来生成周视图布局
+ */
+ public static int getWeekViewEndDiff(int year, int month, int day, int weekStart) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, month - 1, day, 12, 0);
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ if (weekStart == 1) {
+ return 7 - week;
+ }
+ if (weekStart == 2) {
+ return week == 1 ? 0 : 7 - week + 1;
+ }
+ return week == 7 ? 6 : 7 - week - 1;
+ }
+
+
+ /**
+ * 从月视图切换获得第一天的日期
+ * Test Pass 它是100%正确的
+ *
+ * @param position position
+ * @param delegate position
+ * @return 从月视图切换获得第一天的日期
+ */
+ static Calendar getFirstCalendarFromMonthViewPager(int position, CalendarViewDelegate delegate) {
+ Calendar calendar = new Calendar();
+ calendar.setYear((position + delegate.getMinYearMonth() - 1) / 12 + delegate.getMinYear());
+ calendar.setMonth((position + delegate.getMinYearMonth() - 1) % 12 + 1);
+ if (delegate.getDefaultCalendarSelectDay() != CalendarViewDelegate.FIRST_DAY_OF_MONTH) {
+ int monthDays = getMonthDaysCount(calendar.getYear(), calendar.getMonth());
+ Calendar indexCalendar = delegate.mIndexCalendar;
+ calendar.setDay(indexCalendar == null || indexCalendar.getDay() == 0 ? 1 :
+ monthDays < indexCalendar.getDay() ? monthDays : indexCalendar.getDay());
+ } else {
+ calendar.setDay(1);
+ }
+ if (!isCalendarInRange(calendar, delegate)) {
+ if (isMinRangeEdge(calendar, delegate)) {
+ calendar = delegate.getMinRangeCalendar();
+ } else {
+ calendar = delegate.getMaxRangeCalendar();
+ }
+ }
+ calendar.setCurrentMonth(calendar.getYear() == delegate.getCurrentDay().getYear() &&
+ calendar.getMonth() == delegate.getCurrentDay().getMonth());
+ calendar.setCurrentDay(calendar.equals(delegate.getCurrentDay()));
+ LunarCalendar.setupLunarCalendar(calendar);
+ return calendar;
+ }
+
+
+ /**
+ * 根据传入的日期获取边界访问日期,要么最大,要么最小
+ *
+ * @param calendar calendar
+ * @param delegate delegate
+ * @return 获取边界访问日期
+ */
+ static Calendar getRangeEdgeCalendar(Calendar calendar, CalendarViewDelegate delegate) {
+ if (CalendarUtil.isCalendarInRange(delegate.getCurrentDay(), delegate)
+ && delegate.getDefaultCalendarSelectDay() != CalendarViewDelegate.LAST_MONTH_VIEW_SELECT_DAY_IGNORE_CURRENT) {
+ return delegate.createCurrentDate();
+ }
+ if (isCalendarInRange(calendar, delegate)) {
+ return calendar;
+ }
+ Calendar minRangeCalendar = delegate.getMinRangeCalendar();
+ if (minRangeCalendar.isSameMonth(calendar)) {
+ return delegate.getMinRangeCalendar();
+ }
+ return delegate.getMaxRangeCalendar();
+ }
+
+ /**
+ * 是否是最小访问边界了
+ *
+ * @param calendar calendar
+ * @return 是否是最小访问边界了
+ */
+ private static boolean isMinRangeEdge(Calendar calendar, CalendarViewDelegate delegate) {
+ java.util.Calendar c = java.util.Calendar.getInstance();
+ c.set(delegate.getMinYear(), delegate.getMinYearMonth() - 1, delegate.getMinYearDay(), 12, 0);
+ long minTime = c.getTimeInMillis();
+ c.set(calendar.getYear(), calendar.getMonth() - 1, calendar.getDay(), 12, 0);
+ long curTime = c.getTimeInMillis();
+ return curTime < minTime;
+ }
+
+ /**
+ * dp转px
+ *
+ * @param context context
+ * @param dpValue dp
+ * @return px
+ */
+ static int dipToPx(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java
new file mode 100644
index 0000000..aa7df94
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java
@@ -0,0 +1,1916 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.ViewPager;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日历布局
+ * 各个类使用包权限,避免不必要的public
+ */
+@SuppressWarnings({"unused"})
+public class CalendarView extends FrameLayout {
+
+ /**
+ * 抽取自定义属性
+ */
+ private final CalendarViewDelegate mDelegate;
+
+ /**
+ * 自定义自适应高度的ViewPager
+ */
+ private MonthViewPager mMonthPager;
+
+ /**
+ * 日历周视图
+ */
+ private WeekViewPager mWeekPager;
+
+ /**
+ * 星期栏的线
+ */
+ private View mWeekLine;
+
+ /**
+ * 月份快速选取
+ */
+ private YearViewPager mYearViewPager;
+
+ /**
+ * 星期栏
+ */
+ private WeekBar mWeekBar;
+
+ /**
+ * 日历外部收缩布局
+ */
+ CalendarLayout mParentLayout;
+
+
+ public CalendarView(@NonNull Context context) {
+ this(context, null);
+ }
+
+ public CalendarView(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ mDelegate = new CalendarViewDelegate(context, attrs);
+ init(context);
+ }
+
+ /**
+ * 初始化
+ *
+ * @param context context
+ */
+ private void init(Context context) {
+ LayoutInflater.from(context).inflate(R.layout.cv_layout_calendar_view, this, true);
+ FrameLayout frameContent = findViewById(R.id.frameContent);
+ this.mWeekPager = findViewById(R.id.vp_week);
+ this.mWeekPager.setup(mDelegate);
+
+ try {
+ Constructor constructor = mDelegate.getWeekBarClass().getConstructor(Context.class);
+ mWeekBar = (WeekBar) constructor.newInstance(getContext());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ frameContent.addView(mWeekBar, 2);
+ mWeekBar.setup(mDelegate);
+ mWeekBar.onWeekStartChange(mDelegate.getWeekStart());
+
+ this.mWeekLine = findViewById(R.id.line);
+ this.mWeekLine.setBackgroundColor(mDelegate.getWeekLineBackground());
+ LayoutParams lineParams = (LayoutParams) this.mWeekLine.getLayoutParams();
+ lineParams.setMargins(mDelegate.getWeekLineMargin(),
+ mDelegate.getWeekBarHeight(),
+ mDelegate.getWeekLineMargin(),
+ 0);
+ this.mWeekLine.setLayoutParams(lineParams);
+
+ this.mMonthPager = findViewById(R.id.vp_month);
+ this.mMonthPager.mWeekPager = mWeekPager;
+ this.mMonthPager.mWeekBar = mWeekBar;
+ LayoutParams params = (LayoutParams) this.mMonthPager.getLayoutParams();
+ params.setMargins(0, mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0);
+ mWeekPager.setLayoutParams(params);
+
+
+ mYearViewPager = findViewById(R.id.selectLayout);
+ mYearViewPager.setPadding(mDelegate.getYearViewPaddingLeft(), 0, mDelegate.getYearViewPaddingRight(), 0);
+ mYearViewPager.setBackgroundColor(mDelegate.getYearViewBackground());
+ mYearViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ return;
+ }
+ if (mDelegate.mYearChangeListener != null) {
+ mDelegate.mYearChangeListener.onYearChange(position + mDelegate.getMinYear());
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ }
+ });
+
+ mDelegate.mInnerListener = new OnInnerDateSelectedListener() {
+ /**
+ * 月视图选择事件
+ * @param calendar calendar
+ * @param isClick 是否是点击
+ */
+ @Override
+ public void onMonthDateSelected(Calendar calendar, boolean isClick) {
+
+ if (calendar.getYear() == mDelegate.getCurrentDay().getYear() &&
+ calendar.getMonth() == mDelegate.getCurrentDay().getMonth()
+ && mMonthPager.getCurrentItem() != mDelegate.mCurrentMonthViewItem) {
+ return;
+ }
+ mDelegate.mIndexCalendar = calendar;
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick) {
+ mDelegate.mSelectedCalendar = calendar;
+ }
+ mWeekPager.updateSelected(mDelegate.mIndexCalendar, false);
+ mMonthPager.updateSelected();
+ if (mWeekBar != null &&
+ (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick)) {
+ mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick);
+ }
+ }
+
+ /**
+ * 周视图选择事件
+ * @param calendar calendar
+ * @param isClick 是否是点击
+ */
+ @Override
+ public void onWeekDateSelected(Calendar calendar, boolean isClick) {
+ mDelegate.mIndexCalendar = calendar;
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick
+ || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar)) {
+ mDelegate.mSelectedCalendar = calendar;
+ }
+ int y = calendar.getYear() - mDelegate.getMinYear();
+ int position = 12 * y + mDelegate.mIndexCalendar.getMonth() - mDelegate.getMinYearMonth();
+ mWeekPager.updateSingleSelect();
+ mMonthPager.setCurrentItem(position, false);
+ mMonthPager.updateSelected();
+ if (mWeekBar != null &&
+ (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT
+ || isClick
+ || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar))) {
+ mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick);
+ }
+ }
+ };
+
+
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ if (isInRange(mDelegate.getCurrentDay())) {
+ mDelegate.mSelectedCalendar = mDelegate.createCurrentDate();
+ } else {
+ mDelegate.mSelectedCalendar = mDelegate.getMinRangeCalendar();
+ }
+ } else {
+ mDelegate.mSelectedCalendar = new Calendar();
+ }
+
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false);
+
+ mMonthPager.setup(mDelegate);
+ mMonthPager.setCurrentItem(mDelegate.mCurrentMonthViewItem);
+ mYearViewPager.setOnMonthSelectedListener(new YearRecyclerView.OnMonthSelectedListener() {
+ @Override
+ public void onMonthSelected(int year, int month) {
+ int position = 12 * (year - mDelegate.getMinYear()) + month - mDelegate.getMinYearMonth();
+ closeSelectLayout(position);
+ mDelegate.isShowYearSelectedLayout = false;
+ }
+ });
+ mYearViewPager.setup(mDelegate);
+ mWeekPager.updateSelected(mDelegate.createCurrentDate(), false);
+ }
+
+ /**
+ * 设置日期范围
+ *
+ * @param minYear 最小年份
+ * @param minYearMonth 最小年份对应月份
+ * @param minYearDay 最小年份对应天
+ * @param maxYear 最大月份
+ * @param maxYearMonth 最大月份对应月份
+ * @param maxYearDay 最大月份对应天
+ */
+ public void setRange(int minYear, int minYearMonth, int minYearDay,
+ int maxYear, int maxYearMonth, int maxYearDay) {
+ if (CalendarUtil.compareTo(minYear, minYearMonth, minYearDay,
+ maxYear, maxYearMonth, maxYearDay) > 0) {
+ return;
+ }
+ mDelegate.setRange(minYear, minYearMonth, minYearDay,
+ maxYear, maxYearMonth, maxYearDay);
+ mWeekPager.notifyDataSetChanged();
+ mYearViewPager.notifyDataSetChanged();
+ mMonthPager.notifyDataSetChanged();
+ if (!isInRange(mDelegate.mSelectedCalendar)) {
+ mDelegate.mSelectedCalendar = mDelegate.getMinRangeCalendar();
+ mDelegate.updateSelectCalendarScheme();
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+ }
+ mWeekPager.updateRange();
+ mMonthPager.updateRange();
+ mYearViewPager.updateRange();
+ }
+
+ /**
+ * 获取当天
+ *
+ * @return 返回今天
+ */
+ public int getCurDay() {
+ return mDelegate.getCurrentDay().getDay();
+ }
+
+ /**
+ * 获取本月
+ *
+ * @return 返回本月
+ */
+ public int getCurMonth() {
+ return mDelegate.getCurrentDay().getMonth();
+ }
+
+ /**
+ * 获取本年
+ *
+ * @return 返回本年
+ */
+ public int getCurYear() {
+ return mDelegate.getCurrentDay().getYear();
+ }
+
+
+ /**
+ * 打开日历年月份快速选择
+ *
+ * @param year 年
+ */
+ public void showYearSelectLayout(final int year) {
+ showSelectLayout(year);
+ }
+
+ /**
+ * 打开日历年月份快速选择
+ * 请使用 showYearSelectLayout(final int year) 代替,这个没什么,越来越规范
+ *
+ * @param year 年
+ */
+ private void showSelectLayout(final int year) {
+ if (mParentLayout != null && mParentLayout.mContentView != null) {
+ if (!mParentLayout.isExpand()) {
+ mParentLayout.expand();
+ //return;
+ }
+ }
+ mWeekPager.setVisibility(GONE);
+ mDelegate.isShowYearSelectedLayout = true;
+ if (mParentLayout != null) {
+ mParentLayout.hideContentView();
+ }
+ mWeekBar.animate()
+ .translationY(-mWeekBar.getHeight())
+ .setInterpolator(new LinearInterpolator())
+ .setDuration(260)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ mWeekBar.setVisibility(GONE);
+ mYearViewPager.setVisibility(VISIBLE);
+ mYearViewPager.scrollToYear(year, false);
+ if (mParentLayout != null && mParentLayout.mContentView != null) {
+ mParentLayout.expand();
+ }
+ }
+ });
+
+ mMonthPager.animate()
+ .scaleX(0)
+ .scaleY(0)
+ .setDuration(260)
+ .setInterpolator(new LinearInterpolator())
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (mDelegate.mYearViewChangeListener != null) {
+ mDelegate.mYearViewChangeListener.onYearViewChange(false);
+ }
+ }
+ });
+ }
+
+
+ /**
+ * 年月份选择视图是否打开
+ *
+ * @return true or false
+ */
+ public boolean isYearSelectLayoutVisible() {
+ return mYearViewPager.getVisibility() == VISIBLE;
+ }
+
+ /**
+ * 关闭年月视图选择布局
+ */
+ public void closeYearSelectLayout() {
+ if (mYearViewPager.getVisibility() == GONE) {
+ return;
+ }
+ int position = 12 * (mDelegate.mSelectedCalendar.getYear() - mDelegate.getMinYear()) +
+ mDelegate.mSelectedCalendar.getMonth() - mDelegate.getMinYearMonth();
+ closeSelectLayout(position);
+ mDelegate.isShowYearSelectedLayout = false;
+ }
+
+ /**
+ * 关闭日历布局,同时会滚动到指定的位置
+ *
+ * @param position 某一年
+ */
+ private void closeSelectLayout(final int position) {
+ mYearViewPager.setVisibility(GONE);
+ mWeekBar.setVisibility(VISIBLE);
+ if (position == mMonthPager.getCurrentItem()) {
+ if (mDelegate.mCalendarSelectListener != null &&
+ mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_SINGLE) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false);
+ }
+ } else {
+ mMonthPager.setCurrentItem(position, false);
+ }
+ mWeekBar.animate()
+ .translationY(0)
+ .setInterpolator(new LinearInterpolator())
+ .setDuration(280)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ mWeekBar.setVisibility(VISIBLE);
+ }
+ });
+ mMonthPager.animate()
+ .scaleX(1)
+ .scaleY(1)
+ .setDuration(180)
+ .setInterpolator(new LinearInterpolator())
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (mDelegate.mYearViewChangeListener != null) {
+ mDelegate.mYearViewChangeListener.onYearViewChange(true);
+ }
+ if (mParentLayout != null) {
+ mParentLayout.showContentView();
+ if (mParentLayout.isExpand()) {
+ mMonthPager.setVisibility(VISIBLE);
+ } else {
+ mWeekPager.setVisibility(VISIBLE);
+ mParentLayout.shrink();
+ }
+ } else {
+ mMonthPager.setVisibility(VISIBLE);
+ }
+ mMonthPager.clearAnimation();
+ }
+ });
+ }
+
+ /**
+ * 滚动到当前
+ */
+ public void scrollToCurrent() {
+ scrollToCurrent(false);
+ }
+
+ /**
+ * 滚动到当前
+ *
+ * @param smoothScroll smoothScroll
+ */
+ public void scrollToCurrent(boolean smoothScroll) {
+ if (!isInRange(mDelegate.getCurrentDay())) {
+ return;
+ }
+ Calendar calendar = mDelegate.createCurrentDate();
+ if (mDelegate.mCalendarInterceptListener != null &&
+ mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, false);
+ return;
+ }
+ mDelegate.mSelectedCalendar = mDelegate.createCurrentDate();
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+ mDelegate.updateSelectCalendarScheme();
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false);
+ if (mMonthPager.getVisibility() == VISIBLE) {
+ mMonthPager.scrollToCurrent(smoothScroll);
+ mWeekPager.updateSelected(mDelegate.mIndexCalendar, false);
+ } else {
+ mWeekPager.scrollToCurrent(smoothScroll);
+ }
+ mYearViewPager.scrollToYear(mDelegate.getCurrentDay().getYear(), smoothScroll);
+ }
+
+
+ /**
+ * 滚动到下一个月
+ */
+ public void scrollToNext() {
+ scrollToNext(false);
+ }
+
+ /**
+ * 滚动到下一个月
+ *
+ * @param smoothScroll smoothScroll
+ */
+ public void scrollToNext(boolean smoothScroll) {
+ if (isYearSelectLayoutVisible()) {
+ mYearViewPager.setCurrentItem(mYearViewPager.getCurrentItem() + 1, smoothScroll);
+ } else if (mWeekPager.getVisibility() == VISIBLE) {
+ mWeekPager.setCurrentItem(mWeekPager.getCurrentItem() + 1, smoothScroll);
+ } else {
+ mMonthPager.setCurrentItem(mMonthPager.getCurrentItem() + 1, smoothScroll);
+ }
+
+ }
+
+ /**
+ * 滚动到上一个月
+ */
+ public void scrollToPre() {
+ scrollToPre(false);
+ }
+
+ /**
+ * 滚动到上一个月
+ *
+ * @param smoothScroll smoothScroll
+ */
+ public void scrollToPre(boolean smoothScroll) {
+ if (isYearSelectLayoutVisible()) {
+ mYearViewPager.setCurrentItem(mYearViewPager.getCurrentItem() - 1, smoothScroll);
+ } else if (mWeekPager.getVisibility() == VISIBLE) {
+ mWeekPager.setCurrentItem(mWeekPager.getCurrentItem() - 1, smoothScroll);
+ } else {
+ mMonthPager.setCurrentItem(mMonthPager.getCurrentItem() - 1, smoothScroll);
+ }
+ }
+
+ /**
+ * 滚动到选择的日历
+ */
+ public void scrollToSelectCalendar() {
+ if (!mDelegate.mSelectedCalendar.isAvailable()) {
+ return;
+ }
+ scrollToCalendar(mDelegate.mSelectedCalendar.getYear(),
+ mDelegate.mSelectedCalendar.getMonth(),
+ mDelegate.mSelectedCalendar.getDay(),
+ false,
+ true);
+ }
+
+ /**
+ * 滚动到指定日期
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ */
+ public void scrollToCalendar(int year, int month, int day) {
+ scrollToCalendar(year, month, day, false, true);
+ }
+
+ /**
+ * 滚动到指定日期
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ * @param smoothScroll smoothScroll
+ */
+ public void scrollToCalendar(int year, int month, int day, boolean smoothScroll) {
+ scrollToCalendar(year, month, day, smoothScroll, true);
+ }
+
+ /**
+ * 滚动到指定日期
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ * @param smoothScroll smoothScroll
+ * @param invokeListener 调用日期事件
+ */
+ public void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) {
+
+ Calendar calendar = new Calendar();
+ calendar.setYear(year);
+ calendar.setMonth(month);
+ calendar.setDay(day);
+ if (!calendar.isAvailable()) {
+ return;
+ }
+ if (!isInRange(calendar)) {
+ return;
+ }
+ if (mDelegate.mCalendarInterceptListener != null &&
+ mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, false);
+ return;
+ }
+
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ mWeekPager.scrollToCalendar(year, month, day, smoothScroll, invokeListener);
+ } else {
+ mMonthPager.scrollToCalendar(year, month, day, smoothScroll, invokeListener);
+ }
+ }
+
+ /**
+ * 滚动到某一年
+ *
+ * @param year 快速滚动的年份
+ */
+ public void scrollToYear(int year) {
+ scrollToYear(year, false);
+ }
+
+ /**
+ * 滚动到某一年
+ *
+ * @param year 快速滚动的年份
+ * @param smoothScroll smoothScroll
+ */
+ public void scrollToYear(int year, boolean smoothScroll) {
+ if (mYearViewPager.getVisibility() != VISIBLE) {
+ return;
+ }
+ mYearViewPager.scrollToYear(year, smoothScroll);
+ }
+
+ /**
+ * 设置月视图是否可滚动
+ *
+ * @param monthViewScrollable 设置月视图是否可滚动
+ */
+ public final void setMonthViewScrollable(boolean monthViewScrollable) {
+ mDelegate.setMonthViewScrollable(monthViewScrollable);
+ }
+
+
+ /**
+ * 设置周视图是否可滚动
+ *
+ * @param weekViewScrollable 设置周视图是否可滚动
+ */
+ public final void setWeekViewScrollable(boolean weekViewScrollable) {
+ mDelegate.setWeekViewScrollable(weekViewScrollable);
+ }
+
+ /**
+ * 设置年视图是否可滚动
+ *
+ * @param yearViewScrollable 设置年视图是否可滚动
+ */
+ public final void setYearViewScrollable(boolean yearViewScrollable) {
+ mDelegate.setYearViewScrollable(yearViewScrollable);
+ }
+
+
+ public final void setDefaultMonthViewSelectDay() {
+ mDelegate.setDefaultCalendarSelectDay(CalendarViewDelegate.FIRST_DAY_OF_MONTH);
+ }
+
+ public final void setLastMonthViewSelectDay() {
+ mDelegate.setDefaultCalendarSelectDay(CalendarViewDelegate.LAST_MONTH_VIEW_SELECT_DAY);
+ }
+
+ public final void setLastMonthViewSelectDayIgnoreCurrent() {
+ mDelegate.setDefaultCalendarSelectDay(CalendarViewDelegate.LAST_MONTH_VIEW_SELECT_DAY_IGNORE_CURRENT);
+ }
+
+ /**
+ * 清除选择范围
+ */
+ public final void clearSelectRange() {
+ mDelegate.clearSelectRange();
+ mMonthPager.clearSelectRange();
+ mWeekPager.clearSelectRange();
+ }
+
+ /**
+ * 清除单选
+ */
+ public final void clearSingleSelect() {
+ mDelegate.mSelectedCalendar = new Calendar();
+ mMonthPager.clearSingleSelect();
+ mWeekPager.clearSingleSelect();
+ }
+
+ /**
+ * 清除多选
+ */
+ public final void clearMultiSelect() {
+ mDelegate.mSelectedCalendars.clear();
+ mMonthPager.clearMultiSelect();
+ mWeekPager.clearMultiSelect();
+ }
+
+ /**
+ * 添加选择
+ *
+ * @param calendars calendars
+ */
+ public final void putMultiSelect(Calendar... calendars) {
+ if (calendars == null || calendars.length == 0) {
+ return;
+ }
+ for (Calendar calendar : calendars) {
+ if (calendar == null || mDelegate.mSelectedCalendars.containsKey(calendar.toString())) {
+ continue;
+ }
+ mDelegate.mSelectedCalendars.put(calendar.toString(), calendar);
+ }
+ update();
+ }
+
+ /**
+ * 清楚一些多选日期
+ *
+ * @param calendars calendars
+ */
+ @SuppressWarnings("RedundantCollectionOperation")
+ public final void removeMultiSelect(Calendar... calendars) {
+ if (calendars == null || calendars.length == 0) {
+ return;
+ }
+ for (Calendar calendar : calendars) {
+ if (calendar == null) {
+ continue;
+ }
+ if (mDelegate.mSelectedCalendars.containsKey(calendar.toString())) {
+ mDelegate.mSelectedCalendars.remove(calendar.toString());
+ }
+ }
+ update();
+ }
+
+
+ public final List getMultiSelectCalendars() {
+ List calendars = new ArrayList<>();
+ if (mDelegate.mSelectedCalendars.size() == 0) {
+ return calendars;
+ }
+ calendars.addAll(mDelegate.mSelectedCalendars.values());
+ Collections.sort(calendars);
+ return calendars;
+ }
+
+ /**
+ * 获取选中范围
+ *
+ * @return return
+ */
+ public final List getSelectCalendarRange() {
+ return mDelegate.getSelectCalendarRange();
+ }
+
+ /**
+ * 设置月视图项高度
+ *
+ * @param calendarItemHeight MonthView item height
+ */
+ public final void setCalendarItemHeight(int calendarItemHeight) {
+ if (mDelegate.getCalendarItemHeight() == calendarItemHeight) {
+ return;
+ }
+ mDelegate.setCalendarItemHeight(calendarItemHeight);
+ mMonthPager.updateItemHeight();
+ mWeekPager.updateItemHeight();
+ if (mParentLayout == null) {
+ return;
+ }
+ mParentLayout.updateCalendarItemHeight();
+ }
+
+
+ /**
+ * 设置月视图
+ *
+ * @param cls MonthView.class
+ */
+ public final void setMonthView(Class> cls) {
+ if (cls == null) {
+ return;
+ }
+ if (mDelegate.getMonthViewClass().equals(cls)) {
+ return;
+ }
+ mDelegate.setMonthViewClass(cls);
+ mMonthPager.updateMonthViewClass();
+ }
+
+ /**
+ * 设置周视图
+ *
+ * @param cls WeekView.class
+ */
+ public final void setWeekView(Class> cls) {
+ if (cls == null) {
+ return;
+ }
+ if (mDelegate.getWeekBarClass().equals(cls)) {
+ return;
+ }
+ mDelegate.setWeekViewClass(cls);
+ mWeekPager.updateWeekViewClass();
+ }
+
+ /**
+ * 设置周栏视图
+ *
+ * @param cls WeekBar.class
+ */
+ public final void setWeekBar(Class> cls) {
+ if (cls == null) {
+ return;
+ }
+ if (mDelegate.getWeekBarClass().equals(cls)) {
+ return;
+ }
+ mDelegate.setWeekBarClass(cls);
+ FrameLayout frameContent = findViewById(R.id.frameContent);
+ frameContent.removeView(mWeekBar);
+
+ try {
+ Constructor constructor = cls.getConstructor(Context.class);
+ mWeekBar = (WeekBar) constructor.newInstance(getContext());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ frameContent.addView(mWeekBar, 2);
+ mWeekBar.setup(mDelegate);
+ mWeekBar.onWeekStartChange(mDelegate.getWeekStart());
+ this.mMonthPager.mWeekBar = mWeekBar;
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false);
+ }
+
+
+ /**
+ * 添加日期拦截事件
+ * 使用此方法,只能基于select_mode = single_mode
+ * 否则的话,如果标记全部日期为不可点击,那是没有意义的,
+ * 框架本身也不可能在滑动的过程中全部去判断每个日期的可点击性
+ *
+ * @param listener listener
+ */
+ public final void setOnCalendarInterceptListener(OnCalendarInterceptListener listener) {
+ if (listener == null) {
+ mDelegate.mCalendarInterceptListener = null;
+ }
+ if (listener == null || mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ return;
+ }
+ mDelegate.mCalendarInterceptListener = listener;
+ if (!listener.onCalendarIntercept(mDelegate.mSelectedCalendar)) {
+ return;
+ }
+ mDelegate.mSelectedCalendar = new Calendar();
+ }
+
+ /**
+ * 点击视图Padding位置的事件
+ *
+ * @param listener listener
+ */
+ public final void setOnClickCalendarPaddingListener(OnClickCalendarPaddingListener listener) {
+ if (listener == null) {
+ mDelegate.mClickCalendarPaddingListener = null;
+ }
+ if (listener == null) {
+ return;
+ }
+ mDelegate.mClickCalendarPaddingListener = listener;
+ }
+
+ /**
+ * 年份改变事件
+ *
+ * @param listener listener
+ */
+ public void setOnYearChangeListener(OnYearChangeListener listener) {
+ this.mDelegate.mYearChangeListener = listener;
+ }
+
+ /**
+ * 月份改变事件
+ *
+ * @param listener listener
+ */
+ public void setOnMonthChangeListener(OnMonthChangeListener listener) {
+ this.mDelegate.mMonthChangeListener = listener;
+ }
+
+
+ /**
+ * 周视图切换监听
+ *
+ * @param listener listener
+ */
+ public void setOnWeekChangeListener(OnWeekChangeListener listener) {
+ this.mDelegate.mWeekChangeListener = listener;
+ }
+
+ /**
+ * 日期选择事件
+ *
+ * @param listener listener
+ */
+ public void setOnCalendarSelectListener(OnCalendarSelectListener listener) {
+ this.mDelegate.mCalendarSelectListener = listener;
+ if (mDelegate.mCalendarSelectListener == null) {
+ return;
+ }
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ return;
+ }
+ if (!isInRange(mDelegate.mSelectedCalendar)) {
+ return;
+ }
+ mDelegate.updateSelectCalendarScheme();
+ }
+
+
+ /**
+ * 日期选择事件
+ *
+ * @param listener listener
+ */
+ public final void setOnCalendarRangeSelectListener(OnCalendarRangeSelectListener listener) {
+ this.mDelegate.mCalendarRangeSelectListener = listener;
+ }
+
+ /**
+ * 日期多选事件
+ *
+ * @param listener listener
+ */
+ public final void setOnCalendarMultiSelectListener(OnCalendarMultiSelectListener listener) {
+ this.mDelegate.mCalendarMultiSelectListener = listener;
+ }
+
+ /**
+ * 设置最小范围和最大访问,default:minRange = -1,maxRange = -1 没有限制
+ *
+ * @param minRange minRange
+ * @param maxRange maxRange
+ */
+ public final void setSelectRange(int minRange, int maxRange) {
+ if (minRange > maxRange) {
+ return;
+ }
+ mDelegate.setSelectRange(minRange, maxRange);
+ }
+
+
+ public final void setSelectStartCalendar(int startYear, int startMonth, int startDay) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ Calendar startCalendar = new Calendar();
+ startCalendar.setYear(startYear);
+ startCalendar.setMonth(startMonth);
+ startCalendar.setDay(startDay);
+ setSelectStartCalendar(startCalendar);
+ }
+
+ public final void setSelectStartCalendar(Calendar startCalendar) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ if (startCalendar == null) {
+ return;
+ }
+ if (!isInRange(startCalendar)) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(startCalendar, true);
+ }
+ return;
+ }
+ if (onCalendarIntercept(startCalendar)) {
+ if (mDelegate.mCalendarInterceptListener != null) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(startCalendar, false);
+ }
+ return;
+ }
+ mDelegate.mSelectedEndRangeCalendar = null;
+ mDelegate.mSelectedStartRangeCalendar = startCalendar;
+ scrollToCalendar(startCalendar.getYear(), startCalendar.getMonth(), startCalendar.getDay());
+ }
+
+ public final void setSelectEndCalendar(int endYear, int endMonth, int endDay) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ if (mDelegate.mSelectedStartRangeCalendar == null) {
+ return;
+ }
+ Calendar endCalendar = new Calendar();
+ endCalendar.setYear(endYear);
+ endCalendar.setMonth(endMonth);
+ endCalendar.setDay(endDay);
+ setSelectEndCalendar(endCalendar);
+ }
+
+ public final void setSelectEndCalendar(Calendar endCalendar) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ if (mDelegate.mSelectedStartRangeCalendar == null) {
+ return;
+ }
+ setSelectCalendarRange(mDelegate.mSelectedStartRangeCalendar, endCalendar);
+ }
+
+ /**
+ * 直接指定选择范围,set select calendar range
+ *
+ * @param startYear startYear
+ * @param startMonth startMonth
+ * @param startDay startDay
+ * @param endYear endYear
+ * @param endMonth endMonth
+ * @param endDay endDay
+ */
+ public final void setSelectCalendarRange(int startYear, int startMonth, int startDay,
+ int endYear, int endMonth, int endDay) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ Calendar startCalendar = new Calendar();
+ startCalendar.setYear(startYear);
+ startCalendar.setMonth(startMonth);
+ startCalendar.setDay(startDay);
+
+ Calendar endCalendar = new Calendar();
+ endCalendar.setYear(endYear);
+ endCalendar.setMonth(endMonth);
+ endCalendar.setDay(endDay);
+ setSelectCalendarRange(startCalendar, endCalendar);
+ }
+
+ /**
+ * 设置选择日期范围
+ *
+ * @param startCalendar startCalendar
+ * @param endCalendar endCalendar
+ */
+ public final void setSelectCalendarRange(Calendar startCalendar, Calendar endCalendar) {
+ if (mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ if (startCalendar == null || endCalendar == null) {
+ return;
+ }
+ if (onCalendarIntercept(startCalendar)) {
+ if (mDelegate.mCalendarInterceptListener != null) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(startCalendar, false);
+ }
+ return;
+ }
+ if (onCalendarIntercept(endCalendar)) {
+ if (mDelegate.mCalendarInterceptListener != null) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(endCalendar, false);
+ }
+ return;
+ }
+ int minDiffer = endCalendar.differ(startCalendar);
+ if (minDiffer < 0) {
+ return;
+ }
+ if (!isInRange(startCalendar) || !isInRange(endCalendar)) {
+ return;
+ }
+
+
+ //优先判断各种直接return的情况,减少代码深度
+ if (mDelegate.getMinSelectRange() != -1 && mDelegate.getMinSelectRange() > minDiffer + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(endCalendar, true);
+ }
+ return;
+ } else if (mDelegate.getMaxSelectRange() != -1 && mDelegate.getMaxSelectRange() <
+ minDiffer + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(endCalendar, false);
+ }
+ return;
+ }
+ if (mDelegate.getMinSelectRange() == -1 && minDiffer == 0) {
+ mDelegate.mSelectedStartRangeCalendar = startCalendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarRangeSelect(startCalendar, false);
+ }
+ scrollToCalendar(startCalendar.getYear(), startCalendar.getMonth(), startCalendar.getDay());
+ return;
+ }
+
+ mDelegate.mSelectedStartRangeCalendar = startCalendar;
+ mDelegate.mSelectedEndRangeCalendar = endCalendar;
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarRangeSelect(startCalendar, false);
+ mDelegate.mCalendarRangeSelectListener.onCalendarRangeSelect(endCalendar, true);
+ }
+ scrollToCalendar(startCalendar.getYear(), startCalendar.getMonth(), startCalendar.getDay());
+ }
+
+ /**
+ * 是否拦截日期,此设置续设置mCalendarInterceptListener
+ *
+ * @param calendar calendar
+ * @return 是否拦截日期
+ */
+ protected final boolean onCalendarIntercept(Calendar calendar) {
+ return mDelegate.mCalendarInterceptListener != null &&
+ mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar);
+ }
+
+
+ /**
+ * 获得最大多选数量
+ *
+ * @return 获得最大多选数量
+ */
+ public final int getMaxMultiSelectSize() {
+ return mDelegate.getMaxMultiSelectSize();
+ }
+
+ /**
+ * 设置最大多选数量
+ *
+ * @param maxMultiSelectSize 最大多选数量
+ */
+ public final void setMaxMultiSelectSize(int maxMultiSelectSize) {
+ mDelegate.setMaxMultiSelectSize(maxMultiSelectSize);
+ }
+
+ /**
+ * 最小选择范围
+ *
+ * @return 最小选择范围
+ */
+ public final int getMinSelectRange() {
+ return mDelegate.getMinSelectRange();
+ }
+
+ /**
+ * 最大选择范围
+ *
+ * @return 最大选择范围
+ */
+ public final int getMaxSelectRange() {
+ return mDelegate.getMaxSelectRange();
+ }
+
+ /**
+ * 日期长按事件
+ *
+ * @param listener listener
+ */
+ public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener) {
+ this.mDelegate.mCalendarLongClickListener = listener;
+ }
+
+ /**
+ * 日期长按事件
+ *
+ * @param preventLongPressedSelect 防止长按选择日期
+ * @param listener listener
+ */
+ public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener, boolean preventLongPressedSelect) {
+ this.mDelegate.mCalendarLongClickListener = listener;
+ this.mDelegate.setPreventLongPressedSelected(preventLongPressedSelect);
+ }
+
+ /**
+ * 视图改变事件
+ *
+ * @param listener listener
+ */
+ public void setOnViewChangeListener(OnViewChangeListener listener) {
+ this.mDelegate.mViewChangeListener = listener;
+ }
+
+
+ public void setOnYearViewChangeListener(OnYearViewChangeListener listener) {
+ this.mDelegate.mYearViewChangeListener = listener;
+ }
+
+ /**
+ * 保持状态
+ *
+ * @return 状态
+ */
+ @Nullable
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ if (mDelegate == null) {
+ return super.onSaveInstanceState();
+ }
+ Bundle bundle = new Bundle();
+ Parcelable parcelable = super.onSaveInstanceState();
+ bundle.putParcelable("super", parcelable);
+ bundle.putSerializable("selected_calendar", mDelegate.mSelectedCalendar);
+ bundle.putSerializable("index_calendar", mDelegate.mIndexCalendar);
+ return bundle;
+ }
+
+ /**
+ * 恢复状态
+ *
+ * @param state 状态
+ */
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ Bundle bundle = (Bundle) state;
+ Parcelable superData = bundle.getParcelable("super");
+ mDelegate.mSelectedCalendar = (Calendar) bundle.getSerializable("selected_calendar");
+ mDelegate.mIndexCalendar = (Calendar) bundle.getSerializable("index_calendar");
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false);
+ }
+ if (mDelegate.mIndexCalendar != null) {
+ scrollToCalendar(mDelegate.mIndexCalendar.getYear(),
+ mDelegate.mIndexCalendar.getMonth(),
+ mDelegate.mIndexCalendar.getDay());
+ }
+ update();
+ super.onRestoreInstanceState(superData);
+ }
+
+
+ /**
+ * 初始化时初始化日历卡默认选择位置
+ */
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ if (getParent() != null && getParent() instanceof CalendarLayout) {
+ mParentLayout = (CalendarLayout) getParent();
+ mMonthPager.mParentLayout = mParentLayout;
+ mWeekPager.mParentLayout = mParentLayout;
+ mParentLayout.mWeekBar = mWeekBar;
+ mParentLayout.setup(mDelegate);
+ mParentLayout.initStatus();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ if (mDelegate == null ||
+ !mDelegate.isFullScreenCalendar()) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ return;
+ }
+ setCalendarItemHeight((height -
+ mDelegate.getWeekBarHeight()) / 6);
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * 标记哪些日期有事件
+ *
+ * @param mSchemeDates mSchemeDatesMap 通过自己的需求转换即可
+ */
+ public final void setSchemeDate(Map mSchemeDates) {
+ this.mDelegate.mSchemeDatesMap = mSchemeDates;
+ this.mDelegate.updateSelectCalendarScheme();
+ this.mYearViewPager.update();
+ this.mMonthPager.updateScheme();
+ this.mWeekPager.updateScheme();
+ }
+
+ /**
+ * 清空日期标记
+ */
+ public final void clearSchemeDate() {
+ this.mDelegate.mSchemeDatesMap = null;
+ this.mDelegate.clearSelectedScheme();
+ mYearViewPager.update();
+ mMonthPager.updateScheme();
+ mWeekPager.updateScheme();
+ }
+
+ /**
+ * 添加事物标记
+ *
+ * @param calendar calendar
+ */
+ public final void addSchemeDate(Calendar calendar) {
+ if (calendar == null || !calendar.isAvailable()) {
+ return;
+ }
+ if (mDelegate.mSchemeDatesMap == null) {
+ mDelegate.mSchemeDatesMap = new HashMap<>();
+ }
+ mDelegate.mSchemeDatesMap.remove(calendar.toString());
+ mDelegate.mSchemeDatesMap.put(calendar.toString(), calendar);
+ this.mDelegate.updateSelectCalendarScheme();
+ this.mYearViewPager.update();
+ this.mMonthPager.updateScheme();
+ this.mWeekPager.updateScheme();
+ }
+
+ /**
+ * 添加事物标记
+ *
+ * @param mSchemeDates mSchemeDates
+ */
+ public final void addSchemeDate(Map mSchemeDates) {
+ if (this.mDelegate == null || mSchemeDates == null || mSchemeDates.size() == 0) {
+ return;
+ }
+ if (this.mDelegate.mSchemeDatesMap == null) {
+ this.mDelegate.mSchemeDatesMap = new HashMap<>();
+ }
+ this.mDelegate.addSchemes(mSchemeDates);
+ this.mDelegate.updateSelectCalendarScheme();
+ this.mYearViewPager.update();
+ this.mMonthPager.updateScheme();
+ this.mWeekPager.updateScheme();
+ }
+
+ /**
+ * 移除某天的标记
+ * 这个API是安全的
+ *
+ * @param calendar calendar
+ */
+ public final void removeSchemeDate(Calendar calendar) {
+ if (calendar == null) {
+ return;
+ }
+ if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) {
+ return;
+ }
+ mDelegate.mSchemeDatesMap.remove(calendar.toString());
+ if (mDelegate.mSelectedCalendar.equals(calendar)) {
+ mDelegate.clearSelectedScheme();
+ }
+
+ mYearViewPager.update();
+ mMonthPager.updateScheme();
+ mWeekPager.updateScheme();
+ }
+
+ /**
+ * 设置背景色
+ *
+ * @param yearViewBackground 年份卡片的背景色
+ * @param weekBackground 星期栏背景色
+ * @param lineBg 线的颜色
+ */
+ public void setBackground(int yearViewBackground, int weekBackground, int lineBg) {
+ mWeekBar.setBackgroundColor(weekBackground);
+ mYearViewPager.setBackgroundColor(yearViewBackground);
+ mWeekLine.setBackgroundColor(lineBg);
+ }
+
+
+ /**
+ * 设置文本颜色
+ *
+ * @param currentDayTextColor 今天字体颜色
+ * @param curMonthTextColor 当前月份字体颜色
+ * @param otherMonthColor 其它月份字体颜色
+ * @param curMonthLunarTextColor 当前月份农历字体颜色
+ * @param otherMonthLunarTextColor 其它农历字体颜色
+ */
+ public void setTextColor(
+ int currentDayTextColor,
+ int curMonthTextColor,
+ int otherMonthColor,
+ int curMonthLunarTextColor,
+ int otherMonthLunarTextColor) {
+ if (mDelegate == null || mMonthPager == null || mWeekPager == null) {
+ return;
+ }
+ mDelegate.setTextColor(currentDayTextColor, curMonthTextColor,
+ otherMonthColor, curMonthLunarTextColor, otherMonthLunarTextColor);
+ mMonthPager.updateStyle();
+ mWeekPager.updateStyle();
+ }
+
+ /**
+ * 设置选择的效果
+ *
+ * @param selectedThemeColor 选中的标记颜色
+ * @param selectedTextColor 选中的字体颜色
+ * @param selectedLunarTextColor 选中的农历字体颜色
+ */
+ public void setSelectedColor(int selectedThemeColor, int selectedTextColor, int selectedLunarTextColor) {
+ if (mDelegate == null || mMonthPager == null || mWeekPager == null) {
+ return;
+ }
+ mDelegate.setSelectColor(selectedThemeColor, selectedTextColor, selectedLunarTextColor);
+ mMonthPager.updateStyle();
+ mWeekPager.updateStyle();
+ }
+
+ /**
+ * 定制颜色
+ *
+ * @param selectedThemeColor 选中的标记颜色
+ * @param schemeColor 标记背景色
+ */
+ public void setThemeColor(int selectedThemeColor, int schemeColor) {
+ if (mDelegate == null || mMonthPager == null || mWeekPager == null) {
+ return;
+ }
+ mDelegate.setThemeColor(selectedThemeColor, schemeColor);
+ mMonthPager.updateStyle();
+ mWeekPager.updateStyle();
+ }
+
+ /**
+ * 设置标记的色
+ *
+ * @param schemeLunarTextColor 标记农历颜色
+ * @param schemeColor 标记背景色
+ * @param schemeTextColor 标记字体颜色
+ */
+ public void setSchemeColor(int schemeColor, int schemeTextColor, int schemeLunarTextColor) {
+ if (mDelegate == null || mMonthPager == null || mWeekPager == null) {
+ return;
+ }
+ mDelegate.setSchemeColor(schemeColor, schemeTextColor, schemeLunarTextColor);
+ mMonthPager.updateStyle();
+ mWeekPager.updateStyle();
+ }
+
+ /**
+ * 设置年视图的颜色
+ *
+ * @param yearViewMonthTextColor 年视图月份颜色
+ * @param yearViewDayTextColor 年视图天的颜色
+ * @param yarViewSchemeTextColor 年视图标记颜色
+ */
+ public void setYearViewTextColor(int yearViewMonthTextColor, int yearViewDayTextColor, int yarViewSchemeTextColor) {
+ if (mDelegate == null || mYearViewPager == null) {
+ return;
+ }
+ mDelegate.setYearViewTextColor(yearViewMonthTextColor, yearViewDayTextColor, yarViewSchemeTextColor);
+ mYearViewPager.updateStyle();
+ }
+
+ /**
+ * 设置星期栏的背景和字体颜色
+ *
+ * @param weekBackground 背景色
+ * @param weekTextColor 字体颜色
+ */
+ public void setWeeColor(int weekBackground, int weekTextColor) {
+ if (mWeekBar == null) {
+ return;
+ }
+ mWeekBar.setBackgroundColor(weekBackground);
+ mWeekBar.setTextColor(weekTextColor);
+ }
+
+
+ public void setCalendarPadding(int mCalendarPadding) {
+ if (mDelegate == null) {
+ return;
+ }
+ mDelegate.setCalendarPadding(mCalendarPadding);
+ update();
+ }
+
+
+ public void setCalendarPaddingLeft(int mCalendarPaddingLeft) {
+ if (mDelegate == null) {
+ return;
+ }
+ mDelegate.setCalendarPaddingLeft(mCalendarPaddingLeft);
+ update();
+ }
+
+ public void setCalendarPaddingRight(int mCalendarPaddingRight) {
+ if (mDelegate == null) {
+ return;
+ }
+ mDelegate.setCalendarPaddingRight(mCalendarPaddingRight);
+ update();
+ }
+
+
+ /**
+ * 默认选择模式
+ */
+ public final void setSelectDefaultMode() {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ return;
+ }
+ mDelegate.mSelectedCalendar = mDelegate.mIndexCalendar;
+ mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_DEFAULT);
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false);
+ mMonthPager.updateDefaultSelect();
+ mWeekPager.updateDefaultSelect();
+
+ }
+
+ /**
+ * 范围模式
+ */
+ public void setSelectRangeMode() {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_RANGE) {
+ return;
+ }
+ mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_RANGE);
+ clearSelectRange();
+ }
+
+ /**
+ * 多选模式
+ */
+ public void setSelectMultiMode() {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_MULTI) {
+ return;
+ }
+ mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_MULTI);
+ clearMultiSelect();
+ }
+
+ /**
+ * 单选模式
+ */
+ public void setSelectSingleMode() {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_SINGLE) {
+ return;
+ }
+ mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_SINGLE);
+ mWeekPager.updateSelected();
+ mMonthPager.updateSelected();
+ }
+
+ /**
+ * 设置星期日周起始
+ */
+ public void setWeekStarWithSun() {
+ setWeekStart(CalendarViewDelegate.WEEK_START_WITH_SUN);
+ }
+
+ /**
+ * 设置星期一周起始
+ */
+ public void setWeekStarWithMon() {
+ setWeekStart(CalendarViewDelegate.WEEK_START_WITH_MON);
+ }
+
+ /**
+ * 设置星期六周起始
+ */
+ public void setWeekStarWithSat() {
+ setWeekStart(CalendarViewDelegate.WEEK_START_WITH_SAT);
+ }
+
+ /**
+ * 设置周起始
+ * CalendarViewDelegate.WEEK_START_WITH_SUN
+ * CalendarViewDelegate.WEEK_START_WITH_MON
+ * CalendarViewDelegate.WEEK_START_WITH_SAT
+ *
+ * @param weekStart 周起始
+ */
+ private void setWeekStart(int weekStart) {
+ if (weekStart != CalendarViewDelegate.WEEK_START_WITH_SUN &&
+ weekStart != CalendarViewDelegate.WEEK_START_WITH_MON &&
+ weekStart != CalendarViewDelegate.WEEK_START_WITH_SAT)
+ return;
+ if (weekStart == mDelegate.getWeekStart())
+ return;
+ mDelegate.setWeekStart(weekStart);
+ mWeekBar.onWeekStartChange(weekStart);
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, weekStart, false);
+ mWeekPager.updateWeekStart();
+ mMonthPager.updateWeekStart();
+ mYearViewPager.updateWeekStart();
+ }
+
+ /**
+ * 是否是单选模式
+ *
+ * @return isSingleSelectMode
+ */
+ public boolean isSingleSelectMode() {
+ return mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_SINGLE;
+ }
+
+ /**
+ * 设置显示模式为全部
+ */
+ public void setAllMode() {
+ setShowMode(CalendarViewDelegate.MODE_ALL_MONTH);
+ }
+
+ /**
+ * 设置显示模式为仅当前月份
+ */
+ public void setOnlyCurrentMode() {
+ setShowMode(CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH);
+ }
+
+ /**
+ * 设置显示模式为填充
+ */
+ public void setFixMode() {
+ setShowMode(CalendarViewDelegate.MODE_FIT_MONTH);
+ }
+
+ /**
+ * 设置显示模式
+ * CalendarViewDelegate.MODE_ALL_MONTH
+ * CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH
+ * CalendarViewDelegate.MODE_FIT_MONTH
+ *
+ * @param mode 月视图显示模式
+ */
+ private void setShowMode(int mode) {
+ if (mode != CalendarViewDelegate.MODE_ALL_MONTH &&
+ mode != CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH &&
+ mode != CalendarViewDelegate.MODE_FIT_MONTH)
+ return;
+ if (mDelegate.getMonthViewShowMode() == mode)
+ return;
+ mDelegate.setMonthViewShowMode(mode);
+ mWeekPager.updateShowMode();
+ mMonthPager.updateShowMode();
+ mWeekPager.notifyDataSetChanged();
+ }
+
+ /**
+ * 更新界面,
+ * 重新设置颜色等都需要调用该方法
+ */
+ public final void update() {
+ mWeekBar.onWeekStartChange(mDelegate.getWeekStart());
+ mYearViewPager.update();
+ mMonthPager.updateScheme();
+ mWeekPager.updateScheme();
+ }
+
+ /**
+ * 更新周视图
+ */
+ public void updateWeekBar() {
+ mWeekBar.onWeekStartChange(mDelegate.getWeekStart());
+ }
+
+
+ /**
+ * 更新当前日期
+ */
+ public final void updateCurrentDate() {
+ if (mDelegate == null || mMonthPager == null || mWeekPager == null) {
+ return;
+ }
+ java.util.Calendar calendar = java.util.Calendar.getInstance();
+ int day = calendar.get(java.util.Calendar.DAY_OF_MONTH);
+ if (getCurDay() == day) {
+ return;
+ }
+ mDelegate.updateCurrentDay();
+ mMonthPager.updateCurrentDate();
+ mWeekPager.updateCurrentDate();
+ }
+
+ /**
+ * 获取当前周数据
+ *
+ * @return 获取当前周数据
+ */
+ public List getCurrentWeekCalendars() {
+ return mWeekPager.getCurrentWeekCalendars();
+ }
+
+
+ /**
+ * 获取当前月份日期
+ *
+ * @return return
+ */
+ public List getCurrentMonthCalendars() {
+ return mMonthPager.getCurrentMonthCalendars();
+ }
+
+ /**
+ * 获取选择的日期
+ *
+ * @return 获取选择的日期
+ */
+ public Calendar getSelectedCalendar() {
+ return mDelegate.mSelectedCalendar;
+ }
+
+ /**
+ * 获得最小范围日期
+ *
+ * @return 最小范围日期
+ */
+ public Calendar getMinRangeCalendar() {
+ return mDelegate.getMinRangeCalendar();
+ }
+
+
+ /**
+ * 获得最大范围日期
+ *
+ * @return 最大范围日期
+ */
+ public Calendar getMaxRangeCalendar() {
+ return mDelegate.getMaxRangeCalendar();
+ }
+
+ /**
+ * MonthViewPager
+ *
+ * @return 获得月视图
+ */
+ public MonthViewPager getMonthViewPager() {
+ return mMonthPager;
+ }
+
+ /**
+ * 获得周视图
+ *
+ * @return 获得周视图
+ */
+ public WeekViewPager getWeekViewPager() {
+ return mWeekPager;
+ }
+
+ /**
+ * 是否在日期范围内
+ *
+ * @param calendar calendar
+ * @return 是否在日期范围内
+ */
+ protected final boolean isInRange(Calendar calendar) {
+ return mDelegate != null && CalendarUtil.isCalendarInRange(calendar, mDelegate);
+ }
+
+
+ /**
+ * 年份视图切换事件,快速年份切换
+ */
+ public interface OnYearChangeListener {
+ void onYearChange(int year);
+ }
+
+ /**
+ * 月份切换事件
+ */
+ public interface OnMonthChangeListener {
+ void onMonthChange(int year, int month);
+ }
+
+
+ /**
+ * 周视图切换事件
+ */
+ public interface OnWeekChangeListener {
+ void onWeekChange(List weekCalendars);
+ }
+
+ /**
+ * 内部日期选择,不暴露外部使用
+ * 主要是用于更新日历CalendarLayout位置
+ */
+ interface OnInnerDateSelectedListener {
+ /**
+ * 月视图点击
+ *
+ * @param calendar calendar
+ * @param isClick 是否是点击
+ */
+ void onMonthDateSelected(Calendar calendar, boolean isClick);
+
+ /**
+ * 周视图点击
+ *
+ * @param calendar calendar
+ * @param isClick 是否是点击
+ */
+ void onWeekDateSelected(Calendar calendar, boolean isClick);
+ }
+
+
+ /**
+ * 日历范围选择事件
+ */
+ public interface OnCalendarRangeSelectListener {
+
+ /**
+ * 范围选择超出范围越界
+ *
+ * @param calendar calendar
+ */
+ void onCalendarSelectOutOfRange(Calendar calendar);
+
+ /**
+ * 选择范围超出范围
+ *
+ * @param calendar calendar
+ * @param isOutOfMinRange 是否小于最小范围,否则为最大范围
+ */
+ void onSelectOutOfRange(Calendar calendar, boolean isOutOfMinRange);
+
+ /**
+ * 日期选择事件
+ *
+ * @param calendar calendar
+ * @param isEnd 是否结束
+ */
+ void onCalendarRangeSelect(Calendar calendar, boolean isEnd);
+ }
+
+
+ /**
+ * 日历多选事件
+ */
+ public interface OnCalendarMultiSelectListener {
+
+ /**
+ * 多选超出范围越界
+ *
+ * @param calendar calendar
+ */
+ void onCalendarMultiSelectOutOfRange(Calendar calendar);
+
+ /**
+ * 多选超出大小
+ *
+ * @param maxSize 最大大小
+ * @param calendar calendar
+ */
+ void onMultiSelectOutOfSize(Calendar calendar, int maxSize);
+
+ /**
+ * 多选事件
+ *
+ * @param calendar calendar
+ * @param curSize curSize
+ * @param maxSize maxSize
+ */
+ void onCalendarMultiSelect(Calendar calendar, int curSize, int maxSize);
+ }
+
+ /**
+ * 日历选择事件
+ */
+ public interface OnCalendarSelectListener {
+
+ /**
+ * 超出范围越界
+ *
+ * @param calendar calendar
+ */
+ void onCalendarOutOfRange(Calendar calendar);
+
+ /**
+ * 日期选择事件
+ *
+ * @param calendar calendar
+ * @param isClick isClick
+ */
+ void onCalendarSelect(Calendar calendar, boolean isClick);
+ }
+
+ public interface OnCalendarLongClickListener {
+
+ /**
+ * 超出范围越界
+ *
+ * @param calendar calendar
+ */
+ void onCalendarLongClickOutOfRange(Calendar calendar);
+
+ /**
+ * 日期长按事件
+ *
+ * @param calendar calendar
+ */
+ void onCalendarLongClick(Calendar calendar);
+ }
+
+ /**
+ * 视图改变事件
+ */
+ public interface OnViewChangeListener {
+ /**
+ * 视图改变事件
+ *
+ * @param isMonthView isMonthView是否是月视图
+ */
+ void onViewChange(boolean isMonthView);
+ }
+
+ /**
+ * 年视图改变事件
+ */
+ public interface OnYearViewChangeListener {
+ /**
+ * 年视图变化
+ *
+ * @param isClose 是否关闭
+ */
+ void onYearViewChange(boolean isClose);
+ }
+
+ /**
+ * 拦截日期是否可用事件
+ */
+ public interface OnCalendarInterceptListener {
+ boolean onCalendarIntercept(Calendar calendar);
+
+ void onCalendarInterceptClick(Calendar calendar, boolean isClick);
+ }
+
+ /**
+ * 点击Padding位置事件
+ */
+ public interface OnClickCalendarPaddingListener {
+ /**
+ * 点击Padding位置的事件
+ *
+ * @param x x坐标
+ * @param y y坐标
+ * @param isMonthView 是否是月视图,不是则为周视图
+ * @param adjacentCalendar 相邻的日历日期
+ * @param obj 此处的对象,自行设置
+ */
+ void onClickCalendarPadding(float x, float y, boolean isMonthView,
+ Calendar adjacentCalendar, Object obj);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java
new file mode 100644
index 0000000..22aeea2
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java
@@ -0,0 +1,1189 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Google规范化的属性委托,
+ * 代码量多,但是不影响阅读性
+ */
+final class CalendarViewDelegate {
+
+ /**
+ * 周起始:周日
+ */
+ static final int WEEK_START_WITH_SUN = 1;
+
+ /**
+ * 周起始:周一
+ */
+ static final int WEEK_START_WITH_MON = 2;
+
+ /**
+ * 周起始:周六
+ */
+ static final int WEEK_START_WITH_SAT = 7;
+
+ /**
+ * 默认选择日期1号first_day_of_month
+ */
+ static final int FIRST_DAY_OF_MONTH = 0;
+
+ /**
+ * 跟随上个月last_select_day
+ */
+ static final int LAST_MONTH_VIEW_SELECT_DAY = 1;
+
+ /**
+ * 跟随上个月last_select_day_ignore_current忽视今天
+ */
+ static final int LAST_MONTH_VIEW_SELECT_DAY_IGNORE_CURRENT = 2;
+
+ private int mDefaultCalendarSelectDay;
+
+ /**
+ * 周起始
+ */
+ private int mWeekStart;
+
+ /**
+ * 全部显示
+ */
+ static final int MODE_ALL_MONTH = 0;
+ /**
+ * 仅显示当前月份
+ */
+ static final int MODE_ONLY_CURRENT_MONTH = 1;
+
+ /**
+ * 自适应显示,不会多出一行,但是会自动填充
+ */
+ static final int MODE_FIT_MONTH = 2;
+
+ /**
+ * 月份显示模式
+ */
+ private int mMonthViewShowMode;
+
+
+ /**
+ * 默认选择模式
+ */
+ static final int SELECT_MODE_DEFAULT = 0;
+
+ /**
+ * 单选模式
+ */
+ static final int SELECT_MODE_SINGLE = 1;
+
+ /**
+ * 范围选择模式
+ */
+ static final int SELECT_MODE_RANGE = 2;
+
+ /**
+ * 多选模式
+ */
+ static final int SELECT_MODE_MULTI = 3;
+
+ /**
+ * 选择模式
+ */
+ private int mSelectMode;
+
+
+ /**
+ * 支持转换的最小农历年份
+ */
+ static final int MIN_YEAR = 1900;
+ /**
+ * 支持转换的最大农历年份
+ */
+ private static final int MAX_YEAR = 2099;
+
+ /**
+ * 各种字体颜色,看名字知道对应的地方
+ */
+ private int mCurDayTextColor,
+ mCurDayLunarTextColor,
+ mWeekTextColor,
+ mSchemeTextColor,
+ mSchemeLunarTextColor,
+ mOtherMonthTextColor,
+ mCurrentMonthTextColor,
+ mSelectedTextColor,
+ mSelectedLunarTextColor,
+ mCurMonthLunarTextColor,
+ mOtherMonthLunarTextColor;
+
+ private boolean preventLongPressedSelected;
+
+ /**
+ * 年视图一些padding
+ */
+ private int
+ mYearViewPadding,
+ mYearViewPaddingLeft,
+ mYearViewPaddingRight;
+
+ /**
+ * 年视图一些padding
+ */
+ private int
+ mYearViewMonthPaddingLeft,
+ mYearViewMonthPaddingRight,
+ mYearViewMonthPaddingTop,
+ mYearViewMonthPaddingBottom;
+
+ /**
+ * 日历内部左右padding
+ */
+ private int mCalendarPadding;
+
+ /**
+ * 日历内部左padding
+ */
+ private int mCalendarPaddingLeft;
+
+ /**
+ * 日历内部右padding
+ */
+ private int mCalendarPaddingRight;
+
+ /**
+ * 年视图字体大小
+ */
+ private int mYearViewMonthTextSize,
+ mYearViewDayTextSize,
+ mYearViewWeekTextSize;
+
+ /**
+ * 年视图月份高度和周的高度
+ */
+ private int mYearViewMonthHeight,
+ mYearViewWeekHeight;
+
+
+ /**
+ * 年视图字体和标记颜色
+ */
+ private int mYearViewMonthTextColor,
+ mYearViewDayTextColor,
+ mYearViewSchemeTextColor,
+ mYearViewSelectTextColor,
+ mYearViewCurDayTextColor,
+ mYearViewWeekTextColor;
+
+ /**
+ * 星期栏的背景、线的背景、年份背景
+ */
+ private int mWeekLineBackground,
+ mYearViewBackground,
+ mWeekBackground;
+
+ /**
+ * 星期栏Line margin
+ */
+ private int mWeekLineMargin;
+
+ /**
+ * 星期栏字体大小
+ */
+ private int mWeekTextSize;
+
+ /**
+ * 标记的主题色和选中的主题色
+ */
+ private int mSchemeThemeColor, mSelectedThemeColor;
+
+
+ /**
+ * 自定义的日历路径
+ */
+ private String mMonthViewClassPath;
+
+ /**
+ * 月视图类
+ */
+ private Class> mMonthViewClass;
+
+ /**
+ * 自定义周视图路径
+ */
+ private String mWeekViewClassPath;
+
+ /**
+ * 周视图类
+ */
+ private Class> mWeekViewClass;
+
+ /**
+ * 自定义年视图路径
+ */
+ private String mYearViewClassPath;
+
+ /**
+ * 周视图类
+ */
+ private Class> mYearViewClass;
+
+ /**
+ * 自定义周栏路径
+ */
+ private String mWeekBarClassPath;
+
+ /**
+ * 自定义周栏
+ */
+ private Class> mWeekBarClass;
+
+ /**
+ * 年月视图是否打开
+ */
+ boolean isShowYearSelectedLayout;
+
+ /**
+ * 标记文本
+ */
+ private String mSchemeText;
+
+ /**
+ * 最小年份和最大年份
+ */
+ private int mMinYear, mMaxYear;
+
+ /**
+ * 最小年份和最大年份对应最小月份和最大月份
+ * when you want set 2015-07 to 2017-08
+ */
+ private int mMinYearMonth, mMaxYearMonth;
+
+ /**
+ * 最小年份和最大年份对应最小天和最大天数
+ * when you want set like 2015-07-08 to 2017-08-30
+ */
+ private int mMinYearDay, mMaxYearDay;
+
+ /**
+ * 日期和农历文本大小
+ */
+ private int mDayTextSize, mLunarTextSize;
+
+ /**
+ * 日历卡的项高度
+ */
+ private int mCalendarItemHeight;
+
+ /**
+ * 是否是全屏日历
+ */
+ private boolean isFullScreenCalendar;
+
+ /**
+ * 星期栏的高度
+ */
+ private int mWeekBarHeight;
+
+ /**
+ * 今天的日子
+ */
+ private Calendar mCurrentDate;
+
+
+ private boolean mMonthViewScrollable,
+ mWeekViewScrollable,
+ mYearViewScrollable;
+
+ /**
+ * 当前月份和周视图的item位置
+ */
+ int mCurrentMonthViewItem;
+
+ /**
+ * 标记的日期,数量巨大,请使用这个
+ */
+ Map mSchemeDatesMap;
+
+ /**
+ * 点击Padding位置事件
+ */
+ CalendarView.OnClickCalendarPaddingListener mClickCalendarPaddingListener;
+
+ /**
+ * 日期拦截事件
+ */
+ CalendarView.OnCalendarInterceptListener mCalendarInterceptListener;
+
+ /**
+ * 日期选中监听
+ */
+ CalendarView.OnCalendarSelectListener mCalendarSelectListener;
+
+ /**
+ * 范围选择
+ */
+ CalendarView.OnCalendarRangeSelectListener mCalendarRangeSelectListener;
+
+
+ /**
+ * 多选选择事件
+ */
+ CalendarView.OnCalendarMultiSelectListener mCalendarMultiSelectListener;
+
+ /**
+ * 外部日期长按事件
+ */
+ CalendarView.OnCalendarLongClickListener mCalendarLongClickListener;
+
+ /**
+ * 内部日期切换监听,用于内部更新计算
+ */
+ CalendarView.OnInnerDateSelectedListener mInnerListener;
+
+ /**
+ * 快速年份切换
+ */
+ CalendarView.OnYearChangeListener mYearChangeListener;
+
+
+ /**
+ * 月份切换事件
+ */
+ CalendarView.OnMonthChangeListener mMonthChangeListener;
+
+ /**
+ * 周视图改变事件
+ */
+ CalendarView.OnWeekChangeListener mWeekChangeListener;
+
+ /**
+ * 视图改变事件
+ */
+ CalendarView.OnViewChangeListener mViewChangeListener;
+
+
+ /**
+ * 年视图改变事件
+ */
+ CalendarView.OnYearViewChangeListener mYearViewChangeListener;
+
+ /**
+ * 保存选中的日期
+ */
+ Calendar mSelectedCalendar;
+
+ /**
+ * 保存标记位置
+ */
+ Calendar mIndexCalendar;
+
+ /**
+ * 多选日历
+ */
+ Map mSelectedCalendars = new HashMap<>();
+
+ private int mMaxMultiSelectSize;
+
+ /**
+ * 选择范围日历
+ */
+ Calendar mSelectedStartRangeCalendar, mSelectedEndRangeCalendar;
+
+ private int mMinSelectRange, mMaxSelectRange;
+
+ CalendarViewDelegate(Context context, @Nullable AttributeSet attrs) {
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CalendarView);
+
+ LunarCalendar.init(context);
+
+ mCalendarPadding = (int) array.getDimension(R.styleable.CalendarView_calendar_padding, 0);
+ mCalendarPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_calendar_padding_left, 0);
+ mCalendarPaddingRight = (int) array.getDimension(R.styleable.CalendarView_calendar_padding_right, 0);
+
+ if (mCalendarPadding != 0) {
+ mCalendarPaddingLeft = mCalendarPadding;
+ mCalendarPaddingRight = mCalendarPadding;
+ }
+
+ mSchemeTextColor = array.getColor(R.styleable.CalendarView_scheme_text_color, 0xFFFFFFFF);
+ mSchemeLunarTextColor = array.getColor(R.styleable.CalendarView_scheme_lunar_text_color, 0xFFe1e1e1);
+ mSchemeThemeColor = array.getColor(R.styleable.CalendarView_scheme_theme_color, 0x50CFCFCF);
+ mMonthViewClassPath = array.getString(R.styleable.CalendarView_month_view);
+ mYearViewClassPath = array.getString(R.styleable.CalendarView_year_view);
+ mWeekViewClassPath = array.getString(R.styleable.CalendarView_week_view);
+ mWeekBarClassPath = array.getString(R.styleable.CalendarView_week_bar_view);
+ mWeekTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_week_text_size,
+ CalendarUtil.dipToPx(context, 12));
+ mWeekBarHeight = (int) array.getDimension(R.styleable.CalendarView_week_bar_height,
+ CalendarUtil.dipToPx(context, 40));
+ mWeekLineMargin = (int) array.getDimension(R.styleable.CalendarView_week_line_margin,
+ CalendarUtil.dipToPx(context, 0));
+
+ mSchemeText = array.getString(R.styleable.CalendarView_scheme_text);
+ if (TextUtils.isEmpty(mSchemeText)) {
+ mSchemeText = "记";
+ }
+
+ mMonthViewScrollable = array.getBoolean(R.styleable.CalendarView_month_view_scrollable, true);
+ mWeekViewScrollable = array.getBoolean(R.styleable.CalendarView_week_view_scrollable, true);
+ mYearViewScrollable = array.getBoolean(R.styleable.CalendarView_year_view_scrollable, true);
+
+ mDefaultCalendarSelectDay = array.getInt(R.styleable.CalendarView_month_view_auto_select_day,
+ FIRST_DAY_OF_MONTH);
+
+ mMonthViewShowMode = array.getInt(R.styleable.CalendarView_month_view_show_mode, MODE_ALL_MONTH);
+ mWeekStart = array.getInt(R.styleable.CalendarView_week_start_with, WEEK_START_WITH_SUN);
+ mSelectMode = array.getInt(R.styleable.CalendarView_select_mode, SELECT_MODE_DEFAULT);
+ mMaxMultiSelectSize = array.getInt(R.styleable.CalendarView_max_multi_select_size, Integer.MAX_VALUE);
+ mMinSelectRange = array.getInt(R.styleable.CalendarView_min_select_range, -1);
+ mMaxSelectRange = array.getInt(R.styleable.CalendarView_max_select_range, -1);
+ setSelectRange(mMinSelectRange, mMaxSelectRange);
+
+ mWeekBackground = array.getColor(R.styleable.CalendarView_week_background, Color.WHITE);
+ mWeekLineBackground = array.getColor(R.styleable.CalendarView_week_line_background, Color.TRANSPARENT);
+ mYearViewBackground = array.getColor(R.styleable.CalendarView_year_view_background, Color.WHITE);
+ mWeekTextColor = array.getColor(R.styleable.CalendarView_week_text_color, 0xFF333333);
+
+ mCurDayTextColor = array.getColor(R.styleable.CalendarView_current_day_text_color, Color.RED);
+ mCurDayLunarTextColor = array.getColor(R.styleable.CalendarView_current_day_lunar_text_color, Color.RED);
+
+ mSelectedThemeColor = array.getColor(R.styleable.CalendarView_selected_theme_color, 0x50CFCFCF);
+ mSelectedTextColor = array.getColor(R.styleable.CalendarView_selected_text_color, 0xFF111111);
+
+ mSelectedLunarTextColor = array.getColor(R.styleable.CalendarView_selected_lunar_text_color, 0xFF111111);
+ mCurrentMonthTextColor = array.getColor(R.styleable.CalendarView_current_month_text_color, 0xFF111111);
+ mOtherMonthTextColor = array.getColor(R.styleable.CalendarView_other_month_text_color, 0xFFe1e1e1);
+
+ mCurMonthLunarTextColor = array.getColor(R.styleable.CalendarView_current_month_lunar_text_color, 0xffe1e1e1);
+ mOtherMonthLunarTextColor = array.getColor(R.styleable.CalendarView_other_month_lunar_text_color, 0xffe1e1e1);
+ mMinYear = array.getInt(R.styleable.CalendarView_min_year, 1971);
+ mMaxYear = array.getInt(R.styleable.CalendarView_max_year, 2055);
+ mMinYearMonth = array.getInt(R.styleable.CalendarView_min_year_month, 1);
+ mMaxYearMonth = array.getInt(R.styleable.CalendarView_max_year_month, 12);
+ mMinYearDay = array.getInt(R.styleable.CalendarView_min_year_day, 1);
+ mMaxYearDay = array.getInt(R.styleable.CalendarView_max_year_day, -1);
+
+ mDayTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_day_text_size,
+ CalendarUtil.dipToPx(context, 16));
+ mLunarTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_lunar_text_size,
+ CalendarUtil.dipToPx(context, 10));
+ mCalendarItemHeight = (int) array.getDimension(R.styleable.CalendarView_calendar_height,
+ CalendarUtil.dipToPx(context, 56));
+ isFullScreenCalendar = array.getBoolean(R.styleable.CalendarView_calendar_match_parent, false);
+
+ //年视图相关
+ mYearViewMonthTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_month_text_size,
+ CalendarUtil.dipToPx(context, 18));
+ mYearViewDayTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_day_text_size,
+ CalendarUtil.dipToPx(context, 7));
+ mYearViewMonthTextColor = array.getColor(R.styleable.CalendarView_year_view_month_text_color, 0xFF111111);
+ mYearViewDayTextColor = array.getColor(R.styleable.CalendarView_year_view_day_text_color, 0xFF111111);
+ mYearViewSchemeTextColor = array.getColor(R.styleable.CalendarView_year_view_scheme_color, mSchemeThemeColor);
+ mYearViewWeekTextColor = array.getColor(R.styleable.CalendarView_year_view_week_text_color, 0xFF333333);
+ mYearViewCurDayTextColor = array.getColor(R.styleable.CalendarView_year_view_current_day_text_color, mCurDayTextColor);
+ mYearViewSelectTextColor = array.getColor(R.styleable.CalendarView_year_view_select_text_color, 0xFF333333);
+ mYearViewWeekTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_week_text_size,
+ CalendarUtil.dipToPx(context, 8));
+ mYearViewMonthHeight = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_month_height,
+ CalendarUtil.dipToPx(context, 32));
+ mYearViewWeekHeight = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_week_height,
+ CalendarUtil.dipToPx(context, 0));
+
+ mYearViewPadding = (int) array.getDimension(R.styleable.CalendarView_year_view_padding,
+ CalendarUtil.dipToPx(context, 12));
+ mYearViewPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_year_view_padding_left,
+ CalendarUtil.dipToPx(context, 12));
+ mYearViewPaddingRight = (int) array.getDimension(R.styleable.CalendarView_year_view_padding_right,
+ CalendarUtil.dipToPx(context, 12));
+
+ if (mYearViewPadding != 0) {
+ mYearViewPaddingLeft = mYearViewPadding;
+ mYearViewPaddingRight = mYearViewPadding;
+ }
+
+ mYearViewMonthPaddingTop = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_top,
+ CalendarUtil.dipToPx(context, 4));
+ mYearViewMonthPaddingBottom = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_bottom,
+ CalendarUtil.dipToPx(context, 4));
+
+ mYearViewMonthPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_left,
+ CalendarUtil.dipToPx(context, 4));
+ mYearViewMonthPaddingRight = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_right,
+ CalendarUtil.dipToPx(context, 4));
+
+ if (mMinYear <= MIN_YEAR) mMinYear = MIN_YEAR;
+ if (mMaxYear >= MAX_YEAR) mMaxYear = MAX_YEAR;
+ array.recycle();
+ init();
+ }
+
+ private void init() {
+ mCurrentDate = new Calendar();
+ Date d = new Date();
+ mCurrentDate.setYear(CalendarUtil.getDate("yyyy", d));
+ mCurrentDate.setMonth(CalendarUtil.getDate("MM", d));
+ mCurrentDate.setDay(CalendarUtil.getDate("dd", d));
+ mCurrentDate.setCurrentDay(true);
+ LunarCalendar.setupLunarCalendar(mCurrentDate);
+ setRange(mMinYear, mMinYearMonth, mMaxYear, mMaxYearMonth);
+
+ try {
+ mWeekBarClass = TextUtils.isEmpty(mWeekBarClassPath) ?
+ mWeekBarClass = WeekBar.class : Class.forName(mWeekBarClassPath);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ try {
+ mYearViewClass = TextUtils.isEmpty(mYearViewClassPath) ?
+ mYearViewClass = DefaultYearView.class : Class.forName(mYearViewClassPath);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ mMonthViewClass = TextUtils.isEmpty(mMonthViewClassPath) ?
+ DefaultMonthView.class : Class.forName(mMonthViewClassPath);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ mWeekViewClass = TextUtils.isEmpty(mWeekViewClassPath) ?
+ DefaultWeekView.class : Class.forName(mWeekViewClassPath);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ private void setRange(int minYear, int minYearMonth,
+ int maxYear, int maxYearMonth) {
+ this.mMinYear = minYear;
+ this.mMinYearMonth = minYearMonth;
+ this.mMaxYear = maxYear;
+ this.mMaxYearMonth = maxYearMonth;
+ if (this.mMaxYear < mCurrentDate.getYear()) {
+ this.mMaxYear = mCurrentDate.getYear();
+ }
+ if (this.mMaxYearDay == -1) {
+ this.mMaxYearDay = CalendarUtil.getMonthDaysCount(this.mMaxYear, mMaxYearMonth);
+ }
+ int y = mCurrentDate.getYear() - this.mMinYear;
+ mCurrentMonthViewItem = 12 * y + mCurrentDate.getMonth() - this.mMinYearMonth;
+ }
+
+ void setRange(int minYear, int minYearMonth, int minYearDay,
+ int maxYear, int maxYearMonth, int maxYearDay) {
+ this.mMinYear = minYear;
+ this.mMinYearMonth = minYearMonth;
+ this.mMinYearDay = minYearDay;
+ this.mMaxYear = maxYear;
+ this.mMaxYearMonth = maxYearMonth;
+ this.mMaxYearDay = maxYearDay;
+// if (this.mMaxYear < mCurrentDate.getYear()) {
+// this.mMaxYear = mCurrentDate.getYear();
+// }
+ if (this.mMaxYearDay == -1) {
+ this.mMaxYearDay = CalendarUtil.getMonthDaysCount(this.mMaxYear, mMaxYearMonth);
+ }
+ int y = mCurrentDate.getYear() - this.mMinYear;
+ mCurrentMonthViewItem = 12 * y + mCurrentDate.getMonth() - this.mMinYearMonth;
+ }
+
+ String getSchemeText() {
+ return mSchemeText;
+ }
+
+ int getCurDayTextColor() {
+ return mCurDayTextColor;
+ }
+
+ int getCurDayLunarTextColor() {
+ return mCurDayLunarTextColor;
+ }
+
+ int getWeekTextColor() {
+ return mWeekTextColor;
+ }
+
+ int getSchemeTextColor() {
+ return mSchemeTextColor;
+ }
+
+ int getSchemeLunarTextColor() {
+ return mSchemeLunarTextColor;
+ }
+
+ int getOtherMonthTextColor() {
+ return mOtherMonthTextColor;
+ }
+
+ int getCurrentMonthTextColor() {
+ return mCurrentMonthTextColor;
+ }
+
+ int getSelectedTextColor() {
+ return mSelectedTextColor;
+ }
+
+ int getSelectedLunarTextColor() {
+ return mSelectedLunarTextColor;
+ }
+
+ int getCurrentMonthLunarTextColor() {
+ return mCurMonthLunarTextColor;
+ }
+
+ int getOtherMonthLunarTextColor() {
+ return mOtherMonthLunarTextColor;
+ }
+
+ int getSchemeThemeColor() {
+ return mSchemeThemeColor;
+ }
+
+ int getSelectedThemeColor() {
+ return mSelectedThemeColor;
+ }
+
+ int getWeekBackground() {
+ return mWeekBackground;
+ }
+
+ int getYearViewBackground() {
+ return mYearViewBackground;
+ }
+
+ int getWeekLineBackground() {
+ return mWeekLineBackground;
+ }
+
+ int getWeekLineMargin() {
+ return mWeekLineMargin;
+ }
+
+ Class> getMonthViewClass() {
+ return mMonthViewClass;
+ }
+
+ Class> getWeekViewClass() {
+ return mWeekViewClass;
+ }
+
+ Class> getWeekBarClass() {
+ return mWeekBarClass;
+ }
+
+ Class> getYearViewClass() {
+ return mYearViewClass;
+ }
+
+ String getYearViewClassPath() {
+ return mYearViewClassPath;
+ }
+
+ int getWeekBarHeight() {
+ return mWeekBarHeight;
+ }
+
+ int getMinYear() {
+ return mMinYear;
+ }
+
+ int getMaxYear() {
+ return mMaxYear;
+ }
+
+ int getDayTextSize() {
+ return mDayTextSize;
+ }
+
+ int getLunarTextSize() {
+ return mLunarTextSize;
+ }
+
+ int getCalendarItemHeight() {
+ return mCalendarItemHeight;
+ }
+
+ void setCalendarItemHeight(int height) {
+ mCalendarItemHeight = height;
+ }
+
+ int getMinYearMonth() {
+ return mMinYearMonth;
+ }
+
+ int getMaxYearMonth() {
+ return mMaxYearMonth;
+ }
+
+
+ int getYearViewMonthTextSize() {
+ return mYearViewMonthTextSize;
+ }
+
+ int getYearViewMonthTextColor() {
+ return mYearViewMonthTextColor;
+ }
+
+ int getYearViewWeekTextSize() {
+ return mYearViewWeekTextSize;
+ }
+
+ int getYearViewWeekTextColor() {
+ return mYearViewWeekTextColor;
+ }
+
+ int getYearViewSelectTextColor() {
+ return mYearViewSelectTextColor;
+ }
+
+ int getYearViewCurDayTextColor() {
+ return mYearViewCurDayTextColor;
+ }
+
+ @SuppressWarnings("unused")
+ int getYearViewPadding() {
+ return mYearViewPadding;
+ }
+
+ int getYearViewPaddingLeft() {
+ return mYearViewPaddingLeft;
+ }
+
+ int getYearViewPaddingRight() {
+ return mYearViewPaddingRight;
+ }
+
+
+ int getYearViewMonthPaddingLeft() {
+ return mYearViewMonthPaddingLeft;
+ }
+
+ int getYearViewMonthPaddingRight() {
+ return mYearViewMonthPaddingRight;
+ }
+
+ int getYearViewMonthPaddingTop() {
+ return mYearViewMonthPaddingTop;
+ }
+
+ int getYearViewMonthPaddingBottom() {
+ return mYearViewMonthPaddingBottom;
+ }
+
+ int getYearViewWeekHeight() {
+ return mYearViewWeekHeight;
+ }
+
+ int getYearViewMonthHeight() {
+ return mYearViewMonthHeight;
+ }
+
+ int getYearViewDayTextColor() {
+ return mYearViewDayTextColor;
+ }
+
+ int getYearViewDayTextSize() {
+ return mYearViewDayTextSize;
+ }
+
+ int getYearViewSchemeTextColor() {
+ return mYearViewSchemeTextColor;
+ }
+
+ int getMonthViewShowMode() {
+ return mMonthViewShowMode;
+ }
+
+ void setMonthViewShowMode(int monthViewShowMode) {
+ this.mMonthViewShowMode = monthViewShowMode;
+ }
+
+ void setTextColor(int curDayTextColor, int curMonthTextColor, int otherMonthTextColor, int curMonthLunarTextColor, int otherMonthLunarTextColor) {
+ mCurDayTextColor = curDayTextColor;
+ mOtherMonthTextColor = otherMonthTextColor;
+ mCurrentMonthTextColor = curMonthTextColor;
+ mCurMonthLunarTextColor = curMonthLunarTextColor;
+ mOtherMonthLunarTextColor = otherMonthLunarTextColor;
+ }
+
+ void setSchemeColor(int schemeColor, int schemeTextColor, int schemeLunarTextColor) {
+ this.mSchemeThemeColor = schemeColor;
+ this.mSchemeTextColor = schemeTextColor;
+ this.mSchemeLunarTextColor = schemeLunarTextColor;
+ }
+
+ void setYearViewTextColor(int yearViewMonthTextColor, int yearViewDayTextColor, int yarViewSchemeTextColor) {
+ this.mYearViewMonthTextColor = yearViewMonthTextColor;
+ this.mYearViewDayTextColor = yearViewDayTextColor;
+ this.mYearViewSchemeTextColor = yarViewSchemeTextColor;
+ }
+
+ void setSelectColor(int selectedColor, int selectedTextColor, int selectedLunarTextColor) {
+ this.mSelectedThemeColor = selectedColor;
+ this.mSelectedTextColor = selectedTextColor;
+ this.mSelectedLunarTextColor = selectedLunarTextColor;
+ }
+
+ void setThemeColor(int selectedThemeColor, int schemeColor) {
+ this.mSelectedThemeColor = selectedThemeColor;
+ this.mSchemeThemeColor = schemeColor;
+ }
+
+ boolean isMonthViewScrollable() {
+ return mMonthViewScrollable;
+ }
+
+ boolean isWeekViewScrollable() {
+ return mWeekViewScrollable;
+ }
+
+ boolean isYearViewScrollable() {
+ return mYearViewScrollable;
+ }
+
+ void setMonthViewScrollable(boolean monthViewScrollable) {
+ this.mMonthViewScrollable = monthViewScrollable;
+ }
+
+ void setWeekViewScrollable(boolean weekViewScrollable) {
+ this.mWeekViewScrollable = weekViewScrollable;
+ }
+
+ void setYearViewScrollable(boolean yearViewScrollable) {
+ this.mYearViewScrollable = yearViewScrollable;
+ }
+
+ int getWeekStart() {
+ return mWeekStart;
+ }
+
+ void setWeekStart(int mWeekStart) {
+ this.mWeekStart = mWeekStart;
+ }
+
+ void setDefaultCalendarSelectDay(int defaultCalendarSelect) {
+ this.mDefaultCalendarSelectDay = defaultCalendarSelect;
+ }
+
+ int getDefaultCalendarSelectDay() {
+ return mDefaultCalendarSelectDay;
+ }
+
+ int getWeekTextSize() {
+ return mWeekTextSize;
+ }
+
+ /**
+ * 选择模式
+ *
+ * @return 选择模式
+ */
+ int getSelectMode() {
+ return mSelectMode;
+ }
+
+ /**
+ * 设置选择模式
+ *
+ * @param mSelectMode mSelectMode
+ */
+ void setSelectMode(int mSelectMode) {
+ this.mSelectMode = mSelectMode;
+ }
+
+ int getMinSelectRange() {
+ return mMinSelectRange;
+ }
+
+ int getMaxSelectRange() {
+ return mMaxSelectRange;
+ }
+
+ int getMaxMultiSelectSize() {
+ return mMaxMultiSelectSize;
+ }
+
+ void setMaxMultiSelectSize(int maxMultiSelectSize) {
+ this.mMaxMultiSelectSize = maxMultiSelectSize;
+ }
+
+ final void setSelectRange(int minRange, int maxRange) {
+ if (minRange > maxRange && maxRange > 0) {
+ mMaxSelectRange = minRange;
+ mMinSelectRange = minRange;
+ return;
+ }
+ if (minRange <= 0) {
+ mMinSelectRange = -1;
+ } else {
+ mMinSelectRange = minRange;
+ }
+ if (maxRange <= 0) {
+ mMaxSelectRange = -1;
+ } else {
+ mMaxSelectRange = maxRange;
+ }
+ }
+
+ Calendar getCurrentDay() {
+ return mCurrentDate;
+ }
+
+ void updateCurrentDay() {
+ Date d = new Date();
+ mCurrentDate.setYear(CalendarUtil.getDate("yyyy", d));
+ mCurrentDate.setMonth(CalendarUtil.getDate("MM", d));
+ mCurrentDate.setDay(CalendarUtil.getDate("dd", d));
+ LunarCalendar.setupLunarCalendar(mCurrentDate);
+ }
+
+ @SuppressWarnings("unused")
+ int getCalendarPadding() {
+ return mCalendarPadding;
+ }
+
+ void setCalendarPadding(int mCalendarPadding) {
+ this.mCalendarPadding = mCalendarPadding;
+ mCalendarPaddingLeft = mCalendarPadding;
+ mCalendarPaddingRight = mCalendarPadding;
+ }
+
+ int getCalendarPaddingLeft() {
+ return mCalendarPaddingLeft;
+ }
+
+ void setCalendarPaddingLeft(int mCalendarPaddingLeft) {
+ this.mCalendarPaddingLeft = mCalendarPaddingLeft;
+ }
+
+ int getCalendarPaddingRight() {
+ return mCalendarPaddingRight;
+ }
+
+ void setCalendarPaddingRight(int mCalendarPaddingRight) {
+ this.mCalendarPaddingRight = mCalendarPaddingRight;
+ }
+
+ void setPreventLongPressedSelected(boolean preventLongPressedSelected) {
+ this.preventLongPressedSelected = preventLongPressedSelected;
+ }
+
+ void setMonthViewClass(Class> monthViewClass) {
+ this.mMonthViewClass = monthViewClass;
+ }
+
+ void setWeekBarClass(Class> weekBarClass) {
+ this.mWeekBarClass = weekBarClass;
+ }
+
+ void setWeekViewClass(Class> weekViewClass) {
+ this.mWeekViewClass = weekViewClass;
+ }
+
+ boolean isPreventLongPressedSelected() {
+ return preventLongPressedSelected;
+ }
+
+ void clearSelectedScheme() {
+ mSelectedCalendar.clearScheme();
+ }
+
+ int getMinYearDay() {
+ return mMinYearDay;
+ }
+
+ int getMaxYearDay() {
+ return mMaxYearDay;
+ }
+
+ boolean isFullScreenCalendar() {
+ return isFullScreenCalendar;
+ }
+
+ final void updateSelectCalendarScheme() {
+ if (mSchemeDatesMap != null && mSchemeDatesMap.size() > 0) {
+ String key = mSelectedCalendar.toString();
+ if (mSchemeDatesMap.containsKey(key)) {
+ Calendar d = mSchemeDatesMap.get(key);
+ mSelectedCalendar.mergeScheme(d, getSchemeText());
+ }
+ } else {
+ clearSelectedScheme();
+ }
+ }
+
+ final void updateCalendarScheme(Calendar targetCalendar) {
+ if (targetCalendar == null) {
+ return;
+ }
+ if (mSchemeDatesMap == null || mSchemeDatesMap.size() == 0) {
+ return;
+ }
+ String key = targetCalendar.toString();
+ if (mSchemeDatesMap.containsKey(key)) {
+ Calendar d = mSchemeDatesMap.get(key);
+ targetCalendar.mergeScheme(d, getSchemeText());
+ }
+ }
+
+ Calendar createCurrentDate() {
+ Calendar calendar = new Calendar();
+ calendar.setYear(mCurrentDate.getYear());
+ calendar.setWeek(mCurrentDate.getWeek());
+ calendar.setMonth(mCurrentDate.getMonth());
+ calendar.setDay(mCurrentDate.getDay());
+ calendar.setCurrentDay(true);
+ LunarCalendar.setupLunarCalendar(calendar);
+ return calendar;
+ }
+
+ final Calendar getMinRangeCalendar() {
+ Calendar calendar = new Calendar();
+ calendar.setYear(mMinYear);
+ calendar.setMonth(mMinYearMonth);
+ calendar.setDay(mMinYearDay);
+ calendar.setCurrentDay(calendar.equals(mCurrentDate));
+ LunarCalendar.setupLunarCalendar(calendar);
+ return calendar;
+ }
+
+ @SuppressWarnings("unused")
+ final Calendar getMaxRangeCalendar() {
+ Calendar calendar = new Calendar();
+ calendar.setYear(mMaxYear);
+ calendar.setMonth(mMaxYearMonth);
+ calendar.setDay(mMaxYearDay);
+ calendar.setCurrentDay(calendar.equals(mCurrentDate));
+ LunarCalendar.setupLunarCalendar(calendar);
+ return calendar;
+ }
+
+ /**
+ * 添加事件标记,来自Map
+ */
+ final void addSchemesFromMap(List mItems) {
+ if (mSchemeDatesMap == null || mSchemeDatesMap.size() == 0) {
+ return;
+ }
+ for (Calendar a : mItems) {
+ if (mSchemeDatesMap.containsKey(a.toString())) {
+ Calendar d = mSchemeDatesMap.get(a.toString());
+ if (d == null) {
+ continue;
+ }
+ a.setScheme(TextUtils.isEmpty(d.getScheme()) ? getSchemeText() : d.getScheme());
+ a.setSchemeColor(d.getSchemeColor());
+ a.setSchemes(d.getSchemes());
+ } else {
+ a.setScheme("");
+ a.setSchemeColor(0);
+ a.setSchemes(null);
+ }
+ }
+ }
+
+ /**
+ * 添加数据
+ *
+ * @param mSchemeDates mSchemeDates
+ */
+ final void addSchemes(Map mSchemeDates) {
+ if (mSchemeDates == null || mSchemeDates.size() == 0) {
+ return;
+ }
+ if (this.mSchemeDatesMap == null) {
+ this.mSchemeDatesMap = new HashMap<>();
+ }
+ for (String key : mSchemeDates.keySet()) {
+ this.mSchemeDatesMap.remove(key);
+ Calendar calendar = mSchemeDates.get(key);
+ if (calendar == null) {
+ continue;
+ }
+ this.mSchemeDatesMap.put(key, calendar);
+ }
+ }
+
+ /**
+ * 清楚选择
+ */
+ final void clearSelectRange() {
+ mSelectedStartRangeCalendar = null;
+ mSelectedEndRangeCalendar = null;
+ }
+
+ /**
+ * 获得选中范围
+ *
+ * @return 选中范围
+ */
+ final List getSelectCalendarRange() {
+ if (mSelectMode != SELECT_MODE_RANGE) {
+ return null;
+ }
+ List calendars = new ArrayList<>();
+ if (mSelectedStartRangeCalendar == null ||
+ mSelectedEndRangeCalendar == null) {
+ return calendars;
+ }
+ final long ONE_DAY = 1000 * 3600 * 24;
+ java.util.Calendar date = java.util.Calendar.getInstance();
+
+ date.set(mSelectedStartRangeCalendar.getYear(),
+ mSelectedStartRangeCalendar.getMonth() - 1,
+ mSelectedStartRangeCalendar.getDay());//
+
+ long startTimeMills = date.getTimeInMillis();//获得起始时间戳
+
+
+ date.set(mSelectedEndRangeCalendar.getYear(),
+ mSelectedEndRangeCalendar.getMonth() - 1,
+ mSelectedEndRangeCalendar.getDay());//
+ long endTimeMills = date.getTimeInMillis();
+ for (long start = startTimeMills; start <= endTimeMills; start += ONE_DAY) {
+ date.setTimeInMillis(start);
+ Calendar calendar = new Calendar();
+ calendar.setYear(date.get(java.util.Calendar.YEAR));
+ calendar.setMonth(date.get(java.util.Calendar.MONTH) + 1);
+ calendar.setDay(date.get(java.util.Calendar.DAY_OF_MONTH));
+ LunarCalendar.setupLunarCalendar(calendar);
+ updateCalendarScheme(calendar);
+ if (mCalendarInterceptListener != null &&
+ mCalendarInterceptListener.onCalendarIntercept(calendar)) {
+ continue;
+ }
+
+ calendars.add(calendar);
+ }
+ addSchemesFromMap(calendars);
+ return calendars;
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java
new file mode 100644
index 0000000..cb06080
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+/**
+ * 默认高仿魅族日历布局
+ * Created by huanghaibin on 2017/11/15.
+ */
+
+public final class DefaultMonthView extends MonthView {
+
+ private Paint mTextPaint = new Paint();
+ private Paint mSchemeBasicPaint = new Paint();
+ private float mRadio;
+ private int mPadding;
+ private float mSchemeBaseLine;
+
+ public DefaultMonthView(Context context) {
+ super(context);
+
+ mTextPaint.setTextSize(CalendarUtil.dipToPx(context, 8));
+ mTextPaint.setColor(0xffFFFFFF);
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setFakeBoldText(true);
+
+ mSchemeBasicPaint.setAntiAlias(true);
+ mSchemeBasicPaint.setStyle(Paint.Style.FILL);
+ mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
+ mSchemeBasicPaint.setColor(0xffed5353);
+ mSchemeBasicPaint.setFakeBoldText(true);
+ mRadio = CalendarUtil.dipToPx(getContext(), 7);
+ mPadding = CalendarUtil.dipToPx(getContext(), 4);
+ Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
+ mSchemeBaseLine = mRadio - metrics.descent + (metrics.bottom - metrics.top) / 2 + CalendarUtil.dipToPx(getContext(), 1);
+
+ }
+
+ /**
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的
+ */
+ @Override
+ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
+ mSelectedPaint.setStyle(Paint.Style.FILL);
+ canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint);
+ return true;
+ }
+
+ @Override
+ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
+ mSchemeBasicPaint.setColor(calendar.getSchemeColor());
+
+ canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint);
+
+ canvas.drawText(calendar.getScheme(),
+ x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,
+ y + mPadding + mSchemeBaseLine, mTextPaint);
+ }
+
+
+ /**
+ * 获取字体的宽
+ * @param text text
+ * @return return
+ */
+ private float getTextWidth(String text) {
+ return mTextPaint.measureText(text);
+ }
+
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ @Override
+ protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
+ int cx = x + mItemWidth / 2;
+ int top = y - mItemHeight / 6;
+
+ if (isSelected) {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ mSelectTextPaint);
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint);
+ } else if (hasScheme) {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
+
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
+ calendar.isCurrentDay() ? mCurDayLunarTextPaint : mSchemeLunarTextPaint);
+ } else {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10,
+ calendar.isCurrentDay() ? mCurDayLunarTextPaint :
+ calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java
new file mode 100644
index 0000000..41c13df
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+/**
+ * 默认高仿魅族周视图
+ * Created by huanghaibin on 2017/11/29.
+ */
+
+public final class DefaultWeekView extends WeekView {
+ private Paint mTextPaint = new Paint();
+ private Paint mSchemeBasicPaint = new Paint();
+ private float mRadio;
+ private int mPadding;
+ private float mSchemeBaseLine;
+
+ public DefaultWeekView(Context context) {
+ super(context);
+
+ mTextPaint.setTextSize(CalendarUtil.dipToPx(context, 8));
+ mTextPaint.setColor(0xffffffff);
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setFakeBoldText(true);
+
+ mSchemeBasicPaint.setAntiAlias(true);
+ mSchemeBasicPaint.setStyle(Paint.Style.FILL);
+ mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER);
+ mSchemeBasicPaint.setColor(0xffed5353);
+ mSchemeBasicPaint.setFakeBoldText(true);
+ mRadio = CalendarUtil.dipToPx(getContext(), 7);
+ mPadding = CalendarUtil.dipToPx(getContext(), 4);
+ Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics();
+ mSchemeBaseLine = mRadio - metrics.descent + (metrics.bottom - metrics.top) / 2 + CalendarUtil.dipToPx(getContext(), 1);
+
+ }
+
+ /**
+ * 如果需要点击Scheme没有效果,则return true
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的
+ */
+ @Override
+ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) {
+ mSelectedPaint.setStyle(Paint.Style.FILL);
+ canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint);
+ return true;
+ }
+
+
+ @Override
+ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) {
+ mSchemeBasicPaint.setColor(calendar.getSchemeColor());
+
+ canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, mPadding + mRadio, mRadio, mSchemeBasicPaint);
+
+ canvas.drawText(calendar.getScheme(),
+ x + mItemWidth - mPadding - mRadio / 2 - getTextWidth(calendar.getScheme()) / 2,
+ mPadding + mSchemeBaseLine, mTextPaint);
+ }
+
+ /**
+ * 获取字体的宽
+ * @param text text
+ * @return return
+ */
+ private float getTextWidth(String text) {
+ return mTextPaint.measureText(text);
+ }
+
+
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ @Override
+ protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) {
+ int cx = x + mItemWidth / 2;
+ int top = -mItemHeight / 6;
+
+ if (isSelected) {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ mSelectTextPaint);
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint);
+ } else if (hasScheme) {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
+
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
+ calendar.isCurrentDay() ? mCurDayLunarTextPaint :
+ mSchemeLunarTextPaint);
+ } else {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
+ canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10,
+ calendar.isCurrentDay() ? mCurDayLunarTextPaint :
+ calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint);
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java
new file mode 100644
index 0000000..2396baa
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+
+/**
+ * 默认年视图
+ * Created by huanghaibin on 2018/10/9.
+ */
+
+public class DefaultYearView extends YearView {
+
+ private int mTextPadding;
+
+ public DefaultYearView(Context context) {
+ super(context);
+ mTextPadding = CalendarUtil.dipToPx(context, 3);
+ }
+
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ @Override
+ protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) {
+
+ String text = getContext()
+ .getResources()
+ .getStringArray(R.array.month_string_array)[month - 1];
+
+ canvas.drawText(text,
+ x + mItemWidth / 2 - mTextPadding,
+ y + mMonthTextBaseLine,
+ mMonthTextPaint);
+ }
+
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ @Override
+ protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) {
+ String text = getContext().getResources().getStringArray(R.array.year_view_week_string_array)[week];
+ canvas.drawText(text,
+ x + width / 2,
+ y + mWeekTextBaseLine,
+ mWeekTextPaint);
+ }
+
+
+ @Override
+ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
+ return false;
+ }
+
+ @Override
+ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
+
+ }
+
+ @Override
+ protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
+ float baselineY = mTextBaseLine + y;
+ int cx = x + mItemWidth / 2;
+
+ if (isSelected) {
+ canvas.drawText(String.valueOf(calendar.getDay()),
+ cx,
+ baselineY,
+ hasScheme ? mSchemeTextPaint : mSelectTextPaint);
+ } else if (hasScheme) {
+ canvas.drawText(String.valueOf(calendar.getDay()),
+ cx,
+ baselineY,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
+
+ } else {
+ canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY,
+ calendar.isCurrentDay() ? mCurDayTextPaint :
+ calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint);
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/LunarCalendar.java b/calendarview/src/main/java/com/haibin/calendarview/LunarCalendar.java
new file mode 100644
index 0000000..f4da664
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/LunarCalendar.java
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.text.TextUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 农历计算相关
+ */
+@SuppressWarnings("all")
+public final class LunarCalendar {
+
+
+ static void init(Context context) {
+ if (MONTH_STR != null) {
+ return;
+ }
+ TrunkBranchAnnals.init(context);
+ SolarTermUtil.init(context);
+ MONTH_STR = context.getResources().getStringArray(R.array.lunar_first_of_month);
+ TRADITION_FESTIVAL_STR = context.getResources().getStringArray(R.array.tradition_festival);
+ DAY_STR = context.getResources().getStringArray(R.array.lunar_str);
+ SPECIAL_FESTIVAL_STR = context.getResources().getStringArray(R.array.special_festivals);
+ SOLAR_CALENDAR = context.getResources().getStringArray(R.array.solar_festival);
+ }
+
+ /**
+ * 农历月份第一天转写
+ */
+ private static String[] MONTH_STR = null;
+
+ /**
+ * 传统农历节日
+ */
+ private static String[] TRADITION_FESTIVAL_STR = null;
+
+ /**
+ * 农历大写
+ */
+ private static String[] DAY_STR = null;
+
+ /**
+ * 特殊节日的数组
+ */
+ private static String[] SPECIAL_FESTIVAL_STR = null;
+
+ /**
+ * 特殊节日、母亲节和父亲节,感恩节等
+ */
+ @SuppressLint("UseSparseArrays")
+ private static final Map SPECIAL_FESTIVAL = new HashMap<>();
+
+ /**
+ * 公历节日
+ */
+ private static String[] SOLAR_CALENDAR = null;
+
+ /**
+ * 保存每年24节气
+ */
+ @SuppressLint("UseSparseArrays")
+ private static final Map SOLAR_TERMS = new HashMap<>();
+
+ /**
+ * 返回传统农历节日
+ *
+ * @param year 农历年
+ * @param month 农历月
+ * @param day 农历日
+ * @return 返回传统农历节日
+ */
+ private static String getTraditionFestival(int year, int month, int day) {
+ if (month == 12) {
+ int count = daysInLunarMonth(year, month);
+ if (day == count) {
+ return TRADITION_FESTIVAL_STR[0];//除夕
+ }
+ }
+ String text = getString(month, day);
+ String festivalStr = "";
+ for (String festival : TRADITION_FESTIVAL_STR) {
+ if (festival.contains(text)) {
+ festivalStr = festival.replace(text, "");
+ break;
+ }
+ }
+ return festivalStr;
+ }
+
+
+ /**
+ * 数字转换为汉字月份
+ *
+ * @param month 月
+ * @param leap 1==闰月
+ * @return 数字转换为汉字月份
+ */
+ private static String numToChineseMonth(int month, int leap) {
+ if (leap == 1) {
+ return "闰" + MONTH_STR[month - 1];
+ }
+ return MONTH_STR[month - 1];
+ }
+
+ /**
+ * 数字转换为农历节日或者日期
+ *
+ * @param month 月
+ * @param day 日
+ * @param leap 1==闰月
+ * @return 数字转换为汉字日
+ */
+ private static String numToChinese(int month, int day, int leap) {
+ if (day == 1) {
+ return numToChineseMonth(month, leap);
+ }
+ return DAY_STR[day - 1];
+ }
+
+ /**
+ * 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
+ * 1. 前4位表示该年闰哪个月;
+ * 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
+ * 3. 最后7位表示农历年首(正月初一)对应的公历日期。
+ *
+ * 以2014年的数据0x955ABF为例说明:
+ * 1001 0101 0101 1010 1011 1111
+ * 闰九月 农历正月初一对应公历1月31号
+ */
+ private static final int[] LUNAR_INFO = {
+ 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909
+ 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919
+ 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929
+ 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939
+ 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949
+ 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959
+ 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969
+ 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979
+ 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989
+ 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999
+ 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009
+ 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019
+ 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029
+ 0x05aa0,0x076a3,0x096d0,0x04afb,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039
+ 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049
+ 0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059
+ 0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069
+ 0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079
+ 0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089
+ 0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099
+ 0x0d520
+ };
+
+
+ /**
+ * 农历 year年month月的总天数,总共有13个月包括闰月
+ *
+ * @param year 将要计算的年份
+ * @param month 将要计算的月份
+ * @return 传回农历 year年month月的总天数
+ */
+ public static int daysInLunarMonth(int year, int month) {
+ if ((LUNAR_INFO[year - CalendarViewDelegate.MIN_YEAR] & (0x10000 >> month)) == 0)
+ return 29;
+ else
+ return 30;
+ }
+
+ /**
+ * 获取公历节日
+ *
+ * @param month 公历月份
+ * @param day 公历日期
+ * @return 公历节日
+ */
+ private static String gregorianFestival(int month, int day) {
+ String text = getString(month, day);
+ String solar = "";
+ for (String aMSolarCalendar : SOLAR_CALENDAR) {
+ if (aMSolarCalendar.contains(text)) {
+ solar = aMSolarCalendar.replace(text, "");
+ break;
+ }
+ }
+ return solar;
+ }
+
+ private static String getString(int month, int day) {
+ return (month >= 10 ? String.valueOf(month) : "0" + month) + (day >= 10 ? day : "0" + day);
+ }
+
+
+ /**
+ * 返回24节气
+ *
+ * @param year 年
+ * @param month 月
+ * @param day 日
+ * @return 返回24节气
+ */
+ private static String getSolarTerm(int year, int month, int day) {
+ if (!SOLAR_TERMS.containsKey(year)) {
+ SOLAR_TERMS.put(year, SolarTermUtil.getSolarTerms(year));
+ }
+ String[] solarTerm = SOLAR_TERMS.get(year);
+ String text = year + getString(month, day);
+ String solar = "";
+ assert solarTerm != null;
+ for (String solarTermName : solarTerm) {
+ if (solarTermName.contains(text)) {
+ solar = solarTermName.replace(text, "");
+ break;
+ }
+ }
+ return solar;
+ }
+
+
+ /**
+ * 获取农历节日
+ *
+ * @param year 年
+ * @param month 月
+ * @param day 日
+ * @return 农历节日
+ */
+ public static String getLunarText(int year, int month, int day) {
+ String termText = LunarCalendar.getSolarTerm(year, month, day);
+ String solar = LunarCalendar.gregorianFestival(month, day);
+ if (!TextUtils.isEmpty(solar))
+ return solar;
+ if (!TextUtils.isEmpty(termText))
+ return termText;
+ int[] lunar = LunarUtil.solarToLunar(year, month, day);
+ String festival = getTraditionFestival(lunar[0], lunar[1], lunar[2]);
+ if (!TextUtils.isEmpty(festival))
+ return festival;
+ return LunarCalendar.numToChinese(lunar[1], lunar[2], lunar[3]);
+ }
+
+
+ /**
+ * 获取特殊计算方式的节日
+ * 如:每年五月的第二个星期日为母亲节,六月的第三个星期日为父亲节
+ * 每年11月第四个星期四定为"感恩节"
+ *
+ * @param year year
+ * @param month month
+ * @param day day
+ * @return 获取西方节日
+ */
+ private static String getSpecialFestival(int year, int month, int day) {
+ if (!SPECIAL_FESTIVAL.containsKey(year)) {
+ SPECIAL_FESTIVAL.put(year, getSpecialFestivals(year));
+ }
+ String[] specialFestivals = SPECIAL_FESTIVAL.get(year);
+ String text = year + getString(month, day);
+ String solar = "";
+ assert specialFestivals != null;
+ for (String special : specialFestivals) {
+ if (special.contains(text)) {
+ solar = special.replace(text, "");
+ break;
+ }
+ }
+ return solar;
+ }
+
+
+ /**
+ * 获取每年的母亲节和父亲节和感恩节
+ * 特殊计算方式的节日
+ *
+ * @param year 年
+ * @return 获取每年的母亲节和父亲节、感恩节
+ */
+ private static String[] getSpecialFestivals(int year) {
+ String[] festivals = new String[3];
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ date.set(year, 4, 1);
+ int week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ int startDiff = 7 - week + 1;
+ if (startDiff == 7) {
+ festivals[0] = dateToString(year, 5, startDiff + 1) + SPECIAL_FESTIVAL_STR[0];
+ } else {
+ festivals[0] = dateToString(year, 5, startDiff + 7 + 1) + SPECIAL_FESTIVAL_STR[0];
+ }
+ date.set(year, 5, 1);
+ week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ startDiff = 7 - week + 1;
+ if (startDiff == 7) {
+ festivals[1] = dateToString(year, 6, startDiff + 7 + 1) + SPECIAL_FESTIVAL_STR[1];
+ } else {
+ festivals[1] = dateToString(year, 6, startDiff + 7 + 7 + 1) + SPECIAL_FESTIVAL_STR[1];
+ }
+
+ date.set(year, 10, 1);
+ week = date.get(java.util.Calendar.DAY_OF_WEEK);
+ startDiff = 7 - week + 1;
+ if (startDiff <= 2) {
+ festivals[2] = dateToString(year, 11, startDiff + 21 + 5) + SPECIAL_FESTIVAL_STR[2];
+ } else {
+ festivals[2] = dateToString(year, 11, startDiff + 14 + 5) + SPECIAL_FESTIVAL_STR[2];
+ }
+ return festivals;
+ }
+
+
+ private static String dateToString(int year, int month, int day) {
+ return year + getString(month, day);
+ }
+
+ /**
+ * 初始化各种农历、节日
+ *
+ * @param calendar calendar
+ */
+ public static void setupLunarCalendar(Calendar calendar) {
+ int year = calendar.getYear();
+ int month = calendar.getMonth();
+ int day = calendar.getDay();
+ calendar.setWeekend(CalendarUtil.isWeekend(calendar));
+ calendar.setWeek(CalendarUtil.getWeekFormCalendar(calendar));
+
+ Calendar lunarCalendar = new Calendar();
+ calendar.setLunarCalendar(lunarCalendar);
+ int[] lunar = LunarUtil.solarToLunar(year, month, day);
+ lunarCalendar.setYear(lunar[0]);
+ lunarCalendar.setMonth(lunar[1]);
+ lunarCalendar.setDay(lunar[2]);
+ calendar.setLeapYear(CalendarUtil.isLeapYear(year));
+ if (lunar[3] == 1) {//如果是闰月
+ calendar.setLeapMonth(lunar[1]);
+ lunarCalendar.setLeapMonth(lunar[1]);
+ }
+ String solarTerm = LunarCalendar.getSolarTerm(year, month, day);
+ String gregorian = LunarCalendar.gregorianFestival(month, day);
+ String festival = getTraditionFestival(lunar[0], lunar[1], lunar[2]);
+ String lunarText = LunarCalendar.numToChinese(lunar[1], lunar[2], lunar[3]);
+ if (TextUtils.isEmpty(gregorian)) {
+ gregorian = getSpecialFestival(year, month, day);
+ }
+ calendar.setSolarTerm(solarTerm);
+ calendar.setGregorianFestival(gregorian);
+ calendar.setTraditionFestival(festival);
+ lunarCalendar.setTraditionFestival(festival);
+ lunarCalendar.setSolarTerm(solarTerm);
+ if (!TextUtils.isEmpty(solarTerm)) {
+ calendar.setLunar(solarTerm);
+ } else if (!TextUtils.isEmpty(gregorian)) {
+ calendar.setLunar(gregorian);
+ } else if (!TextUtils.isEmpty(festival)) {
+ calendar.setLunar(festival);
+ } else {
+ calendar.setLunar(lunarText);
+ }
+ lunarCalendar.setLunar(lunarText);
+ }
+
+ /**
+ * 获取农历节日
+ *
+ * @param calendar calendar
+ * @return 获取农历节日
+ */
+ public static String getLunarText(Calendar calendar) {
+ return getLunarText(calendar.getYear(), calendar.getMonth(), calendar.getDay());
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/LunarUtil.java b/calendarview/src/main/java/com/haibin/calendarview/LunarUtil.java
new file mode 100644
index 0000000..9b9eee8
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/LunarUtil.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+/**
+ * 农历计算方法
+ */
+public final class LunarUtil {
+
+
+ private static int[] LUNAR_MONTH_DAYS = {1887, 0x1694, 0x16aa, 0x4ad5, 0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a,
+ 0xd54, 0x75aa, 0x156a, 0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a, 0x8d55, 0xad4, 0x135a, 0x495d, 0x95c,
+ 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8, 0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a, 0xda8,
+ 0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94, 0x1d4a, 0xada9, 0xb5a, 0x56c, 0x726e, 0x125c, 0xf92d,
+ 0x192a, 0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b, 0x4ba, 0x125a, 0x592b, 0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5,
+ 0x9b4, 0x14b6, 0x6a57, 0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae, 0x14ae, 0xa4c, 0x7d26,
+ 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d, 0x95a, 0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da,
+ 0x12b6, 0x936, 0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4, 0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a,
+ 0x1d4a, 0x10d65, 0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94, 0x1b4a, 0x4b55, 0xad4, 0xf55b,
+ 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694, 0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526,
+ 0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c, 0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da,
+ 0x1695d, 0x95a, 0x149a, 0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936, 0xf497, 0x1496,
+ 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e, 0x1092f, 0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c,
+ 0x125c, 0x792e, 0x192c, 0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4, 0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a,
+ 0x1694, 0xd6aa, 0x15aa, 0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53, 0xd54, 0x15aa, 0xa9b5, 0x96c,
+ 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54, 0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25,
+ 0x1aa4, 0xfb52, 0x16b4, 0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a, 0x136a5, 0xda4, 0x15ac};
+
+ private static int[] SOLAR = {1887, 0xec04c, 0xec23f, 0xec435, 0xec649, 0xec83e, 0xeca51, 0xecc46, 0xece3a,
+ 0xed04d, 0xed242, 0xed436, 0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d, 0xee050, 0xee244, 0xee439, 0xee64d,
+ 0xee842, 0xeea36, 0xeec4a, 0xeee3e, 0xef052, 0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41,
+ 0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d, 0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651,
+ 0xf1846, 0xf1a3a, 0xf1c4e, 0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848, 0xf2a3b, 0xf2c4f, 0xf2e45,
+ 0xf3039, 0xf324d, 0xf3442, 0xf3636, 0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46, 0xf403b, 0xf424e, 0xf4443, 0xf4638,
+ 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48, 0xf503c, 0xf524f, 0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49,
+ 0xf603e, 0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b, 0xf703f, 0xf7252, 0xf7447, 0xf763c,
+ 0xf7850, 0xf7a45, 0xf7c39, 0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46, 0xf8c3b, 0xf8e4f,
+ 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853, 0xf9a47, 0xf9c3c, 0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641,
+ 0xfa836, 0xfaa49, 0xfac3d, 0xfae52, 0xfb047, 0xfb23a, 0xfb44e, 0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53,
+ 0xfc048, 0xfc23c, 0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36, 0xfd04a, 0xfd23d, 0xfd451, 0xfd646,
+ 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37, 0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44, 0xfee38,
+ 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51, 0xffc46, 0xffe3a, 0x10004e, 0x100242, 0x100437,
+ 0x10064b, 0x100841, 0x100a53, 0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438, 0x10164c, 0x101842,
+ 0x101a35, 0x101c49, 0x101e3d, 0x102051, 0x102245, 0x10243a, 0x10264e, 0x102843, 0x102a37, 0x102c4b,
+ 0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f, 0x103845, 0x103a38, 0x103c4c, 0x103e42, 0x104036,
+ 0x104249, 0x10443d, 0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038, 0x10524a, 0x10543e,
+ 0x105652, 0x105847, 0x105a3b, 0x105c4f, 0x105e45, 0x106039, 0x10624c, 0x106441, 0x106635, 0x106849,
+ 0x106a3d, 0x106c51, 0x106e47, 0x10703c, 0x10724f, 0x107444, 0x107638, 0x10784c, 0x107a3f, 0x107c53,
+ 0x107e48};
+
+ private static int getBitInt(int data, int length, int shift) {
+ return (data & (((1 << length) - 1) << shift)) >> shift;
+ }
+
+ private static long solarToInt(int y, int m, int d) {
+ m = (m + 9) % 12;
+ y = y - m / 10;
+ return 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10 + (d - 1);
+ }
+
+ private static int[] solarFromInt(long g) {
+ long y = (10000 * g + 14780) / 3652425;
+ long ddd = g - (365 * y + y / 4 - y / 100 + y / 400);
+ if (ddd < 0) {
+ y--;
+ ddd = g - (365 * y + y / 4 - y / 100 + y / 400);
+ }
+ long mi = (100 * ddd + 52) / 3060;
+ long mm = (mi + 2) % 12 + 1;
+ y = y + (mi + 2) / 12;
+ long dd = ddd - (mi * 306 + 5) / 10 + 1;
+ int[] solar = new int[4];
+ solar[0] = (int) y;
+ solar[1] = (int) mm;
+ solar[2] = (int) dd;
+ return solar;
+ }
+
+ /**
+ * 公历转农历 Solar To Lunar
+ *
+ * @param year 公历年
+ * @param month 公历月
+ * @param day 公历日
+ * @return [0]农历年 [1]农历月 [2]农历日 [3]是否闰月 0 false : 1 true
+ */
+ @SuppressWarnings("all")
+ public static int[] solarToLunar(int year, int month, int day) {
+ int[] lunarInt = new int[4];
+ int index = year - SOLAR[0];
+ int data = (year << 9) | (month << 5) | (day);
+ int solar11;
+ if (SOLAR[index] > data) {
+ index--;
+ }
+ solar11 = SOLAR[index];
+ int y = getBitInt(solar11, 12, 9);
+ int m = getBitInt(solar11, 4, 5);
+ int d = getBitInt(solar11, 5, 0);
+ long offset = solarToInt(year, month, day) - solarToInt(y, m, d);
+
+ int days = LUNAR_MONTH_DAYS[index];
+ int leap = getBitInt(days, 4, 13);
+
+ int lunarY = index + SOLAR[0];
+ int lunarM = 1;
+ int lunarD;
+ offset += 1;
+
+ for (int i = 0; i < 13; i++) {
+ int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
+ if (offset > dm) {
+ lunarM++;
+ offset -= dm;
+ } else {
+ break;
+ }
+ }
+ lunarD = (int) (offset);
+ lunarInt[0] = lunarY;
+ lunarInt[1] = lunarM;
+ lunarInt[3] = 0;
+
+ if (leap != 0 && lunarM > leap) {
+ lunarInt[1] = lunarM - 1;
+ if (lunarM == leap + 1) {
+ lunarInt[3] = 1;
+ }
+ }
+ lunarInt[2] = lunarD;
+ return lunarInt;
+ }
+
+
+ /**
+ * 农历转公历
+ *
+ * @param lunarYear 农历年
+ * @param lunarMonth 农历月
+ * @param lunarDay 农历天
+ * @param isLeap 是否是闰年 0 false : 1 true
+ * @return [0]新历年 [1]新历月 [2]新历日 [3]是否闰月 0 false : 1 true
+ */
+ @SuppressWarnings("unused")
+ public static int[] lunarToSolar(int lunarYear, int lunarMonth, int lunarDay, boolean isLeap) {
+ int days = LUNAR_MONTH_DAYS[lunarYear - LUNAR_MONTH_DAYS[0]];
+ int leap = getBitInt(days, 4, 13);
+ int offset = 0;
+ int loop = leap;
+ if (!isLeap) {
+ if (lunarMonth <= leap || leap == 0) {
+ loop = lunarMonth - 1;
+ } else {
+ loop = lunarMonth;
+ }
+ }
+ for (int i = 0; i < loop; i++) {
+ offset += getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
+ }
+ offset += lunarDay;
+
+ int solar11 = SOLAR[lunarYear - SOLAR[0]];
+
+ int y = getBitInt(solar11, 12, 9);
+ int m = getBitInt(solar11, 4, 5);
+ int d = getBitInt(solar11, 5, 0);
+
+ return solarFromInt(solarToInt(y, m, d) + offset - 1);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/Month.java b/calendarview/src/main/java/com/haibin/calendarview/Month.java
new file mode 100644
index 0000000..5909530
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/Month.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import java.io.Serializable;
+
+@SuppressWarnings("unused")
+final class Month implements Serializable {
+ private int diff;//日期偏移
+ private int count;
+ private int month;
+ private int year;
+
+ int getDiff() {
+ return diff;
+ }
+
+ void setDiff(int diff) {
+ this.diff = diff;
+ }
+
+ int getCount() {
+ return count;
+ }
+
+ void setCount(int count) {
+ this.count = count;
+ }
+
+ int getMonth() {
+ return month;
+ }
+
+ void setMonth(int month) {
+ this.month = month;
+ }
+
+ int getYear() {
+ return year;
+ }
+
+ void setYear(int year) {
+ this.year = year;
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/MonthView.java b/calendarview/src/main/java/com/haibin/calendarview/MonthView.java
new file mode 100644
index 0000000..8b7e90d
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/MonthView.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 月视图基础控件,可自由继承实现
+ * Created by huanghaibin on 2017/11/15.
+ */
+public abstract class MonthView extends BaseMonthView {
+
+ public MonthView(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mLineCount == 0)
+ return;
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+ onPreviewHook();
+ int count = mLineCount * 7;
+ int d = 0;
+ for (int i = 0; i < mLineCount; i++) {
+ for (int j = 0; j < 7; j++) {
+ Calendar calendar = mItems.get(d);
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH) {
+ if (d > mItems.size() - mNextDiff) {
+ return;
+ }
+ if (!calendar.isCurrentMonth()) {
+ ++d;
+ continue;
+ }
+ } else if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_FIT_MONTH) {
+ if (d >= count) {
+ return;
+ }
+ }
+ draw(canvas, calendar, i, j, d);
+ ++d;
+ }
+ }
+ }
+
+
+ /**
+ * 开始绘制
+ *
+ * @param canvas canvas
+ * @param calendar 对应日历
+ * @param i i
+ * @param j j
+ * @param d d
+ */
+ private void draw(Canvas canvas, Calendar calendar, int i, int j, int d) {
+ int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ int y = i * mItemHeight;
+ onLoopStart(x, y);
+ boolean isSelected = d == mCurrentItem;
+ boolean hasScheme = calendar.hasScheme();
+
+ if (hasScheme) {
+ //标记的日子
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, y, true);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, y);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, y, false);
+ }
+ }
+ onDrawText(canvas, calendar, x, y, hasScheme, isSelected);
+ }
+
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+
+ if (calendar == null) {
+ return;
+ }
+
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH &&
+ !calendar.isCurrentMonth()) {
+ return;
+ }
+
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+
+
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarOutOfRange(calendar);
+ }
+ return;
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (!calendar.isCurrentMonth() && mMonthViewPager != null) {
+ int cur = mMonthViewPager.getCurrentItem();
+ int position = mCurrentItem < 7 ? cur - 1 : cur + 1;
+ mMonthViewPager.setCurrentItem(position);
+ }
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, true);
+ }
+
+ if (mParentLayout != null) {
+ if (calendar.isCurrentMonth()) {
+ mParentLayout.updateSelectPosition(mItems.indexOf(calendar));
+ } else {
+ mParentLayout.updateSelectWeek(CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart()));
+ }
+
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, true);
+ }
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ if (mDelegate.mCalendarLongClickListener == null)
+ return false;
+ if (!isClick) {
+ return false;
+ }
+ Calendar calendar = getIndex();
+ if (calendar == null) {
+ return false;
+ }
+
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH &&
+ !calendar.isCurrentMonth()) {
+ return false;
+ }
+
+
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return false;
+ }
+
+ boolean isCalendarInRange = isInRange(calendar);
+
+ if (!isCalendarInRange) {
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClickOutOfRange(calendar);
+ }
+ return true;
+ }
+
+ if (mDelegate.isPreventLongPressedSelected()) {
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClick(calendar);
+ }
+ return true;
+ }
+
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (!calendar.isCurrentMonth() && mMonthViewPager != null) {
+ int cur = mMonthViewPager.getCurrentItem();
+ int position = mCurrentItem < 7 ? cur - 1 : cur + 1;
+ mMonthViewPager.setCurrentItem(position);
+ }
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, true);
+ }
+
+ if (mParentLayout != null) {
+ if (calendar.isCurrentMonth()) {
+ mParentLayout.updateSelectPosition(mItems.indexOf(calendar));
+ } else {
+ mParentLayout.updateSelectWeek(CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart()));
+ }
+
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, true);
+ }
+
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClick(calendar);
+ }
+ invalidate();
+ return true;
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @return 是否绘制onDrawScheme,true or false
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme);
+
+ /**
+ * 绘制标记的日期,这里可以是背景色,标记色什么的
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java b/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java
new file mode 100644
index 0000000..904eeed
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java
@@ -0,0 +1,646 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import java.lang.reflect.Constructor;
+import java.util.List;
+
+
+/**
+ * 月份切换ViewPager,自定义适应高度
+ */
+public final class MonthViewPager extends ViewPager {
+
+ private boolean isUpdateMonthView;
+
+ private int mMonthCount;
+
+ private CalendarViewDelegate mDelegate;
+
+ private int mNextViewHeight, mPreViewHeight, mCurrentViewHeight;
+
+ CalendarLayout mParentLayout;
+
+ WeekViewPager mWeekPager;
+
+ WeekBar mWeekBar;
+
+ /**
+ * 是否使用滚动到某一天
+ */
+ private boolean isUsingScrollToCalendar = false;
+
+ public MonthViewPager(Context context) {
+ this(context, null);
+ }
+
+ public MonthViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ /**
+ * 初始化
+ *
+ * @param delegate delegate
+ */
+ void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+
+ updateMonthViewHeight(mDelegate.getCurrentDay().getYear(),
+ mDelegate.getCurrentDay().getMonth());
+
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = mCurrentViewHeight;
+ setLayoutParams(params);
+ init();
+ }
+
+ /**
+ * 初始化
+ */
+ private void init() {
+ mMonthCount = 12 * (mDelegate.getMaxYear() - mDelegate.getMinYear())
+ - mDelegate.getMinYearMonth() + 1 +
+ mDelegate.getMaxYearMonth();
+ setAdapter(new MonthViewPagerAdapter());
+ addOnPageChangeListener(new OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {
+ return;
+ }
+ int height;
+ if (position < getCurrentItem()) {//右滑-1
+ height = (int) ((mPreViewHeight)
+ * (1 - positionOffset) +
+ mCurrentViewHeight
+ * positionOffset);
+ } else {//左滑+!
+ height = (int) ((mCurrentViewHeight)
+ * (1 - positionOffset) +
+ (mNextViewHeight)
+ * positionOffset);
+ }
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = height;
+ setLayoutParams(params);
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ Calendar calendar = CalendarUtil.getFirstCalendarFromMonthViewPager(position, mDelegate);
+ if (getVisibility() == VISIBLE) {
+ if (!mDelegate.isShowYearSelectedLayout &&
+ mDelegate.mIndexCalendar != null &&
+ calendar.getYear() != mDelegate.mIndexCalendar.getYear() &&
+ mDelegate.mYearChangeListener != null) {
+ mDelegate.mYearChangeListener.onYearChange(calendar.getYear());
+ }
+ mDelegate.mIndexCalendar = calendar;
+ }
+ //月份改变事件
+ if (mDelegate.mMonthChangeListener != null) {
+ mDelegate.mMonthChangeListener.onMonthChange(calendar.getYear(), calendar.getMonth());
+ }
+
+ //周视图显示的时候就需要动态改变月视图高度
+ if (mWeekPager.getVisibility() == VISIBLE) {
+ updateMonthViewHeight(calendar.getYear(), calendar.getMonth());
+ return;
+ }
+
+
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ if (!calendar.isCurrentMonth()) {
+ mDelegate.mSelectedCalendar = calendar;
+ } else {
+ mDelegate.mSelectedCalendar = CalendarUtil.getRangeEdgeCalendar(calendar, mDelegate);
+ }
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+ } else {
+ if (mDelegate.mSelectedStartRangeCalendar != null &&
+ mDelegate.mSelectedStartRangeCalendar.isSameMonth(mDelegate.mIndexCalendar)) {
+ mDelegate.mIndexCalendar = mDelegate.mSelectedStartRangeCalendar;
+ } else {
+ if (calendar.isSameMonth(mDelegate.mSelectedCalendar)) {
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+ }
+ }
+ }
+
+ mDelegate.updateSelectCalendarScheme();
+ if (!isUsingScrollToCalendar && mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false);
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false);
+ }
+ }
+
+ BaseMonthView view = findViewWithTag(position);
+ if (view != null) {
+ int index = view.getSelectedIndex(mDelegate.mIndexCalendar);
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ view.mCurrentItem = index;
+ }
+ if (index >= 0 && mParentLayout != null) {
+ mParentLayout.updateSelectPosition(index);
+ }
+ view.invalidate();
+ }
+ mWeekPager.updateSelected(mDelegate.mIndexCalendar, false);
+ updateMonthViewHeight(calendar.getYear(), calendar.getMonth());
+ isUsingScrollToCalendar = false;
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ }
+ });
+ }
+
+ /**
+ * 更新月视图的高度
+ *
+ * @param year year
+ * @param month month
+ */
+ private void updateMonthViewHeight(int year, int month) {
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {//非动态高度就不需要了
+ mCurrentViewHeight = 6 * mDelegate.getCalendarItemHeight();
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = mCurrentViewHeight;
+ return;
+ }
+
+ if (mParentLayout != null) {
+ if (getVisibility() != VISIBLE) {//如果已经显示周视图,则需要动态改变月视图高度,否则显示就有bug
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = CalendarUtil.getMonthViewHeight(year, month,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ setLayoutParams(params);
+ }
+ mParentLayout.updateContentViewTranslateY();
+ }
+ mCurrentViewHeight = CalendarUtil.getMonthViewHeight(year, month,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ if (month == 1) {
+ mPreViewHeight = CalendarUtil.getMonthViewHeight(year - 1, 12,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year, 2,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ } else {
+ mPreViewHeight = CalendarUtil.getMonthViewHeight(year, month - 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ if (month == 12) {
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year + 1, 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ } else {
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year, month + 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ }
+ }
+ }
+
+ /**
+ * 刷新
+ */
+ void notifyDataSetChanged() {
+ mMonthCount = 12 * (mDelegate.getMaxYear() - mDelegate.getMinYear())
+ - mDelegate.getMinYearMonth() + 1 +
+ mDelegate.getMaxYearMonth();
+ notifyAdapterDataSetChanged();
+ }
+
+ /**
+ * 更新月视图Class
+ */
+ void updateMonthViewClass() {
+ isUpdateMonthView = true;
+ notifyAdapterDataSetChanged();
+ isUpdateMonthView = false;
+ }
+
+ /**
+ * 更新日期范围
+ */
+ final void updateRange() {
+ isUpdateMonthView = true;
+ notifyDataSetChanged();
+ isUpdateMonthView = false;
+ if (getVisibility() != VISIBLE) {
+ return;
+ }
+ isUsingScrollToCalendar = false;
+ Calendar calendar = mDelegate.mSelectedCalendar;
+ int y = calendar.getYear() - mDelegate.getMinYear();
+ int position = 12 * y + calendar.getMonth() - mDelegate.getMinYearMonth();
+ setCurrentItem(position, false);
+ BaseMonthView view = findViewWithTag(position);
+ if (view != null) {
+ view.setSelectedCalendar(mDelegate.mIndexCalendar);
+ view.invalidate();
+ if (mParentLayout != null) {
+ mParentLayout.updateSelectPosition(view.getSelectedIndex(mDelegate.mIndexCalendar));
+ }
+ }
+ if (mParentLayout != null) {
+ int week = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(week);
+ }
+
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, false);
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, false);
+ }
+ updateSelected();
+ }
+
+ /**
+ * 滚动到指定日期
+ *
+ * @param year 年
+ * @param month 月
+ * @param day 日
+ * @param invokeListener 调用日期事件
+ */
+ void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) {
+ isUsingScrollToCalendar = true;
+ Calendar calendar = new Calendar();
+ calendar.setYear(year);
+ calendar.setMonth(month);
+ calendar.setDay(day);
+ calendar.setCurrentDay(calendar.equals(mDelegate.getCurrentDay()));
+ LunarCalendar.setupLunarCalendar(calendar);
+ mDelegate.mIndexCalendar = calendar;
+ mDelegate.mSelectedCalendar = calendar;
+ mDelegate.updateSelectCalendarScheme();
+ int y = calendar.getYear() - mDelegate.getMinYear();
+ int position = 12 * y + calendar.getMonth() - mDelegate.getMinYearMonth();
+ int curItem = getCurrentItem();
+ if (curItem == position) {
+ isUsingScrollToCalendar = false;
+ }
+ setCurrentItem(position, smoothScroll);
+
+ BaseMonthView view = findViewWithTag(position);
+ if (view != null) {
+ view.setSelectedCalendar(mDelegate.mIndexCalendar);
+ view.invalidate();
+ if (mParentLayout != null) {
+ mParentLayout.updateSelectPosition(view.getSelectedIndex(mDelegate.mIndexCalendar));
+ }
+ }
+ if (mParentLayout != null) {
+ int week = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(week);
+ }
+
+ if (mDelegate.mCalendarSelectListener != null && invokeListener) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, false);
+ }
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, false);
+ }
+
+ updateSelected();
+ }
+
+ /**
+ * 滚动到当前日期
+ */
+ void scrollToCurrent(boolean smoothScroll) {
+ isUsingScrollToCalendar = true;
+ int position = 12 * (mDelegate.getCurrentDay().getYear() - mDelegate.getMinYear()) +
+ mDelegate.getCurrentDay().getMonth() - mDelegate.getMinYearMonth();
+ int curItem = getCurrentItem();
+ if (curItem == position) {
+ isUsingScrollToCalendar = false;
+ }
+
+ setCurrentItem(position, smoothScroll);
+
+ BaseMonthView view = findViewWithTag(position);
+ if (view != null) {
+ view.setSelectedCalendar(mDelegate.getCurrentDay());
+ view.invalidate();
+ if (mParentLayout != null) {
+ mParentLayout.updateSelectPosition(view.getSelectedIndex(mDelegate.getCurrentDay()));
+ }
+ }
+
+ if (mDelegate.mCalendarSelectListener != null && getVisibility() == VISIBLE) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false);
+ }
+ }
+
+ /**
+ * 获取当前月份数据
+ *
+ * @return 获取当前月份数据
+ */
+ List getCurrentMonthCalendars() {
+ BaseMonthView view = findViewWithTag(getCurrentItem());
+ if (view == null) {
+ return null;
+ }
+ return view.mItems;
+ }
+
+ /**
+ * 更新为默认选择模式
+ */
+ void updateDefaultSelect() {
+ BaseMonthView view = findViewWithTag(getCurrentItem());
+ if (view != null) {
+ int index = view.getSelectedIndex(mDelegate.mSelectedCalendar);
+ view.mCurrentItem = index;
+ if (index >= 0 && mParentLayout != null) {
+ mParentLayout.updateSelectPosition(index);
+ }
+ view.invalidate();
+ }
+ }
+
+
+ /**
+ * 更新选择效果
+ */
+ void updateSelected() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.setSelectedCalendar(mDelegate.mSelectedCalendar);
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 更新字体颜色大小
+ */
+ final void updateStyle() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.updateStyle();
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 更新标记日期
+ */
+ void updateScheme() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.update();
+ }
+ }
+
+ /**
+ * 更新当前日期,夜间过度的时候调用这个函数,一般不需要调用
+ */
+ void updateCurrentDate() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.updateCurrentDate();
+ }
+ }
+
+
+ /**
+ * 更新显示模式
+ */
+ void updateShowMode() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.updateShowMode();
+ view.requestLayout();
+ }
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ALL_MONTH) {
+ mCurrentViewHeight = 6 * mDelegate.getCalendarItemHeight();
+ mNextViewHeight = mCurrentViewHeight;
+ mPreViewHeight = mCurrentViewHeight;
+ } else {
+ updateMonthViewHeight(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth());
+ }
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = mCurrentViewHeight;
+ setLayoutParams(params);
+ if (mParentLayout != null) {
+ mParentLayout.updateContentViewTranslateY();
+ }
+ }
+
+ /**
+ * 更新周起始
+ */
+ void updateWeekStart() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.updateWeekStart();
+ view.requestLayout();
+ }
+
+ updateMonthViewHeight(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth());
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = mCurrentViewHeight;
+ setLayoutParams(params);
+ if (mParentLayout != null) {
+ int i = CalendarUtil.getWeekFromDayInMonth(mDelegate.mSelectedCalendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+ updateSelected();
+ }
+
+ /**
+ * 更新高度
+ */
+ final void updateItemHeight() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.updateItemHeight();
+ view.requestLayout();
+ }
+
+ int year = mDelegate.mIndexCalendar.getYear();
+ int month = mDelegate.mIndexCalendar.getMonth();
+ mCurrentViewHeight = CalendarUtil.getMonthViewHeight(year, month,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ if (month == 1) {
+ mPreViewHeight = CalendarUtil.getMonthViewHeight(year - 1, 12,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year, 2,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ } else {
+ mPreViewHeight = CalendarUtil.getMonthViewHeight(year, month - 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ if (month == 12) {
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year + 1, 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ } else {
+ mNextViewHeight = CalendarUtil.getMonthViewHeight(year, month + 1,
+ mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(),
+ mDelegate.getMonthViewShowMode());
+ }
+ }
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = mCurrentViewHeight;
+ setLayoutParams(params);
+ }
+
+ /**
+ * 清除选择范围
+ */
+ final void clearSelectRange() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 清除单选选择
+ */
+ final void clearSingleSelect() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.mCurrentItem = -1;
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 清除单选选择
+ */
+ final void clearMultiSelect() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseMonthView view = (BaseMonthView) getChildAt(i);
+ view.mCurrentItem = -1;
+ view.invalidate();
+ }
+ }
+
+ private void notifyAdapterDataSetChanged() {
+ if (getAdapter() == null) {
+ return;
+ }
+ getAdapter().notifyDataSetChanged();
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return mDelegate.isMonthViewScrollable() && super.onTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return mDelegate.isMonthViewScrollable() && super.onInterceptTouchEvent(ev);
+ }
+
+ @Override
+ public void setCurrentItem(int item) {
+ setCurrentItem(item, true);
+ }
+
+ @Override
+ public void setCurrentItem(int item, boolean smoothScroll) {
+ if (Math.abs(getCurrentItem() - item) > 1) {
+ super.setCurrentItem(item, false);
+ } else {
+ super.setCurrentItem(item, smoothScroll);
+ }
+ }
+
+ /**
+ * 日历卡月份Adapter
+ */
+ private final class MonthViewPagerAdapter extends PagerAdapter {
+
+ @Override
+ public int getCount() {
+ return mMonthCount;
+ }
+
+ @Override
+ public int getItemPosition(@NonNull Object object) {
+ return isUpdateMonthView ? POSITION_NONE : super.getItemPosition(object);
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, @NonNull Object object) {
+ return view.equals(object);
+ }
+
+ @NonNull
+ @Override
+ public Object instantiateItem(@NonNull ViewGroup container, int position) {
+ int year = (position + mDelegate.getMinYearMonth() - 1) / 12 + mDelegate.getMinYear();
+ int month = (position + mDelegate.getMinYearMonth() - 1) % 12 + 1;
+ BaseMonthView view;
+ try {
+ Constructor constructor = mDelegate.getMonthViewClass().getConstructor(Context.class);
+ view = (BaseMonthView) constructor.newInstance(getContext());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new DefaultMonthView(getContext());
+ }
+ view.mMonthViewPager = MonthViewPager.this;
+ view.mParentLayout = mParentLayout;
+ view.setup(mDelegate);
+ view.setTag(position);
+ view.initMonthWithDate(year, month);
+ view.setSelectedCalendar(mDelegate.mSelectedCalendar);
+ container.addView(view);
+ return view;
+ }
+
+ @Override
+ public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+ BaseView view = (BaseView) object;
+ view.onDestroy();
+ container.removeView(view);
+ }
+ }
+
+
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java
new file mode 100644
index 0000000..3973694
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 多选月视图
+ * Created by huanghaibin on 2018/9/11.
+ */
+public abstract class MultiMonthView extends BaseMonthView {
+
+ public MultiMonthView(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mLineCount == 0)
+ return;
+
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+
+ onPreviewHook();
+ int count = mLineCount * 7;
+ int d = 0;
+ for (int i = 0; i < mLineCount; i++) {
+ for (int j = 0; j < 7; j++) {
+ Calendar calendar = mItems.get(d);
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH) {
+ if (d > mItems.size() - mNextDiff) {
+ return;
+ }
+ if (!calendar.isCurrentMonth()) {
+ ++d;
+ continue;
+ }
+ } else if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_FIT_MONTH) {
+ if (d >= count) {
+ return;
+ }
+ }
+ draw(canvas, calendar, d, i, j);
+ ++d;
+ }
+ }
+ }
+
+ /**
+ * 开始绘制
+ *
+ * @param canvas canvas
+ * @param calendar 对应日历
+ * @param i i
+ * @param j j
+ */
+ private void draw(Canvas canvas, Calendar calendar, int calendarIndex, int i, int j) {
+ int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ int y = i * mItemHeight;
+ onLoopStart(x, y);
+ boolean isSelected = isCalendarSelected(calendar);
+ boolean hasScheme = calendar.hasScheme();
+ boolean isPreSelected = isSelectPreCalendar(calendar, calendarIndex);
+ boolean isNextSelected = isSelectNextCalendar(calendar, calendarIndex);
+
+ if (hasScheme) {
+ //标记的日子
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, y, true, isPreSelected, isNextSelected);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, y, true);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, y, false, isPreSelected, isNextSelected);
+ }
+ }
+ onDrawText(canvas, calendar, x, y, hasScheme, isSelected);
+ }
+
+ /**
+ * 日历是否被选中
+ *
+ * @param calendar calendar
+ * @return 日历是否被选中
+ */
+ protected boolean isCalendarSelected(Calendar calendar) {
+ return !onCalendarIntercept(calendar) && mDelegate.mSelectedCalendars.containsKey(calendar.toString());
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+
+ if (calendar == null) {
+ return;
+ }
+
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH
+ && !calendar.isCurrentMonth()) {
+ return;
+ }
+
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onCalendarMultiSelectOutOfRange(calendar);
+ }
+ return;
+ }
+
+ String key = calendar.toString();
+
+ if (mDelegate.mSelectedCalendars.containsKey(key)) {
+ mDelegate.mSelectedCalendars.remove(key);
+ } else {
+ if (mDelegate.mSelectedCalendars.size() >= mDelegate.getMaxMultiSelectSize()) {
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onMultiSelectOutOfSize(calendar,
+ mDelegate.getMaxMultiSelectSize());
+ }
+ return;
+ }
+ mDelegate.mSelectedCalendars.put(key, calendar);
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (!calendar.isCurrentMonth() && mMonthViewPager != null) {
+ int cur = mMonthViewPager.getCurrentItem();
+ int position = mCurrentItem < 7 ? cur - 1 : cur + 1;
+ mMonthViewPager.setCurrentItem(position);
+ }
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, true);
+ }
+
+ if (mParentLayout != null) {
+ if (calendar.isCurrentMonth()) {
+ mParentLayout.updateSelectPosition(mItems.indexOf(calendar));
+ } else {
+ mParentLayout.updateSelectWeek(CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart()));
+ }
+ }
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onCalendarMultiSelect(
+ calendar,
+ mDelegate.mSelectedCalendars.size(),
+ mDelegate.getMaxMultiSelectSize());
+ }
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ return false;
+ }
+
+ /**
+ * 上一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 上一个日期是否选中
+ */
+ protected final boolean isSelectPreCalendar(Calendar calendar, int calendarIndex) {
+ Calendar preCalendar;
+ if (calendarIndex == 0) {
+ preCalendar = CalendarUtil.getPreCalendar(calendar);
+ mDelegate.updateCalendarScheme(preCalendar);
+ } else {
+ preCalendar = mItems.get(calendarIndex - 1);
+ }
+
+ return isCalendarSelected(preCalendar);
+ }
+
+ /**
+ * 下一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 下一个日期是否选中
+ */
+ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarIndex) {
+ Calendar nextCalendar;
+ if (calendarIndex == mItems.size() - 1) {
+ nextCalendar = CalendarUtil.getNextCalendar(calendar);
+ mDelegate.updateCalendarScheme(nextCalendar);
+ } else {
+ nextCalendar = mItems.get(calendarIndex + 1);
+ }
+
+ return isCalendarSelected(nextCalendar);
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @param isSelectedPre 上一个日期是否选中
+ * @param isSelectedNext 下一个日期是否选中
+ * @return 是否继续绘制onDrawScheme,true or false
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme,
+ boolean isSelectedPre, boolean isSelectedNext);
+
+ /**
+ * 绘制标记的日期,这里可以是背景色,标记色什么的
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java
new file mode 100644
index 0000000..db731c0
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 多选周视图
+ * Created by huanghaibin on 2018/9/11.
+ */
+public abstract class MultiWeekView extends BaseWeekView {
+
+ public MultiWeekView(Context context) {
+ super(context);
+ }
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ */
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mItems.size() == 0)
+ return;
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+ onPreviewHook();
+
+ for (int i = 0; i < 7; i++) {
+ int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ onLoopStart(x);
+ Calendar calendar = mItems.get(i);
+ boolean isSelected = isCalendarSelected(calendar);
+ boolean isPreSelected = isSelectPreCalendar(calendar, i);
+ boolean isNextSelected = isSelectNextCalendar(calendar, i);
+ boolean hasScheme = calendar.hasScheme();
+ if (hasScheme) {
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, true, isPreSelected, isNextSelected);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, isSelected);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, false, isPreSelected, isNextSelected);
+ }
+ }
+ onDrawText(canvas, calendar, x, hasScheme, isSelected);
+ }
+ }
+
+
+ /**
+ * 日历是否被选中
+ *
+ * @param calendar calendar
+ * @return 日历是否被选中
+ */
+ protected boolean isCalendarSelected(Calendar calendar) {
+ return !onCalendarIntercept(calendar) && mDelegate.mSelectedCalendars.containsKey(calendar.toString());
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+ if (calendar == null) {
+ return;
+ }
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onCalendarMultiSelectOutOfRange(calendar);
+ }
+ return;
+ }
+
+
+ String key = calendar.toString();
+
+ if (mDelegate.mSelectedCalendars.containsKey(key)) {
+ mDelegate.mSelectedCalendars.remove(key);
+ } else {
+ if (mDelegate.mSelectedCalendars.size() >= mDelegate.getMaxMultiSelectSize()) {
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onMultiSelectOutOfSize(calendar,
+ mDelegate.getMaxMultiSelectSize());
+ }
+ return;
+ }
+ mDelegate.mSelectedCalendars.put(key, calendar);
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, true);
+ }
+ if (mParentLayout != null) {
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ if (mDelegate.mCalendarMultiSelectListener != null) {
+ mDelegate.mCalendarMultiSelectListener.onCalendarMultiSelect(
+ calendar,
+ mDelegate.mSelectedCalendars.size(),
+ mDelegate.getMaxMultiSelectSize());
+ }
+
+ invalidate();
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ return false;
+ }
+
+ /**
+ * 上一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 上一个日期是否选中
+ */
+ protected final boolean isSelectPreCalendar(Calendar calendar, int calendarIndex) {
+ Calendar preCalendar;
+ if (calendarIndex == 0) {
+ preCalendar = CalendarUtil.getPreCalendar(calendar);
+ mDelegate.updateCalendarScheme(preCalendar);
+ } else {
+ preCalendar = mItems.get(calendarIndex - 1);
+ }
+ return isCalendarSelected(preCalendar);
+ }
+
+ /**
+ * 下一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 下一个日期是否选中
+ */
+ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarIndex) {
+ Calendar nextCalendar;
+ if (calendarIndex == mItems.size() - 1) {
+ nextCalendar = CalendarUtil.getNextCalendar(calendar);
+ mDelegate.updateCalendarScheme(nextCalendar);
+ } else {
+ nextCalendar = mItems.get(calendarIndex + 1);
+ }
+ return isCalendarSelected(nextCalendar);
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @param isSelectedPre 上一个日期是否选中
+ * @param isSelectedNext 下一个日期是否选中
+ * @return 是否绘制 onDrawScheme
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme,
+ boolean isSelectedPre, boolean isSelectedNext);
+
+ /**
+ * 绘制标记的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java
new file mode 100644
index 0000000..042c296
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 范围选择月视图
+ * Created by huanghaibin on 2018/9/11.
+ */
+public abstract class RangeMonthView extends BaseMonthView {
+
+ public RangeMonthView(Context context) {
+ super(context);
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mLineCount == 0)
+ return;
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+ onPreviewHook();
+ int count = mLineCount * 7;
+ int d = 0;
+ for (int i = 0; i < mLineCount; i++) {
+ for (int j = 0; j < 7; j++) {
+ Calendar calendar = mItems.get(d);
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH) {
+ if (d > mItems.size() - mNextDiff) {
+ return;
+ }
+ if (!calendar.isCurrentMonth()) {
+ ++d;
+ continue;
+ }
+ } else if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_FIT_MONTH) {
+ if (d >= count) {
+ return;
+ }
+ }
+ draw(canvas, calendar, d, i, j);
+ ++d;
+ }
+ }
+ }
+
+ /**
+ * 开始绘制
+ *
+ * @param canvas canvas
+ * @param calendar 对应日历
+ * @param i i
+ * @param j j
+ */
+ private void draw(Canvas canvas, Calendar calendar, int calendarIndex, int i, int j) {
+ int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ int y = i * mItemHeight;
+ onLoopStart(x, y);
+ boolean isSelected = isCalendarSelected(calendar);
+ boolean hasScheme = calendar.hasScheme();
+ boolean isPreSelected = isSelectPreCalendar(calendar, calendarIndex);
+ boolean isNextSelected = isSelectNextCalendar(calendar, calendarIndex);
+
+ if (hasScheme) {
+ //标记的日子
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, y, true, isPreSelected, isNextSelected);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, y, true);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, y, false, isPreSelected, isNextSelected);
+ }
+ }
+ onDrawText(canvas, calendar, x, y, hasScheme, isSelected);
+ }
+
+ /**
+ * 日历是否被选中
+ *
+ * @param calendar calendar
+ * @return 日历是否被选中
+ */
+ protected boolean isCalendarSelected(Calendar calendar) {
+ if (mDelegate.mSelectedStartRangeCalendar == null) {
+ return false;
+ }
+ if (onCalendarIntercept(calendar)) {
+ return false;
+ }
+ if (mDelegate.mSelectedEndRangeCalendar == null) {
+ return calendar.compareTo(mDelegate.mSelectedStartRangeCalendar) == 0;
+ }
+ return calendar.compareTo(mDelegate.mSelectedStartRangeCalendar) >= 0 &&
+ calendar.compareTo(mDelegate.mSelectedEndRangeCalendar) <= 0;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+
+ if (calendar == null) {
+ return;
+ }
+
+ if (mDelegate.getMonthViewShowMode() == CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH
+ && !calendar.isCurrentMonth()) {
+ return;
+ }
+
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarSelectOutOfRange(calendar);
+ }
+ return;
+ }
+
+ //优先判断各种直接return的情况,减少代码深度
+ if (mDelegate.mSelectedStartRangeCalendar != null && mDelegate.mSelectedEndRangeCalendar == null) {
+ int minDiffer = CalendarUtil.differ(calendar, mDelegate.mSelectedStartRangeCalendar);
+ if (minDiffer >= 0 && mDelegate.getMinSelectRange() != -1 && mDelegate.getMinSelectRange() > minDiffer + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(calendar, true);
+ }
+ return;
+ } else if (mDelegate.getMaxSelectRange() != -1 && mDelegate.getMaxSelectRange() <
+ CalendarUtil.differ(calendar, mDelegate.mSelectedStartRangeCalendar) + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(calendar, false);
+ }
+ return;
+ }
+ }
+
+ if (mDelegate.mSelectedStartRangeCalendar == null || mDelegate.mSelectedEndRangeCalendar != null) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else {
+ int compare = calendar.compareTo(mDelegate.mSelectedStartRangeCalendar);
+ if (mDelegate.getMinSelectRange() == -1 && compare <= 0) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else if (compare < 0) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else if (compare == 0 &&
+ mDelegate.getMinSelectRange() == 1) {
+ mDelegate.mSelectedEndRangeCalendar = calendar;
+ } else {
+ mDelegate.mSelectedEndRangeCalendar = calendar;
+ }
+
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (!calendar.isCurrentMonth() && mMonthViewPager != null) {
+ int cur = mMonthViewPager.getCurrentItem();
+ int position = mCurrentItem < 7 ? cur - 1 : cur + 1;
+ mMonthViewPager.setCurrentItem(position);
+ }
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onMonthDateSelected(calendar, true);
+ }
+
+ if (mParentLayout != null) {
+ if (calendar.isCurrentMonth()) {
+ mParentLayout.updateSelectPosition(mItems.indexOf(calendar));
+ } else {
+ mParentLayout.updateSelectWeek(CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart()));
+ }
+ }
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarRangeSelect(calendar,
+ mDelegate.mSelectedEndRangeCalendar != null);
+ }
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ return false;
+ }
+
+ /**
+ * 上一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 上一个日期是否选中
+ */
+ protected final boolean isSelectPreCalendar(Calendar calendar, int calendarIndex) {
+
+ Calendar preCalendar;
+ if (calendarIndex == 0) {
+ preCalendar = CalendarUtil.getPreCalendar(calendar);
+ mDelegate.updateCalendarScheme(preCalendar);
+ } else {
+ preCalendar = mItems.get(calendarIndex - 1);
+ }
+
+ return mDelegate.mSelectedStartRangeCalendar != null &&
+ isCalendarSelected(preCalendar);
+ }
+
+ /**
+ * 下一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 下一个日期是否选中
+ */
+ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarIndex) {
+
+ Calendar nextCalendar;
+ if (calendarIndex == mItems.size() - 1) {
+ nextCalendar = CalendarUtil.getNextCalendar(calendar);
+ mDelegate.updateCalendarScheme(nextCalendar);
+ } else {
+ nextCalendar = mItems.get(calendarIndex + 1);
+ }
+
+ return mDelegate.mSelectedStartRangeCalendar != null &&
+ isCalendarSelected(nextCalendar);
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @param isSelectedPre 上一个日期是否选中
+ * @param isSelectedNext 下一个日期是否选中
+ * @return 是否继续绘制onDrawScheme,true or false
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme,
+ boolean isSelectedPre, boolean isSelectedNext);
+
+ /**
+ * 绘制标记的日期,这里可以是背景色,标记色什么的
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java
new file mode 100644
index 0000000..435c924
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 范围选择周视图
+ * Created by huanghaibin on 2018/9/11.
+ */
+public abstract class RangeWeekView extends BaseWeekView {
+
+ public RangeWeekView(Context context) {
+ super(context);
+ }
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ */
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mItems.size() == 0)
+ return;
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+ onPreviewHook();
+
+ for (int i = 0; i < 7; i++) {
+ int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ onLoopStart(x);
+ Calendar calendar = mItems.get(i);
+ boolean isSelected = isCalendarSelected(calendar);
+ boolean isPreSelected = isSelectPreCalendar(calendar, i);
+ boolean isNextSelected = isSelectNextCalendar(calendar, i);
+ boolean hasScheme = calendar.hasScheme();
+ if (hasScheme) {
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, true, isPreSelected, isNextSelected);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, isSelected);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, false, isPreSelected, isNextSelected);
+ }
+ }
+ onDrawText(canvas, calendar, x, hasScheme, isSelected);
+ }
+ }
+
+
+ /**
+ * 日历是否被选中
+ *
+ * @param calendar calendar
+ * @return 日历是否被选中
+ */
+ protected boolean isCalendarSelected(Calendar calendar) {
+ if (mDelegate.mSelectedStartRangeCalendar == null) {
+ return false;
+ }
+ if (onCalendarIntercept(calendar)) {
+ return false;
+ }
+ if (mDelegate.mSelectedEndRangeCalendar == null) {
+ return calendar.compareTo(mDelegate.mSelectedStartRangeCalendar) == 0;
+ }
+ return calendar.compareTo(mDelegate.mSelectedStartRangeCalendar) >= 0 &&
+ calendar.compareTo(mDelegate.mSelectedEndRangeCalendar) <= 0;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+ if (calendar == null) {
+ return;
+ }
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarSelectOutOfRange(calendar);
+ }
+ return;
+ }
+
+ //优先判断各种直接return的情况,减少代码深度
+ if (mDelegate.mSelectedStartRangeCalendar != null && mDelegate.mSelectedEndRangeCalendar == null) {
+ int minDiffer = CalendarUtil.differ(calendar, mDelegate.mSelectedStartRangeCalendar);
+ if (minDiffer >= 0 && mDelegate.getMinSelectRange() != -1 && mDelegate.getMinSelectRange() > minDiffer + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(calendar, true);
+ }
+ return;
+ } else if (mDelegate.getMaxSelectRange() != -1 && mDelegate.getMaxSelectRange() <
+ CalendarUtil.differ(calendar, mDelegate.mSelectedStartRangeCalendar) + 1) {
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onSelectOutOfRange(calendar, false);
+ }
+ return;
+ }
+ }
+
+ if (mDelegate.mSelectedStartRangeCalendar == null || mDelegate.mSelectedEndRangeCalendar != null) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else {
+ int compare = calendar.compareTo(mDelegate.mSelectedStartRangeCalendar);
+ if (mDelegate.getMinSelectRange() == -1 && compare <= 0) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else if (compare < 0) {
+ mDelegate.mSelectedStartRangeCalendar = calendar;
+ mDelegate.mSelectedEndRangeCalendar = null;
+ } else if (compare == 0 &&
+ mDelegate.getMinSelectRange() == 1) {
+ mDelegate.mSelectedEndRangeCalendar = calendar;
+ } else {
+ mDelegate.mSelectedEndRangeCalendar = calendar;
+ }
+
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, true);
+ }
+ if (mParentLayout != null) {
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ if (mDelegate.mCalendarRangeSelectListener != null) {
+ mDelegate.mCalendarRangeSelectListener.onCalendarRangeSelect(calendar,
+ mDelegate.mSelectedEndRangeCalendar != null);
+ }
+
+ invalidate();
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ return false;
+ }
+
+ /**
+ * 上一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 上一个日期是否选中
+ */
+ protected final boolean isSelectPreCalendar(Calendar calendar, int calendarIndex) {
+
+ Calendar preCalendar;
+ if (calendarIndex == 0) {
+ preCalendar = CalendarUtil.getPreCalendar(calendar);
+ mDelegate.updateCalendarScheme(preCalendar);
+ } else {
+ preCalendar = mItems.get(calendarIndex - 1);
+ }
+ return mDelegate.mSelectedStartRangeCalendar != null &&
+ isCalendarSelected(preCalendar);
+ }
+
+ /**
+ * 下一个日期是否选中
+ *
+ * @param calendar 当前日期
+ * @param calendarIndex 当前位置
+ * @return 下一个日期是否选中
+ */
+ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarIndex) {
+ Calendar nextCalendar;
+ if (calendarIndex == mItems.size() - 1) {
+ nextCalendar = CalendarUtil.getNextCalendar(calendar);
+ mDelegate.updateCalendarScheme(nextCalendar);
+ } else {
+ nextCalendar = mItems.get(calendarIndex + 1);
+ }
+ return mDelegate.mSelectedStartRangeCalendar != null &&
+ isCalendarSelected(nextCalendar);
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @param isSelectedPre 上一个日期是否选中
+ * @param isSelectedNext 下一个日期是否选中
+ * @return 是否绘制 onDrawScheme
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme,
+ boolean isSelectedPre, boolean isSelectedNext);
+
+ /**
+ * 绘制标记的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/SolarTermUtil.java b/calendarview/src/main/java/com/haibin/calendarview/SolarTermUtil.java
new file mode 100644
index 0000000..a816cac
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/SolarTermUtil.java
@@ -0,0 +1,669 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+
+/**
+ * http://www.cnblogs.com/moodlxs/archive/2010/12/18/2345392.html
+ * 24节气计算公式,参考该博客实现
+ */
+@SuppressWarnings("all")
+public final class SolarTermUtil {
+
+
+ static void init(Context context) {
+ SOLAR_TERMS = context.getResources().getStringArray(R.array.solar_term);
+ }
+
+ /**
+ * 24节气
+ */
+ private static String SOLAR_TERMS[] = null;
+
+ /**
+ * 每弧度的角秒数
+ */
+ private static final double SECOND_PER_RAD = 180 * 3600 / Math.PI;
+
+ /**
+ * 每弧度的角度数
+ */
+ private static final double ANGLE_PER_RAD = 180 / Math.PI;
+
+ /**
+ * 日历计算
+ * 2000年前儒略日数(2000-1-1)
+ */
+ private static final double J2000 = 2451545;
+
+ /**
+ * 黄赤交角系数表
+ */
+ private static final double H_C_ANGLE_TABLE[] = {0, 50287.92262, 111.24406,
+ 0.07699, -0.23479, -0.00178, 0.00018, 0.00001};
+
+
+ /**
+ * 世界时与原子时之差计算表
+ */
+ private static final double[] DTS = {
+ -4000, 108371.7, -13036.80, 392.000, 0.0000, -500, 17201.0,
+ -627.82, 16.170, -0.3413, -150, 12200.6, -346.41, 5.403, -0.1593,
+ 150, 9113.8, -328.13, -1.647, 0.0377, 500, 5707.5, -391.41, 0.915,
+ 0.3145, 900, 2203.4, -283.45, 13.034, -0.1778, 1300, 490.1, -57.35,
+ 2.085, -0.0072, 1600, 120.0, -9.81, -1.532, 0.1403, 1700, 10.2,
+ -0.91, 0.510, -0.0370, 1800, 13.4, -0.72, 0.202, -0.0193, 1830,
+ 7.8, -1.81, 0.416, -0.0247, 1860, 8.3, -0.13, -0.406, 0.0292, 1880,
+ -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169, -0.0135, 1920,
+ 21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031, 1960,
+ 33.2, 0.51, 0.231, -0.0109, 1980, 51.0, 1.29, -0.026, 0.0032, 2000,
+ 64.7, -1.66, 5.224, -0.2905, 2150, 279.4, 732.95, 429.579, 0.0158,
+ 6000};
+
+ /**
+ * 离心率
+ */
+ private static final double GXC_E[] = {0.016708634, -0.000042037,
+ -0.0000001267};
+
+ /**
+ * 近点
+ */
+ private static final double GXC_P[] = {102.93735 / ANGLE_PER_RAD, 1.71946 / ANGLE_PER_RAD,
+ 0.00046 / ANGLE_PER_RAD};
+
+ /**
+ * 太平黄经
+ */
+ private static final double GXC_L[] = {280.4664567 / ANGLE_PER_RAD,
+ 36000.76982779 / ANGLE_PER_RAD, 0.0003032028 / ANGLE_PER_RAD, 1 / 49931000 / ANGLE_PER_RAD,
+ -1 / 153000000 / ANGLE_PER_RAD};
+
+ /**
+ * 光行差常数
+ */
+ private static final double GXC_K = 20.49552 / SECOND_PER_RAD;
+
+
+ /**
+ * 向下取整
+ *
+ * @param v v
+ * @return 取整数部分
+ */
+ private static double doubleFloor(double v) {
+ v = Math.floor(v);
+ if (v < 0)
+ return v + 1;
+
+ return v;
+ }
+
+
+ /**
+ * 对超过0-2PI的角度转为0-2PI
+ *
+ * @param v v
+ * @return 对超过0-2PI的角度转为0-2PI
+ */
+ private static double rad2mrad(double v) {
+ v = v % (2 * Math.PI);
+ if (v < 0)
+ return v + 2 * Math.PI;
+
+ return v;
+ }
+
+ /**
+ * 计算世界时与原子时之差,传入年
+ *
+ * @param year 年
+ * @return 计算世界时与原子时之差
+ */
+ private static double worldTimeDiff(double year) {
+ int i;
+ for (i = 0; i < 100; i += 5)
+ if (year < DTS[i + 5] || i == 95)
+ break;
+
+ double t1 = (year - DTS[i]) / (DTS[i + 5] - DTS[i]) * 10;
+ double t2 = t1 * t1;
+ double t3 = t2 * t1;
+ return DTS[i + 1] + DTS[i + 2] * t1 + DTS[i + 3] * t2 + DTS[i + 4] * t3;
+ }
+
+ /**
+ * 传入儒略日(J2000起算),计算UTC与原子时的差(单位:日)
+ *
+ * @param julian 儒略日
+ * @return 计算UTC与原子时的差
+ */
+ private static double atomTimeDiff(double julian) {
+ return worldTimeDiff(julian / 365.2425 + 2000) / 86400.0;
+ }
+
+ /**
+ * 公历转儒略日,UTC=1表示原日期是UTC
+ *
+ * @param UTC UTC
+ * @return 公历转儒略日, UTC=1表示原日期是UTC
+ */
+ private static double toJulian(Time time, boolean UTC) {
+ double y = time.year; // 取出年月
+ double m = time.month;
+ double n = 0;
+
+ if (m <= 2) {
+ m += 12;
+ y--;
+ }
+
+ if (time.year * 372 + time.month * 31 + time.day >= 588829) {
+ // 判断是否为格里高利历日1582*372+10*31+15
+ n = doubleFloor(y / 100);
+ n = 2 - n + doubleFloor(n / 4);// 加百年闰
+ }
+
+ n += doubleFloor(365.2500001 * (y + 4716)); // 加上年引起的偏移日数
+ n += doubleFloor(30.6 * (m + 1)) + time.day; // 加上月引起的偏移日数及日偏移数
+ n += ((time.second / 60 + time.minute) / 60 + time.hour) / 24 - 1524.5;
+ if (UTC)
+ return n + atomTimeDiff(n - J2000);
+
+ return n;
+ }
+
+ /**
+ * 儒略日数转公历,UTC=1表示目标公历是UTC
+ *
+ * @param jd jd
+ * @param UTC UTC
+ */
+ @SuppressWarnings("all")
+ private static Time setFromJulian(double jd, boolean UTC) {
+ Time time = new Time();
+ if (UTC)
+ jd -= atomTimeDiff(jd - J2000);
+
+ jd += 0.5;
+
+ // 取得日数的整数部份A及小数部分F
+ double A = doubleFloor(jd);
+ double F = jd - A;
+ double D;
+
+ if (A > 2299161) {
+ D = doubleFloor((A - 1867216.25) / 36524.25);
+ A += 1 + D - doubleFloor(D / 4);
+ }
+ A += 1524; // 向前移4年零2个月
+ time.year = doubleFloor((A - 122.1) / 365.25);// 年
+ D = A - doubleFloor(365.25 * time.year); // 去除整年日数后余下日数
+ time.month = doubleFloor(D / 30.6001); // 月数
+ time.day = D - doubleFloor(time.month * 30.6001);// 去除整月日数后余下日数
+ time.year -= 4716;
+ time.month--;
+ if (time.month > 12)
+ time.month -= 12;
+ if (time.month <= 2)
+ time.year++;
+ // 日的小数转为时分秒
+ F *= 24;
+ time.hour = doubleFloor(F);
+ F -= time.hour;
+ F *= 60;
+ time.minute = doubleFloor(F);
+ F -= time.minute;
+ F *= 60;
+ time.second = F;
+ return time;
+ }
+
+
+ /**
+ * 补岁差
+ *
+ * @param jd jd
+ * @param zb zb
+ */
+ private static void precession(double jd, double[] zb) {
+ int i;
+ double t = 1, v = 0, t1 = jd / 365250;
+ for (i = 1; i < 8; i++) {
+ t *= t1;
+ v += H_C_ANGLE_TABLE[i] * t;
+ }
+ zb[0] = rad2mrad(zb[0] + (v + 2.9965 * t1) / SECOND_PER_RAD);
+ }
+
+
+ /**
+ * 恒星周年光行差计算(黄道坐标中)
+ *
+ * @param t t
+ * @param zb zb
+ */
+ private static void addGxc(double t, double[] zb) {
+ double t1 = t / 36525;
+ double t2 = t1 * t1;
+ double t3 = t2 * t1;
+ double t4 = t3 * t1;
+ double L = GXC_L[0] + GXC_L[1] * t1 + GXC_L[2] * t2 + GXC_L[3] * t3
+ + GXC_L[4] * t4;
+ double p = GXC_P[0] + GXC_P[1] * t1 + GXC_P[2] * t2;
+ double e = GXC_E[0] + GXC_E[1] * t1 + GXC_E[2] * t2;
+ double dL = L - zb[0], dP = p - zb[0];
+ zb[0] -= GXC_K * (Math.cos(dL) - e * Math.cos(dP)) / Math.cos(zb[1]);
+ zb[1] -= GXC_K * Math.sin(zb[1]) * (Math.sin(dL) - e * Math.sin(dP));
+ zb[0] = rad2mrad(zb[0]);
+ }
+
+ /**
+ * 章动计算
+ */
+ private static final double nutB[] = {// 章动表
+ 2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10,
+ -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738,
+ 0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31,
+ 1.3375032491, 16799.418221925, -0.0000511866, 6.4626E-08,
+ -5.3543E-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907,
+ 0.0000724525, 7.4681E-08, -5.7586E-10, 2062, 2, -895, 5,
+ 0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11,
+ -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547,
+ 2.5033E-07, -1.1863E-09, 712, 1, -7, 0, 3.4638155059,
+ 1884.965885909, 0.0000079025, 3.8785E-11, -2.8386E-10, -517, 12,
+ 224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285E-08,
+ -2.4750E-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645,
+ 0.0001033681, 3.1496E-07, -1.7218E-09, -301, 0, 129, -1,
+ 3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09, -1.7245E-10,
+ 217, -5, -95, 3};
+
+
+ /**
+ * 计算黄经章动及交角章动
+ *
+ * @param t t
+ * @return 计算黄经章动及交角章动
+ */
+ private static Nutation nutation(double t) {
+ Nutation d = new Nutation();
+ d.Lon = 0;
+ d.Obl = 0;
+ t /= 36525;
+ double c, t1 = t, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;// t5=t4*t1;
+ for (int i = 0; i < nutB.length; i += 9) {
+ c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3]
+ * t3 + nutB[i + 4] * t4;
+ d.Lon += (nutB[i + 5] + nutB[i + 6] * t / 10) * Math.sin(c); // 黄经章动
+ d.Obl += (nutB[i + 7] + nutB[i + 8] * t / 10) * Math.cos(c); // 交角章动
+ }
+ d.Lon /= SECOND_PER_RAD * 10000; // 黄经章动
+ d.Obl /= SECOND_PER_RAD * 10000; // 交角章动
+ return d;
+ }
+
+
+ //
+ /***************************************
+ * 如果用记事本查看此代码,请在"格式"菜单中去除"自动换行"
+ * E10是关于地球的,格式如下:
+ * 它是一个数组,每3个数看作一条记录,每条记录的3个数记为A,B,C
+ * rec=A*cos(B+C*t); 式中t是J2000起算的儒略千年数
+ * 每条记录的计算结果(即rec)取和即得地球的日心黄经的周期量L0
+ * E11格式如下: rec = A*cos*(B+C*t) *t, 取和后得泊松量L1
+ * E12格式如下: rec = A*cos*(B+C*t) *t*t, 取和后得泊松量L2
+ * E13格式如下: rec = A*cos*(B+C*t) *t*t*t, 取和后得泊松量L3
+ * 最后地球的地心黄经:L = L0+L1+L2+L3+...
+ * E20,E21,E22,E23...用于计算黄纬
+ * M10,M11等是关于月球的,参数的用法请阅读Mnn()函数
+ *****************************************/
+ //地球运动VSOP87参数
+ private static final double E10[] = { //黄经周期项
+ 1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456, 4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759, 12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490,
+ 0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218, 4.41808351397, 7860.4193924392, 0.00002342687, 6.13516237631, 3930.2096962196,
+ 0.00001273166, 2.03709655772, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855, 2.04505443513, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478,
+ 0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786, 1.17882652114, 5223.6939198022, 0.00000990250, 5.23268129594, 5884.9268465832, 0.00000753141, 2.53339053818, 5507.5532386674,
+ 0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379, 4.20506639861, 775.5226113240, 0.00000356655, 2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164,
+ 0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649, 10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834,
+ 0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261, 2.45767795458, 6069.7767545534, 0.00000126184, 1.08302630210, 20.7753954924, 0.00000155516, 0.83306073807, 213.2990954380,
+ 0.00000115132, 0.64544911683, 0.9803210682, 0.00000102851, 0.63599846727, 4694.0029547076, 0.00000101724, 4.26679821365, 7.1135470008, 0.00000099206, 6.20992940258, 2146.1654164752,
+ 0.00000132212, 3.41118275555, 2942.4634232916, 0.00000097607, 0.68101272270, 155.4203994342, 0.00000085128, 1.29870743025, 6275.9623029906, 0.00000074651, 1.75508916159, 5088.6288397668,
+ 0.00000101895, 0.97569221824, 15720.8387848784, 0.00000084711, 3.67080093025, 71430.6956181291, 0.00000073547, 4.67926565481, 801.8209311238, 0.00000073874, 3.50319443167, 3154.6870848956,
+ 0.00000078756, 3.03698313141, 12036.4607348882, 0.00000079637, 1.80791330700, 17260.1546546904, 0.00000085803, 5.98322631256, 161000.6857376741, 0.00000056963, 2.78430398043, 6286.5989683404,
+ 0.00000061148, 1.81839811024, 7084.8967811152, 0.00000069627, 0.83297596966, 9437.7629348870, 0.00000056116, 4.38694880779, 14143.4952424306, 0.00000062449, 3.97763880587, 8827.3902698748,
+ 0.00000051145, 0.28306864501, 5856.4776591154, 0.00000055577, 3.47006009062, 6279.5527316424, 0.00000041036, 5.36817351402, 8429.2412664666, 0.00000051605, 1.33282746983, 1748.0164130670,
+ 0.00000051992, 0.18914945834, 12139.5535091068, 0.00000049000, 0.48735065033, 1194.4470102246, 0.00000039200, 6.16832995016, 10447.3878396044, 0.00000035566, 1.77597314691, 6812.7668150860,
+ 0.00000036770, 6.04133859347, 10213.2855462110, 0.00000036596, 2.56955238628, 1059.3819301892, 0.00000033291, 0.59309499459, 17789.8456197850, 0.00000035954, 1.70876111898, 2352.8661537718};
+ private static final double E11[] = { //黄经泊松1项
+ 6283.31966747491, 0.00000000000, 0.0000000000, 0.00206058863, 2.67823455584, 6283.0758499914, 0.00004303430, 2.63512650414, 12566.1516999828, 0.00000425264, 1.59046980729, 3.5231183490,
+ 0.00000108977, 2.96618001993, 1577.3435424478, 0.00000093478, 2.59212835365, 18849.2275499742, 0.00000119261, 5.79557487799, 26.2983197998, 0.00000072122, 1.13846158196, 529.6909650946,
+ 0.00000067768, 1.87472304791, 398.1490034082, 0.00000067327, 4.40918235168, 5507.5532386674, 0.00000059027, 2.88797038460, 5223.6939198022, 0.00000055976, 2.17471680261, 155.4203994342,
+ 0.00000045407, 0.39803079805, 796.2980068164, 0.00000036369, 0.46624739835, 775.5226113240, 0.00000028958, 2.64707383882, 7.1135470008, 0.00000019097, 1.84628332577, 5486.7778431750,
+ 0.00000020844, 5.34138275149, 0.9803210682, 0.00000018508, 4.96855124577, 213.2990954380, 0.00000016233, 0.03216483047, 2544.3144198834, 0.00000017293, 2.99116864949, 6275.9623029906};
+ private static final double E12[] = { //黄经泊松2项
+ 0.00052918870, 0.00000000000, 0.0000000000, 0.00008719837, 1.07209665242, 6283.0758499914, 0.00000309125, 0.86728818832, 12566.1516999828, 0.00000027339, 0.05297871691, 3.5231183490,
+ 0.00000016334, 5.18826691036, 26.2983197998, 0.00000015752, 3.68457889430, 155.4203994342, 0.00000009541, 0.75742297675, 18849.2275499742, 0.00000008937, 2.05705419118, 77713.7714681205,
+ 0.00000006952, 0.82673305410, 775.5226113240, 0.00000005064, 4.66284525271, 1577.3435424478};
+ private static final double E13[] = {0.00000289226, 5.84384198723, 6283.0758499914, 0.00000034955, 0.00000000000, 0.0000000000, 0.00000016819, 5.48766912348, 12566.1516999828};
+ private static final double E14[] = {0.00000114084, 3.14159265359, 0.0000000000, 0.00000007717, 4.13446589358, 6283.0758499914, 0.00000000765, 3.83803776214, 12566.1516999828};
+ private static final double E15[] = {0.00000000878, 3.14159265359, 0.0000000000};
+ private static final double E20[] = { //黄纬周期项
+ 0.00000279620, 3.19870156017, 84334.6615813083, 0.00000101643, 5.42248619256, 5507.5532386674, 0.00000080445, 3.88013204458, 5223.6939198022, 0.00000043806, 3.70444689758, 2352.8661537718,
+ 0.00000031933, 4.00026369781, 1577.3435424478, 0.00000022724, 3.98473831560, 1047.7473117547, 0.00000016392, 3.56456119782, 5856.4776591154, 0.00000018141, 4.98367470263, 6283.0758499914,
+ 0.00000014443, 3.70275614914, 9437.7629348870, 0.00000014304, 3.41117857525, 10213.2855462110};
+ private static final double E21[] = {0.00000009030, 3.89729061890, 5507.5532386674, 0.00000006177, 1.73038850355, 5223.6939198022};
+ private static final double E30[] = { //距离周期项
+ 1.00013988799, 0.00000000000, 0.0000000000, 0.01670699626, 3.09846350771, 6283.0758499914, 0.00013956023, 3.05524609620, 12566.1516999828, 0.00003083720, 5.19846674381, 77713.7714681205,
+ 0.00001628461, 1.17387749012, 5753.3848848968, 0.00001575568, 2.84685245825, 7860.4193924392, 0.00000924799, 5.45292234084, 11506.7697697936, 0.00000542444, 4.56409149777, 3930.2096962196};
+ private static final double E31[] = {0.00103018608, 1.10748969588, 6283.0758499914, 0.00001721238, 1.06442301418, 12566.1516999828, 0.00000702215, 3.14159265359, 0.0000000000};
+ private static final double E32[] = {0.00004359385, 5.78455133738, 6283.0758499914};
+ private static final double E33[] = {0.00000144595, 4.27319435148, 6283.0758499914};
+ //月球运动参数
+ private static final double M10[] = {
+ 22639.5858800, 2.3555545723, 8328.6914247251, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 4586.4383203, 8.0413790709, 7214.0628654588, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, 2369.9139357, 10.3969336431, 15542.7542901840, -6.6188121E-05, 6.3946925E-08, -3.0872935E-10, 769.0257187, 4.7111091445, 16657.3828494503, 3.0462550E-04, 5.0082223E-07, -2.3726782E-09,
+ -666.4175399, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, -411.5957339, 3.2558104895, 16866.9323152810, -1.2804259E-04, -9.8998954E-09, 4.0433461E-11, 211.6555524, 5.6858244986, -1114.6285592663, -3.7081362E-04, -4.3687530E-07, 2.0639488E-09, 205.4359530, 8.0845047526, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10,
+ 191.9561973, 12.7524882154, 23871.4457149091, 8.6124629E-05, 3.1435804E-07, -1.4950684E-09, 164.7286185, 10.4400593249, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, -147.3213842, -2.3986802540, -7700.3894694766, -1.5497663E-04, -2.4979472E-07, 1.1318993E-09, -124.9881185, 5.1984668216, 7771.3771450920, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10,
+ -109.3803637, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 55.1770578, 7.1411231536, -1324.1780250970, 6.1854469E-05, 7.3846820E-08, -3.4916281E-10, -45.0996092, 5.6113650618, 25195.6237400061, 2.4270161E-05, 2.4051122E-07, -1.1459056E-09, 39.5333010, -0.9002559173, -8538.2408905558, 2.8035534E-04, 2.6031101E-07, -1.2267725E-09,
+ 38.4298346, 18.4383127140, 22756.8171556428, -2.8468899E-04, -1.2251727E-07, 5.6888037E-10, 36.1238141, 7.0666637168, 24986.0742741754, 4.5693825E-04, 7.5123334E-07, -3.5590172E-09, 30.7725751, 16.0827581417, 14428.1257309177, -4.3700174E-04, -3.7292838E-07, 1.7552195E-09, -28.3971008, 7.9982533891, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10,
+ -24.3582283, 10.3538079614, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10, -18.5847068, 2.8429122493, -557.3142796331, -1.8540681E-04, -2.1843765E-07, 1.0319744E-09, 17.9544674, 5.1553411398, 8399.6791003405, -3.5757942E-05, 3.2589854E-08, -2.0880440E-10, 14.5302779, 12.7956138971, 23243.1437596606, 8.8788511E-05, 3.1374165E-07, -1.4406287E-09,
+ 14.3796974, 15.1080427876, 32200.1371396342, 2.3843738E-04, 5.6476915E-07, -2.6814075E-09, 14.2514576, -24.0810366320, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 13.8990596, 20.7938672862, 31085.5085803679, -1.3237624E-04, 1.2789385E-07, -6.1745870E-10, 13.1940636, 3.3302699264, -9443.3199839914, -5.2312637E-04, -6.8728642E-07, 3.2502879E-09,
+ -9.6790568, -4.7542348263, -16029.0808942018, -3.0728938E-04, -5.0020584E-07, 2.3182384E-09, -9.3658635, 11.2971895604, 24080.9951807398, -3.4654346E-04, -1.9636409E-07, 9.1804319E-10, 8.6055318, 5.7289501804, -1742.9305145148, -3.6814974E-04, -4.3749170E-07, 2.1183885E-09, -8.4530982, 7.5540213938, 16100.0685698171, 1.1921869E-04, 2.8238458E-07, -1.3407038E-09,
+ 8.0501724, 10.4831850066, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10, -7.6301553, 4.6679834628, 17285.6848046987, 3.0196162E-04, 5.0143862E-07, -2.4271179E-09, -7.4474952, -0.0862513635, 1256.6039104970, -5.3277630E-06, 1.2327842E-09, -1.0887946E-10, 7.3712011, 8.1276304344, 5957.4589549619, -2.1317311E-04, -1.8769697E-07, 9.8648918E-10,
+ 7.0629900, 0.9591375719, 33.7570471374, -3.0829302E-05, -3.6967043E-08, 1.7385419E-10, -6.3831491, 9.4966777258, 7004.5133996281, 2.1416722E-04, 3.2425793E-07, -1.5355019E-09, -5.7416071, 13.6527441326, 32409.6866054649, -1.9423071E-04, 5.4047029E-08, -2.6829589E-10, 4.3740095, 18.4814383957, 22128.5152003943, -2.8202511E-04, -1.2313366E-07, 6.2332010E-10,
+ -3.9976134, 7.9669196340, 33524.3151647312, 1.7658291E-04, 4.9092233E-07, -2.3322447E-09, -3.2096876, 13.2398458924, 14985.4400105508, -2.5159493E-04, -1.5449073E-07, 7.2324505E-10, -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748E-05, 3.1497443E-07, -1.5495082E-09, 2.7318890, 16.1258838235, 13799.8237756692, -4.3433786E-04, -3.7354477E-07, 1.8096592E-09,
+ -2.5679459, -2.4418059357, -7072.0875142282, -1.5764051E-04, -2.4917833E-07, 1.0774596E-09, -2.5211990, 7.9551277074, 8470.6667759558, -2.2382863E-04, -1.8523141E-07, 7.6873027E-10, 2.4888871, 5.6426988169, -486.3266040178, -3.7347750E-04, -4.3625891E-07, 2.0095091E-09, 2.1460741, 7.1842488353, -1952.4799803455, 6.4518350E-05, 7.3230428E-08, -2.9472308E-10,
+ 1.9777270, 23.1494218585, 39414.2000050930, 1.9936508E-05, 3.7830496E-07, -1.8037978E-09, 1.9336825, 9.4222182890, 33314.7656989005, 6.0925100E-04, 1.0016445E-06, -4.7453563E-09, 1.8707647, 20.8369929680, 30457.2066251194, -1.2971236E-04, 1.2727746E-07, -5.6301898E-10, -1.7529659, 0.4873576771, -8886.0057043583, -3.3771956E-04, -4.6884877E-07, 2.2183135E-09,
+ -1.4371624, 7.0979974718, -695.8760698485, 5.9190587E-05, 7.4463212E-08, -4.0360254E-10, -1.3725701, 1.4552986550, -209.5494658307, 4.3266809E-04, 5.1072212E-07, -2.4131116E-09, 1.2618162, 7.5108957121, 16728.3705250656, 1.1655481E-04, 2.8300097E-07, -1.3951435E-09};
+ private static final double M11[] = {
+ 1.6768000, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.5164200, 11.2260974062, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, 0.4138300, 13.5816519784, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, 0.3711500, 5.5402729076, 7700.3894694766, 1.5497663E-04, 2.4979472E-07, -1.1318993E-09,
+ 0.2756000, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09, 0.2459863, -25.6198212459, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 0.0711800, 7.9982533891, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, 0.0612800, 10.3538079614, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10};
+ private static final double M12[] = {0.0048700, -0.0431256817, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.0022800, -27.1705318325, -2.3011998397, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, 0.0015000, 11.2260974062, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10};
+ private static final double M20[] = {
+ 18461.2400600, 1.6279052448, 8433.4661576405, -6.4021295E-05, -4.9499477E-09, 2.0216731E-11, 1010.1671484, 3.9834598170, 16762.1575823656, 8.8291456E-05, 2.4546117E-07, -1.1661223E-09, 999.6936555, 0.7276493275, -104.7747329154, 2.1633405E-04, 2.5536106E-07, -1.2065558E-09, 623.6524746, 8.7690283983, 7109.2881325435, -2.1668263E-06, 6.8896872E-08, -3.2894608E-10,
+ 199.4837596, 9.6692843156, 15647.5290230993, -2.8252217E-04, -1.9141414E-07, 8.9782646E-10, 166.5741153, 6.4134738261, -1219.4032921817, -1.5447958E-04, -1.8151424E-07, 8.5739300E-10, 117.2606951, 12.0248388879, 23976.2204478244, -1.3020942E-04, 5.8996977E-08, -2.8851262E-10, 61.9119504, 6.3390143893, 25090.8490070907, 2.4060421E-04, 4.9587228E-07, -2.3524614E-09,
+ 33.3572027, 11.1245829706, 15437.9795572686, 1.5014592E-04, 3.1930799E-07, -1.5152852E-09, 31.7596709, 3.0832038997, 8223.9166918098, 3.6864680E-04, 5.0577218E-07, -2.3928949E-09, 29.5766003, 8.8121540801, 6480.9861772950, 4.9705523E-07, 6.8280480E-08, -2.7450635E-10, 15.5662654, 4.0579192538, -9548.0947169068, -3.0679233E-04, -4.3192536E-07, 2.0437321E-09,
+ 15.1215543, 14.3803934601, 32304.9118725496, 2.2103334E-05, 3.0940809E-07, -1.4748517E-09, -12.0941511, 8.7259027166, 7737.5900877920, -4.8307078E-06, 6.9513264E-08, -3.8338581E-10, 8.8681426, 9.7124099974, 15019.2270678508, -2.7985829E-04, -1.9203053E-07, 9.5226618E-10, 8.0450400, 0.6687636586, 8399.7091105030, -3.3191993E-05, 3.2017096E-08, -1.5363746E-10,
+ 7.9585542, 12.0679645696, 23347.9184925760, -1.2754553E-04, 5.8380585E-08, -2.3407289E-10, 7.4345550, 6.4565995078, -1847.7052474301, -1.5181570E-04, -1.8213063E-07, 9.1183272E-10, -6.7314363, -4.0265854988, -16133.8556271171, -9.0955337E-05, -2.4484477E-07, 1.1116826E-09, 6.5795750, 16.8104074692, 14323.3509980023, -2.2066770E-04, -1.1756732E-07, 5.4866364E-10,
+ -6.4600721, 1.5847795630, 9061.7681128890, -6.6685176E-05, -4.3335556E-09, -3.4222998E-11, -6.2964773, 4.8837157343, 25300.3984729215, -1.9206388E-04, -1.4849843E-08, 6.0650192E-11, -5.6323538, -0.7707750092, 733.0766881638, -2.1899793E-04, -2.5474467E-07, 1.1521161E-09, -5.3683961, 6.8263720663, 16204.8433027325, -9.7115356E-05, 2.7023515E-08, -1.3414795E-10,
+ -5.3112784, 3.9403341353, 17390.4595376141, 8.5627574E-05, 2.4607756E-07, -1.2205621E-09, -5.0759179, 0.6845236457, 523.5272223331, 2.1367016E-04, 2.5597745E-07, -1.2609955E-09, -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413E-05, 5.5663398E-09, -7.4656459E-11, -4.8057401, 3.5705615768, -662.0890125485, 3.0927234E-05, 3.6923410E-08, -1.7458141E-10,
+ 3.9840545, 8.6945689615, 33419.5404318159, 3.9291696E-04, 7.4628340E-07, -3.5388005E-09, 3.6744619, 19.1659620415, 22652.0424227274, -6.8354947E-05, 1.3284380E-07, -6.3767543E-10, 2.9984815, 20.0662179587, 31190.2833132833, -3.4871029E-04, -1.2746721E-07, 5.8909710E-10, 2.7986413, -2.5281611620, -16971.7070481963, 3.4437664E-04, 2.6526096E-07, -1.2469893E-09,
+ 2.4138774, 17.7106633865, 22861.5918885581, -5.0102304E-04, -3.7787833E-07, 1.7754362E-09, 2.1863132, 5.5132179088, -9757.6441827375, 1.2587576E-04, 7.8796768E-08, -3.6937954E-10, 2.1461692, 13.4801375428, 23766.6709819937, 3.0245868E-04, 5.6971910E-07, -2.7016242E-09, 1.7659832, 11.1677086523, 14809.6776020201, 1.5280981E-04, 3.1869159E-07, -1.4608454E-09,
+ -1.6244212, 7.3137297434, 7318.8375983742, -4.3483492E-04, -4.4182525E-07, 2.0841655E-09, 1.5813036, 5.4387584720, 16552.6081165349, 5.2095955E-04, 7.5618329E-07, -3.5792340E-09, 1.5197528, 16.7359480324, 40633.6032972747, 1.7441609E-04, 5.5981921E-07, -2.6611908E-09, 1.5156341, 1.7023646816, -17876.7861416319, -4.5910508E-04, -6.8233647E-07, 3.2300712E-09,
+ 1.5102092, 5.4977296450, 8399.6847301375, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10, -1.3178223, 9.6261586339, 16275.8309783478, -2.8518605E-04, -1.9079775E-07, 8.4338673E-10, -1.2642739, 11.9817132061, 24604.5224030729, -1.3287330E-04, 5.9613369E-08, -3.4295235E-10, 1.1918723, 22.4217725310, 39518.9747380084, -1.9639754E-04, 1.2294390E-07, -5.9724197E-10,
+ 1.1346110, 14.4235191419, 31676.6099173011, 2.4767216E-05, 3.0879170E-07, -1.4204120E-09, 1.0857810, 8.8552797618, 5852.6842220465, 3.1609367E-06, 6.7664088E-08, -2.2006663E-10, -1.0193852, 7.2392703065, 33629.0898976466, -3.9751134E-05, 2.3556127E-07, -1.1256889E-09, -0.8227141, 11.0814572888, 16066.2815125171, 1.4748204E-04, 3.1992438E-07, -1.5697249E-09,
+ 0.8042238, 3.5274358950, -33.7870573000, 2.8263353E-05, 3.7539802E-08, -2.2902113E-10, 0.8025939, 6.7832463846, 16833.1452579809, -9.9779237E-05, 2.7639907E-08, -1.8858767E-10, -0.7931866, -6.3821400710, -24462.5470518423, -2.4326809E-04, -4.9525589E-07, 2.2980217E-09, -0.7910153, 6.3703481443, -591.1013369332, -1.5714346E-04, -1.8089785E-07, 8.0295327E-10,
+ -0.6674056, 9.1819266386, 24533.5347274576, 5.5197395E-05, 2.7743463E-07, -1.3204870E-09, 0.6502226, 4.1010449356, -10176.3966721553, -3.0412845E-04, -4.3254175E-07, 2.0981718E-09, -0.6388131, 6.2958887075, 25719.1509623392, 2.3794032E-04, 4.9648867E-07, -2.4069012E-09};
+ private static final double M21[] = {
+ 0.0743000, 11.9537467337, 6480.9861772950, 4.9705523E-07, 6.8280480E-08, -2.7450635E-10, 0.0304300, 8.7259027166, 7737.5900877920, -4.8307078E-06, 6.9513264E-08, -3.8338581E-10, 0.0222900, 12.8540026510, 15019.2270678508, -2.7985829E-04, -1.9203053E-07, 9.5226618E-10, 0.0199900, 15.2095572232, 23347.9184925760, -1.2754553E-04, 5.8380585E-08, -2.3407289E-10,
+ 0.0186900, 9.5981921614, -1847.7052474301, -1.5181570E-04, -1.8213063E-07, 9.1183272E-10, 0.0169600, 7.1681781524, 16133.8556271171, 9.0955337E-05, 2.4484477E-07, -1.1116826E-09, 0.0162300, 1.5847795630, 9061.7681128890, -6.6685176E-05, -4.3335556E-09, -3.4222998E-11, 0.0141900, -0.7707750092, 733.0766881638, -2.1899793E-04, -2.5474467E-07, 1.1521161E-09};
+ private static final double M30[] = {
+ 385000.5290396, 1.5707963268, 0.0000000000, 0.0000000E+00, 0.0000000E+00, 0.0000000E+00, -20905.3551378, 3.9263508990, 8328.6914247251, 1.5231275E-04, 2.5041111E-07, -1.1863391E-09, -3699.1109330, 9.6121753977, 7214.0628654588, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, -2955.9675626, 11.9677299699, 15542.7542901840, -6.6188121E-05, 6.3946925E-08, -3.0872935E-10,
+ -569.9251264, 6.2819054713, 16657.3828494503, 3.0462550E-04, 5.0082223E-07, -2.3726782E-09, 246.1584797, 7.2566208254, -1114.6285592663, -3.7081362E-04, -4.3687530E-07, 2.0639488E-09, -204.5861179, 12.0108556517, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, -170.7330791, 14.3232845422, 23871.4457149091, 8.6124629E-05, 3.1435804E-07, -1.4950684E-09,
+ -152.1378118, 9.6553010794, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, -129.6202242, -0.8278839272, -7700.3894694766, -1.5497663E-04, -2.4979472E-07, 1.1318993E-09, 108.7427014, 6.7692631483, 7771.3771450920, -3.3094061E-05, 3.1973462E-08, -1.5436468E-10, 104.7552944, 3.8832252173, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09,
+ 79.6605685, 0.6705404095, -8538.2408905558, 2.8035534E-04, 2.6031101E-07, -1.2267725E-09, 48.8883284, 1.5276706450, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, -34.7825237, 20.0091090408, 22756.8171556428, -2.8468899E-04, -1.2251727E-07, 5.6888037E-10, 30.8238599, 11.9246042882, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10,
+ 24.2084985, 9.5690497159, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, -23.2104305, 8.6374600436, 24986.0742741754, 4.5693825E-04, 7.5123334E-07, -3.5590172E-09, -21.6363439, 17.6535544685, 14428.1257309177, -4.3700174E-04, -3.7292838E-07, 1.7552195E-09, -16.6747239, 6.7261374666, 8399.6791003405, -3.5757942E-05, 3.2589854E-08, -2.0880440E-10,
+ 14.4026890, 4.9010662531, -9443.3199839914, -5.2312637E-04, -6.8728642E-07, 3.2502879E-09, -12.8314035, 14.3664102239, 23243.1437596606, 8.8788511E-05, 3.1374165E-07, -1.4406287E-09, -11.6499478, 22.3646636130, 31085.5085803679, -1.3237624E-04, 1.2789385E-07, -6.1745870E-10, -10.4447578, 16.6788391144, 32200.1371396342, 2.3843738E-04, 5.6476915E-07, -2.6814075E-09,
+ 10.3211071, 8.7119194804, -1324.1780250970, 6.1854469E-05, 7.3846820E-08, -3.4916281E-10, 10.0562033, 7.2997465071, -1742.9305145148, -3.6814974E-04, -4.3749170E-07, 2.1183885E-09, -9.8844667, 12.0539813334, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10, 8.7515625, 6.3563649081, -9652.8694498221, -9.0458282E-05, -1.7656429E-07, 8.3717626E-10,
+ -8.3791067, 4.4137085761, -557.3142796331, -1.8540681E-04, -2.1843765E-07, 1.0319744E-09, -7.0026961, -3.1834384995, -16029.0808942018, -3.0728938E-04, -5.0020584E-07, 2.3182384E-09, 6.3220032, 9.1248177206, 16100.0685698171, 1.1921869E-04, 2.8238458E-07, -1.3407038E-09, 5.7508579, 6.2387797896, 17285.6848046987, 3.0196162E-04, 5.0143862E-07, -2.4271179E-09,
+ -4.9501349, 9.6984267611, 5957.4589549619, -2.1317311E-04, -1.8769697E-07, 9.8648918E-10, -4.4211770, 3.0260949818, -209.5494658307, 4.3266809E-04, 5.1072212E-07, -2.4131116E-09, 4.1311145, 11.0674740526, 7004.5133996281, 2.1416722E-04, 3.2425793E-07, -1.5355019E-09, -3.9579827, 20.0522347225, 22128.5152003943, -2.8202511E-04, -1.2313366E-07, 6.2332010E-10,
+ 3.2582371, 14.8106422192, 14985.4400105508, -2.5159493E-04, -1.5449073E-07, 7.2324505E-10, -3.1483020, 4.8266068163, 16866.9323152810, -1.2804259E-04, -9.8998954E-09, 4.0433461E-11, 2.6164092, 14.2801588604, 24499.7476701576, 8.3460748E-05, 3.1497443E-07, -1.5495082E-09, 2.3536310, 9.5259240342, 8470.6667759558, -2.2382863E-04, -1.8523141E-07, 7.6873027E-10,
+ -2.1171283, -0.8710096090, -7072.0875142282, -1.5764051E-04, -2.4917833E-07, 1.0774596E-09, -1.8970368, 17.6966801503, 13799.8237756692, -4.3433786E-04, -3.7354477E-07, 1.8096592E-09, -1.7385258, 2.0581540038, -8886.0057043583, -3.3771956E-04, -4.6884877E-07, 2.2183135E-09, -1.5713944, 22.4077892948, 30457.2066251194, -1.2971236E-04, 1.2727746E-07, -5.6301898E-10,
+ -1.4225541, 24.7202181853, 39414.2000050930, 1.9936508E-05, 3.7830496E-07, -1.8037978E-09, -1.4189284, 17.1661967915, 23314.1314352759, -9.9282182E-05, 9.5920387E-08, -4.6309403E-10, 1.1655364, 3.8400995356, 9585.2953352221, 1.4698499E-04, 2.5164390E-07, -1.2952185E-09, -1.1169371, 10.9930146158, 33314.7656989005, 6.0925100E-04, 1.0016445E-06, -4.7453563E-09,
+ 1.0656723, 1.4845449633, 1256.6039104970, -5.3277630E-06, 1.2327842E-09, -1.0887946E-10, 1.0586190, 11.9220903668, 8364.7398411275, -2.1850087E-04, -1.8646419E-07, 8.7760973E-10, -0.9333176, 9.0816920389, 16728.3705250656, 1.1655481E-04, 2.8300097E-07, -1.3951435E-09, 0.8624328, 12.4550876470, 6656.7485858257, -4.0390768E-04, -4.0490184E-07, 1.9095841E-09,
+ 0.8512404, 4.3705828944, 70.9876756153, -1.8807069E-04, -2.1782126E-07, 9.7753467E-10, -0.8488018, 16.7219647962, 31571.8351843857, 2.4110126E-04, 5.6415276E-07, -2.6269678E-09, -0.7956264, 3.5134526588, -9095.5551701890, 9.4948529E-05, 4.1873358E-08, -1.9479814E-10};
+ private static final double M31[] = {
+ 0.5139500, 12.0108556517, 14914.4523349355, -6.3524240E-05, 6.3330532E-08, -2.5428962E-10, 0.3824500, 9.6553010794, 6585.7609102104, -2.1583699E-04, -1.8708058E-07, 9.3204945E-10, 0.3265400, 3.9694765808, 7700.3894694766, 1.5497663E-04, 2.4979472E-07, -1.1318993E-09, 0.2639600, 0.7416325637, 8956.9933799736, 1.4964887E-04, 2.5102751E-07, -1.2407788E-09,
+ 0.1230200, -1.6139220085, 628.3019552485, -2.6638815E-06, 6.1639211E-10, -5.4439728E-11, 0.0775400, 8.7830116346, 16171.0562454324, -6.8852003E-05, 6.4563317E-08, -3.6316908E-10, 0.0606800, 6.4274570623, 7842.3648207073, -2.2116475E-04, -1.8584780E-07, 8.2317000E-10, 0.0497000, 12.0539813334, 14286.1503796870, -6.0860358E-05, 6.2714140E-08, -1.9984990E-10};
+ private static final double M1n[] = {3.81034392032, 8.39968473021E+03, -3.31919929753E-05, //月球平黄经系数
+ 3.20170955005E-08, -1.53637455544E-10};
+
+
+ private static double EnnT = 0; // 调用Enn前先设置EnnT时间变量
+
+ /**
+ * 计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间
+ *
+ * @param F F
+ * @return 计算E10, E11, E20等
+ */
+ private static double Enn(double[] F) {
+ double v = 0;
+ for (int i = 0; i < F.length; i += 3)
+ v += F[i] * Math.cos(F[i + 1] + EnnT * F[i + 2]);
+ return v;
+ }
+
+ /**
+ * 返回地球位置,日心Date黄道分点坐标
+ *
+ * @param jd jd
+ * @return 返回地球位置, 日心Date黄道分点坐标
+ */
+ private static double[] earCal(double jd) {
+ EnnT = jd / 365250;
+ double llr[] = new double[3];
+ double t1 = EnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1, t5 = t4
+ * t1;
+ llr[0] = Enn(E10) + Enn(E11) * t1 + Enn(E12) * t2 + Enn(E13) * t3
+ + Enn(E14) * t4 + Enn(E15) * t5;
+ llr[1] = Enn(E20) + Enn(E21) * t1;
+ llr[2] = Enn(E30) + Enn(E31) * t1 + Enn(E32) * t2 + Enn(E33) * t3;
+ llr[0] = rad2mrad(llr[0]);
+ return llr;
+ }
+
+
+ // ==================月位置计算===================
+ private static double MnnT = 0; // 调用Mnn前先设置MnnT时间变量
+
+ /**
+ * 计算M10,M11,M20等,计算前先设置MnnT时间
+ *
+ * @param F F
+ * @return 计算M10, M11, M20等, 计算前先设置MnnT时间
+ */
+ private static double Mnn(double[] F) {
+ double v = 0, t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
+ for (int i = 0; i < F.length; i += 6)
+ v += F[i]
+ * Math.sin(F[i + 1] + t1 * F[i + 2] + t2 * F[i + 3] + t3
+ * F[i + 4] + t4 * F[i + 5]);
+ return v;
+ }
+
+
+ /**
+ * 返回月球位置,返回地心Date黄道坐标
+ *
+ * @param julian 儒略历
+ * @return return 地心黄道坐标
+ */
+ private static double[] moonCoord(double julian) {
+ MnnT = julian / 36525;
+ double t1 = MnnT, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;
+ double[] llr = new double[3];
+ llr[0] = (Mnn(M10) + Mnn(M11) * t1 + Mnn(M12) * t2) / SECOND_PER_RAD;
+ llr[1] = (Mnn(M20) + Mnn(M21) * t1) / SECOND_PER_RAD;
+ llr[2] = (Mnn(M30) + Mnn(M31) * t1) * 0.999999949827;
+ llr[0] = llr[0] + M1n[0] + M1n[1] * t1 + M1n[2] * t2 + M1n[3] * t3
+ + M1n[4] * t4;
+ llr[0] = rad2mrad(llr[0]); // 地心Date黄道原点坐标(不含岁差)
+ precession(julian, llr); // 补岁差
+ return llr;
+ }
+
+
+ /**
+ * 地心坐标中的日月位置计算
+ *
+ * @param lx lx=1时计算t时刻日月角距与jiao的差, lx=0计算t时刻太阳黄经与jiao的差
+ * @param time time
+ * @param angle angle
+ * @return 地心坐标中的日月位置计算
+ */
+ private static double angleDiff(int lx, double time, double angle) {
+ double[] sun = earCal(time); // 计算太阳真位置(先算出日心坐标中地球的位置)
+ sun[0] += Math.PI;
+ sun[1] = -sun[1]; // 转为地心坐标
+ addGxc(time, sun); // 补周年光行差
+ if (lx == 0) {
+ Nutation d = nutation(time);
+ sun[0] += d.Lon; // 补黄经章动
+ return rad2mrad(angle - sun[0]);
+ }
+ double[] moon = moonCoord(time); // 日月角差与章动无关
+ return rad2mrad(angle - (moon[0] - sun[0]));
+ }
+
+ /**
+ * 已知位置反求时间,对于节气计算,应满足t在t1到t1+360天之间,对于Y年第n个节气(n=0是春分),t1可取值Y*365.2422+n*15.2,
+ * 对于朔望计算,应满足t在t1到t1+25天之间,在此范围之外,求右边的根
+ *
+ * @param t1 J2000起算儒略日数,传入的t1是指定角度对应真时刻t的前一些天
+ * @param angle 已知角度(jiao)求时间(t)
+ * @param lx lx=0是太阳黄经达某角度的时刻计算(用于节气计算)
+ * lx=1是日月角距达某角度的时刻计算(用于定朔望等)
+ * @return 已知位置反求时间
+ */
+ private static double getTimeFromAngle(double t1, double angle, int lx) {
+ double t2 = t1, t = 0, v;
+ if (lx == 0)
+ t2 += 360; // 在t1到t2范围内求解(范气360天范围),结果置于t
+ else
+ t2 += 25;
+ angle *= Math.PI / 180; // 待搜索目标角
+ // 利用截弦法计算
+ double v1 = angleDiff(lx, t1, angle); // v1,v2为t1,t2时对应的黄经
+ double v2 = angleDiff(lx, t2, angle);
+ if (v1 < v2)
+ v2 -= 2 * Math.PI; // 减2pi作用是将周期性角度转为连续角度
+ double k = 1, k2; // k是截弦的斜率
+ for (int i = 0; i < 10; i++) { // 快速截弦求根,通常截弦三四次就已达所需精度
+ k2 = (v2 - v1) / (t2 - t1); // 算出斜率
+ if (Math.abs(k2) > 1e-15)
+ k = k2; // 差商可能为零,应排除
+ t = t1 - v1 / k;
+ v = angleDiff(lx, t, angle);// 直线逼近法求根(直线方程的根)
+ if (v > 1)
+ v -= 2 * Math.PI; // 一次逼近后,v1就已接近0,如果很大,则应减1周
+ if (Math.abs(v) < 1e-8)
+ break; // 已达精度
+ t1 = t2;
+ v1 = v2;
+ t2 = t;
+ v2 = v; // 下一次截弦
+ }
+ return t;
+ }
+
+
+ /**
+ * 获得某一年24节气
+ *
+ * @param year 年
+ * @return 24节气
+ */
+
+ public static String[] getSolarTerms(int year) {
+ String[] solarTerms = new String[24];
+ String[] preOffset = getSolarTermsPreOffset(year - 1);
+ String[] nextOffset = getSolarTermsNextOffset(year - 1);
+ System.arraycopy(preOffset, 0, solarTerms, 0, preOffset.length);
+ System.arraycopy(nextOffset, 0, solarTerms, 22, nextOffset.length);
+ double jd = 365.2422 * (year - 2000), q;
+ for (int i = 0; i < 19; i++) {
+ q = getTimeFromAngle(jd + i * 15.2, i * 15, 0);
+ q = q + J2000 + (double) 8 / 24; // 计算第i个节气(i=0是春分),结果转为北京时
+ Time time = setFromJulian(q, true);
+ solarTerms[i + 3] = time.toString() + SOLAR_TERMS[i];
+ }
+
+ return solarTerms;
+ }
+
+
+ /**
+ * 要获得2018年24节气需要传入2017年
+ *
+ * @param year 要获得2018年24节气需要传入2017年
+ * @return 返回 立春 雨水 惊蛰
+ */
+ private static String[] getSolarTermsPreOffset(int year) {
+ String[] solarTerms = new String[3];
+ double jd = 365.2422 * (year - 2000), q;
+ for (int i = 21; i < 24; i++) {
+ q = getTimeFromAngle(jd + i * 15.2, i * 15, 0);
+ q = q + J2000 + (double) 8 / 24; // 计算第i个节气(i=0是春分)
+ Time time = setFromJulian(q, true);
+ solarTerms[i - 21] = time.toString() + SOLAR_TERMS[i];
+ }
+ return solarTerms;
+ }
+
+ /**
+ * 要获得2018年24节气需要传入2017年
+ *
+ * @param year 要获得2018年24节气需要传入2017年
+ * @return 返回 小寒大寒
+ */
+ private static String[] getSolarTermsNextOffset(int year) {
+ String[] solarTerms = new String[2];
+ double jd = 365.2422 * (year - 2000), q;
+ for (int i = 19; i < 21; i++) {
+ q = getTimeFromAngle(jd + i * 15.2, i * 15, 0);
+ q = q + J2000 + (double) 8 / 24; // 计算第i个节气(i=0是春分)
+ Time time = setFromJulian(q, true);
+ solarTerms[i - 19] = time.toString() + SOLAR_TERMS[i];
+ }
+ return solarTerms;
+ }
+
+ /**
+ * 章动
+ */
+ private static class Nutation {
+ /**
+ * 章动角
+ */
+ private double Lon;
+
+ /**
+ * 交角
+ */
+ private double Obl;
+ }
+
+
+ private static class Time {
+ private double year;
+ private double month;
+ private double day;
+ private double hour;
+ private double minute;
+ private double second;
+
+ @Override
+ public String toString() {
+ return doubleToString(year) + doubleToString(month) + doubleToString(day);
+ }
+ }
+
+ private static String doubleToString(double value) {
+ int v = (int) value;
+ return value < 10 ? "0" + v : String.valueOf(v);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/TrunkBranchAnnals.java b/calendarview/src/main/java/com/haibin/calendarview/TrunkBranchAnnals.java
new file mode 100644
index 0000000..6c165cb
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/TrunkBranchAnnals.java
@@ -0,0 +1,90 @@
+package com.haibin.calendarview;
+
+import android.content.Context;
+
+/**
+ * 干支纪年算法
+ * Created by huanghaibin on 2019/2/12.
+ */
+@SuppressWarnings("unused")
+public final class TrunkBranchAnnals {
+
+ /**
+ * 天干字符串
+ */
+ private static String[] TRUNK_STR = null;
+
+ /**
+ * 地支字符串
+ */
+ private static String[] BRANCH_STR = null;
+
+ /**
+ * 单独使用请先调用这个方法
+ * @param context context
+ */
+ public static void init(Context context) {
+ if (TRUNK_STR != null) {
+ return;
+ }
+ TRUNK_STR = context.getResources().getStringArray(R.array.trunk_string_array);
+ BRANCH_STR = context.getResources().getStringArray(R.array.branch_string_array);
+
+ }
+
+ /**
+ * 获取某一年对应天干文字
+ *
+ * @param year 年份
+ * @return 天干由甲到癸,每10一轮回
+ */
+ @SuppressWarnings("all")
+ public static String getTrunkString(int year) {
+ return TRUNK_STR[getTrunkInt(year)];
+ }
+
+ /**
+ * 获取某一年对应天干,
+ *
+ * @param year 年份
+ * @return 4 5 6 7 8 9 10 1 2 3
+ */
+ @SuppressWarnings("all")
+ public static int getTrunkInt(int year) {
+ int trunk = year % 10;
+ return trunk == 0 ? 9 : trunk - 1;
+ }
+
+ /**
+ * 获取某一年对应地支文字
+ *
+ * @param year 年份
+ * @return 地支由子到亥,每12一轮回
+ */
+ @SuppressWarnings("all")
+ public static String getBranchString(int year) {
+ return BRANCH_STR[getBranchInt(year)];
+ }
+
+ /**
+ * 获取某一年对应地支
+ *
+ * @param year 年份
+ * @return 4 5 6 7 8 9 10 11 12 1 2 3
+ */
+ @SuppressWarnings("all")
+ public static int getBranchInt(int year) {
+ int branch = year % 12;
+ return branch == 0 ? 11 : branch - 1;
+ }
+
+ /**
+ * 获取干支纪年
+ *
+ * @param year 年份
+ * @return 干支纪年
+ */
+ public static String getTrunkBranchYear(int year) {
+ return String.format("%s%s", getTrunkString(year), getBranchString(year));
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java b/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java
new file mode 100644
index 0000000..772ad1d
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/**
+ * 星期栏,如果你要使用星期栏自定义,切记XML使用 merge,不要使用LinearLayout
+ * Created by huanghaibin on 2017/11/30.
+ */
+public class WeekBar extends LinearLayout {
+ private CalendarViewDelegate mDelegate;
+
+ public WeekBar(Context context) {
+ super(context);
+ if ("com.haibin.calendarview.WeekBar".equals(getClass().getName())) {
+ LayoutInflater.from(context).inflate(R.layout.cv_week_bar, this, true);
+ }
+ }
+
+ /**
+ * 传递属性
+ *
+ * @param delegate delegate
+ */
+ void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ if ("com.haibin.calendarview.WeekBar".equalsIgnoreCase(getClass().getName())) {
+ setTextSize(mDelegate.getWeekTextSize());
+ setTextColor(delegate.getWeekTextColor());
+ setBackgroundColor(delegate.getWeekBackground());
+ setPadding(delegate.getCalendarPaddingLeft(), 0, delegate.getCalendarPaddingRight(), 0);
+ }
+ }
+
+ /**
+ * 设置文本颜色,使用自定义布局需要重写这个方法,避免出问题
+ * 如果这里报错了,请确定你自定义XML文件跟布局是不是使用merge,而不是LinearLayout
+ *
+ * @param color color
+ */
+ protected void setTextColor(int color) {
+ for (int i = 0; i < getChildCount(); i++) {
+ ((TextView) getChildAt(i)).setTextColor(color);
+ }
+ }
+
+
+ /**
+ * 设置文本大小
+ *
+ * @param size size
+ */
+ protected void setTextSize(int size) {
+ for (int i = 0; i < getChildCount(); i++) {
+ ((TextView) getChildAt(i)).setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
+ }
+ }
+
+ /**
+ * 日期选择事件,这里提供这个回调,可以方便定制WeekBar需要
+ *
+ * @param calendar calendar 选择的日期
+ * @param weekStart 周起始
+ * @param isClick isClick 点击
+ */
+ protected void onDateSelected(Calendar calendar, int weekStart, boolean isClick) {
+
+ }
+
+ /**
+ * 当周起始发生变化,使用自定义布局需要重写这个方法,避免出问题
+ *
+ * @param weekStart 周起始
+ */
+ protected void onWeekStartChange(int weekStart) {
+ if (!"com.haibin.calendarview.WeekBar".equalsIgnoreCase(getClass().getName())) {
+ return;
+ }
+ for (int i = 0; i < getChildCount(); i++) {
+ ((TextView) getChildAt(i)).setText(getWeekString(i, weekStart));
+ }
+ }
+
+
+ /**
+ * 通过View的位置和周起始获取星期的对应坐标
+ *
+ * @param calendar calendar
+ * @param weekStart weekStart
+ * @return 通过View的位置和周起始获取星期的对应坐标
+ */
+ protected int getViewIndexByCalendar(Calendar calendar, int weekStart) {
+ int week = calendar.getWeek() + 1;
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_SUN) {
+ return week - 1;
+ }
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_MON) {
+ return week == CalendarViewDelegate.WEEK_START_WITH_SUN ? 6 : week - 2;
+ }
+ return week == CalendarViewDelegate.WEEK_START_WITH_SAT ? 0 : week;
+ }
+
+ /**
+ * 或者周文本,这个方法仅供父类使用
+ *
+ * @param index index
+ * @param weekStart weekStart
+ * @return 或者周文本
+ */
+ private String getWeekString(int index, int weekStart) {
+ String[] weeks = getContext().getResources().getStringArray(R.array.week_string_array);
+
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_SUN) {
+ return weeks[index];
+ }
+ if (weekStart == CalendarViewDelegate.WEEK_START_WITH_MON) {
+ return weeks[index == 6 ? 0 : index + 1];
+ }
+ return weeks[index == 0 ? 6 : index - 1];
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mDelegate != null) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(mDelegate.getWeekBarHeight(), MeasureSpec.EXACTLY);
+ } else {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(CalendarUtil.dipToPx(getContext(), 40), MeasureSpec.EXACTLY);
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekView.java b/calendarview/src/main/java/com/haibin/calendarview/WeekView.java
new file mode 100644
index 0000000..1d6d115
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/WeekView.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.view.View;
+
+/**
+ * 周视图,因为日历UI采用热插拔实现,所以这里必须继承实现,达到UI一致即可
+ * Created by huanghaibin on 2017/11/21.
+ */
+public abstract class WeekView extends BaseWeekView {
+
+ public WeekView(Context context) {
+ super(context);
+ }
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ */
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mItems.size() == 0)
+ return;
+ mItemWidth = (getWidth() -
+ mDelegate.getCalendarPaddingLeft() -
+ mDelegate.getCalendarPaddingRight()) / 7;
+ onPreviewHook();
+
+ for (int i = 0; i < mItems.size(); i++) {
+ int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft();
+ onLoopStart(x);
+ Calendar calendar = mItems.get(i);
+ boolean isSelected = i == mCurrentItem;
+ boolean hasScheme = calendar.hasScheme();
+ if (hasScheme) {
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, true);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ?
+ calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, false);
+ }
+ }
+ onDrawText(canvas, calendar, x, hasScheme, isSelected);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (!isClick) {
+ return;
+ }
+ Calendar calendar = getIndex();
+ if (calendar == null) {
+ return;
+ }
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return;
+ }
+ if (!isInRange(calendar)) {
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarOutOfRange(calendar);
+ }
+ return;
+ }
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, true);
+ }
+ if (mParentLayout != null) {
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, true);
+ }
+
+ invalidate();
+ }
+
+
+ @Override
+ public boolean onLongClick(View v) {
+ if (mDelegate.mCalendarLongClickListener == null)
+ return false;
+ if (!isClick) {
+ return false;
+ }
+ Calendar calendar = getIndex();
+ if (calendar == null) {
+ return false;
+ }
+ if (onCalendarIntercept(calendar)) {
+ mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, true);
+ return true;
+ }
+ boolean isCalendarInRange = isInRange(calendar);
+
+ if (!isCalendarInRange) {
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClickOutOfRange(calendar);
+ }
+ return true;
+ }
+
+ if (mDelegate.isPreventLongPressedSelected()) {//如果启用拦截长按事件不选择日期
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClick(calendar);
+ }
+ return true;
+ }
+
+
+ mCurrentItem = mItems.indexOf(calendar);
+
+ mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar;
+
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, true);
+ }
+ if (mParentLayout != null) {
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, true);
+ }
+
+ if (mDelegate.mCalendarLongClickListener != null) {
+ mDelegate.mCalendarLongClickListener.onCalendarLongClick(calendar);
+ }
+
+ invalidate();
+ return true;
+ }
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @return 是否绘制 onDrawScheme
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme);
+
+ /**
+ * 绘制标记的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java b/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java
new file mode 100644
index 0000000..fcc36cf
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java
@@ -0,0 +1,480 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import java.lang.reflect.Constructor;
+import java.util.List;
+
+/**
+ * 周视图滑动ViewPager,需要动态固定高度
+ * 周视图是连续不断的视图,因此不能简单的得出每年都有52+1周,这样会计算重叠的部分
+ * WeekViewPager需要和CalendarView关联:
+ */
+
+public final class WeekViewPager extends ViewPager {
+ private boolean isUpdateWeekView;
+ private int mWeekCount;
+ private CalendarViewDelegate mDelegate;
+
+ /**
+ * 日历布局,需要在日历下方放自己的布局
+ */
+ CalendarLayout mParentLayout;
+
+ /**
+ * 是否使用滚动到某一天
+ */
+ private boolean isUsingScrollToCalendar = false;
+
+ public WeekViewPager(Context context) {
+ this(context, null);
+ }
+
+ public WeekViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ init();
+ }
+
+ private void init() {
+ mWeekCount = CalendarUtil.getWeekCountBetweenBothCalendar(
+ mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ mDelegate.getMaxYear(),
+ mDelegate.getMaxYearMonth(),
+ mDelegate.getMaxYearDay(),
+ mDelegate.getWeekStart());
+ setAdapter(new WeekViewPagerAdapter());
+ addOnPageChangeListener(new OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ //默认的显示星期四,周视图切换就显示星期4
+ if (getVisibility() != VISIBLE) {
+ isUsingScrollToCalendar = false;
+ return;
+ }
+ if (isUsingScrollToCalendar) {
+ isUsingScrollToCalendar = false;
+ return;
+ }
+ BaseWeekView view = findViewWithTag(position);
+ if (view != null) {
+ view.performClickCalendar(mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_DEFAULT ?
+ mDelegate.mIndexCalendar : mDelegate.mSelectedCalendar, !isUsingScrollToCalendar);
+ if (mDelegate.mWeekChangeListener != null) {
+ mDelegate.mWeekChangeListener.onWeekChange(getCurrentWeekCalendars());
+ }
+ }
+ isUsingScrollToCalendar = false;
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ }
+ });
+ }
+
+ /**
+ * 获取当前周数据
+ *
+ * @return 获取当前周数据
+ */
+ List getCurrentWeekCalendars() {
+ List calendars = CalendarUtil.getWeekCalendars(mDelegate.mIndexCalendar,
+ mDelegate);
+ mDelegate.addSchemesFromMap(calendars);
+ return calendars;
+ }
+
+
+ /**
+ * 更新周视图
+ */
+ void notifyDataSetChanged() {
+ mWeekCount = CalendarUtil.getWeekCountBetweenBothCalendar(
+ mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ mDelegate.getMaxYear(),
+ mDelegate.getMaxYearMonth(),
+ mDelegate.getMaxYearDay(),
+ mDelegate.getWeekStart());
+ notifyAdapterDataSetChanged();
+ }
+
+ /**
+ * 更新周视图布局
+ */
+ void updateWeekViewClass() {
+ isUpdateWeekView = true;
+ notifyAdapterDataSetChanged();
+ isUpdateWeekView = false;
+ }
+
+ /**
+ * 更新日期范围
+ */
+ void updateRange() {
+ isUpdateWeekView = true;
+ notifyDataSetChanged();
+ isUpdateWeekView = false;
+ if (getVisibility() != VISIBLE) {
+ return;
+ }
+ isUsingScrollToCalendar = true;
+ Calendar calendar = mDelegate.mSelectedCalendar;
+ updateSelected(calendar, false);
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, false);
+ }
+
+ if (mDelegate.mCalendarSelectListener != null) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, false);
+ }
+
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ /**
+ * 滚动到指定日期
+ *
+ * @param year 年
+ * @param month 月
+ * @param day 日
+ * @param invokeListener 调用日期事件
+ */
+ void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) {
+ isUsingScrollToCalendar = true;
+ Calendar calendar = new Calendar();
+ calendar.setYear(year);
+ calendar.setMonth(month);
+ calendar.setDay(day);
+ calendar.setCurrentDay(calendar.equals(mDelegate.getCurrentDay()));
+ LunarCalendar.setupLunarCalendar(calendar);
+ mDelegate.mIndexCalendar = calendar;
+ mDelegate.mSelectedCalendar = calendar;
+ mDelegate.updateSelectCalendarScheme();
+ updateSelected(calendar, smoothScroll);
+ if (mDelegate.mInnerListener != null) {
+ mDelegate.mInnerListener.onWeekDateSelected(calendar, false);
+ }
+ if (mDelegate.mCalendarSelectListener != null && invokeListener) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(calendar, false);
+ }
+ int i = CalendarUtil.getWeekFromDayInMonth(calendar, mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ /**
+ * 滚动到当前
+ */
+ void scrollToCurrent(boolean smoothScroll) {
+ isUsingScrollToCalendar = true;
+ int position = CalendarUtil.getWeekFromCalendarStartWithMinCalendar(mDelegate.getCurrentDay(),
+ mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ mDelegate.getWeekStart()) - 1;
+ int curItem = getCurrentItem();
+ if (curItem == position) {
+ isUsingScrollToCalendar = false;
+ }
+ setCurrentItem(position, smoothScroll);
+ BaseWeekView view = findViewWithTag(position);
+ if (view != null) {
+ view.performClickCalendar(mDelegate.getCurrentDay(), false);
+ view.setSelectedCalendar(mDelegate.getCurrentDay());
+ view.invalidate();
+ }
+
+ if (mDelegate.mCalendarSelectListener != null && getVisibility() == VISIBLE) {
+ mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false);
+ }
+
+ if (getVisibility() == VISIBLE) {
+ mDelegate.mInnerListener.onWeekDateSelected(mDelegate.getCurrentDay(), false);
+ }
+ int i = CalendarUtil.getWeekFromDayInMonth(mDelegate.getCurrentDay(), mDelegate.getWeekStart());
+ mParentLayout.updateSelectWeek(i);
+ }
+
+ /**
+ * 更新任意一个选择的日期
+ */
+ void updateSelected(Calendar calendar, boolean smoothScroll) {
+ int position = CalendarUtil.getWeekFromCalendarStartWithMinCalendar(calendar,
+ mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ mDelegate.getWeekStart()) - 1;
+ int curItem = getCurrentItem();
+ isUsingScrollToCalendar = curItem != position;
+ setCurrentItem(position, smoothScroll);
+ BaseWeekView view = findViewWithTag(position);
+ if (view != null) {
+ view.setSelectedCalendar(calendar);
+ view.invalidate();
+ }
+ }
+
+
+ /**
+ * 更新单选模式
+ */
+ void updateSingleSelect() {
+ if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) {
+ return;
+ }
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateSingleSelect();
+ }
+ }
+
+ /**
+ * 更新为默认选择模式
+ */
+ void updateDefaultSelect() {
+ BaseWeekView view = findViewWithTag(getCurrentItem());
+ if (view != null) {
+ view.setSelectedCalendar(mDelegate.mSelectedCalendar);
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 更新选择效果
+ */
+ void updateSelected() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.setSelectedCalendar(mDelegate.mSelectedCalendar);
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 更新字体颜色大小
+ */
+ final void updateStyle() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateStyle();
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 更新标记日期
+ */
+ void updateScheme() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.update();
+ }
+ }
+
+ /**
+ * 更新当前日期,夜间过度的时候调用这个函数,一般不需要调用
+ */
+ void updateCurrentDate() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateCurrentDate();
+ }
+ }
+
+ /**
+ * 更新显示模式
+ */
+ void updateShowMode() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateShowMode();
+ }
+ }
+
+ /**
+ * 更新周起始
+ */
+ void updateWeekStart() {
+ if (getAdapter() == null) {
+ return;
+ }
+ int count = getAdapter().getCount();
+ mWeekCount = CalendarUtil.getWeekCountBetweenBothCalendar(
+ mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ mDelegate.getMaxYear(),
+ mDelegate.getMaxYearMonth(),
+ mDelegate.getMaxYearDay(),
+ mDelegate.getWeekStart());
+ /*
+ * 如果count发生变化,意味着数据源变化,则必须先调用notifyDataSetChanged(),
+ * 否则会抛出异常
+ */
+ if (count != mWeekCount) {
+ isUpdateWeekView = true;
+ getAdapter().notifyDataSetChanged();
+ }
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateWeekStart();
+ }
+ isUpdateWeekView = false;
+ updateSelected(mDelegate.mSelectedCalendar, false);
+ }
+
+ /**
+ * 更新高度
+ */
+ final void updateItemHeight() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.updateItemHeight();
+ view.requestLayout();
+ }
+ }
+
+ /**
+ * 清除选择范围
+ */
+ final void clearSelectRange() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.invalidate();
+ }
+ }
+
+ final void clearSingleSelect() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.mCurrentItem = -1;
+ view.invalidate();
+ }
+ }
+
+ final void clearMultiSelect() {
+ for (int i = 0; i < getChildCount(); i++) {
+ BaseWeekView view = (BaseWeekView) getChildAt(i);
+ view.mCurrentItem = -1;
+ view.invalidate();
+ }
+ }
+
+ private void notifyAdapterDataSetChanged() {
+ if (getAdapter() == null) {
+ return;
+ }
+ getAdapter().notifyDataSetChanged();
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return mDelegate.isWeekViewScrollable() && super.onTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return mDelegate.isWeekViewScrollable() && super.onInterceptTouchEvent(ev);
+ }
+
+ /**
+ * 周视图的高度应该与日历项的高度一致
+ */
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(mDelegate.getCalendarItemHeight(), MeasureSpec.EXACTLY);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * 周视图切换
+ */
+ private class WeekViewPagerAdapter extends PagerAdapter {
+
+ @Override
+ public int getCount() {
+ return mWeekCount;
+ }
+
+ @Override
+ public int getItemPosition(@NonNull Object object) {
+ return isUpdateWeekView ? POSITION_NONE : super.getItemPosition(object);
+ }
+
+ @Override
+ public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
+ return view.equals(object);
+ }
+
+ @NonNull
+ @Override
+ public Object instantiateItem(@NonNull ViewGroup container, int position) {
+ Calendar calendar = CalendarUtil.getFirstCalendarStartWithMinCalendar(mDelegate.getMinYear(),
+ mDelegate.getMinYearMonth(),
+ mDelegate.getMinYearDay(),
+ position + 1,
+ mDelegate.getWeekStart());
+ BaseWeekView view;
+ try {
+ Constructor constructor = mDelegate.getWeekViewClass().getConstructor(Context.class);
+ view = (BaseWeekView) constructor.newInstance(getContext());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new DefaultWeekView(getContext());
+ }
+ view.mParentLayout = mParentLayout;
+ view.setup(mDelegate);
+ view.setup(calendar);
+ view.setTag(position);
+ view.setSelectedCalendar(mDelegate.mSelectedCalendar);
+ container.addView(view);
+ return view;
+ }
+
+ @Override
+ public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+ BaseWeekView view = (BaseWeekView) object;
+ view.onDestroy();
+ container.removeView(view);
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearRecyclerView.java b/calendarview/src/main/java/com/haibin/calendarview/YearRecyclerView.java
new file mode 100644
index 0000000..ccc0fd7
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/YearRecyclerView.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * 年份布局选择View
+ */
+public final class YearRecyclerView extends RecyclerView {
+ private CalendarViewDelegate mDelegate;
+ private YearViewAdapter mAdapter;
+ private OnMonthSelectedListener mListener;
+
+ public YearRecyclerView(Context context) {
+ this(context, null);
+ }
+
+ public YearRecyclerView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ mAdapter = new YearViewAdapter(context);
+ setLayoutManager(new GridLayoutManager(context, 3));
+ setAdapter(mAdapter);
+ mAdapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
+ @Override
+ public void onItemClick(int position, long itemId) {
+ if (mListener != null && mDelegate != null) {
+ Month month = mAdapter.getItem(position);
+ if (month == null) {
+ return;
+ }
+ if (!CalendarUtil.isMonthInRange(month.getYear(), month.getMonth(),
+ mDelegate.getMinYear(), mDelegate.getMinYearMonth(),
+ mDelegate.getMaxYear(), mDelegate.getMaxYearMonth())) {
+ return;
+ }
+ mListener.onMonthSelected(month.getYear(), month.getMonth());
+ if (mDelegate.mYearViewChangeListener != null) {
+ mDelegate.mYearViewChangeListener.onYearViewChange(true);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * 设置
+ *
+ * @param delegate delegate
+ */
+ final void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ this.mAdapter.setup(delegate);
+ }
+
+ /**
+ * 初始化年视图
+ *
+ * @param year year
+ */
+ final void init(int year) {
+ java.util.Calendar date = java.util.Calendar.getInstance();
+ for (int i = 1; i <= 12; i++) {
+ date.set(year, i - 1, 1);
+ int mDaysCount = CalendarUtil.getMonthDaysCount(year, i);
+ Month month = new Month();
+ month.setDiff(CalendarUtil.getMonthViewStartDiff(year, i, mDelegate.getWeekStart()));
+ month.setCount(mDaysCount);
+ month.setMonth(i);
+ month.setYear(year);
+ mAdapter.addItem(month);
+ }
+ }
+
+ /**
+ * 更新周起始
+ */
+ final void updateWeekStart() {
+ for (Month month : mAdapter.getItems()) {
+ month.setDiff(CalendarUtil.getMonthViewStartDiff(month.getYear(), month.getMonth(), mDelegate.getWeekStart()));
+ }
+ }
+
+ /**
+ * 更新字体颜色大小
+ */
+ final void updateStyle(){
+ for (int i = 0; i < getChildCount(); i++) {
+ YearView view = (YearView) getChildAt(i);
+ view.updateStyle();
+ view.invalidate();
+ }
+ }
+
+ /**
+ * 月份选择事件
+ *
+ * @param listener listener
+ */
+ final void setOnMonthSelectedListener(OnMonthSelectedListener listener) {
+ this.mListener = listener;
+ }
+
+
+ void notifyAdapterDataSetChanged(){
+ if(getAdapter() == null){
+ return;
+ }
+ getAdapter().notifyDataSetChanged();
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec) {
+ super.onMeasure(widthSpec, heightSpec);
+ int height = MeasureSpec.getSize(heightSpec);
+ int width = MeasureSpec.getSize(widthSpec);
+ mAdapter.setYearViewSize(width / 3, height / 4);
+ }
+
+ interface OnMonthSelectedListener {
+ void onMonthSelected(int year, int month);
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearView.java b/calendarview/src/main/java/com/haibin/calendarview/YearView.java
new file mode 100644
index 0000000..d324860
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/YearView.java
@@ -0,0 +1,548 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * 年视图
+ * Created by huanghaibin on 2018/10/9.
+ */
+@SuppressWarnings("unused")
+public abstract class YearView extends View {
+
+ CalendarViewDelegate mDelegate;
+
+ /**
+ * 当前月份日期的笔
+ */
+ protected Paint mCurMonthTextPaint = new Paint();
+
+ /**
+ * 其它月份日期颜色
+ */
+ protected Paint mOtherMonthTextPaint = new Paint();
+
+ /**
+ * 当前月份农历文本颜色
+ */
+ protected Paint mCurMonthLunarTextPaint = new Paint();
+
+ /**
+ * 当前月份农历文本颜色
+ */
+ protected Paint mSelectedLunarTextPaint = new Paint();
+
+ /**
+ * 其它月份农历文本颜色
+ */
+ protected Paint mOtherMonthLunarTextPaint = new Paint();
+
+ /**
+ * 其它月份农历文本颜色
+ */
+ protected Paint mSchemeLunarTextPaint = new Paint();
+
+ /**
+ * 标记的日期背景颜色画笔
+ */
+ protected Paint mSchemePaint = new Paint();
+
+ /**
+ * 被选择的日期背景色
+ */
+ protected Paint mSelectedPaint = new Paint();
+
+ /**
+ * 标记的文本画笔
+ */
+ protected Paint mSchemeTextPaint = new Paint();
+
+ /**
+ * 选中的文本画笔
+ */
+ protected Paint mSelectTextPaint = new Paint();
+
+ /**
+ * 当前日期文本颜色画笔
+ */
+ protected Paint mCurDayTextPaint = new Paint();
+
+ /**
+ * 当前日期文本颜色画笔
+ */
+ protected Paint mCurDayLunarTextPaint = new Paint();
+
+ /**
+ * 月份画笔
+ */
+ protected Paint mMonthTextPaint = new Paint();
+
+ /**
+ * 周栏画笔
+ */
+ protected Paint mWeekTextPaint = new Paint();
+
+ /**
+ * 日历项
+ */
+ List mItems;
+
+ /**
+ * 每一项的高度
+ */
+ protected int mItemHeight;
+
+ /**
+ * 每一项的宽度
+ */
+ protected int mItemWidth;
+
+ /**
+ * Text的基线
+ */
+ protected float mTextBaseLine;
+
+ /**
+ * Text的基线
+ */
+ protected float mMonthTextBaseLine;
+
+ /**
+ * Text的基线
+ */
+ protected float mWeekTextBaseLine;
+
+ /**
+ * 当前日历卡年份
+ */
+ protected int mYear;
+
+ /**
+ * 当前日历卡月份
+ */
+ protected int mMonth;
+
+ /**
+ * 下个月偏移的数量
+ */
+ protected int mNextDiff;
+
+ /**
+ * 周起始
+ */
+ protected int mWeekStart;
+
+ /**
+ * 日历的行数
+ */
+ protected int mLineCount;
+
+ public YearView(Context context) {
+ this(context, null);
+ }
+
+ public YearView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ initPaint();
+ }
+
+
+ /**
+ * 初始化配置
+ */
+ private void initPaint() {
+ mCurMonthTextPaint.setAntiAlias(true);
+ mCurMonthTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurMonthTextPaint.setColor(0xFF111111);
+ mCurMonthTextPaint.setFakeBoldText(true);
+
+ mOtherMonthTextPaint.setAntiAlias(true);
+ mOtherMonthTextPaint.setTextAlign(Paint.Align.CENTER);
+ mOtherMonthTextPaint.setColor(0xFFe1e1e1);
+ mOtherMonthTextPaint.setFakeBoldText(true);
+
+ mCurMonthLunarTextPaint.setAntiAlias(true);
+ mCurMonthLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mSelectedLunarTextPaint.setAntiAlias(true);
+ mSelectedLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mOtherMonthLunarTextPaint.setAntiAlias(true);
+ mOtherMonthLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mMonthTextPaint.setAntiAlias(true);
+ mMonthTextPaint.setFakeBoldText(true);
+
+ mWeekTextPaint.setAntiAlias(true);
+ mWeekTextPaint.setFakeBoldText(true);
+ mWeekTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mSchemeLunarTextPaint.setAntiAlias(true);
+ mSchemeLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ mSchemeTextPaint.setAntiAlias(true);
+ mSchemeTextPaint.setStyle(Paint.Style.FILL);
+ mSchemeTextPaint.setTextAlign(Paint.Align.CENTER);
+ mSchemeTextPaint.setColor(0xffed5353);
+ mSchemeTextPaint.setFakeBoldText(true);
+
+ mSelectTextPaint.setAntiAlias(true);
+ mSelectTextPaint.setStyle(Paint.Style.FILL);
+ mSelectTextPaint.setTextAlign(Paint.Align.CENTER);
+ mSelectTextPaint.setColor(0xffed5353);
+ mSelectTextPaint.setFakeBoldText(true);
+
+ mSchemePaint.setAntiAlias(true);
+ mSchemePaint.setStyle(Paint.Style.FILL);
+ mSchemePaint.setStrokeWidth(2);
+ mSchemePaint.setColor(0xffefefef);
+
+ mCurDayTextPaint.setAntiAlias(true);
+ mCurDayTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurDayTextPaint.setColor(Color.RED);
+ mCurDayTextPaint.setFakeBoldText(true);
+
+ mCurDayLunarTextPaint.setAntiAlias(true);
+ mCurDayLunarTextPaint.setTextAlign(Paint.Align.CENTER);
+ mCurDayLunarTextPaint.setColor(Color.RED);
+ mCurDayLunarTextPaint.setFakeBoldText(true);
+
+ mSelectedPaint.setAntiAlias(true);
+ mSelectedPaint.setStyle(Paint.Style.FILL);
+ mSelectedPaint.setStrokeWidth(2);
+ }
+
+ /**
+ * 设置
+ *
+ * @param delegate delegate
+ */
+ final void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ updateStyle();
+ }
+
+ final void updateStyle(){
+ if(mDelegate == null){
+ return;
+ }
+ this.mCurMonthTextPaint.setTextSize(mDelegate.getYearViewDayTextSize());
+ this.mSchemeTextPaint.setTextSize(mDelegate.getYearViewDayTextSize());
+ this.mOtherMonthTextPaint.setTextSize(mDelegate.getYearViewDayTextSize());
+ this.mCurDayTextPaint.setTextSize(mDelegate.getYearViewDayTextSize());
+ this.mSelectTextPaint.setTextSize(mDelegate.getYearViewDayTextSize());
+
+ this.mSchemeTextPaint.setColor(mDelegate.getYearViewSchemeTextColor());
+ this.mCurMonthTextPaint.setColor(mDelegate.getYearViewDayTextColor());
+ this.mOtherMonthTextPaint.setColor(mDelegate.getYearViewDayTextColor());
+ this.mCurDayTextPaint.setColor(mDelegate.getYearViewCurDayTextColor());
+ this.mSelectTextPaint.setColor(mDelegate.getYearViewSelectTextColor());
+ this.mMonthTextPaint.setTextSize(mDelegate.getYearViewMonthTextSize());
+ this.mMonthTextPaint.setColor(mDelegate.getYearViewMonthTextColor());
+ this.mWeekTextPaint.setColor(mDelegate.getYearViewWeekTextColor());
+ this.mWeekTextPaint.setTextSize(mDelegate.getYearViewWeekTextSize());
+ }
+
+ /**
+ * 初始化年视图
+ *
+ * @param year year
+ * @param month month
+ */
+ final void init(int year, int month) {
+ mYear = year;
+ mMonth = month;
+ mNextDiff = CalendarUtil.getMonthEndDiff(mYear, mMonth, mDelegate.getWeekStart());
+ int preDiff = CalendarUtil.getMonthViewStartDiff(mYear, mMonth, mDelegate.getWeekStart());
+
+ mItems = CalendarUtil.initCalendarForMonthView(mYear, mMonth, mDelegate.getCurrentDay(), mDelegate.getWeekStart());
+
+ mLineCount = 6;
+ addSchemesFromMap();
+
+ }
+
+ /**
+ * 测量大小
+ *
+ * @param width width
+ * @param height height
+ */
+ @SuppressWarnings("IntegerDivisionInFloatingPointContext")
+ final void measureSize(int width, int height) {
+
+ Rect rect = new Rect();
+ mCurMonthTextPaint.getTextBounds("1", 0, 1, rect);
+ int textHeight = rect.height();
+ int mMinHeight = 12 * textHeight + getMonthViewTop();
+
+ int h = height >= mMinHeight ? height : mMinHeight;
+
+ getLayoutParams().width = width;
+ getLayoutParams().height = h;
+ mItemHeight = (h - getMonthViewTop()) / 6;
+
+ Paint.FontMetrics metrics = mCurMonthTextPaint.getFontMetrics();
+ mTextBaseLine = mItemHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2;
+
+ Paint.FontMetrics monthMetrics = mMonthTextPaint.getFontMetrics();
+ mMonthTextBaseLine = mDelegate.getYearViewMonthHeight() / 2 - monthMetrics.descent +
+ (monthMetrics.bottom - monthMetrics.top) / 2;
+
+ Paint.FontMetrics weekMetrics = mWeekTextPaint.getFontMetrics();
+ mWeekTextBaseLine = mDelegate.getYearViewWeekHeight() / 2 - weekMetrics.descent +
+ (weekMetrics.bottom - weekMetrics.top) / 2;
+
+ invalidate();
+ }
+
+ /**
+ * 添加事件标记,来自Map
+ */
+ private void addSchemesFromMap() {
+ if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) {
+ return;
+ }
+ for (Calendar a : mItems) {
+ if (mDelegate.mSchemeDatesMap.containsKey(a.toString())) {
+ Calendar d = mDelegate.mSchemeDatesMap.get(a.toString());
+ if(d == null){
+ continue;
+ }
+ a.setScheme(TextUtils.isEmpty(d.getScheme()) ? mDelegate.getSchemeText() : d.getScheme());
+ a.setSchemeColor(d.getSchemeColor());
+ a.setSchemes(d.getSchemes());
+ } else {
+ a.setScheme("");
+ a.setSchemeColor(0);
+ a.setSchemes(null);
+ }
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ mItemWidth = (getWidth() -
+ mDelegate.getYearViewMonthPaddingLeft() -
+ mDelegate.getYearViewMonthPaddingRight()) / 7;
+ onPreviewHook();
+ onDrawMonth(canvas);
+ onDrawWeek(canvas);
+ onDrawMonthView(canvas);
+ }
+
+ /**
+ * 绘制
+ *
+ * @param canvas canvas
+ */
+ private void onDrawMonth(Canvas canvas) {
+ onDrawMonth(canvas,
+ mYear, mMonth,
+ mDelegate.getYearViewMonthPaddingLeft(),
+ mDelegate.getYearViewMonthPaddingTop(),
+ getWidth() - 2 * mDelegate.getYearViewMonthPaddingRight(),
+ mDelegate.getYearViewMonthHeight() +
+ mDelegate.getYearViewMonthPaddingTop());
+ }
+
+ private int getMonthViewTop() {
+ return mDelegate.getYearViewMonthPaddingTop() +
+ mDelegate.getYearViewMonthHeight() +
+ mDelegate.getYearViewMonthPaddingBottom() +
+ mDelegate.getYearViewWeekHeight();
+ }
+
+ /**
+ * 绘制
+ *
+ * @param canvas canvas
+ */
+ private void onDrawWeek(Canvas canvas) {
+ if (mDelegate.getYearViewWeekHeight() <= 0) {
+ return;
+ }
+ int week = mDelegate.getWeekStart();
+ if (week > 0) {
+ week -= 1;
+ }
+ int width = (getWidth() -
+ mDelegate.getYearViewMonthPaddingLeft() -
+ mDelegate.getYearViewMonthPaddingRight()) / 7;
+ for (int i = 0; i < 7; i++) {
+ onDrawWeek(canvas,
+ week,
+ mDelegate.getYearViewMonthPaddingLeft() + i * width,
+ mDelegate.getYearViewMonthHeight() +
+ mDelegate.getYearViewMonthPaddingTop() +
+ mDelegate.getYearViewMonthPaddingBottom(),
+ width,
+ mDelegate.getYearViewWeekHeight());
+ week += 1;
+ if (week >= 7) {
+ week = 0;
+ }
+
+ }
+ }
+
+ /**
+ * 绘制月份数据
+ *
+ * @param canvas canvas
+ */
+ private void onDrawMonthView(Canvas canvas) {
+
+ int count = mLineCount * 7;
+ int d = 0;
+ for (int i = 0; i < mLineCount; i++) {
+ for (int j = 0; j < 7; j++) {
+ Calendar calendar = mItems.get(d);
+ if (d > mItems.size() - mNextDiff) {
+ return;
+ }
+ if (!calendar.isCurrentMonth()) {
+ ++d;
+ continue;
+ }
+ draw(canvas, calendar, i, j, d);
+ ++d;
+ }
+ }
+ }
+
+
+ /**
+ * 开始绘制
+ *
+ * @param canvas canvas
+ * @param calendar 对应日历
+ * @param i i
+ * @param j j
+ * @param d d
+ */
+ private void draw(Canvas canvas, Calendar calendar, int i, int j, int d) {
+ int x = j * mItemWidth + mDelegate.getYearViewMonthPaddingLeft();
+ int y = i * mItemHeight + getMonthViewTop();
+
+ boolean isSelected = calendar.equals(mDelegate.mSelectedCalendar);
+ boolean hasScheme = calendar.hasScheme();
+
+ if (hasScheme) {
+ //标记的日子
+ boolean isDrawSelected = false;//是否继续绘制选中的onDrawScheme
+ if (isSelected) {
+ isDrawSelected = onDrawSelected(canvas, calendar, x, y, true);
+ }
+ if (isDrawSelected || !isSelected) {
+ //将画笔设置为标记颜色
+ mSchemePaint.setColor(calendar.getSchemeColor() != 0 ? calendar.getSchemeColor() : mDelegate.getSchemeThemeColor());
+ onDrawScheme(canvas, calendar, x, y);
+ }
+ } else {
+ if (isSelected) {
+ onDrawSelected(canvas, calendar, x, y, false);
+ }
+ }
+ onDrawText(canvas, calendar, x, y, hasScheme, isSelected);
+ }
+
+ /**
+ * 开始绘制前的钩子,这里做一些初始化的操作,每次绘制只调用一次,性能高效
+ * 没有需要可忽略不实现
+ * 例如:
+ * 1、需要绘制圆形标记事件背景,可以在这里计算半径
+ * 2、绘制矩形选中效果,也可以在这里计算矩形宽和高
+ */
+ protected void onPreviewHook() {
+ // TODO: 2017/11/16
+ }
+
+
+ /**
+ * 绘制月份
+ *
+ * @param canvas canvas
+ * @param year year
+ * @param month month
+ * @param x x
+ * @param y y
+ * @param width width
+ * @param height height
+ */
+ protected abstract void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height);
+
+
+ /**
+ * 绘制年视图的周栏
+ *
+ * @param canvas canvas
+ * @param week week
+ * @param x x
+ * @param y y
+ * @param width width
+ * @param height height
+ */
+ protected abstract void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height);
+
+
+ /**
+ * 绘制选中的日期
+ *
+ * @param canvas canvas
+ * @param calendar 日历日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme hasScheme 非标记的日期
+ * @return 是否绘制onDrawScheme,true or false
+ */
+ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme);
+
+ /**
+ * 绘制标记的日期,这里可以是背景色,标记色什么的
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ */
+ protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y);
+
+
+ /**
+ * 绘制日历文本
+ *
+ * @param canvas canvas
+ * @param calendar 日历calendar
+ * @param x 日历Card x起点坐标
+ * @param y 日历Card y起点坐标
+ * @param hasScheme 是否是标记的日期
+ * @param isSelected 是否选中
+ */
+ protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected);
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java b/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java
new file mode 100644
index 0000000..b4f1328
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.lang.reflect.Constructor;
+
+final class YearViewAdapter extends BaseRecyclerAdapter {
+ private CalendarViewDelegate mDelegate;
+ private int mItemWidth, mItemHeight;
+
+ YearViewAdapter(Context context) {
+ super(context);
+ }
+
+ final void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ }
+
+
+ final void setYearViewSize(int width, int height) {
+ this.mItemWidth = width;
+ this.mItemHeight = height;
+ }
+
+ @Override
+ RecyclerView.ViewHolder onCreateDefaultViewHolder(ViewGroup parent, int type) {
+ YearView yearView;
+ if (TextUtils.isEmpty(mDelegate.getYearViewClassPath())) {
+ yearView = new DefaultYearView(mContext);
+ } else {
+ try {
+ Constructor constructor = mDelegate.getYearViewClass().getConstructor(Context.class);
+ yearView = (YearView) constructor.newInstance(mContext);
+ } catch (Exception e) {
+ e.printStackTrace();
+ yearView = new DefaultYearView(mContext);
+ }
+ }
+ RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
+ RecyclerView.LayoutParams.MATCH_PARENT);
+ yearView.setLayoutParams(params);
+ return new YearViewHolder(yearView, mDelegate);
+ }
+
+ @Override
+ void onBindViewHolder(RecyclerView.ViewHolder holder, Month item, int position) {
+ YearViewHolder h = (YearViewHolder) holder;
+ YearView view = h.mYearView;
+ view.init(item.getYear(), item.getMonth());
+ view.measureSize(mItemWidth, mItemHeight);
+ }
+
+ private static class YearViewHolder extends RecyclerView.ViewHolder {
+ YearView mYearView;
+ YearViewHolder(View itemView, CalendarViewDelegate delegate) {
+ super(itemView);
+ mYearView = (YearView) itemView;
+ mYearView.setup(delegate);
+ }
+ }
+}
diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearViewPager.java b/calendarview/src/main/java/com/haibin/calendarview/YearViewPager.java
new file mode 100644
index 0000000..4674d2b
--- /dev/null
+++ b/calendarview/src/main/java/com/haibin/calendarview/YearViewPager.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2016 huanghaibin_dev
+ * WebSite https://github.com/MiracleTimes-Dev
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.haibin.calendarview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.Display;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+
+/**
+ * 年份+月份选择布局
+ * ViewPager + RecyclerView
+ */
+public final class YearViewPager extends ViewPager {
+ private int mYearCount;
+ private boolean isUpdateYearView;
+ private CalendarViewDelegate mDelegate;
+ private YearRecyclerView.OnMonthSelectedListener mListener;
+
+ public YearViewPager(Context context) {
+ this(context, null);
+ }
+
+ public YearViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+
+ void setup(CalendarViewDelegate delegate) {
+ this.mDelegate = delegate;
+ this.mYearCount = mDelegate.getMaxYear() - mDelegate.getMinYear() + 1;
+ setAdapter(new PagerAdapter() {
+ @Override
+ public int getCount() {
+ return mYearCount;
+ }
+
+ @Override
+ public int getItemPosition(@NonNull Object object) {
+ return isUpdateYearView ? POSITION_NONE : super.getItemPosition(object);
+ }
+
+ @Override
+ public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
+ return view == object;
+ }
+
+ @NonNull
+ @Override
+ public Object instantiateItem(@NonNull ViewGroup container, int position) {
+ YearRecyclerView view = new YearRecyclerView(getContext());
+ container.addView(view);
+ view.setup(mDelegate);
+ view.setOnMonthSelectedListener(mListener);
+ view.init(position + mDelegate.getMinYear());
+ return view;
+ }
+
+ @Override
+ public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+ container.removeView((View) object);
+ }
+ });
+ setCurrentItem(mDelegate.getCurrentDay().getYear() - mDelegate.getMinYear());
+ }
+
+ @Override
+ public void setCurrentItem(int item) {
+ setCurrentItem(item, false);
+ }
+
+ @Override
+ public void setCurrentItem(int item, boolean smoothScroll) {
+ if (Math.abs(getCurrentItem() - item) > 1) {
+ super.setCurrentItem(item, false);
+ } else {
+ super.setCurrentItem(item, false);
+ }
+ }
+
+ /**
+ * 通知刷新
+ */
+ void notifyDataSetChanged() {
+ this.mYearCount = mDelegate.getMaxYear() - mDelegate.getMinYear() + 1;
+ if(getAdapter() != null){
+ getAdapter().notifyDataSetChanged();
+ }
+
+ }
+
+ /**
+ * 滚动到某年
+ *
+ * @param year year
+ * @param smoothScroll smoothScroll
+ */
+ void scrollToYear(int year, boolean smoothScroll) {
+ setCurrentItem(year - mDelegate.getMinYear(), smoothScroll);
+ }
+
+ /**
+ * 更新日期范围
+ */
+ final void updateRange() {
+ isUpdateYearView = true;
+ notifyDataSetChanged();
+ isUpdateYearView = false;
+ }
+
+ /**
+ * 更新界面
+ */
+ final void update() {
+ for (int i = 0; i < getChildCount(); i++) {
+ YearRecyclerView view = (YearRecyclerView) getChildAt(i);
+ view.notifyAdapterDataSetChanged();
+ }
+ }
+
+
+ /**
+ * 更新周起始
+ */
+ final void updateWeekStart() {
+ for (int i = 0; i < getChildCount(); i++) {
+ YearRecyclerView view = (YearRecyclerView) getChildAt(i);
+ view.updateWeekStart();
+ view.notifyAdapterDataSetChanged();
+ }
+ }
+
+ /**
+ * 更新字体颜色大小
+ */
+ final void updateStyle(){
+ for (int i = 0; i < getChildCount(); i++) {
+ YearRecyclerView view = (YearRecyclerView) getChildAt(i);
+ view.updateStyle();
+ }
+ }
+
+ final void setOnMonthSelectedListener(YearRecyclerView.OnMonthSelectedListener listener) {
+ this.mListener = listener;
+ }
+
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ //heightMeasureSpec = MeasureSpec.makeMeasureSpec(getHeight(getContext(), this), MeasureSpec.EXACTLY);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * 计算相对高度
+ *
+ * @param context context
+ * @param view view
+ * @return 年月视图选择器最适合的高度
+ */
+ private static int getHeight(Context context, View view) {
+ WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ assert manager != null;
+ Display display = manager.getDefaultDisplay();
+ int h = display.getHeight();
+ int[] location = new int[2];
+ view.getLocationInWindow(location);
+ view.getLocationOnScreen(location);
+ return h - location[1];
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return mDelegate.isYearViewScrollable() && super.onTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return mDelegate.isYearViewScrollable() && super.onInterceptTouchEvent(ev);
+ }
+}
diff --git a/calendarview/src/main/res/drawable-v21/cv_bg_material.xml b/calendarview/src/main/res/drawable-v21/cv_bg_material.xml
new file mode 100644
index 0000000..b9f9955
--- /dev/null
+++ b/calendarview/src/main/res/drawable-v21/cv_bg_material.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/calendarview/src/main/res/drawable/cv_bg_material.xml b/calendarview/src/main/res/drawable/cv_bg_material.xml
new file mode 100644
index 0000000..20fd151
--- /dev/null
+++ b/calendarview/src/main/res/drawable/cv_bg_material.xml
@@ -0,0 +1,13 @@
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
diff --git a/calendarview/src/main/res/layout/cv_layout_calendar_view.xml b/calendarview/src/main/res/layout/cv_layout_calendar_view.xml
new file mode 100644
index 0000000..0569060
--- /dev/null
+++ b/calendarview/src/main/res/layout/cv_layout_calendar_view.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/src/main/res/layout/cv_week_bar.xml b/calendarview/src/main/res/layout/cv_week_bar.xml
new file mode 100644
index 0000000..6f54060
--- /dev/null
+++ b/calendarview/src/main/res/layout/cv_week_bar.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calendarview/src/main/res/values-zh-rHK/strings.xml b/calendarview/src/main/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..d3f746b
--- /dev/null
+++ b/calendarview/src/main/res/values-zh-rHK/strings.xml
@@ -0,0 +1,206 @@
+
+ CalendarView
+
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0504青年節
+ - 0701香港回歸
+ - 0801建军节
+ - 0910教師節
+ - 1001國慶日
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+
+
+ - 母親節
+ - 父親節
+ - 感恩節
+
+
+ 日
+ 一
+ 二
+ 三
+ 四
+ 五
+ 六
+
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
diff --git a/calendarview/src/main/res/values-zh-rTW/strings.xml b/calendarview/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..63fb5e8
--- /dev/null
+++ b/calendarview/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,209 @@
+
+ CalendarView
+
+ - 春節
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 臘月
+
+
+
+ - 除夕
+ - 0101春節
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重陽
+
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+
+ - 0101元旦
+ - 0214情人節
+ - 0308婦女節
+ - 0312植樹節
+ - 0315消權日
+ - 0401愚人節
+ - 0404兒童節
+ - 0422地球日
+ - 0501勞動節
+ - 0903軍人節
+ - 0928教師節
+ - 0501勞動節
+ - 0504青年節
+ - 0601兒童節
+ - 0701建黨節
+ - 0801建軍節
+ - 0928教師節
+ - 1001國慶節
+ - 1031萬聖節
+ - 1111光棍節
+ - 1224平安夜
+ - 1225聖誕節
+
+
+
+ - 春分
+ - 清明
+ - 穀雨
+ - 立夏
+ - 小滿
+ - 芒種
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 處暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 驚蟄
+
+
+
+ - 母親節
+ - 父親節
+ - 感恩節
+
+
+ 日
+ 一
+ 二
+ 三
+ 四
+ 五
+ 六
+
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
diff --git a/calendarview/src/main/res/values-zh/strings.xml b/calendarview/src/main/res/values-zh/strings.xml
new file mode 100644
index 0000000..82972c7
--- /dev/null
+++ b/calendarview/src/main/res/values-zh/strings.xml
@@ -0,0 +1,216 @@
+
+ CalendarView
+
+ - 春节
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 冬月
+ - 腊月
+
+
+
+ - 除夕
+ - 0101春节
+ - 0115元宵
+ - 0505端午
+ - 0707七夕
+ - 0815中秋
+ - 0909重阳
+
+
+
+ - 初一
+ - 初二
+ - 初三
+ - 初四
+ - 初五
+ - 初六
+ - 初七
+ - 初八
+ - 初九
+ - 初十
+ - 十一
+ - 十二
+ - 十三
+ - 十四
+ - 十五
+ - 十六
+ - 十七
+ - 十八
+ - 十九
+ - 二十
+ - 廿一
+ - 廿二
+ - 廿三
+ - 廿四
+ - 廿五
+ - 廿六
+ - 廿七
+ - 廿八
+ - 廿九
+ - 三十
+
+
+
+ - 0101元旦
+ - 0214情人节
+ - 0308妇女节
+ - 0312植树节
+ - 0315消权日
+ - 0401愚人节
+ - 0422地球日
+ - 0501劳动节
+ - 0504青年节
+ - 0601儿童节
+ - 0701建党节
+ - 0801建军节
+ - 0910教师节
+ - 1001国庆节
+ - 1031万圣节
+ - 1111光棍节
+ - 1224平安夜
+ - 1225圣诞节
+
+
+
+ - 春分
+ - 清明
+ - 谷雨
+ - 立夏
+ - 小满
+ - 芒种
+ - 夏至
+ - 小暑
+ - 大暑
+ - 立秋
+ - 处暑
+ - 白露
+ - 秋分
+ - 寒露
+ - 霜降
+ - 立冬
+ - 小雪
+ - 大雪
+ - 冬至
+ - 小寒
+ - 大寒
+ - 立春
+ - 雨水
+ - 惊蛰
+
+
+
+ - 母亲节
+ - 父亲节
+ - 感恩节
+
+
+ 日
+ 一
+ 二
+ 三
+ 四
+ 五
+ 六
+
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+
+
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+
+
+
+
+ - 辛
+ - 壬
+ - 癸
+ - 甲
+ - 乙
+ - 丙
+ - 丁
+ - 戊
+ - 己
+ - 庚
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+
+
+
+ - 酉
+ - 戌
+ - 亥
+ - 子
+ - 丑
+ - 寅
+ - 卯
+ - 辰
+ - 巳
+ - 午
+ - 未
+ - 申
+
+
+
diff --git a/calendarview/src/main/res/values/attrs.xml b/calendarview/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..bce063b
--- /dev/null
+++ b/calendarview/src/main/res/values/attrs.xml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 72ce466..1fa5780 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -6,15 +6,15 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
-android.defaults.buildfeatures.buildconfig=true
+#android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=true
-android.nonFinalResIds=false
-android.nonTransitiveRClass=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+kotlin.code.style=official
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
-
+#android.nonFinalResIds=false
+#android.nonTransitiveRClass=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 04e59f0..69955ca 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
diff --git a/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/results.bin b/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/transformed/classes/classes_dex/classes.dex b/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..358bd1a
Binary files /dev/null and b/litepal/build/.transforms/2158afd25b6758a737b01a5fc759bb8c/transformed/classes/classes_dex/classes.dex differ
diff --git a/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/results.bin b/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/transformed/classes/classes_dex/classes.dex b/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..95a7e7a
Binary files /dev/null and b/litepal/build/.transforms/94c7087bbdff0f5324e8c0e9d4385e2a/transformed/classes/classes_dex/classes.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/results.bin b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/results.bin
new file mode 100644
index 0000000..e1640c9
--- /dev/null
+++ b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirRelease
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePal.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePal.dex
new file mode 100644
index 0000000..b8a47a6
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePal.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalApplication.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalApplication.dex
new file mode 100644
index 0000000..8d20f35
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalApplication.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalBase.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalBase.dex
new file mode 100644
index 0000000..79bf421
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalBase.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalDB.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalDB.dex
new file mode 100644
index 0000000..f6bb950
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/LitePalDB.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/annotation/Column.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/annotation/Column.dex
new file mode 100644
index 0000000..3569e62
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/annotation/Column.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/AssociationsAnalyzer.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/AssociationsAnalyzer.dex
new file mode 100644
index 0000000..3bafbd8
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/AssociationsAnalyzer.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1$1.dex
new file mode 100644
index 0000000..83eeb53
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1.dex
new file mode 100644
index 0000000..d80687a
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2$1.dex
new file mode 100644
index 0000000..2807e49
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2.dex
new file mode 100644
index 0000000..10d3b16
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$2.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3$1.dex
new file mode 100644
index 0000000..c364c69
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3.dex
new file mode 100644
index 0000000..0d7de5f
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$3.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4$1.dex
new file mode 100644
index 0000000..44119ce
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4.dex
new file mode 100644
index 0000000..0019c0a
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$4.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5$1.dex
new file mode 100644
index 0000000..20efbc1
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5.dex
new file mode 100644
index 0000000..0e186c5
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$5.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6$1.dex
new file mode 100644
index 0000000..371e449
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6.dex
new file mode 100644
index 0000000..ee0254c
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$6.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7$1.dex
new file mode 100644
index 0000000..3be07c1
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7.dex
new file mode 100644
index 0000000..7769edd
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$7.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8$1.dex
new file mode 100644
index 0000000..a5d2b10
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8.dex
new file mode 100644
index 0000000..23566cd
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery$8.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery.dex
new file mode 100644
index 0000000..eedf1c8
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/ClusterQuery.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler$QueryInfoCache.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler$QueryInfoCache.dex
new file mode 100644
index 0000000..05e976e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler$QueryInfoCache.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler.dex
new file mode 100644
index 0000000..2373a6b
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1$1.dex
new file mode 100644
index 0000000..e050b03
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1.dex
new file mode 100644
index 0000000..0d890cc
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10$1.dex
new file mode 100644
index 0000000..3165e58
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10.dex
new file mode 100644
index 0000000..9854734
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$10.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11$1.dex
new file mode 100644
index 0000000..f2ffa33
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11.dex
new file mode 100644
index 0000000..83b7473
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$11.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12$1.dex
new file mode 100644
index 0000000..5bb8b41
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12.dex
new file mode 100644
index 0000000..21bdba0
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$12.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13$1.dex
new file mode 100644
index 0000000..d7e88c5
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13.dex
new file mode 100644
index 0000000..082d877
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$13.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14$1.dex
new file mode 100644
index 0000000..5e3a041
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14.dex
new file mode 100644
index 0000000..a58bebf
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$14.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15$1.dex
new file mode 100644
index 0000000..7d9834d
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15.dex
new file mode 100644
index 0000000..e0b07ab
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$15.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16$1.dex
new file mode 100644
index 0000000..7f9cbb1
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16.dex
new file mode 100644
index 0000000..7ff19d4
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$16.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17$1.dex
new file mode 100644
index 0000000..8cc6b31
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17.dex
new file mode 100644
index 0000000..dba8c96
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$17.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18$1.dex
new file mode 100644
index 0000000..c8dfe5d
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18.dex
new file mode 100644
index 0000000..c714650
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$18.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19$1.dex
new file mode 100644
index 0000000..65fa80b
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19.dex
new file mode 100644
index 0000000..f5d58a6
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$19.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2$1.dex
new file mode 100644
index 0000000..9c662f8
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2.dex
new file mode 100644
index 0000000..2a582f0
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$2.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20$1.dex
new file mode 100644
index 0000000..8522c54
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20.dex
new file mode 100644
index 0000000..d23ae66
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$20.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3$1.dex
new file mode 100644
index 0000000..ec5cf45
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3.dex
new file mode 100644
index 0000000..58101a9
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$3.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4$1.dex
new file mode 100644
index 0000000..ef99e07
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4.dex
new file mode 100644
index 0000000..f56f477
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$4.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5$1.dex
new file mode 100644
index 0000000..e0981b7
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5.dex
new file mode 100644
index 0000000..c45c6df
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$5.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6$1.dex
new file mode 100644
index 0000000..446b82b
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6.dex
new file mode 100644
index 0000000..f786bd6
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$6.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7$1.dex
new file mode 100644
index 0000000..dd3ae9f
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7.dex
new file mode 100644
index 0000000..e2f7a7e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$7.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8$1.dex
new file mode 100644
index 0000000..4064bdf
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8.dex
new file mode 100644
index 0000000..afdbc80
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$8.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9$1.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9$1.dex
new file mode 100644
index 0000000..695815e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9$1.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9.dex
new file mode 100644
index 0000000..1ace78d
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport$9.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport.dex
new file mode 100644
index 0000000..df54803
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DataSupport.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DeleteHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DeleteHandler.dex
new file mode 100644
index 0000000..db2e2e5
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DeleteHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DynamicExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DynamicExecutor.dex
new file mode 100644
index 0000000..f12cd22
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/DynamicExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2ManyAnalyzer.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2ManyAnalyzer.dex
new file mode 100644
index 0000000..8422b80
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2ManyAnalyzer.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2OneAnalyzer.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2OneAnalyzer.dex
new file mode 100644
index 0000000..2fd2caa
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/Many2OneAnalyzer.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/One2OneAnalyzer.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/One2OneAnalyzer.dex
new file mode 100644
index 0000000..78bc7a6
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/One2OneAnalyzer.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/QueryHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/QueryHandler.dex
new file mode 100644
index 0000000..0abdefe
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/QueryHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/SaveHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/SaveHandler.dex
new file mode 100644
index 0000000..869a83c
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/SaveHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/UpdateHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/UpdateHandler.dex
new file mode 100644
index 0000000..f14b123
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/UpdateHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AsyncExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AsyncExecutor.dex
new file mode 100644
index 0000000..946c77f
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AsyncExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AverageExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AverageExecutor.dex
new file mode 100644
index 0000000..40814f7
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/AverageExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/CountExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/CountExecutor.dex
new file mode 100644
index 0000000..26c906e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/CountExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindExecutor.dex
new file mode 100644
index 0000000..8a1dfbe
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindMultiExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindMultiExecutor.dex
new file mode 100644
index 0000000..0dfb5d6
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/FindMultiExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/SaveExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/SaveExecutor.dex
new file mode 100644
index 0000000..0a48c4c
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/SaveExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/UpdateOrDeleteExecutor.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/UpdateOrDeleteExecutor.dex
new file mode 100644
index 0000000..684fe18
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/async/UpdateOrDeleteExecutor.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/AverageCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/AverageCallback.dex
new file mode 100644
index 0000000..60296d0
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/AverageCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/CountCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/CountCallback.dex
new file mode 100644
index 0000000..38f5e04
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/CountCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindCallback.dex
new file mode 100644
index 0000000..8c27336
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindMultiCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindMultiCallback.dex
new file mode 100644
index 0000000..50e625d
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/FindMultiCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/SaveCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/SaveCallback.dex
new file mode 100644
index 0000000..8afa260
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/SaveCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/UpdateOrDeleteCallback.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/UpdateOrDeleteCallback.dex
new file mode 100644
index 0000000..39754b9
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/callback/UpdateOrDeleteCallback.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/model/AssociationsInfo.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/model/AssociationsInfo.dex
new file mode 100644
index 0000000..99ed8f7
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/crud/model/AssociationsInfo.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DataSupportException.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DataSupportException.dex
new file mode 100644
index 0000000..ae56ae5
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DataSupportException.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DatabaseGenerateException.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DatabaseGenerateException.dex
new file mode 100644
index 0000000..a318e26
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/DatabaseGenerateException.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/GlobalException.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/GlobalException.dex
new file mode 100644
index 0000000..f82f338
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/GlobalException.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/InvalidAttributesException.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/InvalidAttributesException.dex
new file mode 100644
index 0000000..fc6acf9
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/InvalidAttributesException.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/ParseConfigurationFileException.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/ParseConfigurationFileException.dex
new file mode 100644
index 0000000..8bae38e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/exceptions/ParseConfigurationFileException.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/model/Table_Schema.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/model/Table_Schema.dex
new file mode 100644
index 0000000..1c769bb
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/model/Table_Schema.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalAttr.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalAttr.dex
new file mode 100644
index 0000000..ad9356a
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalAttr.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalConfig.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalConfig.dex
new file mode 100644
index 0000000..e41dac8
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalConfig.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalContentHandler.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalContentHandler.dex
new file mode 100644
index 0000000..daa0455
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalContentHandler.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalParser.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalParser.dex
new file mode 100644
index 0000000..2f0f7f1
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/parser/LitePalParser.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationCreator.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationCreator.dex
new file mode 100644
index 0000000..ff83266
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationCreator.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationUpdater.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationUpdater.dex
new file mode 100644
index 0000000..0f1b1b4
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/AssociationUpdater.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Connector.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Connector.dex
new file mode 100644
index 0000000..0a339c3
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Connector.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Creator.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Creator.dex
new file mode 100644
index 0000000..c58635e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Creator.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Dropper.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Dropper.dex
new file mode 100644
index 0000000..ab19abb
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Dropper.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Generator.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Generator.dex
new file mode 100644
index 0000000..c05e2b0
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Generator.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/LitePalOpenHelper.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/LitePalOpenHelper.dex
new file mode 100644
index 0000000..33ffe22
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/LitePalOpenHelper.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Upgrader.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Upgrader.dex
new file mode 100644
index 0000000..2ba8872
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/Upgrader.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/AssociationsModel.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/AssociationsModel.dex
new file mode 100644
index 0000000..962b59e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/AssociationsModel.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/ColumnModel.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/ColumnModel.dex
new file mode 100644
index 0000000..39b73ac
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/ColumnModel.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/GenericModel.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/GenericModel.dex
new file mode 100644
index 0000000..9c89690
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/GenericModel.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/TableModel.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/TableModel.dex
new file mode 100644
index 0000000..cdda489
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/model/TableModel.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BlobOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BlobOrm.dex
new file mode 100644
index 0000000..edb5eb5
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BlobOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BooleanOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BooleanOrm.dex
new file mode 100644
index 0000000..3e3d980
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/BooleanOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DateOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DateOrm.dex
new file mode 100644
index 0000000..89a73b2
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DateOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DecimalOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DecimalOrm.dex
new file mode 100644
index 0000000..f7e90d2
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/DecimalOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/NumericOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/NumericOrm.dex
new file mode 100644
index 0000000..a9b9f80
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/NumericOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/OrmChange.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/OrmChange.dex
new file mode 100644
index 0000000..3a4da42
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/OrmChange.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/TextOrm.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/TextOrm.dex
new file mode 100644
index 0000000..8d026a9
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/tablemanager/typechange/TextOrm.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/BaseUtility.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/BaseUtility.dex
new file mode 100644
index 0000000..5618eab
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/BaseUtility.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Config.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Config.dex
new file mode 100644
index 0000000..2c2d509
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Config.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Model.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Model.dex
new file mode 100644
index 0000000..29b00d4
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$Model.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$TableSchema.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$TableSchema.dex
new file mode 100644
index 0000000..417cc1e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const$TableSchema.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const.dex
new file mode 100644
index 0000000..a695e1b
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/Const.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/DBUtility.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/DBUtility.dex
new file mode 100644
index 0000000..7bcc855
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/DBUtility.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/LogUtil.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/LogUtil.dex
new file mode 100644
index 0000000..7a2937e
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/LogUtil.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/SharedUtil.dex b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/SharedUtil.dex
new file mode 100644
index 0000000..13f5cc1
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/org/litepal/util/SharedUtil.dex differ
diff --git a/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/litepal/build/.transforms/a65818fee1a39a3e6ef0a7b34b01b4ac/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin differ
diff --git a/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..b2699ae
--- /dev/null
+++ b/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..a1f73d3
--- /dev/null
+++ b/litepal/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "org.litepal",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..b2699ae
--- /dev/null
+++ b/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json b/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..1b9d44b
--- /dev/null
+++ b/litepal/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "org.litepal",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/litepal/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/litepal/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
new file mode 100644
index 0000000..b09f552
Binary files /dev/null and b/litepal/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar differ
diff --git a/litepal/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar b/litepal/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar
new file mode 100644
index 0000000..f8e31f5
Binary files /dev/null and b/litepal/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar differ
diff --git a/litepal/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/litepal/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/litepal/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/litepal/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties b/litepal/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/litepal/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/litepal/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/litepal/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/litepal/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/litepal/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/litepal/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/litepal/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/litepal/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/litepal/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/litepal/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt b/litepal/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/litepal/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/litepal/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 0000000..62565d0
Binary files /dev/null and b/litepal/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/litepal/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/litepal/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar
new file mode 100644
index 0000000..62565d0
Binary files /dev/null and b/litepal/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ
diff --git a/litepal/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/litepal/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 0000000..88c7373
Binary files /dev/null and b/litepal/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/litepal/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/litepal/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar
new file mode 100644
index 0000000..88c7373
Binary files /dev/null and b/litepal/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ
diff --git a/litepal/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/litepal/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 0000000..a9551e5
--- /dev/null
+++ b/litepal/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
@@ -0,0 +1 @@
+int string app_name 0x0
diff --git a/litepal/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/litepal/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
new file mode 100644
index 0000000..a9551e5
--- /dev/null
+++ b/litepal/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
@@ -0,0 +1 @@
+int string app_name 0x0
diff --git a/litepal/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/litepal/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 0000000..1c983fc
Binary files /dev/null and b/litepal/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/litepal/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/litepal/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000..0c59d11
--- /dev/null
+++ b/litepal/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:03:44 CST 2024
diff --git a/litepal/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml b/litepal/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..611cb91
--- /dev/null
+++ b/litepal/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml
@@ -0,0 +1,4 @@
+
+
+ LitePal
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/litepal/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 0000000..76bf04d
--- /dev/null
+++ b/litepal/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,2 @@
+
+LitePal
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/litepal/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000..64717b5
--- /dev/null
+++ b/litepal/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/mergeDebugShaders/merger.xml b/litepal/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000..cf93528
--- /dev/null
+++ b/litepal/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/litepal/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
new file mode 100644
index 0000000..9c92ee2
--- /dev/null
+++ b/litepal/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/litepal/build/intermediates/incremental/mergeReleaseShaders/merger.xml
new file mode 100644
index 0000000..84c46e9
--- /dev/null
+++ b/litepal/build/intermediates/incremental/mergeReleaseShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/packageDebugAssets/merger.xml b/litepal/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000..9d8ae64
--- /dev/null
+++ b/litepal/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/packageReleaseAssets/merger.xml b/litepal/build/intermediates/incremental/packageReleaseAssets/merger.xml
new file mode 100644
index 0000000..291444f
--- /dev/null
+++ b/litepal/build/intermediates/incremental/packageReleaseAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/release-mergeJavaRes/merge-state b/litepal/build/intermediates/incremental/release-mergeJavaRes/merge-state
new file mode 100644
index 0000000..1c983fc
Binary files /dev/null and b/litepal/build/intermediates/incremental/release-mergeJavaRes/merge-state differ
diff --git a/litepal/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties b/litepal/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..7e42bee
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Wed Sep 11 19:14:18 CST 2024
diff --git a/litepal/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml b/litepal/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..611cb91
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml
@@ -0,0 +1,4 @@
+
+
+ LitePal
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/release/mergeReleaseResources/merger.xml b/litepal/build/intermediates/incremental/release/mergeReleaseResources/merger.xml
new file mode 100644
index 0000000..4624b4b
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/mergeReleaseResources/merger.xml
@@ -0,0 +1,2 @@
+
+LitePal
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties b/litepal/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..f254a9e
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:04:20 CST 2024
diff --git a/litepal/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml b/litepal/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml
new file mode 100644
index 0000000..611cb91
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/packageReleaseResources/merged.dir/values/values.xml
@@ -0,0 +1,4 @@
+
+
+ LitePal
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/incremental/release/packageReleaseResources/merger.xml b/litepal/build/intermediates/incremental/release/packageReleaseResources/merger.xml
new file mode 100644
index 0000000..bf7ca6b
--- /dev/null
+++ b/litepal/build/intermediates/incremental/release/packageReleaseResources/merger.xml
@@ -0,0 +1,2 @@
+
+LitePal
\ No newline at end of file
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePal.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePal.class
new file mode 100644
index 0000000..46b9254
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePal.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalApplication.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalApplication.class
new file mode 100644
index 0000000..7d49fb3
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalApplication.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalBase.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalBase.class
new file mode 100644
index 0000000..25b3015
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalBase.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalDB.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalDB.class
new file mode 100644
index 0000000..db1a1ab
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/LitePalDB.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/annotation/Column.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/annotation/Column.class
new file mode 100644
index 0000000..ddbd628
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/annotation/Column.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class
new file mode 100644
index 0000000..5fa61f5
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class
new file mode 100644
index 0000000..c191880
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class
new file mode 100644
index 0000000..2e4318a
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class
new file mode 100644
index 0000000..8e7bf69
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class
new file mode 100644
index 0000000..266dc17
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class
new file mode 100644
index 0000000..81af636
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class
new file mode 100644
index 0000000..40949a2
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class
new file mode 100644
index 0000000..415936b
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class
new file mode 100644
index 0000000..6a10cf8
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class
new file mode 100644
index 0000000..14e4a43
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class
new file mode 100644
index 0000000..2e01a82
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class
new file mode 100644
index 0000000..12c576d
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class
new file mode 100644
index 0000000..9d9b77a
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class
new file mode 100644
index 0000000..e2d5a2c
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class
new file mode 100644
index 0000000..4282a8d
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class
new file mode 100644
index 0000000..c1dea96
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class
new file mode 100644
index 0000000..a6156f4
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class
new file mode 100644
index 0000000..8f8384e
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class
new file mode 100644
index 0000000..b883750
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler.class
new file mode 100644
index 0000000..c8aaf6f
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataHandler.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class
new file mode 100644
index 0000000..778331f
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class
new file mode 100644
index 0000000..2d21d0f
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class
new file mode 100644
index 0000000..c1a2663
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10.class
new file mode 100644
index 0000000..421637a
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$10.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11$1.class
new file mode 100644
index 0000000..0303fe5
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11.class
new file mode 100644
index 0000000..c3a2599
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$11.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12$1.class
new file mode 100644
index 0000000..3fee857
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12.class
new file mode 100644
index 0000000..9c73d95
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$12.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13$1.class
new file mode 100644
index 0000000..266641a
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13.class
new file mode 100644
index 0000000..8fa08b9
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$13.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14$1.class
new file mode 100644
index 0000000..d486204
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14.class
new file mode 100644
index 0000000..4deb5e6
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$14.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15$1.class
new file mode 100644
index 0000000..4119590
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15.class
new file mode 100644
index 0000000..faa0906
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$15.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16$1.class
new file mode 100644
index 0000000..85f341b
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16.class
new file mode 100644
index 0000000..8936d34
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$16.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17$1.class
new file mode 100644
index 0000000..1251dcd
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17.class
new file mode 100644
index 0000000..8d5f9a2
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$17.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18$1.class
new file mode 100644
index 0000000..251c2e3
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class
new file mode 100644
index 0000000..64183b1
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class
new file mode 100644
index 0000000..174f34a
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class
new file mode 100644
index 0000000..431e360
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class
new file mode 100644
index 0000000..e014145
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class
new file mode 100644
index 0000000..53cb1c0
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class
new file mode 100644
index 0000000..d7d4411
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class
new file mode 100644
index 0000000..73f30c7
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class
new file mode 100644
index 0000000..26bc127
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class
new file mode 100644
index 0000000..40a2afd
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class
new file mode 100644
index 0000000..12cbe11
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class
new file mode 100644
index 0000000..b62d049
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class
new file mode 100644
index 0000000..4d4f798
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class
new file mode 100644
index 0000000..12c1c74
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class
new file mode 100644
index 0000000..24c8b91
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class
new file mode 100644
index 0000000..c890211
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class
new file mode 100644
index 0000000..4082511
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/CountExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/CountExecutor.class
new file mode 100644
index 0000000..4525253
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/CountExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindExecutor.class
new file mode 100644
index 0000000..3b9a692
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindMultiExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindMultiExecutor.class
new file mode 100644
index 0000000..63f43b7
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/FindMultiExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/SaveExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/SaveExecutor.class
new file mode 100644
index 0000000..f34b608
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/SaveExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/UpdateOrDeleteExecutor.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/UpdateOrDeleteExecutor.class
new file mode 100644
index 0000000..ebf5ae4
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/async/UpdateOrDeleteExecutor.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/AverageCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/AverageCallback.class
new file mode 100644
index 0000000..b47331d
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/AverageCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/CountCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/CountCallback.class
new file mode 100644
index 0000000..3c8ad47
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/CountCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindCallback.class
new file mode 100644
index 0000000..b02c09d
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindMultiCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindMultiCallback.class
new file mode 100644
index 0000000..0ba10f5
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/FindMultiCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/SaveCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/SaveCallback.class
new file mode 100644
index 0000000..450eb1c
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/SaveCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/UpdateOrDeleteCallback.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/UpdateOrDeleteCallback.class
new file mode 100644
index 0000000..d18c149
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/callback/UpdateOrDeleteCallback.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/model/AssociationsInfo.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/model/AssociationsInfo.class
new file mode 100644
index 0000000..886cbd6
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/crud/model/AssociationsInfo.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/exceptions/DataSupportException.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/exceptions/DataSupportException.class
new file mode 100644
index 0000000..3167a6f
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/exceptions/DataSupportException.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/Upgrader.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/Upgrader.class
new file mode 100644
index 0000000..29e80dc
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/Upgrader.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/AssociationsModel.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/AssociationsModel.class
new file mode 100644
index 0000000..fe1d534
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/AssociationsModel.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/ColumnModel.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/ColumnModel.class
new file mode 100644
index 0000000..988dea9
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/ColumnModel.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/GenericModel.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/GenericModel.class
new file mode 100644
index 0000000..fd1de92
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/GenericModel.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/TableModel.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/TableModel.class
new file mode 100644
index 0000000..9d7a1eb
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/model/TableModel.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BlobOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BlobOrm.class
new file mode 100644
index 0000000..76ad0de
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BlobOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BooleanOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BooleanOrm.class
new file mode 100644
index 0000000..a586ae0
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/BooleanOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DateOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DateOrm.class
new file mode 100644
index 0000000..eed811c
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DateOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DecimalOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DecimalOrm.class
new file mode 100644
index 0000000..92fcee2
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/DecimalOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/NumericOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/NumericOrm.class
new file mode 100644
index 0000000..67db85c
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/NumericOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/OrmChange.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/OrmChange.class
new file mode 100644
index 0000000..bfe5b7d
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/OrmChange.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/TextOrm.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/TextOrm.class
new file mode 100644
index 0000000..bf1ee77
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/tablemanager/typechange/TextOrm.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/BaseUtility.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/BaseUtility.class
new file mode 100644
index 0000000..8d70cb0
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/BaseUtility.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Config.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Config.class
new file mode 100644
index 0000000..4f39859
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Config.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Model.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Model.class
new file mode 100644
index 0000000..ff6aa15
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$Model.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$TableSchema.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$TableSchema.class
new file mode 100644
index 0000000..e038632
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const$TableSchema.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const.class
new file mode 100644
index 0000000..267a953
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/Const.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/DBUtility.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/DBUtility.class
new file mode 100644
index 0000000..f0e05ad
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/DBUtility.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/LogUtil.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/LogUtil.class
new file mode 100644
index 0000000..e3647c6
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/LogUtil.class differ
diff --git a/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/SharedUtil.class b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/SharedUtil.class
new file mode 100644
index 0000000..32db7e9
Binary files /dev/null and b/litepal/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/litepal/util/SharedUtil.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePal.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePal.class
new file mode 100644
index 0000000..46b9254
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePal.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalApplication.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalApplication.class
new file mode 100644
index 0000000..7d49fb3
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalApplication.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalBase.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalBase.class
new file mode 100644
index 0000000..25b3015
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalBase.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalDB.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalDB.class
new file mode 100644
index 0000000..db1a1ab
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/LitePalDB.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/annotation/Column.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/annotation/Column.class
new file mode 100644
index 0000000..ddbd628
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/annotation/Column.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class
new file mode 100644
index 0000000..5fa61f5
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/AssociationsAnalyzer.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class
new file mode 100644
index 0000000..c191880
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class
new file mode 100644
index 0000000..2e4318a
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class
new file mode 100644
index 0000000..8e7bf69
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class
new file mode 100644
index 0000000..266dc17
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$2.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class
new file mode 100644
index 0000000..81af636
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class
new file mode 100644
index 0000000..40949a2
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$3.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class
new file mode 100644
index 0000000..415936b
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class
new file mode 100644
index 0000000..6a10cf8
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$4.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class
new file mode 100644
index 0000000..14e4a43
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class
new file mode 100644
index 0000000..2e01a82
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$5.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class
new file mode 100644
index 0000000..12c576d
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class
new file mode 100644
index 0000000..9d9b77a
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$6.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class
new file mode 100644
index 0000000..e2d5a2c
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class
new file mode 100644
index 0000000..4282a8d
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$7.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class
new file mode 100644
index 0000000..c1dea96
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class
new file mode 100644
index 0000000..a6156f4
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery$8.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class
new file mode 100644
index 0000000..8f8384e
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/ClusterQuery.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class
new file mode 100644
index 0000000..b883750
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler$QueryInfoCache.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler.class
new file mode 100644
index 0000000..c8aaf6f
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataHandler.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class
new file mode 100644
index 0000000..778331f
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class
new file mode 100644
index 0000000..2d21d0f
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class
new file mode 100644
index 0000000..c1a2663
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$10$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class
new file mode 100644
index 0000000..64183b1
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$18.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class
new file mode 100644
index 0000000..174f34a
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class
new file mode 100644
index 0000000..431e360
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$19.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class
new file mode 100644
index 0000000..e014145
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class
new file mode 100644
index 0000000..53cb1c0
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$2.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class
new file mode 100644
index 0000000..d7d4411
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class
new file mode 100644
index 0000000..73f30c7
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$20.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class
new file mode 100644
index 0000000..26bc127
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class
new file mode 100644
index 0000000..40a2afd
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$3.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class
new file mode 100644
index 0000000..12cbe11
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class
new file mode 100644
index 0000000..b62d049
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$4.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class
new file mode 100644
index 0000000..4d4f798
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class
new file mode 100644
index 0000000..12c1c74
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$5.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6$1.class
new file mode 100644
index 0000000..3d12050
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6.class
new file mode 100644
index 0000000..1c828b9
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$6.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7$1.class
new file mode 100644
index 0000000..97f8fdb
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7.class
new file mode 100644
index 0000000..7abd10c
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$7.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8$1.class
new file mode 100644
index 0000000..57c6867
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8.class
new file mode 100644
index 0000000..fbbdb6f
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$8.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9$1.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9$1.class
new file mode 100644
index 0000000..86c8faf
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9$1.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9.class
new file mode 100644
index 0000000..0314620
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport$9.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport.class
new file mode 100644
index 0000000..78d20e2
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DataSupport.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DeleteHandler.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DeleteHandler.class
new file mode 100644
index 0000000..88ba60e
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DeleteHandler.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DynamicExecutor.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DynamicExecutor.class
new file mode 100644
index 0000000..41ee3ba
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/DynamicExecutor.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2ManyAnalyzer.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2ManyAnalyzer.class
new file mode 100644
index 0000000..1f3b09c
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2ManyAnalyzer.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2OneAnalyzer.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2OneAnalyzer.class
new file mode 100644
index 0000000..69962e2
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/Many2OneAnalyzer.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/One2OneAnalyzer.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/One2OneAnalyzer.class
new file mode 100644
index 0000000..4df31d2
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/One2OneAnalyzer.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/QueryHandler.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/QueryHandler.class
new file mode 100644
index 0000000..56a511c
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/QueryHandler.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/SaveHandler.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/SaveHandler.class
new file mode 100644
index 0000000..8a7cb06
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/SaveHandler.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class
new file mode 100644
index 0000000..24c8b91
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/UpdateHandler.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class
new file mode 100644
index 0000000..c890211
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AsyncExecutor.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class
new file mode 100644
index 0000000..4082511
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/crud/async/AverageExecutor.class differ
diff --git a/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/util/SharedUtil.class b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/util/SharedUtil.class
new file mode 100644
index 0000000..32db7e9
Binary files /dev/null and b/litepal/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/litepal/util/SharedUtil.class differ
diff --git a/litepal/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/litepal/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
new file mode 100644
index 0000000..34ca0ec
--- /dev/null
+++ b/litepal/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
@@ -0,0 +1,3 @@
+R_DEF: Internal format may change without notice
+local
+string app_name
diff --git a/litepal/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt b/litepal/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
new file mode 100644
index 0000000..34ca0ec
--- /dev/null
+++ b/litepal/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt
@@ -0,0 +1,3 @@
+R_DEF: Internal format may change without notice
+local
+string app_name
diff --git a/litepal/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/litepal/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
new file mode 100644
index 0000000..1b0f1d1
--- /dev/null
+++ b/litepal/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/litepal/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt b/litepal/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
new file mode 100644
index 0000000..1b0f1d1
--- /dev/null
+++ b/litepal/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/litepal/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-litepal.jar b/litepal/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-litepal.jar
new file mode 100644
index 0000000..15cb0ec
Binary files /dev/null and b/litepal/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-litepal.jar differ
diff --git a/litepal/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-litepal.jar b/litepal/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-litepal.jar
new file mode 100644
index 0000000..15cb0ec
Binary files /dev/null and b/litepal/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-litepal.jar differ
diff --git a/litepal/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/litepal/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
new file mode 100644
index 0000000..b2699ae
--- /dev/null
+++ b/litepal/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml b/litepal/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
new file mode 100644
index 0000000..b2699ae
--- /dev/null
+++ b/litepal/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/merged_res/release/mergeReleaseResources/values/values.xml b/litepal/build/intermediates/merged_res/release/mergeReleaseResources/values/values.xml
new file mode 100644
index 0000000..611cb91
--- /dev/null
+++ b/litepal/build/intermediates/merged_res/release/mergeReleaseResources/values/values.xml
@@ -0,0 +1,4 @@
+
+
+ LitePal
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values.json b/litepal/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values.json
new file mode 100644
index 0000000..c00bc6e
--- /dev/null
+++ b/litepal/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values.json
@@ -0,0 +1,48 @@
+{
+ "logs": [
+ {
+ "outputFile": "org.litepal-release-3:/values/values.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\litepal\\src\\main\\res\\values\\strings.xml",
+ "from": {
+ "startLines": "1",
+ "startColumns": "4",
+ "startOffsets": "17",
+ "endColumns": "44",
+ "endOffsets": "57"
+ },
+ "to": {
+ "startLines": "2",
+ "startColumns": "4",
+ "startOffsets": "55",
+ "endColumns": "44",
+ "endOffsets": "95"
+ }
+ }
+ ]
+ },
+ {
+ "outputFile": "org.litepal-mergeReleaseResources-1:/values/values.xml",
+ "map": [
+ {
+ "source": "C:\\Users\\admin\\AndroidStudioProjects\\DYWOA\\litepal\\src\\main\\res\\values\\strings.xml",
+ "from": {
+ "startLines": "1",
+ "startColumns": "4",
+ "startOffsets": "17",
+ "endColumns": "44",
+ "endOffsets": "57"
+ },
+ "to": {
+ "startLines": "2",
+ "startColumns": "4",
+ "startOffsets": "55",
+ "endColumns": "44",
+ "endOffsets": "95"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/litepal/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/litepal/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/litepal/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/litepal/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json b/litepal/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/litepal/build/intermediates/navigation_json/release/extractDeepLinksRelease/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/litepal/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/litepal/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/litepal/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/litepal/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt b/litepal/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
new file mode 100644
index 0000000..08f4ebe
--- /dev/null
+++ b/litepal/build/intermediates/nested_resources_validation_report/release/generateReleaseResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/litepal/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml b/litepal/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
new file mode 100644
index 0000000..611cb91
--- /dev/null
+++ b/litepal/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml
@@ -0,0 +1,4 @@
+
+
+ LitePal
+
\ No newline at end of file
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12$1.class
new file mode 100644
index 0000000..3fee857
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12.class
new file mode 100644
index 0000000..9c73d95
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$12.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13$1.class
new file mode 100644
index 0000000..266641a
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13.class
new file mode 100644
index 0000000..8fa08b9
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$13.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14$1.class
new file mode 100644
index 0000000..d486204
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14.class
new file mode 100644
index 0000000..4deb5e6
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$14.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15$1.class
new file mode 100644
index 0000000..4119590
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15.class
new file mode 100644
index 0000000..faa0906
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$15.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16$1.class
new file mode 100644
index 0000000..85f341b
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16.class
new file mode 100644
index 0000000..8936d34
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$16.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$2.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$2.class
new file mode 100644
index 0000000..53cb1c0
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$2.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20$1.class
new file mode 100644
index 0000000..d7d4411
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20.class
new file mode 100644
index 0000000..73f30c7
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$20.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3$1.class
new file mode 100644
index 0000000..26bc127
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3.class
new file mode 100644
index 0000000..40a2afd
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$3.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$4$1.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$4$1.class
new file mode 100644
index 0000000..12cbe11
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/crud/DataSupport$4$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Dropper.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Dropper.class
new file mode 100644
index 0000000..cd9919e
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Dropper.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Generator.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Generator.class
new file mode 100644
index 0000000..0e5557b
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Generator.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/LitePalOpenHelper.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/LitePalOpenHelper.class
new file mode 100644
index 0000000..1181b87
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/LitePalOpenHelper.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Upgrader.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Upgrader.class
new file mode 100644
index 0000000..29e80dc
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/Upgrader.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/AssociationsModel.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/AssociationsModel.class
new file mode 100644
index 0000000..fe1d534
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/AssociationsModel.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/ColumnModel.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/ColumnModel.class
new file mode 100644
index 0000000..988dea9
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/ColumnModel.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/GenericModel.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/GenericModel.class
new file mode 100644
index 0000000..fd1de92
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/GenericModel.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/TableModel.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/TableModel.class
new file mode 100644
index 0000000..9d7a1eb
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/model/TableModel.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BlobOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BlobOrm.class
new file mode 100644
index 0000000..76ad0de
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BlobOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BooleanOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BooleanOrm.class
new file mode 100644
index 0000000..a586ae0
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/BooleanOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DateOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DateOrm.class
new file mode 100644
index 0000000..eed811c
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DateOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DecimalOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DecimalOrm.class
new file mode 100644
index 0000000..92fcee2
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/DecimalOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/NumericOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/NumericOrm.class
new file mode 100644
index 0000000..67db85c
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/NumericOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/OrmChange.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/OrmChange.class
new file mode 100644
index 0000000..bfe5b7d
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/OrmChange.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/TextOrm.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/TextOrm.class
new file mode 100644
index 0000000..bf1ee77
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/tablemanager/typechange/TextOrm.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/util/BaseUtility.class b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/util/BaseUtility.class
new file mode 100644
index 0000000..8d70cb0
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/litepal/util/BaseUtility.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1$1.class
new file mode 100644
index 0000000..778331f
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1.class
new file mode 100644
index 0000000..2d21d0f
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10$1.class
new file mode 100644
index 0000000..c1a2663
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10.class
new file mode 100644
index 0000000..421637a
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$10.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11$1.class
new file mode 100644
index 0000000..0303fe5
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11.class
new file mode 100644
index 0000000..c3a2599
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$11.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12$1.class
new file mode 100644
index 0000000..3fee857
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12.class
new file mode 100644
index 0000000..9c73d95
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$12.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13$1.class
new file mode 100644
index 0000000..266641a
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13.class
new file mode 100644
index 0000000..8fa08b9
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$13.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14$1.class
new file mode 100644
index 0000000..d486204
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14.class
new file mode 100644
index 0000000..4deb5e6
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$14.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15$1.class
new file mode 100644
index 0000000..4119590
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15.class
new file mode 100644
index 0000000..faa0906
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$15.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16$1.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16$1.class
new file mode 100644
index 0000000..85f341b
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16$1.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16.class
new file mode 100644
index 0000000..8936d34
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/crud/DataSupport$16.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/DatabaseGenerateException.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/DatabaseGenerateException.class
new file mode 100644
index 0000000..721d8bd
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/DatabaseGenerateException.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/GlobalException.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/GlobalException.class
new file mode 100644
index 0000000..cde7c91
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/GlobalException.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/InvalidAttributesException.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/InvalidAttributesException.class
new file mode 100644
index 0000000..0e4c497
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/InvalidAttributesException.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/ParseConfigurationFileException.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/ParseConfigurationFileException.class
new file mode 100644
index 0000000..ec0579f
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/exceptions/ParseConfigurationFileException.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/model/Table_Schema.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/model/Table_Schema.class
new file mode 100644
index 0000000..f35f7b4
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/model/Table_Schema.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalAttr.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalAttr.class
new file mode 100644
index 0000000..0f081dd
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalAttr.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalConfig.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalConfig.class
new file mode 100644
index 0000000..a4e336b
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalConfig.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalContentHandler.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalContentHandler.class
new file mode 100644
index 0000000..03ac18a
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalContentHandler.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalParser.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalParser.class
new file mode 100644
index 0000000..4bb18d2
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/parser/LitePalParser.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationCreator.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationCreator.class
new file mode 100644
index 0000000..f54e715
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationCreator.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationUpdater.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationUpdater.class
new file mode 100644
index 0000000..9b53522
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/AssociationUpdater.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Connector.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Connector.class
new file mode 100644
index 0000000..4a92b36
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Connector.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Creator.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Creator.class
new file mode 100644
index 0000000..e639955
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Creator.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Dropper.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Dropper.class
new file mode 100644
index 0000000..cd9919e
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Dropper.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Generator.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Generator.class
new file mode 100644
index 0000000..0e5557b
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/Generator.class differ
diff --git a/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/LitePalOpenHelper.class b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/LitePalOpenHelper.class
new file mode 100644
index 0000000..1181b87
Binary files /dev/null and b/litepal/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/org/litepal/tablemanager/LitePalOpenHelper.class differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/AndroidVersion.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/AndroidVersion.dex
new file mode 100644
index 0000000..c7a1a54
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/AndroidVersion.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex
new file mode 100644
index 0000000..cdb3d04
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex
new file mode 100644
index 0000000..8d91601
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/Encryption.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/Encryption.dex
new file mode 100644
index 0000000..2747835
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/Encryption.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/HeaderUtil.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/HeaderUtil.dex
new file mode 100644
index 0000000..41eb557
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/HeaderUtil.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/IOUtils.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/IOUtils.dex
new file mode 100644
index 0000000..a95da0c
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/IOUtils.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex
new file mode 100644
index 0000000..bde650d
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex
new file mode 100644
index 0000000..be1c18b
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex
new file mode 100644
index 0000000..ded089a
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex
new file mode 100644
index 0000000..f1d0622
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader.dex
new file mode 100644
index 0000000..baed24a
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageDownloader.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex
new file mode 100644
index 0000000..4cc02a1
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex
new file mode 100644
index 0000000..376b526
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex
new file mode 100644
index 0000000..641c294
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex
new file mode 100644
index 0000000..ea4e213
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex
new file mode 100644
index 0000000..a01eb43
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex differ
diff --git a/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/nohttp/build/.transforms/064f5feaecb830df5e032234ba9c92b1/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin differ
diff --git a/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/results.bin b/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/transformed/classes/classes_dex/classes.dex b/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..e1cf9fa
Binary files /dev/null and b/nohttp/build/.transforms/7b44ece2fcdc754edd91e4356a9ca220/transformed/classes/classes_dex/classes.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/results.bin b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/results.bin
new file mode 100644
index 0000000..7ed749e
--- /dev/null
+++ b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary$UploadPoster.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary$UploadPoster.dex
new file mode 100644
index 0000000..a27ae16
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary$UploadPoster.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary.dex
new file mode 100644
index 0000000..e15285c
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicBinary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicConnection.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicConnection.dex
new file mode 100644
index 0000000..e556475
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicConnection.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicRequest.dex
new file mode 100644
index 0000000..757c048
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BasicRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Binary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Binary.dex
new file mode 100644
index 0000000..2233d23
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Binary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BitmapBinary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BitmapBinary.dex
new file mode 100644
index 0000000..478ecc8
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/BitmapBinary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/ByteArrayBinary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/ByteArrayBinary.dex
new file mode 100644
index 0000000..32794b0
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/ByteArrayBinary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Connection.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Connection.dex
new file mode 100644
index 0000000..983d14f
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Connection.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/FileBinary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/FileBinary.dex
new file mode 100644
index 0000000..4234ee2
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/FileBinary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Headers.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Headers.dex
new file mode 100644
index 0000000..d7b77fd
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Headers.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders$1.dex
new file mode 100644
index 0000000..cbe24f2
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders.dex
new file mode 100644
index 0000000..ca59e02
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/HttpHeaders.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IBasicRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IBasicRequest.dex
new file mode 100644
index 0000000..3aec56f
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IBasicRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IPriority.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IPriority.dex
new file mode 100644
index 0000000..41ea625
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/IPriority.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/InputStreamBinary.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/InputStreamBinary.dex
new file mode 100644
index 0000000..05ae2e1
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/InputStreamBinary.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Logger.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Logger.dex
new file mode 100644
index 0000000..d8358e5
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Logger.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp$1.dex
new file mode 100644
index 0000000..7707bd2
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp.dex
new file mode 100644
index 0000000..2757b91
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/NoHttp.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/OnUploadListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/OnUploadListener.dex
new file mode 100644
index 0000000..7874f00
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/OnUploadListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/PosterHandler.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/PosterHandler.dex
new file mode 100644
index 0000000..456c19e
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/PosterHandler.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Priority.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Priority.dex
new file mode 100644
index 0000000..a0c7627
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/Priority.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RedirectHandler.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RedirectHandler.dex
new file mode 100644
index 0000000..7e0ebb4
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RedirectHandler.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod$1.dex
new file mode 100644
index 0000000..17528af
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod.dex
new file mode 100644
index 0000000..3b6ea39
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/RequestMethod.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/SimpleUploadListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/SimpleUploadListener.dex
new file mode 100644
index 0000000..db282f2
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/SimpleUploadListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/UserAgent.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/UserAgent.dex
new file mode 100644
index 0000000..a5d16f8
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/UserAgent.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Cancelable.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Cancelable.dex
new file mode 100644
index 0000000..717cf0e
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Cancelable.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Finishable.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Finishable.dex
new file mode 100644
index 0000000..cfd5a65
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Finishable.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Queueable.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Queueable.dex
new file mode 100644
index 0000000..209f337
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/able/Queueable.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/StorageSpaceNotEnoughError.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/StorageSpaceNotEnoughError.dex
new file mode 100644
index 0000000..978c539
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/StorageSpaceNotEnoughError.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/TimeoutError.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/TimeoutError.dex
new file mode 100644
index 0000000..dd156a9
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/TimeoutError.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/URLError.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/URLError.dex
new file mode 100644
index 0000000..90e982b
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/URLError.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/UnKnownHostError.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/UnKnownHostError.dex
new file mode 100644
index 0000000..13dc724
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/error/UnKnownHostError.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ByteArrayRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ByteArrayRequest.dex
new file mode 100644
index 0000000..20c2daa
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ByteArrayRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode$1.dex
new file mode 100644
index 0000000..674fe24
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode.dex
new file mode 100644
index 0000000..cc97ab2
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/CacheMode.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IParserRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IParserRequest.dex
new file mode 100644
index 0000000..5683312
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IParserRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IProtocolRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IProtocolRequest.dex
new file mode 100644
index 0000000..bf8804d
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IProtocolRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestParser.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestParser.dex
new file mode 100644
index 0000000..a6f713d
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestParser.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestProtocol.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestProtocol.dex
new file mode 100644
index 0000000..b6fc996
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/IRestProtocol.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ImageRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ImageRequest.dex
new file mode 100644
index 0000000..71447c3
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ImageRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonArrayRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonArrayRequest.dex
new file mode 100644
index 0000000..466a144
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonArrayRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonObjectRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonObjectRequest.dex
new file mode 100644
index 0000000..62251f4
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/JsonObjectRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/OnResponseListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/OnResponseListener.dex
new file mode 100644
index 0000000..e3ae951
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/OnResponseListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ParseRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ParseRequest.dex
new file mode 100644
index 0000000..151219f
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ParseRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolRequest.dex
new file mode 100644
index 0000000..6c71f88
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolResult.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolResult.dex
new file mode 100644
index 0000000..4bf3c6b
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/ProtocolResult.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Request.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Request.dex
new file mode 100644
index 0000000..931dc10
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Request.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher$ThreadPoster.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher$ThreadPoster.dex
new file mode 100644
index 0000000..94b0911
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher$ThreadPoster.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher.dex
new file mode 100644
index 0000000..7922308
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestDispatcher.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestQueue.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestQueue.dex
new file mode 100644
index 0000000..11e2451
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RequestQueue.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Response.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Response.dex
new file mode 100644
index 0000000..b7f5336
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/Response.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestParser.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestParser.dex
new file mode 100644
index 0000000..e6795ff
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestParser.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol$1.dex
new file mode 100644
index 0000000..75a3d2b
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol.dex
new file mode 100644
index 0000000..c420895
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestProtocol.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestRequest.dex
new file mode 100644
index 0000000..686ffc8
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestResponse.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestResponse.dex
new file mode 100644
index 0000000..bcf17d0
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/RestResponse.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/SimpleResponseListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/SimpleResponseListener.dex
new file mode 100644
index 0000000..881d1f5
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/SimpleResponseListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/StringRequest.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/StringRequest.dex
new file mode 100644
index 0000000..d989525
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/rest/StringRequest.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/AndroidVersion.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/AndroidVersion.dex
new file mode 100644
index 0000000..e3ae782
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/AndroidVersion.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex
new file mode 100644
index 0000000..5026270
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/BasicMultiValueMap.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex
new file mode 100644
index 0000000..5c9ad40
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/CounterOutputStream.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/Encryption.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/Encryption.dex
new file mode 100644
index 0000000..85b1cec
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/Encryption.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/HeaderUtil.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/HeaderUtil.dex
new file mode 100644
index 0000000..db2d59e
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/HeaderUtil.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/IOUtils.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/IOUtils.dex
new file mode 100644
index 0000000..cb2d861
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/IOUtils.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex
new file mode 100644
index 0000000..c7e4f72
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex
new file mode 100644
index 0000000..c4d4a5f
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$DownImageThread.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex
new file mode 100644
index 0000000..1d9f93c
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$ImageHolder.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex
new file mode 100644
index 0000000..90c3400
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader$OnImageDownListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader.dex
new file mode 100644
index 0000000..90e8f94
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageDownloader.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex
new file mode 100644
index 0000000..98fddbd
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$1.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex
new file mode 100644
index 0000000..36c68f1
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImageLoadListener.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex
new file mode 100644
index 0000000..93af0b7
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$ImgBeanHolder.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex
new file mode 100644
index 0000000..d53e32e
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader$TaskThread.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex
new file mode 100644
index 0000000..6f74c1b
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ImageLocalLoader.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LinkedMultiValueMap.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LinkedMultiValueMap.dex
new file mode 100644
index 0000000..edfbf30
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LinkedMultiValueMap.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LruCache.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LruCache.dex
new file mode 100644
index 0000000..6960a84
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/LruCache.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/MultiValueMap.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/MultiValueMap.dex
new file mode 100644
index 0000000..aaa2969
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/MultiValueMap.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil$NetType.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil$NetType.dex
new file mode 100644
index 0000000..15094b5
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil$NetType.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil.dex
new file mode 100644
index 0000000..80d509f
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/NetUtil.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ResCompat.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ResCompat.dex
new file mode 100644
index 0000000..c5d8324
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/ResCompat.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/TreeMultiValueMap.dex b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/TreeMultiValueMap.dex
new file mode 100644
index 0000000..5c67bb4
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/yolanda/nohttp/tools/TreeMultiValueMap.dex differ
diff --git a/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/nohttp/build/.transforms/bcb8e74dd5c2a3810b0f401cea56235f/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/results.bin b/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/transformed/classes/classes_dex/classes.dex b/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..04a8fc6
Binary files /dev/null and b/nohttp/build/.transforms/ca2ef4d02f463c295396a737fa9bd902/transformed/classes/classes_dex/classes.dex differ
diff --git a/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..60b4153
--- /dev/null
+++ b/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..3e23ef8
--- /dev/null
+++ b/nohttp/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.yolanda.nohttp",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
new file mode 100644
index 0000000..60b4153
--- /dev/null
+++ b/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json b/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
new file mode 100644
index 0000000..5857db6
--- /dev/null
+++ b/nohttp/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.yolanda.nohttp",
+ "variantName": "release",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/nohttp/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/nohttp/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
new file mode 100644
index 0000000..782c26d
Binary files /dev/null and b/nohttp/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar differ
diff --git a/nohttp/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar b/nohttp/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar
new file mode 100644
index 0000000..7703ab6
Binary files /dev/null and b/nohttp/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar differ
diff --git a/nohttp/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/nohttp/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/nohttp/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/nohttp/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties b/nohttp/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/nohttp/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/nohttp/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/nohttp/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/nohttp/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/nohttp/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/nohttp/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/nohttp/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/nohttp/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/nohttp/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/nohttp/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt b/nohttp/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/nohttp/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/nohttp/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 0000000..e7583b0
Binary files /dev/null and b/nohttp/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/nohttp/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/nohttp/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar
new file mode 100644
index 0000000..e7583b0
Binary files /dev/null and b/nohttp/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ
diff --git a/nohttp/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/nohttp/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 0000000..4adbde8
Binary files /dev/null and b/nohttp/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/nohttp/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/nohttp/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar
new file mode 100644
index 0000000..4adbde8
Binary files /dev/null and b/nohttp/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ
diff --git a/nohttp/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/nohttp/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 0000000..e69de29
diff --git a/nohttp/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/nohttp/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
new file mode 100644
index 0000000..e69de29
diff --git a/nohttp/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/nohttp/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 0000000..1c983fc
Binary files /dev/null and b/nohttp/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/nohttp/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/nohttp/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000..0c59d11
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:03:44 CST 2024
diff --git a/nohttp/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/nohttp/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 0000000..780761d
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/nohttp/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 0000000..542c3d3
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/mergeDebugShaders/merger.xml b/nohttp/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 0000000..c189901
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/nohttp/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
new file mode 100644
index 0000000..c55b048
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/nohttp/build/intermediates/incremental/mergeReleaseShaders/merger.xml
new file mode 100644
index 0000000..0d673c0
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/mergeReleaseShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/packageDebugAssets/merger.xml b/nohttp/build/intermediates/incremental/packageDebugAssets/merger.xml
new file mode 100644
index 0000000..3667030
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/packageReleaseAssets/merger.xml b/nohttp/build/intermediates/incremental/packageReleaseAssets/merger.xml
new file mode 100644
index 0000000..5ffcb1e
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/packageReleaseAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/release-mergeJavaRes/merge-state b/nohttp/build/intermediates/incremental/release-mergeJavaRes/merge-state
new file mode 100644
index 0000000..1c983fc
Binary files /dev/null and b/nohttp/build/intermediates/incremental/release-mergeJavaRes/merge-state differ
diff --git a/nohttp/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties b/nohttp/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..f27aed3
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Wed Sep 11 19:14:25 CST 2024
diff --git a/nohttp/build/intermediates/incremental/release/mergeReleaseResources/merger.xml b/nohttp/build/intermediates/incremental/release/mergeReleaseResources/merger.xml
new file mode 100644
index 0000000..734c3fc
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/release/mergeReleaseResources/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties b/nohttp/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
new file mode 100644
index 0000000..63b5714
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sat Sep 21 19:04:19 CST 2024
diff --git a/nohttp/build/intermediates/incremental/release/packageReleaseResources/merger.xml b/nohttp/build/intermediates/incremental/release/packageReleaseResources/merger.xml
new file mode 100644
index 0000000..8a87500
--- /dev/null
+++ b/nohttp/build/intermediates/incremental/release/packageReleaseResources/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary$UploadPoster.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary$UploadPoster.class
new file mode 100644
index 0000000..315645d
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary$UploadPoster.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary.class
new file mode 100644
index 0000000..d787496
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicBinary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicConnection.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicConnection.class
new file mode 100644
index 0000000..54bcfa5
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicConnection.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicRequest.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicRequest.class
new file mode 100644
index 0000000..8db36e8
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BasicRequest.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Binary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Binary.class
new file mode 100644
index 0000000..701bc77
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Binary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BitmapBinary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BitmapBinary.class
new file mode 100644
index 0000000..7928360
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/BitmapBinary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/ByteArrayBinary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/ByteArrayBinary.class
new file mode 100644
index 0000000..ca8c0d0
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/ByteArrayBinary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Connection.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Connection.class
new file mode 100644
index 0000000..b8db014
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Connection.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/FileBinary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/FileBinary.class
new file mode 100644
index 0000000..e010e5f
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/FileBinary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Headers.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Headers.class
new file mode 100644
index 0000000..5d7e605
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Headers.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders$1.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders$1.class
new file mode 100644
index 0000000..0b0556e
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders$1.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders.class
new file mode 100644
index 0000000..0e669ed
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/HttpHeaders.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IBasicRequest.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IBasicRequest.class
new file mode 100644
index 0000000..7e07c18
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IBasicRequest.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IPriority.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IPriority.class
new file mode 100644
index 0000000..726ff5d
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/IPriority.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/InputStreamBinary.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/InputStreamBinary.class
new file mode 100644
index 0000000..aadd17b
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/InputStreamBinary.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Logger.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Logger.class
new file mode 100644
index 0000000..4a4ed2b
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Logger.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp$1.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp$1.class
new file mode 100644
index 0000000..b195ca1
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp$1.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp.class
new file mode 100644
index 0000000..cc74ce4
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/NoHttp.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/OnUploadListener.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/OnUploadListener.class
new file mode 100644
index 0000000..d7602fd
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/OnUploadListener.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/PosterHandler.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/PosterHandler.class
new file mode 100644
index 0000000..db2764c
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/PosterHandler.class differ
diff --git a/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Priority.class b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Priority.class
new file mode 100644
index 0000000..c7e085d
Binary files /dev/null and b/nohttp/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/yolanda/nohttp/Priority.class differ
diff --git a/nohttp/src/main/AndroidManifest.xml b/nohttp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6b3ad56
--- /dev/null
+++ b/nohttp/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/BasicBinary.java b/nohttp/src/main/java/com/yolanda/nohttp/BasicBinary.java
new file mode 100644
index 0000000..3689a8b
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/BasicBinary.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.able.Finishable;
+import com.yolanda.nohttp.able.Startable;
+import com.yolanda.nohttp.tools.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLConnection;
+
+/**
+ *
+ * A basic implementation of Binary.
+ * All the methods are called in Son thread.
+ *
+ * Created in Oct 17, 2015 12:40:54 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public abstract class BasicBinary implements Binary, Startable, Finishable {
+
+ private boolean isStarted = false;
+
+ private boolean isCancel = false;
+
+ private boolean isFinish = false;
+
+ private int what;
+
+ private OnUploadListener mUploadListener;
+
+ private String fileName;
+
+ private String mimeType;
+
+ public BasicBinary(String fileName, String mimeType) {
+ this.fileName = fileName;
+ this.mimeType = mimeType;
+ }
+
+ /**
+ * To monitor file upload progress.
+ *
+ * @param what in {@link OnUploadListener} will return to you.
+ * @param mProgressHandler {@link OnUploadListener}.
+ */
+ public void setUploadListener(int what, OnUploadListener mProgressHandler) {
+ this.what = what;
+ this.mUploadListener = mProgressHandler;
+ }
+
+ @Override
+ public final long getLength() {
+ if (!isCanceled())
+ return getBinaryLength();
+ return 0;
+ }
+
+ public abstract long getBinaryLength();
+
+ protected abstract InputStream getInputStream() throws IOException;
+
+ @Override
+ public void onWriteBinary(OutputStream outputStream) {
+ if (!isCanceled()) {
+ InputStream inputStream = null;
+ try {
+ inputStream = IOUtils.toBufferedInputStream(getInputStream());
+ start();
+ postStart();
+
+ int oldProgress = 0;
+ long totalLength = getLength();
+ int len;
+
+ byte[] buffer = new byte[4096];
+
+ long hasUpCount = 0;
+
+ while (!isCanceled() && (len = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, len);
+ if (totalLength != 0 && mUploadListener != null) {
+ hasUpCount += len;
+ int progress = (int) (hasUpCount * 100 / totalLength);
+ if ((0 == progress % 3 || 0 == progress % 5 || 0 == progress % 7) && oldProgress != progress) {
+ oldProgress = progress;
+ postProgress(oldProgress);
+ }
+ }
+ }
+ } catch (IOException e) {
+ Logger.e(e);
+ postError(e);
+ } finally {
+ IOUtils.closeQuietly(inputStream);
+ postFinish();
+ }
+ }
+ finish();
+ }
+
+ @Override
+ public String getFileName() {
+ if (TextUtils.isEmpty(fileName))
+ fileName = Long.toString(System.currentTimeMillis());
+ return fileName;
+ }
+
+ @Override
+ public String getMimeType() {
+ String fileName = getFileName();
+ if (TextUtils.isEmpty(mimeType) && !TextUtils.isEmpty(fileName))
+ mimeType = URLConnection.guessContentTypeFromName(getFileName());
+ if (TextUtils.isEmpty(mimeType))
+ mimeType = Headers.HEAD_VALUE_ACCEPT_APPLICATION_OCTET_STREAM;
+ return mimeType;
+ }
+
+ /**
+ * Inform the task start.
+ */
+ protected void postStart() {
+ UploadPoster start = new UploadPoster(what, mUploadListener);
+ start.start();
+ PosterHandler.getInstance().post(start);
+ }
+
+ /**
+ * The update task schedule.
+ *
+ * @param progress progress.
+ */
+ protected void postProgress(int progress) {
+ UploadPoster progressPoster = new UploadPoster(what, mUploadListener);
+ progressPoster.progress(progress);
+ PosterHandler.getInstance().post(progressPoster);
+ }
+
+ /**
+ * Inform the task cancel.
+ */
+ protected void postCancel() {
+ UploadPoster cancelPoster = new UploadPoster(what, mUploadListener);
+ cancelPoster.cancel();
+ PosterHandler.getInstance().post(cancelPoster);
+ }
+
+ /**
+ * Error notification tasks.
+ *
+ * @param e exception.
+ */
+ protected void postError(Exception e) {
+ UploadPoster error = new UploadPoster(what, mUploadListener);
+ error.error(e);
+ PosterHandler.getInstance().post(error);
+ }
+
+ /**
+ * Inform the task finish.
+ */
+ protected void postFinish() {
+ UploadPoster finish = new UploadPoster(what, mUploadListener);
+ finish.finish();
+ PosterHandler.getInstance().post(finish);
+ }
+
+ @Override
+ public void start() {
+ isStarted = true;
+ }
+
+ @Override
+ public boolean isStarted() {
+ return isStarted;
+ }
+
+ @Override
+ public void cancel() {
+ if (!isCancel) {
+ this.isCancel = true;
+ postCancel();
+ }
+ }
+
+ @Override
+ public boolean isCanceled() {
+ return isCancel;
+ }
+
+ @Override
+ public void finish() {
+ isFinish = true;
+ }
+
+ @Override
+ public boolean isFinished() {
+ return isFinish;
+ }
+
+ private class UploadPoster implements Runnable {
+
+ private final int what;
+ private final OnUploadListener mOnUploadListener;
+
+ private int command;
+
+ public static final int ON_START = 0;
+ public static final int ON_CANCEL = 1;
+ public static final int ON_PROGRESS = 2;
+ public static final int ON_FINISH = 3;
+ public static final int ON_ERROR = 4;
+
+ private int progress;
+ private Exception exception;
+
+ public UploadPoster(int what, OnUploadListener onUploadListener) {
+ this.what = what;
+ this.mOnUploadListener = onUploadListener;
+ }
+
+ public void start() {
+ this.command = ON_START;
+ }
+
+ public void cancel() {
+ this.command = ON_CANCEL;
+ }
+
+ public void progress(int progress) {
+ this.command = ON_PROGRESS;
+ this.progress = progress;
+ }
+
+ public void finish() {
+ this.command = ON_FINISH;
+ }
+
+ public void error(Exception exception) {
+ this.command = ON_ERROR;
+ this.exception = exception;
+ }
+
+ @Override
+ public void run() {
+ if (mOnUploadListener != null) {
+ if (command == ON_START)
+ mOnUploadListener.onStart(what);
+ else if (command == ON_FINISH)
+ mOnUploadListener.onFinish(what);
+ else if (command == ON_PROGRESS)
+ mOnUploadListener.onProgress(what, progress);
+ else if (command == ON_CANCEL)
+ mOnUploadListener.onCancel(what);
+ else if (command == ON_ERROR)
+ mOnUploadListener.onError(what, exception);
+ }
+ }
+
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/BasicConnection.java b/nohttp/src/main/java/com/yolanda/nohttp/BasicConnection.java
new file mode 100644
index 0000000..85d7701
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/BasicConnection.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.os.Build;
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.error.NetworkError;
+import com.yolanda.nohttp.error.TimeoutError;
+import com.yolanda.nohttp.error.URLError;
+import com.yolanda.nohttp.error.UnKnownHostError;
+import com.yolanda.nohttp.rest.ProtocolResult;
+import com.yolanda.nohttp.rest.Request;
+import com.yolanda.nohttp.rest.StringRequest;
+import com.yolanda.nohttp.tools.AndroidVersion;
+import com.yolanda.nohttp.tools.HeaderUtil;
+import com.yolanda.nohttp.tools.IOUtils;
+import com.yolanda.nohttp.tools.NetUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.Proxy;
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ *
+ * Package good Http implementation class, establish connection, read and write data.
+ *
+ * Created in Aug 4, 2015 10:12:38 AM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class BasicConnection {
+
+ /**
+ * Send the request, send only head, parameters, such as file information.
+ *
+ * @param request {@link IBasicRequest}.
+ * @return {@link ProtocolResult}.
+ */
+ protected Connection getConnection(IBasicRequest request) {
+ Logger.d("--------------Request start--------------");
+
+ Headers responseHeaders = new HttpHeaders();
+ InputStream inputStream = null;
+ Exception exception = null;
+
+ HttpURLConnection urlConnection = null;
+ String url = request.url();
+ try {
+ if (!NetUtil.isNetworkAvailable())
+ throw new NetworkError("The network is not available, please check the network. The requested url is: " + url);
+
+ // MalformedURLException, IOException, ProtocolException, UnknownHostException, SocketTimeoutException
+ urlConnection = createConnectionAndWriteData(request);
+ Logger.d("-------Response start-------");
+ int responseCode = urlConnection.getResponseCode();
+ responseHeaders = parseResponseHeaders(new URI(request.url()), responseCode, urlConnection.getResponseMessage(), urlConnection.getHeaderFields());
+
+ // handle body
+ if (responseCode == 301 || responseCode == 302 || responseCode == 303 || responseCode == 307) {
+ Connection redirectConnection = handleRedirect(request, responseHeaders);
+ responseHeaders = redirectConnection.responseHeaders();
+ inputStream = redirectConnection.serverStream();
+ exception = redirectConnection.exception();
+ } else if (hasResponseBody(request.getRequestMethod(), responseCode)) {
+ inputStream = getServerStream(responseCode, responseHeaders.getContentEncoding(), urlConnection);
+ }
+ Logger.d("-------Response end-------");
+ } catch (MalformedURLException e) {
+ exception = new URLError("The url is malformed: " + url + ".");
+ } catch (UnknownHostException e) {
+ exception = new UnKnownHostError("Hostname can not be resolved: " + url + ".");
+ } catch (SocketTimeoutException e) {
+ exception = new TimeoutError("Request time out: " + url + ".");
+ } catch (Exception e) {
+ exception = e;
+ } finally {
+ if (exception != null)
+ Logger.e(exception);
+ }
+ Logger.d("--------------Request finish--------------");
+ return new Connection(urlConnection, responseHeaders, inputStream, exception);
+ }
+
+ /**
+ * Handle retries, and complete the request network here.
+ *
+ * @param request {@link IBasicRequest}.
+ * @return {@link ProtocolResult}.
+ * @throws Exception {@link #createHttpURLConnection(IBasicRequest)}.
+ */
+ private HttpURLConnection createConnectionAndWriteData(IBasicRequest request) throws Exception {
+ HttpURLConnection connection = null;
+ Exception exception = null;
+ int retryCount = request.getRetryCount() + 1;
+ boolean failed = true;
+ for (; failed && retryCount > 0; retryCount--) {
+ try {
+ connection = createHttpURLConnection(request);
+ exception = null;
+ failed = false;
+ } catch (Exception e) {
+ exception = e;
+ }
+ }
+ if (failed) {
+ throw exception;
+ } else if (request.getRequestMethod().allowRequestBody()) {
+ writeRequestBody(request, connection.getOutputStream());
+ }
+ return connection;
+ }
+
+ /**
+ * The connection is established, including the head and send the request body.
+ *
+ * @param request {@link IBasicRequest}.
+ * @return {@link HttpURLConnection} Have been established and the server connection, and send the complete data, you can directly determine the response code and read the data.
+ * @throws Exception can happen when the connection is established and send data.
+ */
+ private HttpURLConnection createHttpURLConnection(IBasicRequest request) throws Exception {
+ // 1.Pre operation notice
+ request.onPreExecute();
+
+ // 2.Build URL
+ String urlStr = request.url();
+ Logger.i("Request address: " + urlStr);
+ URL url = new URL(urlStr);
+ HttpURLConnection connection;
+ Proxy proxy = request.getProxy();
+ if (proxy == null)
+ connection = (HttpURLConnection) url.openConnection();
+ else
+ connection = (HttpURLConnection) url.openConnection(proxy);
+
+ connection.setConnectTimeout(request.getConnectTimeout());
+ connection.setReadTimeout(request.getReadTimeout());
+ connection.setInstanceFollowRedirects(false);
+
+ if (connection instanceof HttpsURLConnection) {
+ SSLSocketFactory sslSocketFactory = request.getSSLSocketFactory();
+ if (sslSocketFactory != null)
+ ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory);
+ HostnameVerifier hostnameVerifier = request.getHostnameVerifier();
+ if (hostnameVerifier != null)
+ ((HttpsURLConnection) connection).setHostnameVerifier(hostnameVerifier);
+ }
+
+ // 3. Base attribute
+ RequestMethod requestMethod = request.getRequestMethod();
+ String requestMethodStr = requestMethod.toString();
+ Logger.i("Request method: " + requestMethodStr);
+ // Fix delete patch error.
+ try {
+ connection.setRequestMethod(requestMethodStr);
+ } catch (ProtocolException protocol) {
+ try {
+ Field methodField = connection.getClass().getDeclaredField("method");
+ methodField.setAccessible(true);
+ methodField.set(connection, requestMethodStr);
+ } catch (Exception noSuchFieldIllegalAccess) {
+ throw protocol;
+ }
+ }
+
+ connection.setDoInput(true);
+ connection.setDoOutput(requestMethod.allowRequestBody());
+
+ // 4.Set request headers
+ setHeaders(url.toURI(), connection, request);
+
+ // 5. Connect
+ connection.connect();
+ return connection;
+ }
+
+ /**
+ * Set request headers, here will add cookies.
+ *
+ * @param uri uri.
+ * @param connection {@link HttpURLConnection}.
+ * @param request {@link IBasicRequest}.
+ */
+ private void setHeaders(URI uri, HttpURLConnection connection, IBasicRequest request) {
+ Headers headers = request.headers();
+ headers.set(Headers.HEAD_KEY_CONTENT_TYPE, request.getContentType());
+
+ // To fix bug: accidental EOFException before API 19
+ List values = headers.getValues(Headers.HEAD_KEY_CONNECTION);
+ if (values == null || values.size() == 0) {
+ headers.set(Headers.HEAD_KEY_CONNECTION, Build.VERSION.SDK_INT > AndroidVersion.KITKAT ? Headers.HEAD_VALUE_CONNECTION_KEEP_ALIVE : Headers.HEAD_VALUE_CONNECTION_CLOSE);
+ }
+
+ // Content-Length.
+ RequestMethod requestMethod = request.getRequestMethod();
+ if (requestMethod.allowRequestBody()) {
+ long contentLength = request.getContentLength();
+ if (contentLength < Integer.MAX_VALUE)
+ connection.setFixedLengthStreamingMode((int) contentLength);
+ else if (Build.VERSION.SDK_INT >= AndroidVersion.KITKAT)
+ try {
+ Class> connectionClass = connection.getClass();
+ Method setFixedLengthStreamingModeMethod = connectionClass.getMethod("setFixedLengthStreamingMode", long.class);
+ setFixedLengthStreamingModeMethod.invoke(connection, contentLength);
+ } catch (Throwable e) {
+ Logger.w(e);
+ connection.setChunkedStreamingMode(256 * 1024);
+ }
+ else
+ connection.setChunkedStreamingMode(256 * 1024);
+ headers.set(Headers.HEAD_KEY_CONTENT_LENGTH, Long.toString(contentLength));
+ }
+
+ // Cookie.
+ if (NoHttp.isEnableCookie() && uri != null)
+ headers.addCookie(uri, NoHttp.getDefaultCookieManager());
+
+ Map requestHeaders = headers.toRequestHeaders();
+
+ // Adds all request header to httpConnection.
+ for (Map.Entry headerEntry : requestHeaders.entrySet()) {
+ String headKey = headerEntry.getKey();
+ String headValue = headerEntry.getValue();
+ Logger.i(headKey + ": " + headValue);
+ connection.setRequestProperty(headKey, headValue);
+ }
+ }
+
+ /**
+ * Write request params.
+ *
+ * @param request {@link IBasicRequest}.
+ * @param outputStream {@link OutputStream}.
+ * @throws IOException io exception.
+ */
+ private void writeRequestBody(IBasicRequest request, OutputStream outputStream) throws IOException {
+ // 6. Write request body
+ Logger.i("-------Send request data start-------");
+ OutputStream realOutputStream = IOUtils.toBufferedOutputStream(outputStream);
+ request.onWriteRequestBody(realOutputStream);
+ IOUtils.closeQuietly(realOutputStream);
+ Logger.i("-------Send request data end-------");
+ }
+
+ /**
+ * The redirection process any response.
+ *
+ * @param oldRequest need to redirect the {@link Request}.
+ * @param responseHeaders need to redirect the request of the responding head.
+ * @return {@link ProtocolResult}.
+ */
+ private Connection handleRedirect(IBasicRequest oldRequest, Headers responseHeaders) {
+ // redirect request
+ IBasicRequest redirectRequest = null;
+ RedirectHandler redirectHandler = oldRequest.getRedirectHandler();
+ if (redirectHandler != null) {
+ if (redirectHandler.isDisallowedRedirect(responseHeaders))
+ return new Connection(null, responseHeaders, null, null);
+ else
+ redirectRequest = redirectHandler.onRedirect(responseHeaders);
+ }
+ if (redirectRequest == null) {
+ redirectRequest = new StringRequest(responseHeaders.getLocation(), oldRequest.getRequestMethod());
+ redirectRequest.setSSLSocketFactory(oldRequest.getSSLSocketFactory());
+ redirectRequest.setProxy(oldRequest.getProxy());
+ }
+ return getConnection(redirectRequest);
+ }
+
+ /**
+ * Get input stream from connection.
+ *
+ * @param responseCode response code of connection.
+ * @param contentEncoding {@value Headers#HEAD_KEY_CONTENT_ENCODING} value of the HTTP response headers.
+ * @param urlConnection connection.
+ * @return when the normal return the correct input stream, returns the error when the response code is more than 400 input stream.
+ * @throws IOException if no InputStream could be created.
+ */
+ protected InputStream getServerStream(int responseCode, String contentEncoding, HttpURLConnection urlConnection) throws IOException {
+ if (responseCode >= 400)
+ return getErrorStream(contentEncoding, urlConnection);
+ else {
+ return getInputStream(contentEncoding, urlConnection);
+ }
+ }
+
+ /**
+ * Get the input stream, and automatically extract.
+ *
+ * @param contentEncoding {@value Headers#HEAD_KEY_CONTENT_ENCODING} value of the HTTP response headers.
+ * @param urlConnection {@link HttpURLConnection}.
+ * @return http input stream.
+ * @throws IOException Unpack the stream may be thrown, or if no input stream could be created.
+ */
+ protected InputStream getInputStream(String contentEncoding, HttpURLConnection urlConnection) throws IOException {
+ InputStream inputStream = urlConnection.getInputStream();
+ return gzipInputStream(contentEncoding, inputStream);
+ }
+
+ /**
+ * Get the wrong input stream, and automatically extract.
+ *
+ * @param contentEncoding {@value Headers#HEAD_KEY_CONTENT_ENCODING} value of the HTTP response headers.
+ * @param urlConnection {@link HttpURLConnection}.
+ * @return http error stream.
+ * @throws IOException Unpack the stream may be thrown.
+ */
+ protected InputStream getErrorStream(String contentEncoding, HttpURLConnection urlConnection) throws IOException {
+ InputStream inputStream = urlConnection.getErrorStream();
+ return gzipInputStream(contentEncoding, inputStream);
+ }
+
+ /**
+ * Pressure http input stream.
+ *
+ * @param contentEncoding {@value Headers#HEAD_KEY_CONTENT_ENCODING} value of the HTTP response headers.
+ * @param inputStream {@link InputStream}.
+ * @return It can directly read normal data flow
+ * @throws IOException if an {@code IOException} occurs.
+ */
+ protected InputStream gzipInputStream(String contentEncoding, InputStream inputStream) throws IOException {
+ if (HeaderUtil.isGzipContent(contentEncoding)) {
+ inputStream = new GZIPInputStream(inputStream);
+ }
+ return inputStream;
+ }
+
+ /**
+ * Parse server response headers, here will save cookies.
+ *
+ * @param uri according to the requested URL generated uris.
+ * @param responseCode responseCode.
+ * @param responseMessage responseMessage.
+ * @param responseHeaders responseHeaders of server.
+ * @return response headers of server.
+ */
+ protected Headers parseResponseHeaders(URI uri, int responseCode, String responseMessage, Map> responseHeaders) {
+ // handle cookie
+ if (NoHttp.isEnableCookie())
+ try {
+ NoHttp.getDefaultCookieManager().put(uri, responseHeaders);
+ } catch (IOException e) {
+ Logger.e(e, "Save cookie filed: " + uri.toString() + ".");
+ }
+
+ // handle headers
+ Headers headers = new HttpHeaders();
+ headers.set(responseHeaders);
+ headers.set(Headers.HEAD_KEY_RESPONSE_MESSAGE, responseMessage);
+ headers.set(Headers.HEAD_KEY_RESPONSE_CODE, Integer.toString(responseCode));
+ // print
+ for (String headKey : headers.keySet()) {
+ List headValues = headers.getValues(headKey);
+ for (String headValue : headValues) {
+ StringBuilder builder = new StringBuilder();
+ if (!TextUtils.isEmpty(headKey))
+ builder.append(headKey).append(": ");
+ if (!TextUtils.isEmpty(headValue))
+ builder.append(headValue);
+ Logger.i(builder.toString());
+ }
+ }
+ return headers;
+ }
+
+ ////////// Read response body //////////
+
+ /**
+ * This requestMethod and responseCode has responseBody ?
+ *
+ * @param requestMethod it's come from {@link RequestMethod}.
+ * @param responseCode responseCode from server.
+ * @return true: there is data, false: no data.
+ */
+ public static boolean hasResponseBody(RequestMethod requestMethod, int responseCode) {
+ return requestMethod != RequestMethod.HEAD && hasResponseBody(responseCode);
+ }
+
+ /**
+ * According to the response code to judge whether there is data.
+ *
+ * @param responseCode responseCode.
+ * @return true: there is data, false: no data.
+ */
+ public static boolean hasResponseBody(int responseCode) {
+ return !(100 <= responseCode && responseCode < 200) && responseCode != 204 && responseCode != 205 && !(300 <= responseCode && responseCode < 400);
+ }
+
+ /**
+ * This requestMethod and responseCode has responseBody ?
+ *
+ * @param requestMethod it's come from {@link RequestMethod}.
+ * @param responseCode responseCode from server.
+ * @return true: there is data, false: no data.
+ */
+ public static boolean hasDownload(RequestMethod requestMethod, int responseCode) {
+ return requestMethod != RequestMethod.HEAD && hasDownload(responseCode);
+ }
+
+ /**
+ * According to the response code to judge whether there is download data.
+ *
+ * @param responseCode responseCode.
+ * @return true: there is data, false: no data.
+ */
+ public static boolean hasDownload(int responseCode) {
+ return 200 <= responseCode && responseCode < 300 && responseCode != 204 && responseCode != 205;
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/BasicRequest.java b/nohttp/src/main/java/com/yolanda/nohttp/BasicRequest.java
new file mode 100644
index 0000000..b80c759
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/BasicRequest.java
@@ -0,0 +1,839 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.tools.CounterOutputStream;
+import com.yolanda.nohttp.tools.HeaderUtil;
+import com.yolanda.nohttp.tools.IOUtils;
+import com.yolanda.nohttp.tools.LinkedMultiValueMap;
+import com.yolanda.nohttp.tools.MultiValueMap;
+
+import org.json.JSONObject;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpCookie;
+import java.net.Proxy;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ *
+ * Implement all the methods of the base class {@link IBasicRequest}.
+ *
+ * Created in Nov 4, 2015 8:28:50 AM.
+ *
+ * @author Yan Zhenjie.
+ */
+public abstract class BasicRequest implements IBasicRequest {
+
+ private final String boundary = createBoundary();
+ private final String startBoundary = "--" + boundary;
+ private final String endBoundary = startBoundary + "--";
+
+ /**
+ * Request priority.
+ */
+ private Priority mPriority = Priority.DEFAULT;
+ /**
+ * The sequence.
+ */
+ private int sequence;
+ /**
+ * Target address.
+ */
+ private String url;
+ /**
+ * Request method.
+ */
+ private RequestMethod mRequestMethod;
+ /**
+ * MultipartFormEnable.
+ */
+ private boolean isMultipartFormEnable = false;
+ /**
+ * Proxy server.
+ */
+ private Proxy mProxy;
+ /**
+ * SSLSockets.
+ */
+ private SSLSocketFactory mSSLSocketFactory = null;
+ /**
+ * HostnameVerifier.
+ */
+ private HostnameVerifier mHostnameVerifier = null;
+ /**
+ * Connect timeout of request.
+ */
+ private int mConnectTimeout = NoHttp.getDefaultConnectTimeout();
+ /**
+ * Read data timeout.
+ */
+ private int mReadTimeout = NoHttp.getDefaultReadTimeout();
+ /**
+ * Request heads.
+ */
+ private Headers mHeaders;
+ /**
+ * After the failure of retries.
+ */
+ private int mRetryCount;
+ /**
+ * The params encoding.
+ */
+ private String mParamEncoding;
+ /**
+ * Param collection.
+ */
+ private MultiValueMap mParamKeyValues;
+ /**
+ * RequestBody.
+ */
+ private InputStream mRequestBody;
+ /**
+ * Redirect handler.
+ */
+ private RedirectHandler mRedirectHandler;
+ /**
+ * Request queue
+ */
+ private BlockingQueue> blockingQueue;
+ /**
+ * The record has started.
+ */
+ private boolean isStart = false;
+ /**
+ * The request is completed.
+ */
+ private boolean isFinished = false;
+ /**
+ * Has been canceled.
+ */
+ private boolean isCanceled = false;
+ /**
+ * Cancel sign.
+ */
+ private Object mCancelSign;
+ /**
+ * Tag of request.
+ */
+ private Object mTag;
+
+ /**
+ * Create a request, RequestMethod is {@link RequestMethod#GET}.
+ *
+ * @param url request address, like: http://www.yanzhenjie.com.
+ */
+ public BasicRequest(String url) {
+ this(url, RequestMethod.GET);
+ }
+
+ /**
+ * Create a request.
+ *
+ * @param url request adress, like: http://www.yanzhenjie.com.
+ * @param requestMethod request method, like {@link RequestMethod#GET}, {@link RequestMethod#POST}.
+ */
+ public BasicRequest(String url, RequestMethod requestMethod) {
+ this.url = url;
+ mRequestMethod = requestMethod;
+
+ mHeaders = new HttpHeaders();
+ mHeaders.set(Headers.HEAD_KEY_ACCEPT, Headers.HEAD_VALUE_ACCEPT_ALL);
+ mHeaders.set(Headers.HEAD_KEY_ACCEPT_ENCODING, Headers.HEAD_VALUE_ACCEPT_ENCODING_GZIP_DEFLATE);
+ mHeaders.set(Headers.HEAD_KEY_ACCEPT_LANGUAGE, HeaderUtil.systemAcceptLanguage());
+ mHeaders.set(Headers.HEAD_KEY_USER_AGENT, UserAgent.instance());
+
+ mParamKeyValues = new LinkedMultiValueMap();
+ }
+
+ @Override
+ public void setPriority(Priority priority) {
+ this.mPriority = priority;
+ }
+
+ @Override
+ public Priority getPriority() {
+ return mPriority;
+ }
+
+ @Override
+ public void setSequence(int sequence) {
+ this.sequence = sequence;
+ }
+
+ @Override
+ public int getSequence() {
+ return this.sequence;
+ }
+
+ @Override
+ public final int compareTo(IBasicRequest another) {
+ final Priority me = getPriority();
+ final Priority it = another.getPriority();
+ return me == it ? getSequence() - another.getSequence() : it.ordinal() - me.ordinal();
+ }
+
+ @Override
+ public String url() {
+ StringBuilder urlBuilder = new StringBuilder(url);
+ if (!getRequestMethod().allowRequestBody() && mParamKeyValues.size() > 0) {
+ StringBuffer paramBuffer = buildCommonParams(getParamKeyValues(), getParamsEncoding());
+ if (url.contains("?") && url.contains("=") && paramBuffer.length() > 0)
+ urlBuilder.append("&");
+ else if (paramBuffer.length() > 0 && !url.endsWith("?")) // end with '?', not append '?'.
+ urlBuilder.append("?");
+ urlBuilder.append(paramBuffer);
+ }
+ return urlBuilder.toString();
+ }
+
+ @Override
+ public RequestMethod getRequestMethod() {
+ return mRequestMethod;
+ }
+
+ @Override
+ public void setMultipartFormEnable(boolean enable) {
+ if (enable && !getRequestMethod().allowRequestBody())
+ throw new IllegalArgumentException("MultipartFormEnable is request method is the premise of the POST/PUT/PATCH/DELETE, but the Android system under API level 19 does not support the DELETE.");
+ isMultipartFormEnable = enable;
+ }
+
+ @Override
+ public boolean isMultipartFormEnable() {
+ if (isMultipartFormEnable) {
+ return true;
+ } else {
+ Set keys = mParamKeyValues.keySet();
+ for (String key : keys) {
+ List values = mParamKeyValues.getValues(key);
+ for (Object value : values) {
+ if (value instanceof Binary)
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void setProxy(Proxy proxy) {
+ this.mProxy = proxy;
+ }
+
+ @Override
+ public Proxy getProxy() {
+ return mProxy;
+ }
+
+ @Override
+ public void setSSLSocketFactory(SSLSocketFactory socketFactory) {
+ mSSLSocketFactory = socketFactory;
+ }
+
+ @Override
+ public SSLSocketFactory getSSLSocketFactory() {
+ return mSSLSocketFactory;
+ }
+
+ @Override
+ public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
+ mHostnameVerifier = hostnameVerifier;
+ }
+
+ @Override
+ public HostnameVerifier getHostnameVerifier() {
+ return mHostnameVerifier;
+ }
+
+ @Override
+ public void setConnectTimeout(int connectTimeout) {
+ mConnectTimeout = connectTimeout;
+ }
+
+ @Override
+ public int getConnectTimeout() {
+ return mConnectTimeout;
+ }
+
+ @Override
+ public void setReadTimeout(int readTimeout) {
+ mReadTimeout = readTimeout;
+ }
+
+ @Override
+ public int getReadTimeout() {
+ return mReadTimeout;
+ }
+
+ @Override
+ public void addHeader(String key, String value) {
+ mHeaders.add(key, value);
+ }
+
+ @Override
+ public void setHeader(String key, String value) {
+ mHeaders.set(key, value);
+ }
+
+ @Override
+ public void addHeader(HttpCookie cookie) {
+ if (cookie != null)
+ mHeaders.add(Headers.HEAD_KEY_COOKIE, cookie.getName() + "=" + cookie.getValue());
+ }
+
+ @Override
+ public void removeHeader(String key) {
+ mHeaders.remove(key);
+ }
+
+ @Override
+ public void removeAllHeader() {
+ mHeaders.clear();
+ }
+
+ @Override
+ public Headers headers() {
+ return mHeaders;
+ }
+
+ @Override
+ public void setAccept(String accept) {
+ mHeaders.set(Headers.HEAD_KEY_ACCEPT, accept);
+ }
+
+ @Override
+ public void setAcceptLanguage(String acceptLanguage) {
+ mHeaders.set(Headers.HEAD_KEY_ACCEPT_LANGUAGE, acceptLanguage);
+ }
+
+ @Override
+ public long getContentLength() {
+ CounterOutputStream outputStream = new CounterOutputStream();
+ try {
+ onWriteRequestBody(outputStream);
+ } catch (IOException e) {
+ Logger.e(e);
+ }
+ return outputStream.get();
+ }
+
+ @Override
+ public void setContentType(String contentType) {
+ mHeaders.set(Headers.HEAD_KEY_CONTENT_TYPE, contentType);
+ }
+
+ @Override
+ public String getContentType() {
+ String contentType = mHeaders.getValue(Headers.HEAD_KEY_CONTENT_TYPE, 0);
+ if (!TextUtils.isEmpty(contentType))
+ return contentType;
+ if (getRequestMethod().allowRequestBody() && isMultipartFormEnable())
+ return Headers.HEAD_VALUE_ACCEPT_MULTIPART_FORM_DATA + "; boundary=" + boundary;
+ else
+ return Headers.HEAD_VALUE_ACCEPT_APPLICATION_X_WWW_FORM_URLENCODED + "; charset=" + getParamsEncoding();
+ }
+
+ @Override
+ public void setUserAgent(String userAgent) {
+ mHeaders.set(Headers.HEAD_KEY_USER_AGENT, userAgent);
+ }
+
+ @Override
+ public void setRetryCount(int count) {
+ this.mRetryCount = count;
+ }
+
+ @Override
+ public int getRetryCount() {
+ return mRetryCount;
+ }
+
+ @Override
+ public void setParamsEncoding(String encoding) {
+ this.mParamEncoding = encoding;
+ }
+
+ @Override
+ public String getParamsEncoding() {
+ if (TextUtils.isEmpty(mParamEncoding))
+ mParamEncoding = NoHttp.CHARSET_UTF8;
+ return mParamEncoding;
+ }
+
+ @Override
+ public void add(String key, int value) {
+ add(key, Integer.toString(value));
+ }
+
+ @Override
+ public void add(String key, long value) {
+ add(key, Long.toString(value));
+ }
+
+ @Override
+ public void add(String key, boolean value) {
+ add(key, String.valueOf(value));
+ }
+
+ @Override
+ public void add(String key, char value) {
+ add(key, String.valueOf(value));
+ }
+
+ @Override
+ public void add(String key, double value) {
+ add(key, Double.toString(value));
+ }
+
+ @Override
+ public void add(String key, float value) {
+ add(key, Float.toString(value));
+ }
+
+ @Override
+ public void add(String key, short value) {
+ add(key, Integer.toString(value));
+ }
+
+ @Override
+ public void add(String key, byte value) {
+ add(key, Integer.toString(value));
+ }
+
+ @Override
+ public void add(String key, String value) {
+ if (value != null) {
+ mParamKeyValues.set(key, value);
+ }
+ }
+
+ @Override
+ public void set(String key, String value) {
+ if (value != null)
+ mParamKeyValues.set(key, value);
+ }
+
+ @Override
+ public void add(String key, Binary binary) {
+ mParamKeyValues.add(key, binary);
+ }
+
+ @Override
+ public void set(String key, Binary binary) {
+ mParamKeyValues.set(key, binary);
+ }
+
+ @Override
+ public void add(String key, File file) {
+ add(key, new FileBinary(file));
+ }
+
+ @Override
+ public void set(String key, File file) {
+ set(key, new FileBinary(file));
+ }
+
+ @Override
+ public void add(String key, List binaries) {
+ if (binaries != null) {
+ for (Binary binary : binaries)
+ mParamKeyValues.add(key, binary);
+ }
+ }
+
+ @Override
+ public void set(String key, List binaries) {
+ mParamKeyValues.remove(key);
+ add(key, binaries);
+ }
+
+ @Override
+ public void add(Map params) {
+ if (params != null) {
+ for (Map.Entry stringEntry : params.entrySet())
+ add(stringEntry.getKey(), stringEntry.getValue());
+ }
+ }
+
+ @Override
+ public void set(Map params) {
+ if (params != null) {
+ for (Map.Entry stringEntry : params.entrySet())
+ set(stringEntry.getKey(), stringEntry.getValue());
+ }
+ }
+
+ @Override
+ public List remove(String key) {
+ return mParamKeyValues.remove(key);
+ }
+
+ @Override
+ public void removeAll() {
+ mParamKeyValues.clear();
+ }
+
+ @Override
+ public MultiValueMap getParamKeyValues() {
+ return mParamKeyValues;
+ }
+
+ @Override
+ public void setDefineRequestBody(InputStream requestBody, String contentType) {
+ if (requestBody == null || contentType == null)
+ throw new IllegalArgumentException("The requestBody and contentType must be can't be null");
+ if (requestBody instanceof ByteArrayInputStream || requestBody instanceof FileInputStream) {
+ this.mRequestBody = requestBody;
+ mHeaders.set(Headers.HEAD_KEY_CONTENT_TYPE, contentType);
+ } else {
+ throw new IllegalArgumentException("Can only accept ByteArrayInputStream and FileInputStream type of stream");
+ }
+ }
+
+ @Override
+ public void setDefineRequestBody(String requestBody, String contentType) {
+ if (!TextUtils.isEmpty(requestBody)) {
+ try {
+ mRequestBody = IOUtils.toInputStream(requestBody, getParamsEncoding());
+ if (!TextUtils.isEmpty(contentType))
+ mHeaders.set(Headers.HEAD_KEY_CONTENT_TYPE, contentType + "; charset=" + getParamsEncoding());
+ } catch (UnsupportedEncodingException e) {
+ setDefineRequestBody(IOUtils.toInputStream(requestBody), contentType);
+ }
+ }
+ }
+
+ @Override
+ public void setDefineRequestBodyForJson(String jsonBody) {
+ if (!TextUtils.isEmpty(jsonBody))
+ setDefineRequestBody(jsonBody, Headers.HEAD_VALUE_ACCEPT_APPLICATION_JSON);
+ }
+
+ @Override
+ public void setDefineRequestBodyForJson(JSONObject jsonBody) {
+ if (jsonBody != null)
+ setDefineRequestBody(jsonBody.toString(), Headers.HEAD_VALUE_ACCEPT_APPLICATION_JSON);
+ }
+
+ @Override
+ public void setDefineRequestBodyForXML(String xmlBody) {
+ if (!TextUtils.isEmpty(xmlBody))
+ setDefineRequestBody(xmlBody, Headers.HEAD_VALUE_ACCEPT_APPLICATION_XML);
+ }
+
+ /**
+ * Is there a custom request inclusions.
+ *
+ * @return Returns true representatives have, return false on behalf of the no.
+ */
+ protected boolean hasDefineRequestBody() {
+ return mRequestBody != null;
+ }
+
+ /**
+ * To get custom inclusions.
+ *
+ * @return {@link InputStream}.
+ */
+ protected InputStream getDefineRequestBody() {
+ return mRequestBody;
+ }
+
+ @Override
+ public void onPreExecute() {
+ }
+
+ @Override
+ public void onWriteRequestBody(OutputStream writer) throws IOException {
+ if (mRequestBody != null) {
+ writeRequestBody(writer);
+ } else if (isMultipartFormEnable()) {
+ writeFormStreamData(writer);
+ } else {
+ writeCommonStreamData(writer);
+ }
+ }
+
+ /**
+ * Send form data.
+ *
+ * @param writer {@link OutputStream}.
+ * @throws IOException write error.
+ */
+ protected void writeFormStreamData(OutputStream writer) throws IOException {
+ Set keys = mParamKeyValues.keySet();
+ for (String key : keys) {
+ List values = mParamKeyValues.getValues(key);
+ for (Object value : values) {
+ if (!isCanceled()) {
+ if (value != null && value instanceof String) {
+ if (!(writer instanceof CounterOutputStream))
+ Logger.i(key + "=" + value);
+ writeFormString(writer, key, value.toString());
+ } else if (value != null && value instanceof Binary) {
+ if (!(writer instanceof CounterOutputStream))
+ Logger.i(key + " is Binary");
+ writeFormBinary(writer, key, (Binary) value);
+ }
+ writer.write("\r\n".getBytes());
+ }
+ }
+ }
+ writer.write((endBoundary).getBytes());
+ }
+
+ /**
+ * Send text data in a form.
+ *
+ * @param writer {@link OutputStream}
+ * @param key equivalent to form the name of the input label, {@code "Content-Disposition: form-data; name=key"}.
+ * @param value equivalent to form the value of the input label.
+ * @throws IOException Write the data may be abnormal.
+ */
+ private void writeFormString(OutputStream writer, String key, String value) throws IOException {
+ StringBuilder stringFieldBuilder = new StringBuilder(startBoundary).append("\r\n");
+
+ stringFieldBuilder.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n");
+ stringFieldBuilder.append("Content-Type: text/plain; charset=").append(getParamsEncoding()).append("\r\n\r\n");
+
+ writer.write(stringFieldBuilder.toString().getBytes(getParamsEncoding()));
+
+ writer.write(value.getBytes(getParamsEncoding()));
+ }
+
+ /**
+ * Send binary data in a form.
+ */
+ private void writeFormBinary(OutputStream writer, String key, Binary value) throws IOException {
+ if (!value.isCanceled()) {
+ StringBuilder binaryFieldBuilder = new StringBuilder(startBoundary).append("\r\n");
+
+ binaryFieldBuilder.append("Content-Disposition: form-data; name=\"").append(key).append("\"");
+ binaryFieldBuilder.append("; filename=\"").append(value.getFileName()).append("\"\r\n");
+
+ binaryFieldBuilder.append("Content-Type: ").append(value.getMimeType()).append("\r\n");
+ binaryFieldBuilder.append("Content-Transfer-Encoding: binary\r\n\r\n");
+
+ writer.write(binaryFieldBuilder.toString().getBytes());
+
+ if (writer instanceof CounterOutputStream) {
+ ((CounterOutputStream) writer).write(value.getLength());
+ } else {
+ value.onWriteBinary(writer);
+ }
+ }
+ }
+
+ /**
+ * Send non form data.
+ *
+ * @param writer {@link OutputStream}.
+ * @throws IOException write error.
+ */
+ protected void writeCommonStreamData(OutputStream writer) throws IOException {
+ String requestBody = buildCommonParams(getParamKeyValues(), getParamsEncoding()).toString();
+ if (!(writer instanceof CounterOutputStream))
+ Logger.i("Push RequestBody: " + requestBody);
+ writer.write(requestBody.getBytes());
+ }
+
+ /**
+ * Send request requestBody.
+ *
+ * @param writer {@link OutputStream}.
+ * @throws IOException write error.
+ */
+ protected void writeRequestBody(OutputStream writer) throws IOException {
+ if (mRequestBody != null) {
+ if (writer instanceof CounterOutputStream) {
+ writer.write(mRequestBody.available());
+ } else {
+ IOUtils.write(mRequestBody, writer);
+ IOUtils.closeQuietly(mRequestBody);
+ mRequestBody = null;
+ }
+ }
+ }
+
+ @Override
+ public void setRedirectHandler(RedirectHandler redirectHandler) {
+ mRedirectHandler = redirectHandler;
+ }
+
+ @Override
+ public RedirectHandler getRedirectHandler() {
+ return mRedirectHandler;
+ }
+
+ @Override
+ public void setTag(Object tag) {
+ this.mTag = tag;
+ }
+
+ @Override
+ public Object getTag() {
+ return this.mTag;
+ }
+
+ @Override
+ public void setQueue(BlockingQueue> queue) {
+ blockingQueue = queue;
+ }
+
+ @Override
+ public boolean inQueue() {
+ return blockingQueue != null && blockingQueue.contains(this);
+ }
+
+ @Override
+ public void start() {
+ this.isStart = true;
+ }
+
+ @Override
+ public boolean isStarted() {
+ return isStart;
+ }
+
+ @Override
+ public void finish() {
+ this.isFinished = true;
+ }
+
+ @Override
+ public boolean isFinished() {
+ return isFinished;
+ }
+
+ @Override
+ public void cancel() {
+ if (!isCanceled) {
+ isCanceled = true;
+ if (mRequestBody != null)
+ IOUtils.closeQuietly(mRequestBody);
+
+ if (blockingQueue != null)
+ blockingQueue.remove(this);
+
+ // cancel file upload
+ Set keys = mParamKeyValues.keySet();
+ for (String key : keys) {
+ List values = mParamKeyValues.getValues(key);
+ for (Object value : values)
+ if (value != null && value instanceof Binary)
+ ((Binary) value).cancel();
+ }
+ }
+ }
+
+ @Override
+ public boolean isCanceled() {
+ return isCanceled;
+ }
+
+ public void setCancelSign(Object sign) {
+ this.mCancelSign = sign;
+ }
+
+ @Override
+ public void cancelBySign(Object sign) {
+ if (mCancelSign == sign)
+ cancel();
+ }
+
+ ////////// static module /////////
+
+ /**
+ * Split joint non form data.
+ *
+ * @param paramMap param map.
+ * @param encodeCharset charset.
+ * @return string parameter combination, each key value on nails with {@code "&"} space.
+ */
+ public static StringBuffer buildCommonParams(MultiValueMap paramMap, String encodeCharset) {
+ StringBuffer paramBuffer = new StringBuffer();
+ Set keySet = paramMap.keySet();
+ for (String key : keySet) {
+ List values = paramMap.getValues(key);
+ for (Object value : values) {
+ if (value != null && value instanceof CharSequence) {
+ paramBuffer.append("&");
+ try {
+ paramBuffer.append(URLEncoder.encode(key, encodeCharset));
+ paramBuffer.append("=");
+ paramBuffer.append(URLEncoder.encode(value.toString(), encodeCharset));
+ } catch (UnsupportedEncodingException e) {
+ Logger.e("Encoding " + encodeCharset + " format is not supported by the system");
+ paramBuffer.append(key);
+ paramBuffer.append("=");
+ paramBuffer.append(value.toString());
+ }
+ }
+ }
+ }
+ if (paramBuffer.length() > 0)
+ paramBuffer.deleteCharAt(0);
+ return paramBuffer;
+ }
+
+ /**
+ * Create acceptLanguage.
+ *
+ * @return Returns the client can accept the language types. Such as:zh-CN,zh.
+ * @deprecated use {@link HeaderUtil#systemAcceptLanguage()} instead.
+ */
+ @Deprecated
+ public static String defaultAcceptLanguage() {
+ return HeaderUtil.systemAcceptLanguage();
+ }
+
+ /**
+ * Randomly generated boundary mark.
+ *
+ * @return Random code.
+ */
+ public static String createBoundary() {
+ StringBuffer sb = new StringBuffer("----NoHttpFormBoundary");
+ for (int t = 1; t < 12; t++) {
+ long time = System.currentTimeMillis() + t;
+ if (time % 3L == 0L) {
+ sb.append((char) (int) time % '\t');
+ } else if (time % 3L == 1L) {
+ sb.append((char) (int) (65L + time % 26L));
+ } else {
+ sb.append((char) (int) (97L + time % 26L));
+ }
+ }
+ return sb.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/Binary.java b/nohttp/src/main/java/com/yolanda/nohttp/Binary.java
new file mode 100644
index 0000000..55f8a65
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/Binary.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import com.yolanda.nohttp.able.Cancelable;
+
+import java.io.OutputStream;
+
+/**
+ * File interface.
+ * All the methods are called in Son thread.
+ * Created in Oct 12, 2015 4:44:07 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface Binary extends Cancelable {
+
+ /**
+ * Returns the size of the Binary, if size is 0, the Binary Field will not be sent. The rest of the {@link Binary} method will not be invoked.
+ *
+ * @return Long length.
+ */
+ long getLength();
+
+ /**
+ * Write your Binary data through flow out.
+ *
+ * @param outputStream {@link OutputStream}.
+ */
+ void onWriteBinary(OutputStream outputStream);
+
+ /**
+ * Return the fileName, Can be null.
+ *
+ * @return File name.
+ */
+ String getFileName();
+
+ /**
+ * Return mimeType of binary.
+ *
+ * @return MimeType.
+ */
+ String getMimeType();
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/BitmapBinary.java b/nohttp/src/main/java/com/yolanda/nohttp/BitmapBinary.java
new file mode 100644
index 0000000..0d14254
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/BitmapBinary.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+
+import com.yolanda.nohttp.tools.IOUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ *
+ * A default implementation of Binary.
+ * All the methods are called in Son thread.
+ *
+ * Created in Oct 17, 2015 12:40:54 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class BitmapBinary extends BasicBinary {
+
+ private InputStream inputStream;
+
+ /**
+ * An input stream {@link Binary}.
+ *
+ * @param bitmap image.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ */
+ public BitmapBinary(Bitmap bitmap, String fileName) {
+ this(bitmap, fileName, null);
+ }
+
+ /**
+ * An input stream {@link Binary}.
+ *
+ * @param bitmap image.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ * @param mimeType such as: image/png.
+ */
+ public BitmapBinary(Bitmap bitmap, String fileName, String mimeType) {
+ super(fileName, mimeType);
+
+ if (bitmap != null && !bitmap.isRecycled()) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
+ bitmap.recycle();
+ IOUtils.closeQuietly(outputStream);
+ inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+ } else {
+ Log.e("Binary", "Binary was cancelled, because the Bitmap is null or bitmap is recycled.");
+ super.cancel();
+ }
+ }
+
+ @Override
+ public void cancel() {
+ IOUtils.closeQuietly(inputStream);
+ super.cancel();
+ }
+
+ @Override
+ protected InputStream getInputStream() throws IOException {
+ return inputStream;
+ }
+
+ @Override
+ public long getBinaryLength() {
+ try {
+ return inputStream == null ? 0 : inputStream.available();
+ } catch (IOException e) {
+ return 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/ByteArrayBinary.java b/nohttp/src/main/java/com/yolanda/nohttp/ByteArrayBinary.java
new file mode 100644
index 0000000..e9d9a77
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/ByteArrayBinary.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import java.io.ByteArrayInputStream;
+
+/**
+ *
+ * A default implementation of Binary.
+ * All the methods are called in Son thread.
+ *
+ * Created in Oct 17, 2015 12:40:54 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class ByteArrayBinary extends InputStreamBinary {
+
+ /**
+ * A byte array of {@link Binary}.
+ *
+ * @param byteArray byte array.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ */
+ public ByteArrayBinary(byte[] byteArray, String fileName) {
+ super(new ByteArrayInputStream(byteArray), fileName);
+ }
+
+ /**
+ * A byte array of {@link Binary}.
+ *
+ * @param byteArray byte array.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ * @param mimeType content type.
+ */
+ public ByteArrayBinary(byte[] byteArray, String fileName, String mimeType) {
+ super(new ByteArrayInputStream(byteArray), fileName, mimeType);
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/Connection.java b/nohttp/src/main/java/com/yolanda/nohttp/Connection.java
new file mode 100644
index 0000000..8959be3
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/Connection.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import com.yolanda.nohttp.tools.IOUtils;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ * Created in May 3, 2016 11:05:03 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class Connection implements Closeable {
+
+ /**
+ * HttpURLConnection
+ */
+ private HttpURLConnection connection;
+ /**
+ * Server response header.
+ */
+ private Headers mResponseHeaders;
+ /**
+ * Server data steram.
+ */
+ private InputStream mInputStream;
+ /**
+ * Exception of connection.
+ */
+ private Exception mException;
+
+ /**
+ * Create a response.
+ *
+ * @param responseHeaders response headers.
+ * @param inputStream According to the response code, the incoming data stream server.
+ * @param exception Connection exceptions that occur in the process.
+ */
+ Connection(HttpURLConnection connection, Headers responseHeaders, InputStream inputStream, Exception exception) {
+ this.connection = connection;
+ this.mResponseHeaders = responseHeaders;
+ this.mInputStream = inputStream;
+ this.mException = exception;
+ }
+
+ /**
+ * Get the {@link URL} of connection.
+ *
+ * @return {@link URL}.
+ */
+ public URL getURL() {
+ return connection.getURL();
+ }
+
+ /**
+ * Get response headers.
+ *
+ * @return the responseHeaders.
+ */
+ public Headers responseHeaders() {
+ return mResponseHeaders;
+ }
+
+ /**
+ * Set response headers.
+ *
+ * @param responseHeaders the responseHeaders to set.
+ */
+ void setResponseHeaders(Headers responseHeaders) {
+ this.mResponseHeaders = responseHeaders;
+ }
+
+ /**
+ * Get stream from server.
+ *
+ * @return the inputStream.
+ */
+ public InputStream serverStream() {
+ return mInputStream;
+ }
+
+ /**
+ * Set the stream from server.
+ *
+ * @param inputStream the inputStream to set.
+ */
+ void setServerStream(InputStream inputStream) {
+ this.mInputStream = inputStream;
+ }
+
+ /**
+ * Get exception for execution.
+ *
+ * @return the exception.
+ */
+ public Exception exception() {
+ return mException;
+ }
+
+ /**
+ * Set execetpin for execution.
+ *
+ * @param exception the exception to set.
+ */
+ void setException(Exception exception) {
+ this.mException = exception;
+ }
+
+ @Override
+ public void close() throws IOException {
+ IOUtils.closeQuietly(mInputStream);
+ IOUtils.closeQuietly(connection);
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/FileBinary.java b/nohttp/src/main/java/com/yolanda/nohttp/FileBinary.java
new file mode 100644
index 0000000..e5bbddd
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/FileBinary.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.util.Log;
+
+import com.yolanda.nohttp.tools.IOUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ *
+ * A default implementation of Binary.
+ * All the methods are called in Son thread.
+ *
+ * Created in Oct 17, 2015 12:40:54 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class FileBinary extends BasicBinary {
+
+ private FileInputStream inputStream;
+
+ /**
+ * File binary.
+ *
+ * @param file a file.
+ */
+ public FileBinary(File file) {
+ this(file, file.getName(), null);
+ }
+
+ /**
+ * File binary.
+ *
+ * @param file a file.
+ * @param fileName file name.
+ */
+ public FileBinary(File file, String fileName) {
+ this(file, fileName, null);
+ }
+
+ /**
+ * File binary.
+ *
+ * @param file a file.
+ * @param fileName file name.
+ * @param mimeType content type.
+ */
+ public FileBinary(File file, String fileName, String mimeType) {
+ super(fileName, mimeType);
+ try {
+ this.inputStream = new FileInputStream(file);
+ } catch (FileNotFoundException e) {
+ Log.e("Binary", "Binary was cancelled, because the file does not exist.");
+ super.cancel();
+ }
+ }
+
+ @Override
+ public void cancel() {
+ IOUtils.closeQuietly(inputStream);
+ super.cancel();
+ }
+
+ @Override
+ public long getBinaryLength() {
+ try {
+ return inputStream == null ? 0 : inputStream.available();
+ } catch (IOException e) {
+ return 0;
+ }
+ }
+
+ @Override
+ protected InputStream getInputStream() throws IOException {
+ return inputStream;
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/Headers.java b/nohttp/src/main/java/com/yolanda/nohttp/Headers.java
new file mode 100644
index 0000000..e702c1a
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/Headers.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import com.yolanda.nohttp.tools.MultiValueMap;
+
+import org.json.JSONException;
+
+import java.net.CookieHandler;
+import java.net.HttpCookie;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * Http header.
+ *
+ * Created in Jan 10, 2016 2:29:42 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface Headers extends MultiValueMap {
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_RESPONSE_CODE = "ResponseCode";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_RESPONSE_MESSAGE = "ResponseMessage";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_ACCEPT = "Accept";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_ALL = "application/json,application/xml,application/xhtml+xml,text/html;q=0.9,image/webp,*/*;q=0.8";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_MULTIPART_FORM_DATA = "multipart/form-data";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_APPLICATION_OCTET_STREAM = "application/octet-stream";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_APPLICATION_JSON = "application/json";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_APPLICATION_XML = "application/xml";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_ACCEPT_ENCODING = "Accept-Encoding";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_ACCEPT_ENCODING_GZIP_DEFLATE = "gzip, deflate";// no sdch
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_ACCEPT_LANGUAGE = "Accept-Language";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_ACCEPT_RANGE = "Accept-Range";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONTENT_DISPOSITION = "Content-Disposition";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONTENT_ENCODING = "Content-Encoding";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONTENT_LENGTH = "Content-Length";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONTENT_RANGE = "Content-Range";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONTENT_TYPE = "Content-Type";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CACHE_CONTROL = "Cache-Control";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_CONNECTION = "Connection";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_CONNECTION_KEEP_ALIVE = "keep-alive";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_VALUE_CONNECTION_CLOSE = "close";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_DATE = "Date";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_EXPIRES = "Expires";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_E_TAG = "ETag";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_PRAGMA = "Pragma";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_IF_MODIFIED_SINCE = "If-Modified-Since";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_IF_NONE_MATCH = "If-None-Match";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_LAST_MODIFIED = "Last-Modified";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_LOCATION = "Location";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_USER_AGENT = "User-Agent";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_COOKIE = "Cookie";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_COOKIE2 = "Cookie2";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_SET_COOKIE = "Set-Cookie";
+
+ /**
+ * The value is {@value}.
+ */
+ String HEAD_KEY_SET_COOKIE2 = "Set-Cookie2";
+
+ /**
+ * Copy all head to Headers.
+ *
+ * @param headers headers.
+ */
+ void addAll(Headers headers);
+
+ /**
+ * Remove all of the head now, add a new head in.
+ *
+ * @param headers headers.
+ */
+ void setAll(Headers headers);
+
+ /**
+ * Conform to the URI of the Cookie is added to the head.
+ *
+ * @param uri url.
+ * @param cookieHandler cookieHandler.
+ */
+ void addCookie(URI uri, CookieHandler cookieHandler);
+
+ /**
+ * From the json format String parsing out the {@code Map>} data.
+ *
+ * @param jsonString json string.
+ * @throws JSONException thrown it when format error.
+ */
+ void setJSONString(String jsonString) throws JSONException;
+
+ /**
+ * Into a json format string.
+ *
+ * @return Json format data.
+ */
+ String toJSONString();
+
+ /**
+ * Into a single key-value map.
+ *
+ * @return Map.
+ */
+ Map toRequestHeaders();
+
+ /**
+ * To multiple key - the value of the map.
+ *
+ * @return Map format data.
+ */
+ Map> toResponseHeaders();
+
+ /**
+ * All the cookies in header information.
+ *
+ * @return {@code List}.
+ */
+ List getCookies();
+
+ /**
+ * {@value #HEAD_KEY_CACHE_CONTROL}.
+ *
+ * @return CacheControl.
+ */
+ String getCacheControl();
+
+ /**
+ * {@value HEAD_KEY_CONTENT_DISPOSITION}.
+ *
+ * @return {@value HEAD_KEY_CONTENT_DISPOSITION}.
+ */
+ String getContentDisposition();
+
+ /**
+ * {@value #HEAD_KEY_CONTENT_ENCODING}.
+ *
+ * @return ContentEncoding.
+ */
+ String getContentEncoding();
+
+ /**
+ * {@value #HEAD_KEY_CONTENT_LENGTH}.
+ *
+ * @return ContentLength.
+ */
+ int getContentLength();
+
+ /**
+ * {@value #HEAD_KEY_CONTENT_TYPE}.
+ *
+ * @return ContentType.
+ */
+ String getContentType();
+
+ /**
+ * {@value #HEAD_KEY_CONTENT_RANGE} or {@value #HEAD_KEY_ACCEPT_RANGE}.
+ *
+ * @return {@value #HEAD_KEY_CONTENT_RANGE} or {@value #HEAD_KEY_ACCEPT_RANGE}.
+ */
+ String getContentRange();
+
+ /**
+ * {@value #HEAD_KEY_DATE}.
+ *
+ * @return Date.
+ */
+ long getDate();
+
+ /**
+ * {@value #HEAD_KEY_E_TAG}.
+ *
+ * @return ETag.
+ */
+ String getETag();
+
+ /**
+ * {@value #HEAD_KEY_EXPIRES}.
+ *
+ * @return Expiration.
+ */
+ long getExpiration();
+
+ /**
+ * {@value #HEAD_KEY_LAST_MODIFIED}.
+ *
+ * @return LastModified.
+ */
+ long getLastModified();
+
+ /**
+ * {@value #HEAD_KEY_LOCATION}.
+ *
+ * @return Location.
+ */
+ String getLocation();
+
+ /**
+ * {@value #HEAD_KEY_RESPONSE_CODE}.
+ *
+ * @return ResponseCode.
+ */
+ int getResponseCode();
+
+ /**
+ * {@value #HEAD_KEY_RESPONSE_MESSAGE}.
+ *
+ * @return ResponseMessage.
+ */
+ String getResponseMessage();
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/HttpHeaders.java b/nohttp/src/main/java/com/yolanda/nohttp/HttpHeaders.java
new file mode 100644
index 0000000..499a247
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/HttpHeaders.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.tools.HeaderUtil;
+import com.yolanda.nohttp.tools.TreeMultiValueMap;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.net.CookieHandler;
+import java.net.HttpCookie;
+import java.net.URI;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * {@link Headers} The default implementation.
+ *
+ * Created in Jan 10, 2016 2:37:06 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class HttpHeaders extends TreeMultiValueMap implements Headers {
+
+ public HttpHeaders() {
+ super(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ return o1.compareTo(o2);
+ }
+ });
+ }
+
+ @Override
+ public void addAll(Headers headers) {
+ if (headers != null) {
+ Set keySet = headers.keySet();
+ for (String key : keySet) {
+ add(key, headers.getValues(key));
+ }
+ }
+ }
+
+ @Override
+ public void setAll(Headers headers) {
+ if (headers != null) {
+ Set keySet = headers.keySet();
+ for (String key : keySet) {
+ set(key, headers.getValues(key));
+ }
+ }
+ }
+
+ @Override
+ public void addCookie(URI uri, CookieHandler cookieHandler) {
+ try {
+ Map> diskCookies = cookieHandler.get(uri, new HashMap>());
+ for (Map.Entry> entry : diskCookies.entrySet()) {
+ String key = entry.getKey();
+ List value = entry.getValue();
+ if ((HEAD_KEY_COOKIE.equalsIgnoreCase(key) || HEAD_KEY_COOKIE2.equalsIgnoreCase(key))) {
+ add(key, TextUtils.join("; ", value));
+ }
+ }
+ } catch (IOException e) {
+ Logger.e(e);
+ }
+ }
+
+ @Override
+ public void setJSONString(String jsonString) throws JSONException {
+ clear();
+ JSONObject jsonObject = new JSONObject(jsonString);
+ Iterator keySet = jsonObject.keys();
+ while (keySet.hasNext()) {
+ String key = keySet.next();
+ String value = jsonObject.optString(key);
+ JSONArray values = new JSONArray(value);
+ if (values != null)
+ for (int i = 0; i < values.length(); i++)
+ add(key, values.optString(i));
+ }
+ }
+
+ @Override
+ public final String toJSONString() {
+ JSONObject jsonObject = new JSONObject();
+ Set>> entrySet = entrySet();
+ for (Map.Entry> entry : entrySet) {
+ String key = entry.getKey();
+ List values = entry.getValue();
+ JSONArray value = new JSONArray(values);
+ try {
+ jsonObject.put(key, value);
+ } catch (JSONException e) {
+ Logger.w(e);
+ }
+ }
+
+ return jsonObject.toString();
+ }
+
+ @Override
+ public Map toRequestHeaders() {
+ Map singleMap = new LinkedHashMap();
+ for (Map.Entry> entry : entrySet()) {
+ String key = entry.getKey();
+ List value = entry.getValue();
+ String trueValue = TextUtils.join("; ", value);
+ singleMap.put(key, trueValue);
+ }
+ return singleMap;
+ }
+
+ @Override
+ public Map> toResponseHeaders() {
+ return getSource();
+ }
+
+ @Override
+ public List getCookies() {
+ List cookies = new ArrayList();
+ for (String key : keySet()) {
+ if (key.equalsIgnoreCase(HEAD_KEY_SET_COOKIE) || key.equalsIgnoreCase(HEAD_KEY_SET_COOKIE2)) {
+ List cookieValues = getValues(key);
+ for (String cookieStr : cookieValues) {
+ for (HttpCookie cookie : HttpCookie.parse(cookieStr))
+ cookies.add(cookie);
+ }
+ }
+ }
+ return cookies;
+ }
+
+ @Override
+ public String getCacheControl() {
+ // first http1.1, second http1.0
+ List cacheControls = getValues(HEAD_KEY_CACHE_CONTROL);
+ if (cacheControls == null)
+ cacheControls = getValues(HEAD_KEY_PRAGMA);
+ if (cacheControls == null)
+ cacheControls = new ArrayList();
+ return TextUtils.join(",", cacheControls);
+ }
+
+ @Override
+ public String getContentDisposition() {
+ return getValue(HEAD_KEY_CONTENT_DISPOSITION, 0);
+ }
+
+ @Override
+ public String getContentEncoding() {
+ return getValue(HEAD_KEY_CONTENT_ENCODING, 0);
+ }
+
+ @Override
+ public int getContentLength() {
+ String contentLength = getValue(HEAD_KEY_CONTENT_LENGTH, 0);
+ try {
+ return Integer.parseInt(contentLength);
+ } catch (Throwable e) {
+ }
+ return 0;
+ }
+
+ @Override
+ public String getContentRange() {
+ String contentRange = getValue(HEAD_KEY_CONTENT_RANGE, 0);
+ if (contentRange == null)
+ contentRange = getValue(HEAD_KEY_ACCEPT_RANGE, 0);
+ return contentRange;
+ }
+
+ @Override
+ public int getResponseCode() {
+ String responseCode = getValue(HEAD_KEY_RESPONSE_CODE, 0);
+ int code = 0;
+ try {
+ code = Integer.parseInt(responseCode);
+ } catch (Exception e) {
+ }
+ return code;
+ }
+
+ @Override
+ public String getResponseMessage() {
+ return getValue(HEAD_KEY_RESPONSE_MESSAGE, 0);
+ }
+
+ @Override
+ public String getContentType() {
+ return getValue(HEAD_KEY_CONTENT_TYPE, 0);
+ }
+
+ @Override
+ public long getDate() {
+ return getDateField(HEAD_KEY_DATE);
+ }
+
+ @Override
+ public String getETag() {
+ return getValue(HEAD_KEY_E_TAG, 0);
+ }
+
+ @Override
+ public long getExpiration() {
+ return getDateField(HEAD_KEY_EXPIRES);
+ }
+
+ @Override
+ public long getLastModified() {
+ return getDateField(HEAD_KEY_LAST_MODIFIED);
+ }
+
+ @Override
+ public String getLocation() {
+ return getValue(HEAD_KEY_LOCATION, 0);
+ }
+
+ /**
+ *
+ * Returns the date value in milliseconds since 1970.1.1, 00:00h corresponding to the header field field. The
+ * defaultValue will be returned if no such field can be found in the response header.
+ *
+ *
+ * @param key the header field name.
+ * @return the header field represented in milliseconds since January 1, 1970 GMT.
+ */
+ private long getDateField(String key) {
+ String value = getValue(key, 0);
+ if (!TextUtils.isEmpty(value))
+ try {
+ return HeaderUtil.parseGMTToMillis(value);
+ } catch (ParseException e) {
+ Logger.w(e);
+ }
+ return 0;
+ }
+
+ @Override
+ public String toString() {
+ return toJSONString();
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/IBasicRequest.java b/nohttp/src/main/java/com/yolanda/nohttp/IBasicRequest.java
new file mode 100644
index 0000000..325bd79
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/IBasicRequest.java
@@ -0,0 +1,545 @@
+/*
+ * Copyright © Yan Zhenjie. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import com.yolanda.nohttp.able.Cancelable;
+import com.yolanda.nohttp.able.Finishable;
+import com.yolanda.nohttp.able.Queueable;
+import com.yolanda.nohttp.able.SignCancelable;
+import com.yolanda.nohttp.able.Startable;
+import com.yolanda.nohttp.tools.MultiValueMap;
+
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpCookie;
+import java.net.Proxy;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * Created by Yan Zhenjie on 2016/8/20.
+ */
+public interface IBasicRequest extends IPriority, Queueable, Startable, Cancelable, SignCancelable, Finishable, Comparable {
+
+ /*
+ * =====================================================
+ * || Client ||
+ * =====================================================
+ */
+
+ /**
+ * Mandatory set to form pattern to transmit data.
+ * MultipartFormEnable is request method is the premise of the POST/PUT/PATCH/DELETE, but the Android system under API level 19 does not support the DELETE.
+ *
+ * @param enable true enable, other wise false.
+ */
+ void setMultipartFormEnable(boolean enable);
+
+ /**
+ * Set proxy server.
+ *
+ * @param proxy Can use {@code Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("64.233.162.83", 80));}.
+ */
+ void setProxy(Proxy proxy);
+
+ /**
+ * Sets the {@link SSLSocketFactory} for this request.
+ *
+ * @param socketFactory {@link SSLSocketFactory}.
+ */
+ void setSSLSocketFactory(SSLSocketFactory socketFactory);
+
+ /**
+ * Set the {@link HostnameVerifier}.
+ *
+ * @param hostnameVerifier {@link HostnameVerifier}.
+ */
+ void setHostnameVerifier(HostnameVerifier hostnameVerifier);
+
+ /**
+ * Sets the connection timeout time.
+ *
+ * @param connectTimeout timeout number, Unit is a millisecond.
+ */
+ void setConnectTimeout(int connectTimeout);
+
+ /**
+ * Sets the read timeout time.
+ *
+ * @param readTimeout timeout number, Unit is a millisecond.
+ */
+ void setReadTimeout(int readTimeout);
+
+ /**
+ * Add a new key-value header.
+ *
+ * @param key key.
+ * @param value value.
+ */
+ void addHeader(String key, String value);
+
+ /**
+ * If there is a key to delete, and then add a new key-value header.
+ *
+ * @param key key.
+ * @param value value.
+ */
+ void setHeader(String key, String value);
+
+ /**
+ * Add a {@link HttpCookie}.
+ * Just like the:
+ *
+ * HttpCookie httpCookie = getHttpCookie();
+ * if(httpCookie != null)
+ * request.addHeader("Cookie", cookie.getName() + "=" + cookie.getValue());
+ * ...
+ *
+ *
+ * @param cookie {@link HttpCookie}.
+ */
+ void addHeader(HttpCookie cookie);
+
+ /**
+ * Remove the key from the information.
+ *
+ * @param key key.
+ */
+ void removeHeader(String key);
+
+ /**
+ * Remove all header.
+ */
+ void removeAllHeader();
+
+ /**
+ * Set the accept for head.
+ *
+ * @param accept such as: "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}", "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_XML}.
+ */
+ void setAccept(String accept);
+
+ /**
+ * Set the acceptLanguage for head.
+ *
+ * @param acceptLanguage such as "zh-CN,zh", "en-US,us".
+ */
+ void setAcceptLanguage(String acceptLanguage);
+
+ /**
+ * Set the contentType for head.
+ *
+ * @param contentType such as: "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}", "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_XML}" or "{@value Headers#HEAD_VALUE_ACCEPT_MULTIPART_FORM_DATA}". Note, does not need to include quotation marks.
+ */
+ void setContentType(String contentType);
+
+ /**
+ * Set the userAgent for head.
+ *
+ * @param userAgent such as: {@code Mozilla/5.0 (Android U; Android 5.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Safari/533.1}.
+ */
+ void setUserAgent(String userAgent);
+
+ /**
+ * Set the request fails retry count.The default value is 0, that is to say, after the failure will not go to this to initiate the request again.
+ *
+ * @param count the retry count, The default value is 0.
+ */
+ void setRetryCount(int count);
+
+ /**
+ * Set the params encoding.
+ *
+ * @param encoding such as {@code utf-8, gbk, gb2312}.
+ */
+ void setParamsEncoding(String encoding);
+
+ /**
+ * Add {@link Integer} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, int value);
+
+ /**
+ * Add {@link Long} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, long value);
+
+ /**
+ * Add {@link Boolean} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, boolean value);
+
+ /**
+ * Add {@code char} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, char value);
+
+ /**
+ * Add {@link Double} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, double value);
+
+ /**
+ * Add {@link Float} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, float value);
+
+ /**
+ * Add {@link Short} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, short value);
+
+ /**
+ * Add {@link Byte} param.
+ *
+ * @param key param name.
+ * @param value param value, for example, the result is {@code 1} of {@code 0x01}.
+ */
+ void add(String key, byte value);
+
+ /**
+ * Add {@link String} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void add(String key, String value);
+
+ /**
+ * Add {@link String} param.
+ *
+ * @param key param name.
+ * @param value param value.
+ */
+ void set(String key, String value);
+
+ /**
+ * Add {@link Binary} param.
+ *
+ * @param key param name.
+ * @param binary param value.
+ */
+ void add(String key, Binary binary);
+
+ /**
+ * Set {@link Binary} param.
+ *
+ * @param key param name.
+ * @param binary param value.
+ */
+ void set(String key, Binary binary);
+
+ /**
+ * Add {@link File} param.
+ *
+ * @param key param name.
+ * @param file param value.
+ */
+ void add(String key, File file);
+
+ /**
+ * Set {@link File} param.
+ *
+ * @param key param name.
+ * @param file param value.
+ */
+ void set(String key, File file);
+
+ /**
+ * Add {@link Binary} param;
+ *
+ * @param key param name.
+ * @param binaries param value.
+ */
+ void add(String key, List binaries);
+
+ /**
+ * Set {@link Binary} param.
+ *
+ * @param key param name.
+ * @param binaries param value.
+ */
+ void set(String key, List binaries);
+
+ /**
+ * Add all param.
+ *
+ * @param params params {@link Map}.
+ */
+ void add(Map params);
+
+ /**
+ * Set all param.
+ *
+ * @param params params {@link Map}.
+ */
+ void set(Map params);
+
+ /**
+ * Remove a request param by key.
+ *
+ * @param key key
+ * @return The object is removed, if there are no returns null.
+ */
+ List remove(String key);
+
+ /**
+ * Remove all request param.
+ */
+ void removeAll();
+
+ /**
+ * Get the parameters of key-value pairs.
+ *
+ * @return Not empty Map.
+ */
+ MultiValueMap getParamKeyValues();
+
+ /**
+ * Settings you want to push data and contentType. Can only accept {@link java.io.ByteArrayInputStream} and {@link java.io.FileInputStream} type.
+ * It is important to note that the request method must be {@link RequestMethod#PUT}, {@link RequestMethod#POST}, {@link RequestMethod#PATCH} in one of them.
+ *
+ * @param requestBody There can be a file, pictures, any other data flow.You don't need to close it, NoHttp when complete request will be automatically closed.
+ * @param contentType such as: "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_XML}{@code ; charset=}{@value NoHttp#CHARSET_UTF8}", "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}{@code ; charset=}{@value NoHttp#CHARSET_UTF8}" or "{@value Headers#HEAD_VALUE_ACCEPT_MULTIPART_FORM_DATA}". Note, does not need to include quotation marks.
+ * @see #setDefineRequestBody(String, String)
+ * @see #setDefineRequestBodyForJson(JSONObject)
+ * @see #setDefineRequestBodyForJson(String)
+ * @see #setDefineRequestBodyForXML(String)
+ */
+ void setDefineRequestBody(InputStream requestBody, String contentType);
+
+
+ /**
+ * Sets the request body and content type.
+ * It is important to note that the request method must be {@link RequestMethod#PUT}, {@link RequestMethod#POST}, {@link RequestMethod#PATCH} in one of them.
+ *
+ * @param requestBody string body.
+ * @param contentType such as: "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}" or "{@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_XML}". Note, does not need to include quotation marks.
+ * If ContentType parameter into "" or null, the default for the {@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}.
+ * @see #setDefineRequestBody(InputStream, String)
+ * @see #setDefineRequestBodyForJson(JSONObject)
+ * @see #setDefineRequestBodyForJson(String)
+ * @see #setDefineRequestBodyForXML(String)
+ */
+ void setDefineRequestBody(String requestBody, String contentType);
+
+ /**
+ * Set the request json body.
+ * It is important to note that the request method must be {@link RequestMethod#PUT}, {@link RequestMethod#POST}, {@link RequestMethod#PATCH} in one of them.
+ * The content type is {@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}
+ *
+ * @param jsonBody json body.
+ * @see #setDefineRequestBody(InputStream, String)
+ * @see #setDefineRequestBody(String, String)
+ * @see #setDefineRequestBodyForJson(JSONObject)
+ * @see #setDefineRequestBodyForXML(String)
+ */
+ void setDefineRequestBodyForJson(String jsonBody);
+
+ /**
+ * Set the request json body.
+ * It is important to note that the request method must be {@link RequestMethod#PUT}, {@link RequestMethod#POST}, {@link RequestMethod#PATCH} in one of them.
+ * The content type is {@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}
+ *
+ * @param jsonBody json body.
+ * @see #setDefineRequestBody(InputStream, String)
+ * @see #setDefineRequestBody(String, String)
+ * @see #setDefineRequestBodyForJson(String)
+ * @see #setDefineRequestBodyForXML(String)
+ */
+ void setDefineRequestBodyForJson(JSONObject jsonBody);
+
+ /**
+ * Set the request XML body.
+ * It is important to note that the request method must be {@link RequestMethod#PUT}, {@link RequestMethod#POST}, {@link RequestMethod#PATCH} in one of them.
+ * The content type is {@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_XML}
+ *
+ * @param xmlBody xml body.
+ * @see #setDefineRequestBody(InputStream, String)
+ * @see #setDefineRequestBody(String, String)
+ * @see #setDefineRequestBody(String, String)
+ * @see #setDefineRequestBodyForJson(String)
+ */
+ void setDefineRequestBodyForXML(String xmlBody);
+
+ /**
+ * Sets redirect interface.
+ *
+ * @param redirectHandler {@link RedirectHandler}.
+ */
+ void setRedirectHandler(RedirectHandler redirectHandler);
+
+ /**
+ * Set tag of task, At the end of the task is returned to you.
+ *
+ * @param tag {@link Object}.
+ */
+ void setTag(Object tag);
+
+ /*
+ * =====================================================
+ * || Server ||
+ * =====================================================
+ */
+
+ /**
+ * Return url of request.
+ *
+ * @return Url.
+ */
+ String url();
+
+ /**
+ * return method of request.
+ *
+ * @return {@link RequestMethod}.
+ */
+ RequestMethod getRequestMethod();
+
+ /**
+ * Is MultipartFormEnable ?
+ * MultipartFormEnable is request method is the premise of the POST/PUT/PATCH/DELETE, but the Android system under API level 19 does not support the DELETE.
+ *
+ * @return true enable, other wise false.
+ */
+ boolean isMultipartFormEnable();
+
+ /**
+ * Get proxy server.
+ *
+ * @return Can use {@code Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("64.233.162.83", 80));}.
+ */
+ Proxy getProxy();
+
+ /**
+ * Get SSLSocketFactory.
+ *
+ * @return {@link SSLSocketFactory}.
+ */
+ SSLSocketFactory getSSLSocketFactory();
+
+ /**
+ * Get the HostnameVerifier.
+ *
+ * @return {@link HostnameVerifier}.
+ */
+ HostnameVerifier getHostnameVerifier();
+
+ /**
+ * Get the connection timeout time, Unit is a millisecond.
+ *
+ * @return Connection timeout.
+ */
+ int getConnectTimeout();
+
+ /**
+ * Get the read timeout time, Unit is a millisecond.
+ *
+ * @return Read timeout.
+ */
+ int getReadTimeout();
+
+ /**
+ * Get all Heads.
+ *
+ * @return {@code Headers}.
+ */
+ Headers headers();
+
+ /**
+ * To get the failure after retries.
+ *
+ * @return The default value is 0.
+ */
+ int getRetryCount();
+
+ /**
+ * The length of the request body.
+ *
+ * @return Such as: {@code 2048}.
+ */
+ long getContentLength();
+
+ /**
+ * Get {@value Headers#HEAD_KEY_CONTENT_TYPE}.
+ *
+ * @return string, such as: {@value Headers#HEAD_VALUE_ACCEPT_APPLICATION_JSON}.
+ */
+ String getContentType();
+
+ /**
+ * Get the params encoding.
+ *
+ * @return such as {@code "utf-8, gbk, bg2312"}.
+ */
+ String getParamsEncoding();
+
+ /**
+ * Call before carry out the request, you can do some preparation work.
+ */
+ void onPreExecute();
+
+ /**
+ * Get the redirect handler.
+ *
+ * @return {@link RedirectHandler}.
+ */
+ RedirectHandler getRedirectHandler();
+
+ /**
+ * Send request body data.
+ *
+ * @param writer {@link OutputStream}.
+ * @throws IOException write error.
+ */
+ void onWriteRequestBody(OutputStream writer) throws IOException;
+
+ /**
+ * Should to return the tag of the object.
+ *
+ * @return {@link Object}.
+ */
+ Object getTag();
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/IPriority.java b/nohttp/src/main/java/com/yolanda/nohttp/IPriority.java
new file mode 100644
index 0000000..2a960f1
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/IPriority.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+/**
+ * Created on 2016/6/21.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface IPriority {
+
+ /**
+ * Set the priority of the request object. The default priority is {@link Priority#DEFAULT}.
+ *
+ * @param priority {@link Priority}.
+ */
+ void setPriority(Priority priority);
+
+ /**
+ * Get the priority of the request object.
+ *
+ * @return {@link Priority}.
+ */
+ Priority getPriority();
+
+ /**
+ * Set the sequence in the queue, under the condition of two requests as priority, {@code left.sequence-right.sequence} decision to order.
+ *
+ * @param sequence sequence code.
+ */
+ void setSequence(int sequence);
+
+ /**
+ * Get the sequence in the queue, under the condition of two requests as priority, {@code left.sequence-right.sequence} decision to order.
+ *
+ * @return sequence code.
+ */
+ int getSequence();
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/InputStreamBinary.java b/nohttp/src/main/java/com/yolanda/nohttp/InputStreamBinary.java
new file mode 100644
index 0000000..298251b
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/InputStreamBinary.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.util.Log;
+
+import com.yolanda.nohttp.tools.IOUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ *
+ * A default implementation of Binary.
+ * All the methods are called in Son thread.
+ *
+ * Created in Oct 17, 2015 12:40:54 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class InputStreamBinary extends BasicBinary {
+
+ protected InputStream inputStream;
+
+ /**
+ * An input stream {@link Binary}.
+ *
+ * @param inputStream must be {@link FileInputStream}, {@link ByteArrayInputStream}.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ */
+ public InputStreamBinary(InputStream inputStream, String fileName) {
+ this(inputStream, fileName, null);
+ }
+
+ /**
+ * An input stream {@link Binary}.
+ *
+ * @param inputStream must be {@link FileInputStream}, {@link ByteArrayInputStream}.
+ * @param fileName file name. Had better pass this value, unless the server tube don't care about the file name.
+ * @param mimeType content type.
+ */
+ public InputStreamBinary(InputStream inputStream, String fileName, String mimeType) {
+ super(fileName, mimeType);
+ this.inputStream = inputStream;
+ if (!(inputStream instanceof FileInputStream) && !(inputStream instanceof ByteArrayInputStream)) {
+ Log.e("Binary", "Binary was cancelled, because the InputStream must be FileInputStream or ByteArrayInputStream.");
+ super.cancel();
+ }
+ }
+
+ @Override
+ public void cancel() {
+ IOUtils.closeQuietly(inputStream);
+ super.cancel();
+ }
+
+ @Override
+ public long getBinaryLength() {
+ try {
+ return inputStream.available();
+ } catch (IOException e) {
+ Logger.e(e);
+ }
+ return 0;
+ }
+
+ @Override
+ protected InputStream getInputStream() throws IOException {
+ return inputStream;
+ }
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/Logger.java b/nohttp/src/main/java/com/yolanda/nohttp/Logger.java
new file mode 100644
index 0000000..564e5ff
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/Logger.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created in Jul 28, 2015 7:32:05 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class Logger {
+
+ private static final String V = "v";
+ private static final String I = "i";
+ private static final String D = "d";
+ private static final String W = "w";
+ private static final String E = "e";
+ private static final String WTF = "wtf";
+
+ /**
+ * Library debug tag.
+ */
+ private static String STag = "NoHttp";
+ /**
+ * Library debug sign.
+ */
+ private static boolean SDebug = false;
+ /**
+ * Default length.
+ */
+ private static final int MAX_LENGTH = 4000;
+ /**
+ * Length of message.
+ */
+ private static int maxLength = MAX_LENGTH;
+
+ /**
+ * Set tag of log.
+ *
+ * @param tag tag.
+ */
+ public static void setTag(String tag) {
+ STag = tag;
+ }
+
+ /**
+ * Open debug mode of {@code NoHttp}.
+ *
+ * @param debug true open, false close.
+ */
+ public static void setDebug(boolean debug) {
+ SDebug = debug;
+ }
+
+ /**
+ * Set the length of the line of the Log, value is {@value MAX_LENGTH}.
+ *
+ * @param length length.
+ */
+ public static void setMessageMaxLength(int length) {
+ maxLength = length;
+ }
+
+ public static void i(String msg) {
+ print(I, msg);
+ }
+
+ public static void i(Throwable e) {
+ i(e, "");
+ }
+
+ public static void i(Throwable e, String msg) {
+ print(I, msg, e);
+ }
+
+ public static void v(String msg) {
+ print(V, msg);
+ }
+
+ public static void v(Throwable e) {
+ v(e, "");
+ }
+
+ public static void v(Throwable e, String msg) {
+ print(V, msg, e);
+ }
+
+ public static void d(String msg) {
+ print(D, msg);
+ }
+
+ public static void d(Throwable e) {
+ d(e, "");
+ }
+
+ public static void d(Throwable e, String msg) {
+ print(D, msg, e);
+ }
+
+ public static void e(String msg) {
+ print(E, msg);
+ }
+
+ public static void e(Throwable e) {
+ e(e, "");
+ }
+
+ public static void e(Throwable e, String msg) {
+ print(E, msg, e);
+ }
+
+ public static void w(String msg) {
+ print(W, msg);
+ }
+
+ public static void w(Throwable e) {
+ w(e, "");
+ }
+
+ public static void w(Throwable e, String msg) {
+ print(W, msg, e);
+ }
+
+ public static void wtf(String msg) {
+ print(WTF, msg);
+ }
+
+ public static void wtf(Throwable e) {
+ wtf(e, "");
+ }
+
+ public static void wtf(Throwable e, String msg) {
+ print(WTF, msg, e);
+ }
+
+ /**
+ * Print log for define method. When information is too long, the Logger can also complete printing. The equivalent of "{@code android.util.Log.i("Tag", "Message")}" "{@code com.yolanda.nohttp.Logger.print("i", "Tag", "Message")}".
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param message message.
+ */
+ private static void print(String method, String message) {
+ print(method, STag, message);
+ }
+
+ /**
+ * Print log for define method. When information is too long, the Logger can also complete printing. The equivalent of "{@code android.util.Log.i("Tag", "Message")}" "{@code com.yolanda.nohttp.Logger.print("i", "Tag", "Message")}".
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param tag tag.
+ * @param message message.
+ */
+ public static void print(String method, String tag, String message) {
+ if (SDebug) {
+ if (message == null)
+ message = "null";
+ int strLength = message.length();
+ if (strLength == 0)
+ invokePrint(method, tag, message);
+ else {
+ for (int i = 0; i < strLength / maxLength + (strLength % maxLength > 0 ? 1 : 0); i++) {
+ int end = (i + 1) * maxLength;
+ if (strLength >= end) {
+ invokePrint(method, tag, message.substring(end - maxLength, end));
+ } else {
+ invokePrint(method, tag, message.substring(end - maxLength));
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Through the reflection to call the print method.
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param tag tag.
+ * @param message message.
+ */
+ private static void invokePrint(String method, String tag, String message) {
+ try {
+ Class logClass = android.util.Log.class;
+ Method logMethod = logClass.getMethod(method, String.class, String.class);
+ logMethod.setAccessible(true);
+ logMethod.invoke(null, tag, message);
+ } catch (Exception e) {
+ System.out.println(tag + ": " + message);
+ }
+ }
+
+ /**
+ * Print log for define method. When information is too long, the Logger can also complete printing. The equivalent of "{@code android.util.Log.i("Tag", "Message")}" "{@code com.yolanda.nohttp.Logger.print("i", "Tag", "Message")}".
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param message message.
+ * @param e error.
+ */
+ private static void print(String method, String message, Throwable e) {
+ print(method, STag, message, e);
+ }
+
+ /**
+ * Print log for define method. When information is too long, the Logger can also complete printing. The equivalent of "{@code android.util.Log.i("Tag", "Message")}" "{@code com.yolanda.nohttp.Logger.print("i", "Tag", "Message")}".
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param tag tag.
+ * @param message message.
+ * @param e error.
+ */
+ private static void print(String method, String tag, String message, Throwable e) {
+ if (SDebug) {
+ if (message == null)
+ message = "null";
+ invokePrint(method, tag, message, e);
+ }
+ }
+
+ /**
+ * Through the reflection to call the print method.
+ *
+ * @param method such as "{@code v, i, d, w, e, wtf}".
+ * @param tag tag.
+ * @param message message.
+ * @param e error.
+ */
+ private static void invokePrint(String method, String tag, String message, Throwable e) {
+ try {
+ Class logClass = android.util.Log.class;
+ Method logMethod = logClass.getMethod(method, String.class, String.class, Throwable.class);
+ logMethod.setAccessible(true);
+ logMethod.invoke(null, tag, message, e);
+ } catch (Exception e1) {
+ System.out.println(tag + ": " + message);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/NoHttp.java b/nohttp/src/main/java/com/yolanda/nohttp/NoHttp.java
new file mode 100644
index 0000000..1615177
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/NoHttp.java
@@ -0,0 +1,674 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.app.Application;
+import android.graphics.Bitmap;
+import android.os.Build;
+import android.widget.ImageView;
+
+import com.yolanda.nohttp.cache.Cache;
+import com.yolanda.nohttp.cache.CacheEntity;
+import com.yolanda.nohttp.cache.DiskCacheStore;
+import com.yolanda.nohttp.cookie.DiskCookieStore;
+import com.yolanda.nohttp.download.DownloadConnection;
+import com.yolanda.nohttp.download.DownloadQueue;
+import com.yolanda.nohttp.download.DownloadRequest;
+import com.yolanda.nohttp.download.Downloader;
+import com.yolanda.nohttp.download.RestDownloadRequest;
+import com.yolanda.nohttp.rest.IParserRequest;
+import com.yolanda.nohttp.rest.IRestParser;
+import com.yolanda.nohttp.rest.IRestProtocol;
+import com.yolanda.nohttp.rest.ImageRequest;
+import com.yolanda.nohttp.rest.JsonArrayRequest;
+import com.yolanda.nohttp.rest.JsonObjectRequest;
+import com.yolanda.nohttp.rest.Request;
+import com.yolanda.nohttp.rest.RequestQueue;
+import com.yolanda.nohttp.rest.Response;
+import com.yolanda.nohttp.rest.RestParser;
+import com.yolanda.nohttp.rest.RestProtocol;
+import com.yolanda.nohttp.rest.StringRequest;
+import com.yolanda.nohttp.tools.AndroidVersion;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.net.Authenticator;
+import java.net.CookieHandler;
+import java.net.CookieManager;
+import java.net.CookiePolicy;
+import java.net.PasswordAuthentication;
+
+/**
+ *
+ * NoHttp.
+ *
+ * Created in Jul 28, 2015 7:32:22 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class NoHttp {
+
+ /**
+ * The value is {@value}.
+ */
+ public static final String CHARSET_UTF8 = "UTF-8";
+
+ /**
+ * RequestQueue default thread size, value is {@value}.
+ */
+ private static int DEFAULT_REQUEST_THREAD_SIZE = 3;
+
+ /**
+ * DownloadQueue default thread size, value is {@value}.
+ */
+ private static int DEFAULT_DOWNLOAD_THREAD_SIZE = 3;
+
+ /**
+ * Default connect timeout. The value is {@value}.
+ */
+ private static int sDefaultConnectTimeout = 10 * 1000;
+
+ /**
+ * Default read timeout. The value is {@value}.
+ */
+ private static int sDefaultReadTimeout = 10 * 1000;
+
+ /**
+ * Context.
+ */
+ private static Application sApplication;
+
+ /**
+ * Cookie.
+ */
+ private static CookieManager sCookieManager;
+ /**
+ * Is enable cookies.
+ */
+ private static boolean isEnableCookie = true;
+
+ /**
+ * Create a new request queue, using NoHttp default configuration. And number of concurrent requests is 3.
+ *
+ * @return Returns the request queue, the queue is used to control the entry of the request.
+ * @see #newRequestQueue(int)
+ * @see #newRequestQueue(Cache, int)
+ * @see #newRequestQueue(IRestProtocol, int)
+ * @see #newRequestQueue(IRestParser, int)
+ */
+ public static RequestQueue newRequestQueue() {
+ return newRequestQueue(DEFAULT_REQUEST_THREAD_SIZE);
+ }
+
+ /**
+ * Create a new request queue, using NoHttp default configuration.
+ *
+ * @param threadPoolSize request the number of concurrent.
+ * @return Returns the request queue, the queue is used to control the entry of the request.
+ * @see #newRequestQueue()
+ * @see #newRequestQueue(Cache, int)
+ * @see #newRequestQueue(IRestProtocol, int)
+ * @see #newRequestQueue(IRestParser, int)
+ */
+ public static RequestQueue newRequestQueue(int threadPoolSize) {
+ return newRequestQueue(DiskCacheStore.INSTANCE, threadPoolSize);
+ }
+
+ /**
+ * Create a new request queue, using NoHttp default request connection {@link RestProtocol} and default response parser {@link RestParser}.
+ *
+ * @param cache cache interface, which is used to cache the request results.
+ * @param threadPoolSize request the number of concurrent.
+ * @return Returns the request queue, the queue is used to control the entry of the request.
+ * @see #newRequestQueue()
+ * @see #newRequestQueue(int)
+ * @see #newRequestQueue(IRestProtocol, int)
+ * @see #newRequestQueue(IRestParser, int)
+ */
+ public static RequestQueue newRequestQueue(Cache cache, int threadPoolSize) {
+ return newRequestQueue(RestProtocol.getInstance(cache), threadPoolSize);
+ }
+
+ /**
+ * Create a new request queue, using NoHttp default request executor {@link RestProtocol} and default response parser {@link RestParser}.
+ *
+ * @param iRestProtocol network operating interface, The implementation of the network layer.
+ * @param threadPoolSize request the number of concurrent.
+ * @return Returns the request queue, the queue is used to control the entry of the request.
+ * @see #newRequestQueue()
+ * @see #newRequestQueue(int)
+ * @see #newRequestQueue(Cache, int)
+ * @see #newRequestQueue(IRestParser, int)
+ */
+ public static RequestQueue newRequestQueue(IRestProtocol iRestProtocol, int threadPoolSize) {
+ return newRequestQueue(RestParser.getInstance(iRestProtocol), threadPoolSize);
+ }
+
+ /**
+ * Create a new request queue.
+ *
+ * @param implRestParser the response parser, The result of parsing the network layer.
+ * @param threadPoolSize request the number of concurrent.
+ * @return Returns the request queue, the queue is used to control the entry of the request.
+ * @see #newRequestQueue()
+ * @see #newRequestQueue(int)
+ * @see #newRequestQueue(Cache, int)
+ * @see #newRequestQueue(IRestProtocol, int)
+ */
+ public static RequestQueue newRequestQueue(IRestParser implRestParser, int threadPoolSize) {
+ RequestQueue requestQueue = new RequestQueue(implRestParser, threadPoolSize);
+ requestQueue.start();
+ return requestQueue;
+ }
+
+ /**
+ * Create a String type request, the request method is {@link RequestMethod#GET}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @return {@code Request}.
+ * @see #createStringRequest(String, RequestMethod)
+ */
+ public static Request createStringRequest(String url) {
+ return new StringRequest(url);
+ }
+
+ /**
+ * Create a String type request, custom request method, method from {@link RequestMethod}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @param requestMethod {@link RequestMethod}.
+ * @return {@code Request}.
+ * @see #createStringRequest(String)
+ */
+ public static Request createStringRequest(String url, RequestMethod requestMethod) {
+ return new StringRequest(url, requestMethod);
+ }
+
+ /**
+ * Create a JSONObject type request, the request method is {@link RequestMethod#GET}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @return {@code Request}.
+ * @see #createJsonObjectRequest(String, RequestMethod)
+ */
+ public static Request createJsonObjectRequest(String url) {
+ return new JsonObjectRequest(url);
+ }
+
+ /**
+ * Create a JSONObject type request, custom request method, method from {@link RequestMethod}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @param requestMethod {@link RequestMethod}.
+ * @return {@code Request}.
+ * @see #createJsonObjectRequest(String)
+ */
+ public static Request createJsonObjectRequest(String url, RequestMethod requestMethod) {
+ return new JsonObjectRequest(url, requestMethod);
+ }
+
+ /**
+ * Create a JSONArray type request, the request method is {@link RequestMethod#GET}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @return {@code Request}.
+ * @see #createJsonArrayRequest(String, RequestMethod)
+ */
+ public static Request createJsonArrayRequest(String url) {
+ return new JsonArrayRequest(url);
+ }
+
+ /**
+ * Create a JSONArray type request, custom request method, method from {@link RequestMethod}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @param requestMethod {@link RequestMethod}.
+ * @return {@code Request}.
+ * @see #createJsonArrayRequest(String)
+ */
+ public static Request createJsonArrayRequest(String url, RequestMethod requestMethod) {
+ return new JsonArrayRequest(url, requestMethod);
+ }
+
+ /**
+ * Create a Image type request, the request method is {@link RequestMethod#GET}.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @return {@code Request}.
+ * @see #createImageRequest(String, RequestMethod)
+ * @see #createImageRequest(String, RequestMethod, int, int, Bitmap.Config, ImageView.ScaleType)
+ */
+ public static Request createImageRequest(String url) {
+ return createImageRequest(url, RequestMethod.GET);
+ }
+
+ /**
+ * Create a Image type request.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @param requestMethod {@link RequestMethod}.
+ * @return {@code Request}.
+ * @see #createImageRequest(String)
+ * @see #createImageRequest(String, RequestMethod, int, int, Bitmap.Config, ImageView.ScaleType)
+ */
+ public static Request createImageRequest(String url, RequestMethod requestMethod) {
+ return createImageRequest(url, requestMethod, 1000, 1000, Bitmap.Config.ARGB_8888, ImageView.ScaleType.CENTER_INSIDE);
+ }
+
+ /**
+ * Create a Image type request.
+ *
+ * @param url such as: {@code http://www.google.com}.
+ * @param requestMethod {@link RequestMethod}.
+ * @param maxWidth width.
+ * @param maxHeight height.
+ * @param config config.
+ * @param scaleType scaleType.
+ * @return {@code Request}.
+ * @see #createImageRequest(String)
+ * @see #createImageRequest(String, RequestMethod)
+ */
+ public static Request createImageRequest(String url, RequestMethod requestMethod, int maxWidth, int maxHeight, Bitmap.Config config, ImageView.ScaleType scaleType) {
+ return new ImageRequest(url, requestMethod, maxWidth, maxHeight, config, scaleType);
+ }
+
+ /**
+ * Initiate a synchronization request.
+ *
+ * @param request request object.
+ * @param {@link T}.
+ * @return {@link Response}.
+ * @see #startRequestSync(Cache, IParserRequest)
+ * @see #startRequestSync(IRestProtocol, IParserRequest)
+ * @see #startRequestSync(IRestParser, IParserRequest)
+ */
+ public static Response startRequestSync(IParserRequest request) {
+ return startRequestSync(DiskCacheStore.INSTANCE, request);
+ }
+
+ /**
+ * Initiate a synchronization request.
+ *
+ * @param cache cache interface, which is used to cache the request results.
+ * @param request tequest object.
+ * @param {@link T}.
+ * @return {@link Response}.
+ * @see #startRequestSync(IParserRequest)
+ * @see #startRequestSync(IRestProtocol, IParserRequest)
+ * @see #startRequestSync(IRestParser, IParserRequest)
+ */
+ public static Response startRequestSync(Cache cache, IParserRequest request) {
+ return startRequestSync(RestProtocol.getInstance(cache), request);
+ }
+
+ /**
+ * Initiate a synchronization request.
+ *
+ * @param implRestConnection complete implementation of the {@link IRestProtocol}.
+ * @param request request object.
+ * @param {@link T}.
+ * @return {@link Response}.
+ * @see #startRequestSync(IParserRequest)
+ * @see #startRequestSync(Cache, IParserRequest)
+ * @see #startRequestSync(IRestParser, IParserRequest)
+ */
+ public static Response startRequestSync(IRestProtocol implRestConnection, IParserRequest request) {
+ return startRequestSync(RestParser.getInstance(implRestConnection), request);
+ }
+
+ /**
+ * Initiate a synchronization request.
+ *
+ * @param implRestParser complete implementation of the {@link IRestParser}.
+ * @param request request object.
+ * @param {@link T}.
+ * @return {@link Response}.
+ * @see #startRequestSync(IParserRequest)
+ * @see #startRequestSync(Cache, IParserRequest)
+ * @see #startRequestSync(IRestProtocol, IParserRequest)
+ */
+ public static Response startRequestSync(IRestParser implRestParser, IParserRequest request) {
+ return implRestParser.parserRequest(request);
+ }
+
+ /**
+ * Create a new download queue, the default thread pool number is 3.
+ *
+ * @return {@link DownloadQueue}.
+ * @see #newDownloadQueue(int)
+ * @see #newDownloadQueue(Downloader, int)
+ */
+ public static DownloadQueue newDownloadQueue() {
+ return newDownloadQueue(DEFAULT_DOWNLOAD_THREAD_SIZE);
+ }
+
+ /**
+ * Create a new download queue.
+ *
+ * @param threadPoolSize thread pool number, here is the number of concurrent tasks.
+ * @return {@link DownloadQueue}.
+ * @see #newDownloadQueue()
+ * @see #newDownloadQueue(Downloader, int)
+ */
+ public static DownloadQueue newDownloadQueue(int threadPoolSize) {
+ return newDownloadQueue(new DownloadConnection(), threadPoolSize);
+ }
+
+ /**
+ * Create a new download queue.
+ *
+ * @param downloader {@link Downloader}.
+ * @param threadPoolSize number of concurrent.
+ * @return {@link DownloadQueue}
+ * @see #newDownloadQueue()
+ * @see #newDownloadQueue(int)
+ */
+ public static DownloadQueue newDownloadQueue(Downloader downloader, int threadPoolSize) {
+ DownloadQueue downloadQueue = new DownloadQueue(downloader, threadPoolSize);
+ downloadQueue.start();
+ return downloadQueue;
+ }
+
+ /**
+ * Create a download object, auto named file. The request method is {@link RequestMethod#GET}.
+ *
+ * @param url download address.
+ * @param fileFolder folder to save file.
+ * @param isDeleteOld find the same when the file is deleted after download, or on behalf of the download is complete, not to request the network.
+ * @return {@link DownloadRequest}.
+ * @see #createDownloadRequest(String, RequestMethod, String, String, boolean, boolean)
+ */
+ public static DownloadRequest createDownloadRequest(String url, String fileFolder, boolean isDeleteOld) {
+ return createDownloadRequest(url, RequestMethod.GET, fileFolder, isDeleteOld);
+ }
+
+ /**
+ * Create a download object, auto named file.
+ *
+ * @param url download address.
+ * @param requestMethod {@link RequestMethod}.
+ * @param fileFolder folder to save file.
+ * @param isDeleteOld find the same when the file is deleted after download, or on behalf of the download is complete, not to request the network.
+ * @return {@link DownloadRequest}.
+ * @see #createDownloadRequest(String, RequestMethod, String, String, boolean, boolean)
+ */
+ public static DownloadRequest createDownloadRequest(String url, RequestMethod requestMethod, String fileFolder, boolean isDeleteOld) {
+ return new RestDownloadRequest(url, requestMethod, fileFolder, isDeleteOld);
+ }
+
+ /**
+ * Create a download object. The request method is {@link RequestMethod#GET}.
+ *
+ * @param url download address.
+ * @param fileFolder folder to save file.
+ * @param filename filename.
+ * @param isRange whether the breakpoint continuing.
+ * @param isDeleteOld find the same when the file is deleted after download, or on behalf of the download is complete, not to request the network.
+ * @return {@link DownloadRequest}.
+ * @see #createDownloadRequest(String, RequestMethod, String, String, boolean, boolean)
+ */
+ public static DownloadRequest createDownloadRequest(String url, String fileFolder, String filename, boolean isRange, boolean isDeleteOld) {
+ return createDownloadRequest(url, RequestMethod.GET, fileFolder, filename, isRange, isDeleteOld);
+ }
+
+ /**
+ * Create a download object.
+ *
+ * @param url download address.
+ * @param requestMethod {@link RequestMethod}.
+ * @param fileFolder folder to save file.
+ * @param filename filename.
+ * @param isRange whether the breakpoint continuing.
+ * @param isDeleteOld find the same when the file is deleted after download, or on behalf of the download is complete, not to request the network.
+ * @return {@link DownloadRequest}.
+ * @see #createDownloadRequest(String, String, String, boolean, boolean)
+ */
+ public static DownloadRequest createDownloadRequest(String url, RequestMethod requestMethod, String fileFolder, String filename, boolean isRange, boolean isDeleteOld) {
+ return new RestDownloadRequest(url, requestMethod, fileFolder, filename, isRange, isDeleteOld);
+ }
+
+ /**
+ * Get version name of NoHttp.
+ *
+ * @return {@link String}.
+ */
+ public static String versionName() {
+ return "1.0.5";
+ }
+
+ /**
+ * Get version code of NoHttp.
+ *
+ * @return {@link Integer}.
+ */
+ public static int versionCode() {
+ return 105;
+ }
+
+ /**
+ * Initialization NoHttp, Should invoke on {@link Application#onCreate()}.
+ *
+ * @param application {@link Application}.
+ * @deprecated use {@link #initialize(Application)} instead.
+ */
+ @Deprecated
+ public static void init(Application application) {
+ initialize(application);
+ }
+
+ /**
+ * Initialization NoHttp, Should invoke on {@link Application#onCreate()}.
+ *
+ * @param application {@link Application}.
+ */
+ public static void initialize(Application application) {
+ if (sApplication == null) {
+ sApplication = application;
+ sCookieManager = new CookieManager(DiskCookieStore.INSTANCE, CookiePolicy.ACCEPT_ALL);
+
+ if (Build.VERSION.SDK_INT < AndroidVersion.KITKAT) {
+ System.setProperty("http.keepAlive", "false");
+ System.setProperty("http.maxConnections", String.valueOf(5));
+ }
+ }
+ }
+
+ /**
+ * Get application of app.
+ *
+ * @return {@link Application}.
+ */
+ public static Application getContext() {
+ if (sApplication == null)
+ throw new ExceptionInInitializerError("Please invoke NoHttp.initialize(Application) on Application#onCreate()");
+ return sApplication;
+ }
+
+ /**
+ * It will be called whenever the realm that the URL is pointing to requires authorization.
+ *
+ * @param passwordAuthentication passwordAuthentication which has to be set as default.
+ */
+ public static void setDefaultAuthenticator(final PasswordAuthentication passwordAuthentication) {
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return passwordAuthentication;
+ }
+ });
+ }
+
+ /**
+ * Set default connect timeout.
+ *
+ * @param timeout ms.
+ */
+ public static void setDefaultConnectTimeout(int timeout) {
+ sDefaultConnectTimeout = timeout;
+ }
+
+ /**
+ * Get default connect timeout.
+ *
+ * @return ms.
+ */
+ public static int getDefaultConnectTimeout() {
+ return sDefaultConnectTimeout;
+ }
+
+ /**
+ * Set default read timeout.
+ *
+ * @param timeout ms.
+ */
+ public static void setDefaultReadTimeout(int timeout) {
+ sDefaultReadTimeout = timeout;
+ }
+
+ /**
+ * Get default read timeout.
+ *
+ * @return ms.
+ */
+ public static int getDefaultReadTimeout() {
+ return sDefaultReadTimeout;
+ }
+
+ /**
+ * Set default request thread pool size.
+ *
+ * @param size count.
+ */
+ public static void setDefaultRequestThreadSize(int size) {
+ DEFAULT_REQUEST_THREAD_SIZE = size;
+ }
+
+ /**
+ * Get default request thread pool size.
+ *
+ * @return count.
+ */
+ public static int getDefaultRequestThreadSize() {
+ return DEFAULT_REQUEST_THREAD_SIZE;
+ }
+
+ /**
+ * Set default download thread pool size.
+ *
+ * @param size count.
+ */
+ public static void setDefaultDownloadThreadSize(int size) {
+ DEFAULT_DOWNLOAD_THREAD_SIZE = size;
+ }
+
+ /**
+ * Get default donwload thread pool size.
+ *
+ * @return count.
+ */
+ public static int getDefaultDownloadThreadSize() {
+ return DEFAULT_DOWNLOAD_THREAD_SIZE;
+ }
+
+ /**
+ * Set to enable cookies.
+ *
+ * @param enableCookie ture enable, false disenable.
+ */
+ public static void setEnableCookie(boolean enableCookie) {
+ isEnableCookie = enableCookie;
+ }
+
+ /**
+ * Get NoHttp Cookie manager by default.
+ *
+ * @return {@link CookieHandler}.
+ * @see #setDefaultCookieManager(CookieManager)
+ */
+ public static CookieManager getDefaultCookieManager() {
+ return sCookieManager;
+ }
+
+ /**
+ * Sets the system-wide cookie handler.
+ *
+ * @param cookieHandler {@link CookieHandler}.
+ * @see #getDefaultCookieManager()
+ */
+ public static void setDefaultCookieManager(CookieManager cookieHandler) {
+ if (cookieHandler == null)
+ throw new IllegalArgumentException("cookieHandler == null");
+ sCookieManager = cookieHandler;
+ }
+
+ /**
+ * Is enable cookie.
+ *
+ * @return true enable, false disenable.
+ */
+ public static boolean isEnableCookie() {
+ return isEnableCookie;
+ }
+
+ private NoHttp() {
+ }
+
+ /*
+ * =================================================
+ * || Instance ||
+ * =================================================
+ */
+
+ /**
+ * Default thread pool size for request queue.
+ */
+ private static RequestQueue sRequestQueueInstance;
+
+ /**
+ * Default thread pool size for request queue.
+ */
+ private static DownloadQueue sDownloadQueueInstance;
+
+ /**
+ * Get default RequestQueue.
+ *
+ * @return {@link RequestQueue}.
+ */
+ public static RequestQueue getRequestQueueInstance() {
+ synchronized (NoHttp.class) {
+ if (sRequestQueueInstance == null) {
+ sRequestQueueInstance = newRequestQueue();
+ }
+ }
+ return sRequestQueueInstance;
+ }
+
+ /**
+ * Get default DownloadQueue.
+ *
+ * @return {@link DownloadQueue}.
+ */
+ public static DownloadQueue getDownloadQueueInstance() {
+ synchronized (NoHttp.class) {
+ if (sDownloadQueueInstance == null) {
+ sDownloadQueueInstance = newDownloadQueue();
+ }
+ }
+ return sDownloadQueueInstance;
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/OnUploadListener.java b/nohttp/src/main/java/com/yolanda/nohttp/OnUploadListener.java
new file mode 100644
index 0000000..c6d61aa
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/OnUploadListener.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+/**
+ * Created in Jan 29, 2016 10:56:37 AM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface OnUploadListener {
+
+ /**
+ * At the start of the upload is invoked.
+ *
+ * @param what what of {@link FileBinary#setUploadListener(int, OnUploadListener)}.
+ * @see FileBinary#setUploadListener(int, OnUploadListener)
+ */
+ void onStart(int what);
+
+ /**
+ * Called when the upload was cancelled.
+ *
+ * @param what what of {@link FileBinary#setUploadListener(int, OnUploadListener)}.
+ * @see FileBinary#setUploadListener(int, OnUploadListener)
+ */
+ void onCancel(int what);
+
+ /**
+ * Invoked when the upload progress changes.
+ *
+ * @param what what of {@link FileBinary#setUploadListener(int, OnUploadListener)}.
+ * @param progress progress
+ * @see FileBinary#setUploadListener(int, OnUploadListener)
+ */
+ void onProgress(int what, int progress);
+
+ /**
+ * Upload is complete is invoked.
+ *
+ * @param what what of {@link FileBinary#setUploadListener(int, OnUploadListener)}.
+ * @see FileBinary#setUploadListener(int, OnUploadListener)
+ */
+ void onFinish(int what);
+
+ /**
+ * Upload error is called.
+ *
+ * @param what what of {@link FileBinary#setUploadListener(int, OnUploadListener)}. * @param exception upload is called when an error occurs.
+ * @param exception error type.
+ * @see BasicBinary#setUploadListener(int, OnUploadListener)
+ */
+ void onError(int what, Exception exception);
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/PosterHandler.java b/nohttp/src/main/java/com/yolanda/nohttp/PosterHandler.java
new file mode 100644
index 0000000..13e22ce
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/PosterHandler.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright © Yan Zhenjie. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.os.Handler;
+import android.os.Looper;
+
+/**
+ * Poster.
+ * Created on 2016/6/7.
+ *
+ * @author Yan Zhenjie.
+ */
+public final class PosterHandler extends Handler {
+
+ private static PosterHandler instance;
+
+ public static PosterHandler getInstance() {
+ synchronized (PosterHandler.class) {
+ if (instance == null) {
+ instance = new PosterHandler();
+ }
+ }
+ return instance;
+ }
+
+ private PosterHandler() {
+ super(Looper.getMainLooper());
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/Priority.java b/nohttp/src/main/java/com/yolanda/nohttp/Priority.java
new file mode 100644
index 0000000..d2c411b
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/Priority.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+/**
+ *
+ * Request priority.
+ *
+ * Created in Mar 20, 2016 11:40:03 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public enum Priority {
+ /**
+ * Low.
+ */
+ LOW,
+
+ /**
+ * Default.
+ */
+ DEFAULT,
+
+ /**
+ * Height.
+ */
+ HEIGHT,
+
+ /**
+ * The highest.
+ */
+ HIGHEST
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/RedirectHandler.java b/nohttp/src/main/java/com/yolanda/nohttp/RedirectHandler.java
new file mode 100644
index 0000000..3056d56
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/RedirectHandler.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+/**
+ * Created in Jan 31, 2016 8:45:37 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface RedirectHandler {
+
+ /**
+ * When the server's response code is 302 or 303 corresponding need to redirect is invoked.
+ *
+ * @param responseHeaders the service side head accordingly.
+ * @return {@link IBasicRequest}.
+ */
+ IBasicRequest onRedirect(Headers responseHeaders);
+
+ /**
+ * Whether to allow the redirection, if not redirect will not be {@code #onRedirect(Headers)} callback method, at the same time will ban NoHttp automatic redirection.If allowed to redirect, first
+ * call {@code #onRedirect(Headers)} method, if {@code #onRedirect(Headers)} method returns null, execute NoHttp default redirect.
+ *
+ * @param responseHeaders the service side head accordingly.
+ * @return returns true said allow redirection, returns false said do not allow the redirection.
+ */
+ boolean isDisallowedRedirect(Headers responseHeaders);
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/RequestMethod.java b/nohttp/src/main/java/com/yolanda/nohttp/RequestMethod.java
new file mode 100644
index 0000000..ff128e3
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/RequestMethod.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.os.Build;
+
+import com.yolanda.nohttp.tools.AndroidVersion;
+
+/**
+ *
+ * HTTP request method.
+ *
+ * Created in Oct 10, 2015 8:00:48 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public enum RequestMethod {
+
+ GET("GET"),
+
+ POST("POST"),
+
+ PUT("PUT"),
+
+ MOVE("MOVE"),
+
+ COPY("COPY"),
+
+ DELETE("DELETE"),
+
+ HEAD("HEAD"),
+
+ PATCH("PATCH"),
+
+ OPTIONS("OPTIONS"),
+
+ TRACE("TRACE"),
+
+ CONNECT("CONNECT");
+
+ private final String value;
+
+ RequestMethod(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return this.value;
+ }
+
+ public boolean allowRequestBody() {
+ boolean allowRequestBody = false;
+ switch (this) {
+ case POST:
+ case PUT:
+ case PATCH:
+ case DELETE:
+ allowRequestBody = true;
+ break;
+ }
+ if (Build.VERSION.SDK_INT < AndroidVersion.LOLLIPOP)
+ return allowRequestBody && this != DELETE;
+ return allowRequestBody;
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/SimpleUploadListener.java b/nohttp/src/main/java/com/yolanda/nohttp/SimpleUploadListener.java
new file mode 100644
index 0000000..7b6861b
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/SimpleUploadListener.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright © Yan Zhenjie. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+/**
+ * Created on 2016/6/7.
+ *
+ * @author Yan Zhenjie.
+ */
+public abstract class SimpleUploadListener implements OnUploadListener {
+ @Override
+ public void onStart(int what) {
+ }
+
+ @Override
+ public void onProgress(int what, int progress) {
+ }
+
+ @Override
+ public void onCancel(int what) {
+ }
+
+ @Override
+ public void onFinish(int what) {
+ }
+
+ @Override
+ public void onError(int what, Exception exception) {
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/UserAgent.java b/nohttp/src/main/java/com/yolanda/nohttp/UserAgent.java
new file mode 100644
index 0000000..3bc2a9b
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/UserAgent.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp;
+
+import android.os.Build;
+import android.text.TextUtils;
+
+import java.lang.reflect.Field;
+import java.util.Locale;
+
+/**
+ * Created in Oct 15, 2015 12:39:06 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class UserAgent {
+
+ /**
+ * UserAgent.
+ */
+ private static String userAgent;
+
+ /**
+ * Get the singleton UA.
+ *
+ * @return String.
+ * @see #newInstance()
+ */
+ public static String instance() {
+ if (TextUtils.isEmpty(userAgent))
+ userAgent = newInstance();
+ return userAgent;
+ }
+
+ /**
+ * Get User-Agent of System.
+ *
+ * @return UA.
+ */
+ public static String newInstance() {
+ String webUserAgent = null;
+ try {
+ Class> sysResCls = Class.forName("com.android.internal.R$string");
+ Field webUserAgentField = sysResCls.getDeclaredField("web_user_agent");
+ Integer resId = (Integer) webUserAgentField.get(null);
+ webUserAgent = NoHttp.getContext().getString(resId);
+ } catch (Exception e) {
+ // We have nothing to do
+ }
+ if (TextUtils.isEmpty(webUserAgent)) {
+ webUserAgent = "Mozilla/5.0 (Linux; U; Android %s) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 %sSafari/533.1";
+ }
+
+ Locale locale = Locale.getDefault();
+ StringBuffer buffer = new StringBuffer();
+ // Add version
+ final String version = Build.VERSION.RELEASE;
+ if (version.length() > 0) {
+ buffer.append(version);
+ } else {
+ // default to "1.0"
+ buffer.append("1.0");
+ }
+ buffer.append("; ");
+ final String language = locale.getLanguage();
+ if (language != null) {
+ buffer.append(language.toLowerCase(locale));
+ final String country = locale.getCountry();
+ if (!TextUtils.isEmpty(country)) {
+ buffer.append("-");
+ buffer.append(country.toLowerCase(locale));
+ }
+ } else {
+ // default to "en"
+ buffer.append("en");
+ }
+ // add the model for the release build
+ if ("REL".equals(Build.VERSION.CODENAME)) {
+ final String model = Build.MODEL;
+ if (model.length() > 0) {
+ buffer.append("; ");
+ buffer.append(model);
+ }
+ }
+ final String id = Build.ID;
+ if (id.length() > 0) {
+ buffer.append(" Build/");
+ buffer.append(id);
+ }
+ return String.format(webUserAgent, buffer, "Mobile ");
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/able/Cancelable.java b/nohttp/src/main/java/com/yolanda/nohttp/able/Cancelable.java
new file mode 100644
index 0000000..745a4a7
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/able/Cancelable.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.able;
+
+/**
+ * Cancel interface.
+ * Created in Dec 17, 2015 11:42:10 AM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface Cancelable {
+
+ /**
+ * Cancel handle.
+ */
+ void cancel();
+
+ /**
+ * Whether has been cancelled.
+ *
+ * @return true: canceled, false: there is no cancel.
+ */
+ boolean isCanceled();
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/able/Finishable.java b/nohttp/src/main/java/com/yolanda/nohttp/able/Finishable.java
new file mode 100644
index 0000000..bef6aad
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/able/Finishable.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.able;
+
+/**
+ * Finish interface.
+ * Created in Jan 13, 2016 10:34:48 PM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface Finishable {
+
+ /**
+ * Finish handle.
+ */
+ void finish();
+
+ /**
+ * Whether they have been completed.
+ *
+ * @return true: finished, false: unfinished.
+ */
+ boolean isFinished();
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/able/Queueable.java b/nohttp/src/main/java/com/yolanda/nohttp/able/Queueable.java
new file mode 100644
index 0000000..f083aef
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/able/Queueable.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.able;
+
+import java.util.concurrent.BlockingQueue;
+
+/**
+ * Queue interface.
+ * Created in Nov 12, 2015 5:59:29 PM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface Queueable {
+
+ /**
+ * Set the request in the queue.
+ *
+ * @param queue queue.
+ */
+ void setQueue(BlockingQueue> queue);
+
+ /**
+ * In the queue?
+ *
+ * @return true: in the queue, false: not in the queue.
+ */
+ boolean inQueue();
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/able/SignCancelable.java b/nohttp/src/main/java/com/yolanda/nohttp/able/SignCancelable.java
new file mode 100644
index 0000000..2d2943f
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/able/SignCancelable.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.able;
+
+/**
+ * According to the sign cancel interface.
+ * Created in Nov 12, 2015 5:11:56 PM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface SignCancelable {
+
+ /**
+ * Cancel operation by contrast the sign.
+ *
+ * @param sign an object that can be null.
+ */
+ void cancelBySign(Object sign);
+
+ /**
+ * Set cancel sign.
+ *
+ * @param object a object.
+ */
+ void setCancelSign(Object object);
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/able/Startable.java b/nohttp/src/main/java/com/yolanda/nohttp/able/Startable.java
new file mode 100644
index 0000000..131d205
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/able/Startable.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.able;
+
+/**
+ * Start interface.
+ * Created in Nov 12, 2015 5:03:54 PM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface Startable {
+
+ /**
+ * Start handle.
+ */
+ void start();
+
+ /**
+ * Whether has already begun.
+ *
+ * @return true: has already started, false: haven't started.
+ */
+ boolean isStarted();
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cache/Cache.java b/nohttp/src/main/java/com/yolanda/nohttp/cache/Cache.java
new file mode 100644
index 0000000..4444f39
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cache/Cache.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cache;
+
+/**
+ * Cache interface.
+ * Created in Dec 14, 2015 5:52:41 PM.
+ *
+ * @author Yan Zhenjie;
+ */
+public interface Cache {
+
+ /**
+ * According to the key to get the cache data.
+ *
+ * @param key unique key.
+ * @return cache data.
+ */
+ T get(String key);
+
+ /**
+ * According to the key to replace or save the data.
+ *
+ * @param key unique key.
+ * @param data cache data.
+ * @return cache data.
+ */
+ T replace(String key, T data);
+
+ /**
+ * According to the key to remove the data.
+ *
+ * @param key unique.
+ * @return cache data.
+ */
+ boolean remove(String key);
+
+ /**
+ * Clear all data.
+ *
+ * @return return to true to clear the failure when the false is cleared.
+ */
+ boolean clear();
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDisk.java b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDisk.java
new file mode 100644
index 0000000..7ce13e5
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDisk.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cache;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import com.yolanda.nohttp.NoHttp;
+import com.yolanda.nohttp.db.Field;
+
+/**
+ * Cache database operation class.
+ * Created in Jan 10, 2016 12:39:15 AM.
+ *
+ * @author Yan Zhenjie;
+ */
+class CacheDisk extends SQLiteOpenHelper implements Field {
+
+ public static final String DB_CACHE_NAME = "_nohttp_cache_db.db";
+ public static final int DB_CACHE_VERSION = 2;
+
+ public static final String TABLE_NAME = "cache_table";
+ public static final String KEY = "key";
+ public static final String HEAD = "head";
+ public static final String DATA = "data";
+ public static final String LOCAL_EXPIRES = "local_expires";
+
+ private static final String SQL_CREATE_TABLE = "CREATE TABLE cache_table(_id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT, head TEXT, data BLOB, local_expires INTEGER)";
+ private static final String SQL_CREATE_UNIQUE_INDEX = "CREATE UNIQUE INDEX cache_unique_index ON cache_table(\"key\")";
+ private static final String SQL_DELETE_TABLE = "DROP TABLE IF EXISTS cache_table";
+ private static final String SQL_DELETE_UNIQUE_INDEX = "DROP INDEX IF EXISTS cache_unique_index";
+
+ public CacheDisk() {
+ super(NoHttp.getContext(), DB_CACHE_NAME, null, DB_CACHE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.beginTransaction();
+ try {
+ db.execSQL(SQL_CREATE_TABLE);
+ db.execSQL(SQL_CREATE_UNIQUE_INDEX);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ if (newVersion != oldVersion) {
+ db.beginTransaction();
+ try {
+ db.execSQL(SQL_DELETE_TABLE);
+ db.execSQL(SQL_DELETE_UNIQUE_INDEX);
+ db.execSQL(SQL_CREATE_TABLE);
+ db.execSQL(SQL_CREATE_UNIQUE_INDEX);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+ }
+
+ public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ onUpgrade(db, oldVersion, newVersion);
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDiskManager.java b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDiskManager.java
new file mode 100644
index 0000000..1084ff8
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheDiskManager.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cache;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.db.DBManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Cache database manager.
+ * Created in Jan 10, 2016 12:42:29 AM.
+ *
+ * @author Yan Zhenjie;
+ */
+class CacheDiskManager extends DBManager {
+
+ private static DBManager _Instance;
+
+ private CacheDiskManager() {
+ super(new CacheDisk());
+ }
+
+ public synchronized static DBManager getInstance() {
+ if (_Instance == null) {
+ _Instance = new CacheDiskManager();
+ }
+ return _Instance;
+ }
+
+ @Override
+ public long replace(CacheEntity cacheEntity) {
+ SQLiteDatabase execute = getWriter();
+ ContentValues values = new ContentValues();
+ values.put(CacheDisk.KEY, cacheEntity.getKey());
+ values.put(CacheDisk.HEAD, cacheEntity.getResponseHeadersJson());
+ values.put(CacheDisk.DATA, cacheEntity.getData());
+ values.put(CacheDisk.LOCAL_EXPIRES, cacheEntity.getLocalExpire());
+ long id = -1;
+ try {
+ id = execute.replace(getTableName(), null, values);
+ } catch (Throwable e) {
+ Logger.e(e);
+ }
+ closeWriter(execute);
+ return id;
+ }
+
+ @Override
+ public List get(String querySql) {
+ SQLiteDatabase execute = getReader();
+
+ List cacheEntities = new ArrayList();
+ Cursor cursor = null;
+ try {
+ cursor = execute.rawQuery(querySql, null);
+ while (!cursor.isClosed() && cursor.moveToNext()) {
+ try {
+ CacheEntity cacheEntity = new CacheEntity();
+ int idIndex = cursor.getColumnIndex(CacheEntity.ID);
+ if (idIndex >= 0)
+ cacheEntity.setId(cursor.getInt(idIndex));
+
+ int keyIndex = cursor.getColumnIndex(CacheDisk.KEY);
+ if (keyIndex >= 0)
+ cacheEntity.setKey(cursor.getString(keyIndex));
+
+ int headIndex = cursor.getColumnIndex(CacheDisk.HEAD);
+ if (headIndex >= 0)
+ cacheEntity.setResponseHeadersJson(cursor.getString(headIndex));
+
+ int dataIndex = cursor.getColumnIndex(CacheDisk.DATA);
+ if (dataIndex >= 0)
+ cacheEntity.setData(cursor.getBlob(dataIndex));
+
+ int expiresIndex = cursor.getColumnIndex(CacheDisk.LOCAL_EXPIRES);
+ if (expiresIndex >= 0)
+ cacheEntity.setLocalExpire(cursor.getLong(expiresIndex));
+
+ cacheEntities.add(cacheEntity);
+ } catch (Throwable e) {
+ Logger.w(e);
+ }
+ }
+ } catch (Throwable e) {
+ Logger.e(e);
+ }
+ closeReader(execute, cursor);
+ return cacheEntities;
+ }
+
+ @Override
+ protected String getTableName() {
+ return CacheDisk.TABLE_NAME;
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheEntity.java b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheEntity.java
new file mode 100644
index 0000000..f4b5fd5
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cache/CacheEntity.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cache;
+
+import com.yolanda.nohttp.Headers;
+import com.yolanda.nohttp.HttpHeaders;
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.db.DBId;
+import com.yolanda.nohttp.db.Field;
+
+import org.json.JSONException;
+
+import java.io.Serializable;
+
+/**
+ * Cache entity class.
+ * Created in Jan 10, 2016 12:43:10 AM.
+ *
+ * @author Yan Zhenjie;
+ */
+public class CacheEntity implements DBId, Field, Serializable {
+
+ private static final long serialVersionUID = 12348534793L;
+
+ private long id;
+
+ /**
+ * The cache key.
+ */
+ private String key;
+ /**
+ * The server response headers.
+ */
+ private Headers responseHeaders = new HttpHeaders();
+
+ /**
+ * Cache data.
+ */
+ private byte[] data = {};
+
+ /**
+ * Cached in the local expiration time.
+ */
+ private long localExpire;
+
+ public CacheEntity() {
+ }
+
+ /**
+ * @param id id.
+ * @param key key.
+ * @param responseHeaders http response headers.
+ * @param data http response data.
+ * @param localExpire local expire time.
+ */
+ public CacheEntity(long id, String key, Headers responseHeaders, byte[] data, long localExpire) {
+ this.id = id;
+ this.key = key;
+ this.responseHeaders = responseHeaders;
+ this.data = data;
+ this.localExpire = localExpire;
+ }
+
+ /**
+ * @return the id.
+ */
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set.
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the key.
+ */
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * @param key the key to set.
+ */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ /**
+ * @return the responseHeaders.
+ */
+ public Headers getResponseHeaders() {
+ return responseHeaders;
+ }
+
+ /**
+ * @param responseHeaders the responseHeaders to set.
+ */
+ public void setResponseHeaders(Headers responseHeaders) {
+ this.responseHeaders = responseHeaders;
+ }
+
+ /**
+ * Set the {@link Headers#setJSONString(String)} can Parse the json data, format conforms to the corresponding Http header format.
+ *
+ * @param jsonString conform to the relevant head of the Json data format.
+ */
+ public void setResponseHeadersJson(String jsonString) {
+ try {
+ this.responseHeaders.setJSONString(jsonString);
+ } catch (JSONException e) {
+ Logger.e(e);
+ }
+ }
+
+ /**
+ * To get the json data format of the head.
+ *
+ * @return json.
+ */
+ public String getResponseHeadersJson() {
+ return this.responseHeaders.toJSONString();
+ }
+
+ /**
+ * @return the data.
+ */
+ public byte[] getData() {
+ return data;
+ }
+
+ /**
+ * @param data the data to set.
+ */
+ public void setData(byte[] data) {
+ this.data = data;
+ }
+
+ /**
+ * @return the localExpire.
+ */
+ public long getLocalExpire() {
+ return localExpire;
+ }
+
+ /**
+ * @param localExpire the localExpire to set.
+ */
+ public void setLocalExpire(long localExpire) {
+ this.localExpire = localExpire;
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cache/DiskCacheStore.java b/nohttp/src/main/java/com/yolanda/nohttp/cache/DiskCacheStore.java
new file mode 100644
index 0000000..83c5a46
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cache/DiskCacheStore.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cache;
+
+import com.yolanda.nohttp.db.DBManager;
+import com.yolanda.nohttp.db.Where;
+import com.yolanda.nohttp.db.Where.Options;
+
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Http cache interface implementation.
+ * Created in Jan 10, 2016 12:45:34 AM.
+ *
+ * @author Yan Zhenjie;
+ */
+public enum DiskCacheStore implements Cache {
+
+ INSTANCE;
+
+ /**
+ * Database sync lock.
+ */
+ private Lock mLock;
+ /**
+ * Database manager.
+ */
+ private DBManager mManager;
+
+ DiskCacheStore() {
+ mLock = new ReentrantLock();
+ mManager = CacheDiskManager.getInstance();
+ }
+
+ @Override
+ public CacheEntity get(String key) {
+ mLock.lock();
+ try {
+ Where where = new Where(CacheDisk.KEY, Options.EQUAL, key);
+ List cacheEntities = mManager.get(CacheDisk.ALL, where.get(), null, null, null);
+ return cacheEntities.size() > 0 ? cacheEntities.get(0) : null;
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public CacheEntity replace(String key, CacheEntity entrance) {
+ mLock.lock();
+ try {
+ entrance.setKey(key);
+ mManager.replace(entrance);
+ return entrance;
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean remove(String key) {
+ mLock.lock();
+ try {
+ if (key == null)
+ return true;
+ Where where = new Where(CacheDisk.KEY, Options.EQUAL, key);
+ return mManager.delete(where.toString());
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean clear() {
+ mLock.lock();
+ try {
+ return mManager.deleteAll();
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDisk.java b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDisk.java
new file mode 100644
index 0000000..fd89319
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDisk.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cookie;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import com.yolanda.nohttp.NoHttp;
+import com.yolanda.nohttp.db.Field;
+
+/**
+ * Cookie database operation class.
+ * Created in Dec 18, 2015 6:30:59 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+class CookieDisk extends SQLiteOpenHelper implements Field {
+
+ public static final String DB_COOKIE_NAME = "_nohttp_cookies_db.db";
+ public static final int DB_COOKIE_VERSION = 2;
+
+ public static final String TABLE_NAME = "cookies_table";
+ public static final String URI = "uri";
+ public static final String NAME = "name";
+ public static final String VALUE = "value";
+ public static final String COMMENT = "comment";
+ public static final String COMMENT_URL = "comment_url";
+ public static final String DISCARD = "discard";
+ public static final String DOMAIN = "domain";
+ public static final String EXPIRY = "expiry";
+ public static final String PATH = "path";
+ public static final String PORT_LIST = "port_list";
+ public static final String SECURE = "secure";
+ public static final String VERSION = "version";
+
+ private static final String SQL_CREATE_TABLE = "CREATE TABLE cookies_table(_id INTEGER PRIMARY KEY AUTOINCREMENT, uri TEXT, name TEXT, value TEXT, comment TEXT, comment_url TEXT, discard TEXT, domain TEXT, expiry INTEGER, path TEXT, port_list TEXT, secure TEXT, version INTEGER)";
+ private static final String SQL_CREATE_UNIQUE_INDEX = "CREATE UNIQUE INDEX cookie_unique_index ON cookies_table(\"name\", \"domain\", \"path\")";
+ private static final String SQL_DELETE_TABLE = "DROP TABLE IF EXISTS cookies_table";
+ private static final String SQL_DELETE_UNIQUE_INDEX = "DROP INDEX IF EXISTS cookie_unique_index";
+
+ public CookieDisk() {
+ super(NoHttp.getContext(), DB_COOKIE_NAME, null, DB_COOKIE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.beginTransaction();
+ try {
+ db.execSQL(SQL_CREATE_TABLE);
+ db.execSQL(SQL_CREATE_UNIQUE_INDEX);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ if (newVersion != oldVersion) {
+ db.beginTransaction();
+ try {
+ db.execSQL(SQL_DELETE_TABLE);
+ db.execSQL(SQL_DELETE_UNIQUE_INDEX);
+ db.execSQL(SQL_CREATE_TABLE);
+ db.execSQL(SQL_CREATE_UNIQUE_INDEX);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ }
+ }
+
+ public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ onUpgrade(db, oldVersion, newVersion);
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDiskManager.java b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDiskManager.java
new file mode 100644
index 0000000..a2f1afc
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieDiskManager.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cookie;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.db.DBManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Cookie database manager.
+ * Created in Dec 18, 2015 7:01:31 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+class CookieDiskManager extends DBManager {
+
+ private static DBManager _Instance;
+
+ private CookieDiskManager() {
+ super(new CookieDisk());
+ }
+
+ public synchronized static DBManager getInstance() {
+ if (_Instance == null)
+ _Instance = new CookieDiskManager();
+ return _Instance;
+ }
+
+ /**
+ * Add or update by index(name, domain, path).
+ *
+ * @param cookie cookie entity.
+ */
+ @Override
+ public long replace(CookieEntity cookie) {
+ SQLiteDatabase execute = getWriter();
+ ContentValues values = new ContentValues();
+ values.put(CookieDisk.URI, cookie.getUri());
+ values.put(CookieDisk.NAME, cookie.getName());
+ values.put(CookieDisk.VALUE, cookie.getValue());
+ values.put(CookieDisk.COMMENT, cookie.getComment());
+ values.put(CookieDisk.COMMENT_URL, cookie.getCommentURL());
+ values.put(CookieDisk.DISCARD, String.valueOf(cookie.isDiscard()));
+ values.put(CookieDisk.DOMAIN, cookie.getDomain());
+ values.put(CookieDisk.EXPIRY, cookie.getExpiry());
+ values.put(CookieDisk.PATH, cookie.getPath());
+ values.put(CookieDisk.PORT_LIST, cookie.getPortList());
+ values.put(CookieDisk.SECURE, String.valueOf(cookie.isSecure()));
+ values.put(CookieDisk.VERSION, cookie.getVersion());
+ long id = -1;
+ try {
+ print(values.toString());
+ id = execute.replace(CookieDisk.TABLE_NAME, null, values);
+ } catch (Throwable e) {
+ Logger.w(e);
+ }
+ closeWriter(execute);
+ return id;
+ }
+
+ @Override
+ public List get(String querySql) {
+ SQLiteDatabase execute = getReader();
+
+ List cookies = new ArrayList();
+ Cursor cursor = null;
+ try {
+ cursor = execute.rawQuery(querySql, null);
+ while (!cursor.isClosed() && cursor.moveToNext()) {
+ try {
+ CookieEntity cookie = new CookieEntity();
+ int idIndex = cursor.getColumnIndex(CookieDisk.ID);
+ if (idIndex >= 0)
+ cookie.setId(cursor.getInt(idIndex));
+
+ int uriIndex = cursor.getColumnIndex(CookieDisk.URI);
+ if (uriIndex >= 0)
+ cookie.setUri(cursor.getString(uriIndex));
+
+ int nameIndex = cursor.getColumnIndex(CookieDisk.NAME);
+ if (nameIndex >= 0)
+ cookie.setName(cursor.getString(nameIndex));
+
+ int valueIndex = cursor.getColumnIndex(CookieDisk.VALUE);
+ if (valueIndex >= 0)
+ cookie.setValue(cursor.getString(valueIndex));
+
+ int commentIndex = cursor.getColumnIndex(CookieDisk.COMMENT);
+ if (commentIndex >= 0)
+ cookie.setComment(cursor.getString(commentIndex));
+
+ int commentUriIndex = cursor.getColumnIndex(CookieDisk.COMMENT_URL);
+ if (commentUriIndex >= 0)
+ cookie.setCommentURL(cursor.getString(commentUriIndex));
+
+ int discardIndex = cursor.getColumnIndex(CookieDisk.DISCARD);
+ if (discardIndex >= 0)
+ cookie.setDiscard("true".equals(cursor.getString(discardIndex)));
+
+ int domainIndex = cursor.getColumnIndex(CookieDisk.DOMAIN);
+ if (domainIndex >= 0)
+ cookie.setDomain(cursor.getString(domainIndex));
+
+ int expiryIndex = cursor.getColumnIndex(CookieDisk.EXPIRY);
+ if (expiryIndex >= 0)
+ cookie.setExpiry(cursor.getLong(expiryIndex));
+
+ int pathIndex = cursor.getColumnIndex(CookieDisk.PATH);
+ if (pathIndex >= 0)
+ cookie.setPath(cursor.getString(pathIndex));
+
+ int portListIndex = cursor.getColumnIndex(CookieDisk.PORT_LIST);
+ if (portListIndex >= 0)
+ cookie.setPortList(cursor.getString(portListIndex));
+
+ int secureIndex = cursor.getColumnIndex(CookieDisk.SECURE);
+ if (secureIndex >= 0)
+ cookie.setSecure("true".equals(cursor.getString(secureIndex)));
+
+ int versionIndex = cursor.getColumnIndex(CookieDisk.VERSION);
+ if (versionIndex >= 0)
+ cookie.setVersion(cursor.getInt(versionIndex));
+
+ print(cookie.toString());
+ cookies.add(cookie);
+ } catch (Throwable e) {
+ Logger.e(e);
+ }
+ }
+ } catch (Throwable e) {
+ Logger.e(e);
+ }
+ closeReader(execute, cursor);
+ return cookies;
+ }
+
+ @Override
+ protected String getTableName() {
+ return CookieDisk.TABLE_NAME;
+ }
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieEntity.java b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieEntity.java
new file mode 100644
index 0000000..502991a
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieEntity.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cookie;
+
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.db.DBId;
+import com.yolanda.nohttp.tools.HeaderUtil;
+
+import java.io.Serializable;
+import java.net.HttpCookie;
+import java.net.URI;
+
+/**
+ * Cookie entity.
+ * Created in Dec 17, 2015 7:21:16 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+class CookieEntity implements DBId, Serializable {
+
+ private static final long serialVersionUID = 6374381323722046732L;
+
+ private long id = -1;
+ private String uri; // cookie add by this uri.
+ private String name;
+ private String value;
+ private String comment;
+ private String commentURL;
+ private boolean discard;
+ private String domain;
+ private long expiry;
+ private String path;
+ private String portList;
+ private boolean secure;
+ private int version = 1;
+
+ public CookieEntity() {
+ }
+
+ /**
+ * Cookie building database entities.
+ *
+ * @param uri cookie corresponding uri.
+ * @param cookie cookie.
+ */
+ public CookieEntity(URI uri, HttpCookie cookie) {
+ this.uri = uri == null ? null : uri.toString();
+ this.name = cookie.getName();
+ this.value = cookie.getValue();
+ this.comment = cookie.getComment();
+ this.commentURL = cookie.getCommentURL();
+ this.discard = cookie.getDiscard();
+ this.domain = cookie.getDomain();
+ long maxAge = cookie.getMaxAge();
+ if (maxAge != -1 && maxAge > 0) {
+ this.expiry = (maxAge * 1000L) + System.currentTimeMillis();
+ if (this.expiry < 0L) // 溢出
+ this.expiry = HeaderUtil.getMaxExpiryMillis();
+ } else
+ this.expiry = -1L;
+
+ this.path = cookie.getPath();
+ if (!TextUtils.isEmpty(path) && path.length() > 1 && path.endsWith("/")) {
+ this.path = path.substring(0, path.length() - 1);
+ }
+ this.portList = cookie.getPortlist();
+ this.secure = cookie.getSecure();
+ this.version = cookie.getVersion();
+ }
+
+ /**
+ * Into {@link HttpCookie}.
+ *
+ * @return {@link HttpCookie}.
+ */
+ public HttpCookie toHttpCookie() {
+ HttpCookie cookie = new HttpCookie(name, value);
+ cookie.setComment(comment);
+ cookie.setCommentURL(commentURL);
+ cookie.setDiscard(discard);
+ cookie.setDomain(domain);
+ if (expiry == -1L)
+ cookie.setMaxAge(-1L);
+ else
+ cookie.setMaxAge((expiry - System.currentTimeMillis()) / 1000L);
+ cookie.setPath(path);
+ cookie.setPortlist(portList);
+ cookie.setSecure(secure);
+ cookie.setVersion(version);
+ return cookie;
+ }
+
+ /**
+ * @return the id.
+ */
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set.
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the uri.
+ */
+ public String getUri() {
+ return uri;
+ }
+
+ /**
+ * @param uri the uri to set.
+ */
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ /**
+ * @return the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the value.
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * @param value the value to set.
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * @return the comment.
+ */
+ public String getComment() {
+ return comment;
+ }
+
+ /**
+ * @param comment the comment to set.
+ */
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ /**
+ * @return the commentURL.
+ */
+ public String getCommentURL() {
+ return commentURL;
+ }
+
+ /**
+ * @param commentURL the commentURL to set.
+ */
+ public void setCommentURL(String commentURL) {
+ this.commentURL = commentURL;
+ }
+
+ /**
+ * @return the discard.
+ */
+ public boolean isDiscard() {
+ return discard;
+ }
+
+ /**
+ * @param discard the discard to set.
+ */
+ public void setDiscard(boolean discard) {
+ this.discard = discard;
+ }
+
+ /**
+ * @return the domain.
+ */
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * @param domain the domain to set.
+ */
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ /**
+ * @return the expiry.
+ */
+ public long getExpiry() {
+ return expiry;
+ }
+
+ /**
+ * @param expiry the expiry to set.
+ */
+ public void setExpiry(long expiry) {
+ this.expiry = expiry;
+ }
+
+ /**
+ * @return the path.
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /**
+ * @param path the path to set.
+ */
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ /**
+ * @return the portList.
+ */
+ public String getPortList() {
+ return portList;
+ }
+
+ /**
+ * @param portList the portList to set.
+ */
+ public void setPortList(String portList) {
+ this.portList = portList;
+ }
+
+ /**
+ * @return the secure.
+ */
+ public boolean isSecure() {
+ return secure;
+ }
+
+ /**
+ * @param secure the secure to set.
+ */
+ public void setSecure(boolean secure) {
+ this.secure = secure;
+ }
+
+ /**
+ * @return the version.
+ */
+ public int getVersion() {
+ return version;
+ }
+
+ /**
+ * @param version the version to set.
+ */
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+ /**
+ * Cookie is expired ?
+ *
+ * @return expired return true, other wise false.
+ */
+ public boolean isExpired() {
+ return expiry != -1L && expiry < System.currentTimeMillis();
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieStoreListener.java b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieStoreListener.java
new file mode 100644
index 0000000..65f8cee
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cookie/CookieStoreListener.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cookie;
+
+import java.net.HttpCookie;
+import java.net.URI;
+
+/**
+ * The listener when save or delete the Cookie.
+ * Created in Dec 22, 2015 8:23:49 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface CookieStoreListener {
+
+ /**
+ * When saving a Cookie callback.
+ *
+ * @param uri cookie corresponding uri.
+ * @param cookie {@link HttpCookie}.
+ */
+ void onSaveCookie(URI uri, HttpCookie cookie);
+
+ /**
+ * The callback when deleting cookies.
+ *
+ * @param uri cookie corresponding uri.
+ * @param cookie {@link HttpCookie}.
+ */
+ void onRemoveCookie(URI uri, HttpCookie cookie);
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/cookie/DiskCookieStore.java b/nohttp/src/main/java/com/yolanda/nohttp/cookie/DiskCookieStore.java
new file mode 100644
index 0000000..022481c
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/cookie/DiskCookieStore.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.cookie;
+
+import android.text.TextUtils;
+
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.db.DBManager;
+import com.yolanda.nohttp.db.Field;
+import com.yolanda.nohttp.db.Where;
+import com.yolanda.nohttp.db.Where.Options;
+
+import java.net.CookieStore;
+import java.net.HttpCookie;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created in Dec 17, 2015 7:20:52 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public enum DiskCookieStore implements CookieStore {
+
+ INSTANCE;
+
+ /**
+ * Cookie max count in disk.
+ */
+ private final static int MAX_COOKIE_SIZE = 8888;
+ /**
+ * Database sync lock.
+ */
+ private Lock mLock;
+ /**
+ * Database Manager.
+ */
+ private DBManager mManager;
+ /**
+ * When Add and remove cookie notify.
+ */
+ private CookieStoreListener mCookieStoreListener;
+
+ DiskCookieStore() {
+ mLock = new ReentrantLock();
+ mManager = CookieDiskManager.getInstance();
+
+ // Delete temp cookie.
+ Where where = new Where(CookieDisk.EXPIRY, Options.EQUAL, -1L);
+ mManager.delete(where.get());
+ }
+
+ /**
+ * The callback when adding and deleting cookies.
+ *
+ * @param cookieStoreListener {@link CookieStoreListener}.
+ */
+ public void setCookieStoreListener(CookieStoreListener cookieStoreListener) {
+ mCookieStoreListener = cookieStoreListener;
+ }
+
+ @Override
+ public void add(URI uri, HttpCookie cookie) {
+ mLock.lock();
+ try {
+ if (uri != null && cookie != null) {
+ uri = getEffectiveURI(uri);
+ if (mCookieStoreListener != null)
+ mCookieStoreListener.onSaveCookie(uri, cookie);
+ mManager.replace(new CookieEntity(uri, cookie));
+ trimSize();
+ }
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public List get(URI uri) {
+ mLock.lock();
+ try {
+ if (uri == null)
+ return Collections.emptyList();
+
+ uri = getEffectiveURI(uri);
+ Where where = new Where();
+
+ String host = uri.getHost();
+ if (!TextUtils.isEmpty(host)) {
+ Where subWhere = new Where(CookieDisk.DOMAIN, Options.EQUAL, host).or(CookieDisk.DOMAIN, Options.EQUAL, "." + host);
+
+ int firstDot = host.indexOf(".");
+ int lastDot = host.lastIndexOf(".");
+ if (firstDot > 0 && lastDot > firstDot) {
+ String domain = host.substring(firstDot, host.length());
+ if (!TextUtils.isEmpty(domain)) {
+ subWhere.or(CookieDisk.DOMAIN, Options.EQUAL, domain);
+ }
+ }
+ where.set(subWhere.get());
+ }
+
+ String path = uri.getPath();
+ if (!TextUtils.isEmpty(path)) {
+ Where subWhere = new Where(CookieDisk.PATH, Options.EQUAL, path).or(CookieDisk.PATH, Options.EQUAL, "/").orNull(CookieDisk.PATH);
+ int lastSplit = path.lastIndexOf("/");
+ while (lastSplit > 0) {
+ path = path.substring(0, lastSplit);
+ subWhere.or(CookieDisk.PATH, Options.EQUAL, path);
+ lastSplit = path.lastIndexOf("/");
+ }
+ subWhere.bracket();
+ where.and(subWhere);
+ }
+
+ where.or(CookieDisk.URI, Options.EQUAL, uri.toString());
+
+ List cookieList = mManager.get(Field.ALL, where.get(), null, null, null);
+ List returnedCookies = new ArrayList();
+ for (CookieEntity cookieEntity : cookieList)
+ if (!cookieEntity.isExpired())
+ returnedCookies.add(cookieEntity.toHttpCookie());
+ return returnedCookies;
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public List getCookies() {
+ mLock.lock();
+ try {
+ List rt = new ArrayList();
+ List cookieEntityList = mManager.getAll();
+ for (CookieEntity cookieEntity : cookieEntityList)
+ if (!cookieEntity.isExpired())
+ rt.add(cookieEntity.toHttpCookie());
+ return rt;
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public List getURIs() {
+ mLock.lock();
+ try {
+ List uris = new ArrayList();
+ List uriList = mManager.getAll(CookieDisk.URI);
+ for (CookieEntity cookie : uriList) {
+ String uri = cookie.getUri();
+ if (!TextUtils.isEmpty(uri))
+ try {
+ uris.add(new URI(uri));
+ } catch (Throwable e) {
+ Logger.w(e);
+ StringBuilder where = new StringBuilder(CookieDisk.URI).append('=').append(uri);
+ mManager.delete(where.toString());
+ }
+ }
+ return uris;
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean remove(URI uri, HttpCookie httpCookie) {
+ mLock.lock();
+ try {
+ if (httpCookie == null)
+ return true;
+ if (mCookieStoreListener != null)
+ mCookieStoreListener.onRemoveCookie(uri, httpCookie);
+ Where where = new Where(CookieDisk.NAME, Options.EQUAL, httpCookie.getName());
+
+ String domain = httpCookie.getDomain();
+ if (!TextUtils.isEmpty(domain))
+ where.and(CookieDisk.DOMAIN, Options.EQUAL, domain);
+
+ String path = httpCookie.getPath();
+ if (!TextUtils.isEmpty(path)) {
+ if (path.length() > 1 && path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ where.and(CookieDisk.PATH, Options.EQUAL, path);
+ }
+ return mManager.delete(where.toString());
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean removeAll() {
+ mLock.lock();
+ try {
+ return mManager.deleteAll();
+ } finally {
+ mLock.unlock();
+ }
+ }
+
+ /**
+ * Trim the Cookie list.
+ */
+ private void trimSize() {
+ int count = mManager.count();
+ if (count > MAX_COOKIE_SIZE + 10) {
+ List rmList = mManager.get(Field.ALL, null, null, Integer.toString(count - MAX_COOKIE_SIZE), null);
+ if (rmList != null)
+ mManager.delete(rmList);
+ }
+ }
+
+ /**
+ * Get effective URI.
+ *
+ * @param uri cookie corresponding uri.
+ */
+ private URI getEffectiveURI(final URI uri) {
+ URI effectiveURI;
+ try {
+ effectiveURI = new URI("http", uri.getHost(), uri.getPath(), null, null);
+ } catch (URISyntaxException e) {
+ effectiveURI = uri;
+ }
+ return effectiveURI;
+ }
+}
\ No newline at end of file
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/db/DBId.java b/nohttp/src/main/java/com/yolanda/nohttp/db/DBId.java
new file mode 100644
index 0000000..9eff3a0
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/db/DBId.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.db;
+
+/**
+ * The entity class id of the interface.
+ * Created in Jan 10, 2016 11:03:21 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface DBId {
+
+ /**
+ * Get the object id.
+ *
+ * @return {@link Long}.
+ */
+ long getId();
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/db/DBManager.java b/nohttp/src/main/java/com/yolanda/nohttp/db/DBManager.java
new file mode 100644
index 0000000..63d145f
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/db/DBManager.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.db;
+
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.yolanda.nohttp.Logger;
+
+import java.util.List;
+
+/**
+ * Database management generic class, has realized the basic functions, inheritance of the subclass only need to implement {@link #replace(DBId)}, {@link #get(String)} and
+ * {@link #getTableName()}.
+ * Created in Jan 10, 2016 8:18:28 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public abstract class DBManager {
+
+ private static final boolean DEBUG = false;
+ /**
+ * A helper class to manage database creation and version management.
+ */
+ private SQLiteOpenHelper disk;
+
+ public DBManager(SQLiteOpenHelper disk) {
+ this.disk = disk;
+ }
+
+ /**
+ * Open the database when the read data.
+ *
+ * @return {@link SQLiteDatabase}.
+ */
+ protected final SQLiteDatabase getReader() {
+ return disk.getReadableDatabase();
+ }
+
+ /**
+ * Open the database when the write data.
+ *
+ * @return {@link SQLiteDatabase}.
+ */
+ protected final SQLiteDatabase getWriter() {
+ return disk.getWritableDatabase();
+ }
+
+ /**
+ * Close the database when reading data.
+ *
+ * @param execute {@link SQLiteDatabase}.
+ * @param cursor {@link Cursor}.
+ */
+ protected final void closeReader(SQLiteDatabase execute, Cursor cursor) {
+ if (cursor != null && !cursor.isClosed())
+ cursor.close();
+ closeWriter(execute);
+ }
+
+ /**
+ * Close the database when writing data.
+ *
+ * @param execute {@link SQLiteDatabase}.
+ */
+ protected final void closeWriter(SQLiteDatabase execute) {
+ if (execute != null && execute.isOpen()) {
+ execute.close();
+ }
+ }
+
+ /**
+ * The query id number.
+ *
+ * @return int format.
+ */
+ public final int count() {
+ return countColumn(Field.ID);
+ }
+
+ /**
+ * According to the "column" query "column" number.
+ *
+ * @param columnName ColumnName.
+ * @return column count.
+ */
+ public final int countColumn(String columnName) {
+ StringBuilder sqlBuild = new StringBuilder("SELECT COUNT(").append(columnName).append(") FROM ").append(getTableName());
+ return count(sqlBuild.toString());
+ }
+
+ /**
+ * According to the "column" query number.
+ *
+ * @param sql sql.
+ * @return count
+ */
+ public final int count(String sql) {
+ SQLiteDatabase execute = getReader();
+ print(sql);
+ Cursor cursor = execute.rawQuery(sql, null);
+ int count = 0;
+ if (cursor.moveToNext()) {
+ count = cursor.getInt(0);
+ }
+ closeReader(execute, cursor);
+ return count;
+ }
+
+ /**
+ * Delete all data.
+ *
+ * @return a boolean value, whether deleted successfully.
+ */
+ public final boolean deleteAll() {
+ return delete("1=1");
+ }
+
+ /**
+ * Must have the id.
+ *
+ * @param ts delete the queue list.
+ * @return a boolean value, whether deleted successfully.
+ */
+ public final boolean delete(List ts) {
+ StringBuilder where = new StringBuilder(Field.ID).append(" IN(");
+ for (T t : ts) {
+ long id = t.getId();
+ if (id > 0) {
+ where.append(',');
+ where.append(id);
+ }
+ }
+ where.append(')');
+ if (',' == where.charAt(6))
+ where.deleteCharAt(6);
+ return delete(where.toString());
+ }
+
+ /**
+ * According to the where to delete data.
+ *
+ * @param where performs conditional.
+ * @return a boolean value, whether deleted successfully.
+ */
+ public final boolean delete(String where) {
+ if (TextUtils.isEmpty(where))
+ return true;
+ SQLiteDatabase execute = getWriter();
+ StringBuilder sqlBuild = new StringBuilder("DELETE FROM ").append(getTableName()).append(" WHERE ").append(where);
+ boolean result = true;
+ try {
+ String sql = sqlBuild.toString();
+ print(sql);
+ execute.execSQL(sql);
+ } catch (SQLException e) {
+ Logger.e(e);
+ result = false;
+ }
+ closeWriter(execute);
+ return result;
+ }
+
+ /**
+ * Query all data.
+ *
+ * @return list data.
+ */
+ public final List getAll() {
+ return getAll(Field.ALL);
+ }
+
+ /**
+ * All the data query a column.
+ *
+ * @param columnName columnName.
+ * @return list data.
+ */
+ public final List getAll(String columnName) {
+ return get(columnName, null, null, null, null);
+ }
+
+ /**
+ * All the data query a column.
+ *
+ * @param columnName such as: {@code "*"}.
+ * @param where such as: {@code age > 20}.
+ * @param orderBy such as: {@code "age"}.
+ * @param limit such as. {@code '20'}.
+ * @param offset offset.
+ * @return list data.
+ */
+ public final List get(String columnName, String where, String orderBy, String limit, String offset) {
+ return get(getSelectSql(columnName, where, orderBy, limit, offset));
+ }
+
+ /**
+ * Create query sql
+ *
+ * @param columnName columnName.
+ * @param where where.
+ * @param orderBy orderBy.
+ * @param limit limit.
+ * @param offset offset.
+ * @return {@link String}.
+ */
+ private String getSelectSql(String columnName, String where, String orderBy, String limit, String offset) {
+ StringBuilder sqlBuild = new StringBuilder("SELECT ").append(columnName).append(" FROM ").append(getTableName());
+ if (!TextUtils.isEmpty(where)) {
+ sqlBuild.append(" WHERE ");
+ sqlBuild.append(where);
+ }
+ if (!TextUtils.isEmpty(orderBy)) {
+ sqlBuild.append(" ORDER BY ");
+ sqlBuild.append(orderBy);
+ }
+ if (!TextUtils.isEmpty(limit)) {
+ sqlBuild.append(" LIMIT ");
+ sqlBuild.append(limit);
+ }
+ if (!TextUtils.isEmpty(limit) && !TextUtils.isEmpty(offset)) {
+ sqlBuild.append(" OFFSET ");
+ sqlBuild.append(offset);
+ }
+ String sql = sqlBuild.toString();
+ print(sql);
+ return sqlBuild.toString();
+ }
+
+ /**
+ * According to the SQL query data list.
+ *
+ * @param querySql sql.
+ * @return list data.
+ */
+ public abstract List get(String querySql);
+
+ /**
+ * According to the unique index adds or updates a row data.
+ *
+ * @param t {@link T}.
+ * @return long.
+ */
+ public abstract long replace(T t);
+
+ /**
+ * Table name should be.
+ *
+ * @return table name.
+ */
+ protected abstract String getTableName();
+
+ /**
+ * Print the test data.
+ *
+ * @param print string.
+ */
+ protected void print(String print) {
+ if (DEBUG)
+ Log.d("NoHttp", print);
+ }
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/db/Field.java b/nohttp/src/main/java/com/yolanda/nohttp/db/Field.java
new file mode 100644
index 0000000..be3991f
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/db/Field.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.db;
+
+/**
+ * General field class.
+ * Created in Jan 11, 2016 12:46:38 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public interface Field {
+
+ String ID = "_id";
+
+ String ALL = "*";
+
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/db/Where.java b/nohttp/src/main/java/com/yolanda/nohttp/db/Where.java
new file mode 100644
index 0000000..1a28ac3
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/db/Where.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.db;
+
+import java.util.List;
+
+/**
+ * Created in Dec 19, 2015 4:16:24 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class Where {
+
+ /**
+ * Structure where the symbols.
+ */
+ public enum Options {
+
+ IN("IN"), EQUAL("="), NO_EQUAL("!="), ThAN_LARGE(">"), THAN_SMALL("<");
+
+ private String value;
+
+ Options(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public final String toString() {
+ return this.value;
+ }
+ }
+
+ private StringBuilder builder;
+
+ public Where() {
+ builder = new StringBuilder();
+ }
+
+ /**
+ * @param columnName columnName.
+ * @param op such as: {@code >, =, <, IN}, but it's come from {@link Options}.
+ * @param value {@link Character}, {@link Integer}, {@link Long}, {@link Short}, {@link Double}, {@link Float}.
+ */
+ public Where(CharSequence columnName, Options op, Object value) {
+ builder = new StringBuilder();
+ add(columnName, op, value);
+ }
+
+ public final Where clear() {
+ builder.delete(0, builder.length());
+ return this;
+ }
+
+ public final Where append(Object row) {
+ builder.append(row);
+ return this;
+ }
+
+ public final Where set(String row) {
+ clear().append(row);
+ return this;
+ }
+
+ public final Where isNull(CharSequence columnName) {
+ builder.append("\"").append(columnName).append("\" ").append("IS ").append("NULL");
+ return this;
+ }
+
+ private Where addColumnName(CharSequence columnName, Options op) {
+ builder.append("\"").append(columnName).append("\" ").append(op.toString()).append(' ');
+ return this;
+ }
+
+ /**
+ * @param columnName columnName.
+ * @param op such as: {@code >, =, <, IN}, but it's come from {@link Options}.
+ * @param value {@link Character}, {@link Integer}, {@link Long}, {@link Short}, {@link Double}, {@link Float}.
+ * @return {@link Where}.
+ */
+ public final Where add(CharSequence columnName, Options op, Object value) {
+ if (Options.EQUAL.equals(op) || Options.ThAN_LARGE.equals(op) || Options.THAN_SMALL.equals(op) || Options.NO_EQUAL.equals(op)) {
+ addColumnName(columnName, op);
+ if (isNumber(value))
+ builder.append(value);
+ else
+ builder.append("'").append(value).append("'");
+ } else if (Options.IN.equals(op) && value instanceof List>)
+ addColumnName(columnName, op).append(value).in((List>) value);
+ else
+ throw new IllegalArgumentException("Value is not supported by the data type");
+ return this;
+ }
+
+ private Where in(List values) {
+ builder.append(Options.IN).append(" (");
+ String sep = ", ";
+ for (T value : values) {
+ if (value instanceof CharSequence)
+ builder.append("'").append(value).append("'");
+ else if (value instanceof Integer || value instanceof Long || value instanceof Short)
+ builder.append(value);
+ builder.append(sep);
+ }
+ if (builder.lastIndexOf(sep) > 0)
+ builder.delete(builder.length() - 2, builder.length());
+ builder.append(")");
+ return this;
+ }
+
+ private Where and() {
+ if (builder.length() > 0)
+ builder.append(" AND ");
+ return this;
+ }
+
+ /**
+ * @param columnName columnName.
+ * @param op such as: {@code >, =, <, IN}, but it's come from {@link Options}.
+ * @param value {@link Character}, {@link Integer}, {@link Long}, {@link Short}, {@link Double}, {@link Float}.
+ * @return {@link Where}.
+ */
+ public final Where and(CharSequence columnName, Options op, Object value) {
+ return and().add(columnName, op, value);
+ }
+
+ public final Where andNull(CharSequence columnName) {
+ return and().isNull(columnName);
+ }
+
+ public final Where and(Where where) {
+ return and().append(where);
+ }
+
+ private Where or() {
+ if (builder.length() > 0)
+ builder.append(" OR ");
+ return this;
+ }
+
+ /**
+ * @param columnName columnName.
+ * @param op such as: {@code >, =, <, IN}, but it's come from {@link Options}.
+ * @param value {@link Character}, {@link Integer}, {@link Long}, {@link Short}, {@link Double}, {@link Float}.
+ * @return {@link Where}.
+ */
+ public final Where or(CharSequence columnName, Options op, Object value) {
+ return or().add(columnName, op, value);
+ }
+
+ public final Where orNull(CharSequence columnName) {
+ return or().isNull(columnName);
+ }
+
+ public final Where or(Where where) {
+ return or().append(where);
+ }
+
+ public final Where bracket() {
+ return insert(0, "(").append(')');
+ }
+
+ public final Where insert(int index, CharSequence s) {
+ builder.insert(index, s);
+ return this;
+ }
+
+ public final String get() {
+ return builder.toString();
+ }
+
+ @Override
+ public String toString() {
+ return builder.toString();
+ }
+
+ public static boolean isNumber(Object value) {
+ return value != null && (value instanceof Character || value instanceof Integer || value instanceof Long || value instanceof Short || value instanceof Double || value instanceof Float);
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadConnection.java b/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadConnection.java
new file mode 100644
index 0000000..1fbb093
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadConnection.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.download;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.yolanda.nohttp.BasicConnection;
+import com.yolanda.nohttp.Connection;
+import com.yolanda.nohttp.Headers;
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.error.ArgumentError;
+import com.yolanda.nohttp.error.NetworkError;
+import com.yolanda.nohttp.error.ServerError;
+import com.yolanda.nohttp.error.StorageReadWriteError;
+import com.yolanda.nohttp.error.StorageSpaceNotEnoughError;
+import com.yolanda.nohttp.error.TimeoutError;
+import com.yolanda.nohttp.error.URLError;
+import com.yolanda.nohttp.error.UnKnownHostError;
+import com.yolanda.nohttp.tools.HeaderUtil;
+import com.yolanda.nohttp.tools.IOUtils;
+import com.yolanda.nohttp.tools.NetUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
+import java.net.URLDecoder;
+import java.net.UnknownHostException;
+
+/**
+ *
+ * The network layer to download missions.
+ *
+ * Created in Jul 31, 2015 9:11:55 AM.
+ *
+ * @author Yan Zhenjie.
+ */
+public class DownloadConnection extends BasicConnection implements Downloader {
+
+ public DownloadConnection() {
+ }
+
+ @Override
+ public void download(int what, DownloadRequest downloadRequest, DownloadListener downloadListener) {
+ Connection connection = null;
+ if (downloadRequest == null)
+ throw new IllegalArgumentException("downloadRequest == null.");
+ if (downloadListener == null)
+ throw new IllegalArgumentException("downloadListener == null.");
+
+ RandomAccessFile randomAccessFile = null;
+ String savePathDir = downloadRequest.getFileDir();
+ String fileName = downloadRequest.getFileName();
+ try {
+ if (TextUtils.isEmpty(savePathDir))
+ throw new ArgumentError("Error saving the location of the target file, please check whether fileFolder parameter is empty.");
+
+ File file = new File(savePathDir);
+ if (file.exists() && file.isFile())
+ IOUtils.delFileOrFolder(file);
+
+ if (!IOUtils.createFolder(savePathDir))
+ throw new StorageReadWriteError("Failed to create the folder " + savePathDir + ", please check storage devices.");
+
+ if (!NetUtil.isNetworkAvailable())
+ throw new NetworkError("Network is not available.");
+
+ if (TextUtils.isEmpty(fileName))// aotu named.
+ fileName = Long.toString(System.currentTimeMillis());
+
+ File tempFile = new File(savePathDir, fileName + ".nohttp");
+ // 根据临时文件处理断点头。
+ long rangeSize = 0L;// 断点开始处。
+ if (tempFile.exists()) {
+ if (tempFile.isDirectory())
+ try {
+ IOUtils.createNewFile(tempFile);
+ } catch (Throwable e) {
+ throw new StorageReadWriteError("Failed to create the file, please check storage devices.");
+ }
+
+ if (downloadRequest.isRange()) {
+ rangeSize = tempFile.length();
+ // 例如:从1024开始下载:Range:bytes=1024-。
+ downloadRequest.setHeader("Range", "bytes=" + rangeSize + "-");
+ } else {
+ tempFile.delete();
+ }
+ }
+
+ // 连接服务器。
+ connection = getConnection(downloadRequest);
+ Exception exception = connection.exception();
+ if (exception != null)
+ throw exception;
+
+ Logger.i("----------Response Start----------");
+ Headers responseHeaders = connection.responseHeaders();
+ int responseCode = responseHeaders.getResponseCode();
+
+ // get filename from server.
+ if (downloadRequest.autoNameByHead()) {
+ String contentDisposition = responseHeaders.getContentDisposition();
+ if (!TextUtils.isEmpty(contentDisposition)) {
+ fileName = HeaderUtil.parseHeadValue(contentDisposition, "filename", null);
+ if (!TextUtils.isEmpty(fileName)) {
+ fileName = URLDecoder.decode(fileName, downloadRequest.getParamsEncoding());
+ if (fileName.startsWith("\"") && fileName.endsWith("\"")) {
+ fileName = fileName.substring(1, fileName.length() - 1);
+ }
+ }
+ }
+
+ if (TextUtils.isEmpty(fileName)) {
+ // handle redirect url.
+ String tempUrl = connection.getURL().toString();
+ if (TextUtils.isEmpty(tempUrl))
+ tempUrl = downloadRequest.url();
+ String[] slash = tempUrl.split("/");
+ fileName = slash[slash.length - 1];
+ int paramIndex = fileName.indexOf("?");
+ if (paramIndex > 0) {
+ fileName = fileName.substring(0, paramIndex);
+ }
+ }
+ }
+
+ InputStream serverStream = connection.serverStream();
+ if (responseCode >= 400) {
+ ServerError error = new ServerError("Download fails, the server response code is " + responseCode + ": " + downloadRequest.url());
+ error.setErrorBody(IOUtils.toString(serverStream));
+ throw error;
+ } else {
+ long contentLength = 0;
+ // 文件总大小
+ if (responseCode == 206) {
+ // Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]。
+ String range = responseHeaders.getContentRange(); // 事例:Accept-Range:bytes 1024-2047/2048。
+ try {
+ contentLength = Long.parseLong(range.substring(range.indexOf('/') + 1));// 截取'/'之后的总大小。
+ } catch (Throwable e) {
+ throw new ServerError("ResponseCode is 206, but content-Range error in Server HTTP header information: " + range + ".");
+ }
+ } else if (responseCode == 200) {
+ contentLength = responseHeaders.getContentLength();// 直接下载。
+ rangeSize = 0L; // 没有contentLength时断点移动到头部。
+ } else if (responseCode == 304) {
+ int httpContentLength = responseHeaders.getContentLength();
+ downloadListener.onStart(what, true, httpContentLength, responseHeaders, httpContentLength);
+ downloadListener.onProgress(what, 100, httpContentLength);
+ Logger.d("-------Download finish-------");
+ downloadListener.onFinish(what, savePathDir + File.separator + fileName);
+ return;
+ }
+
+ // 验证文件已经存在。
+ File lastFile = new File(savePathDir, fileName);
+ if (lastFile.exists()) {
+ if (downloadRequest.isDeleteOld())
+ lastFile.delete();
+ else {
+ downloadListener.onStart(what, true, lastFile.length(), responseHeaders, lastFile.length());
+ downloadListener.onProgress(what, 100, lastFile.length());
+ Logger.d("-------Download finish-------");
+ downloadListener.onFinish(what, lastFile.getAbsolutePath());
+ return;
+ }
+ }
+
+ // 需要重新下载,生成临时文件。
+ if ((responseCode == 200 || responseCode >= 400) && !IOUtils.createNewFile(tempFile))
+ throw new StorageReadWriteError("Failed to create the file, please check storage devices.");
+
+ if (IOUtils.getDirSize(savePathDir) < contentLength)
+ throw new StorageSpaceNotEnoughError("The folder is not enough space to save the downloaded file: " + savePathDir + ".");
+
+ if (downloadRequest.isCanceled()) {
+ Log.i("NoHttpDownloader", "Download request is canceled.");
+ downloadListener.onCancel(what);
+ return;
+ }
+
+ // 通知开始下载了。
+ Logger.d("-------Download start-------");
+ downloadListener.onStart(what, rangeSize > 0, rangeSize, responseHeaders, contentLength);
+
+ randomAccessFile = new RandomAccessFile(tempFile, "rws");
+ randomAccessFile.seek(rangeSize);
+
+ byte[] buffer = new byte[4096];
+ int len;
+
+ int oldProgress = 0;// 旧的进度记录,防止重复通知。
+ long count = rangeSize;// 追加目前已经下载的进度。
+
+ while (((len = serverStream.read(buffer)) != -1)) {
+ if (downloadRequest.isCanceled()) {
+ Log.i("NoHttpDownloader", "Download request is canceled.");
+ downloadListener.onCancel(what);
+ break;
+ } else {
+ randomAccessFile.write(buffer, 0, len);
+ count += len;
+ if (contentLength != 0) {
+ int progress = (int) (count * 100 / contentLength);
+ if ((0 == progress % 2 || 0 == progress % 3 || 0 == progress % 5 || 0 == progress % 7) && oldProgress != progress) {
+ oldProgress = progress;
+ downloadListener.onProgress(what, oldProgress, count);// 进度通知。
+ }
+ }
+ }
+ }
+ if (!downloadRequest.isCanceled() && (tempFile.length() == contentLength || contentLength == 0)) {
+ tempFile.renameTo(lastFile);
+ Logger.d("-------Download finish-------");
+ downloadListener.onFinish(what, lastFile.getAbsolutePath());
+ }
+ }
+ } catch (MalformedURLException e) {
+ Logger.e(e);
+ downloadListener.onDownloadError(what, new URLError(e.getMessage()));
+ } catch (UnknownHostException e) {
+ Logger.e(e);
+ downloadListener.onDownloadError(what, new UnKnownHostError(e.getMessage()));
+ } catch (SocketTimeoutException e) {
+ Logger.e(e);
+ downloadListener.onDownloadError(what, new TimeoutError(e.getMessage()));
+ } catch (IOException e) {
+ Exception newException = e;
+ if (!IOUtils.canWrite(savePathDir))
+ newException = new StorageReadWriteError("This folder cannot be written to the file: " + savePathDir + ".");
+ else if (IOUtils.getDirSize(savePathDir) < 1024)
+ newException = new StorageSpaceNotEnoughError("The folder is not enough space to save the downloaded file: " + savePathDir + ".");
+ Logger.e(newException);
+ downloadListener.onDownloadError(what, newException);
+ } catch (Exception e) {// NetworkError | ServerError | StorageCantWriteError | StorageSpaceNotEnoughError
+ if (!NetUtil.isNetworkAvailable())
+ e = new NetworkError("The network is not available.");
+ Logger.e(e);
+ downloadListener.onDownloadError(what, e);
+ } finally {
+ Logger.i("----------Response End----------");
+ IOUtils.closeQuietly(randomAccessFile);
+ IOUtils.closeQuietly(connection);
+ }
+ }
+}
diff --git a/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadDispatcher.java b/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadDispatcher.java
new file mode 100644
index 0000000..a6e0ee7
--- /dev/null
+++ b/nohttp/src/main/java/com/yolanda/nohttp/download/DownloadDispatcher.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2015 Yan Zhenjie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.yolanda.nohttp.download;
+
+import android.os.Process;
+
+import com.yolanda.nohttp.Headers;
+import com.yolanda.nohttp.Logger;
+import com.yolanda.nohttp.PosterHandler;
+
+import java.util.concurrent.BlockingQueue;
+
+/**
+ *
+ * Download queue polling thread.
+ *
+ * Created in Oct 21, 2015 2:46:23 PM.
+ *
+ * @author Yan Zhenjie.
+ */
+class DownloadDispatcher extends Thread {
+
+ /**
+ * Un finish task queue.
+ */
+ private final BlockingQueue mUnFinishQueue;
+ /**
+ * Download task queue.
+ */
+ private final BlockingQueue mDownloadQueue;
+ /**
+ * Perform network request interface.
+ */
+ private final Downloader mDownloader;
+ /**
+ * Are you out of this thread.
+ */
+ private boolean mQuit = false;
+
+ /**
+ * Create a thread that executes the download queue.
+ *
+ * @param unFinishQueue un finish queue.
+ * @param downloadQueue download queue to be polled.
+ * @param downloader perform network request interface.
+ */
+ public DownloadDispatcher(BlockingQueue unFinishQueue, BlockingQueue