presenter) {
if (presenter == null) return (V) this;
mPresenterMap.put(presenter.getClass(), presenter);
//noinspection unchecked
presenter.bindView((V) this);
return (V) this;
}
public > P getPresenter(Class
presenterClass) {
if (presenterClass == null) {
throw new IllegalArgumentException("presenterClass is null!");
}
BasePresenter basePresenter = mPresenterMap.get(presenterClass);
if (basePresenter == null) {
throw new IllegalArgumentException("presenter of <" + presenterClass.getSimpleName() + "> is not added!");
}
//noinspection unchecked
return (P) basePresenter;
}
@CallSuper
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.i(TAG, "destroy view: " + getClass().getSimpleName());
removeLifecycle(this);
for (BasePresenter presenter : mPresenterMap.values()) {
if (presenter != null) {
presenter.onDestroy();
}
}
mPresenterMap.clear();
}
private void addLifecycle(LifecycleObserver observer) {
if (mLifecycle == null) {
Log.w(TAG, "addLifecycle: mLifecycle is null");
return;
}
mLifecycle.addObserver(observer);
}
private void removeLifecycle(LifecycleObserver observer) {
if (mLifecycle == null) {
Log.w(TAG, "removeLifecycle: mLifecycle is null");
return;
}
mLifecycle.removeObserver(observer);
}
}
================================================
FILE: lib/base/src/main/java/com/blankj/base/rv/BaseItem.java
================================================
package com.blankj.base.rv;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/03/16
* desc :
*
*/
public abstract class BaseItem {
private static final SparseIntArray LAYOUT_SPARSE_ARRAY = new SparseIntArray();
private static final SparseArray VIEW_SPARSE_ARRAY = new SparseArray<>();
public boolean isBindViewHolder = false;
static ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
int layoutByType = LAYOUT_SPARSE_ARRAY.get(viewType, -1);
if (layoutByType != -1) {
return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutByType, parent, false));
}
View viewByType = VIEW_SPARSE_ARRAY.get(viewType);
if (viewByType != null) {
return new ItemViewHolder(viewByType);
}
throw new RuntimeException("onCreateViewHolder: get holder from view type failed.");
}
public abstract void bind(@NonNull final ItemViewHolder holder, final int position);
public void partialUpdate(List payloads) {
}
void bindViewHolder(@NonNull final ItemViewHolder holder, final int position) {
isBindViewHolder = true;
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//noinspection unchecked
mOnItemClickListener.onItemClick(holder, (T) BaseItem.this, getIndex());
}
}
});
} else {
holder.itemView.setOnClickListener(null);
}
if (mOnItemLongClickListener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
//noinspection unchecked
return mOnItemLongClickListener.onItemLongClick(holder, (T) BaseItem.this, getIndex());
}
return false;
}
});
} else {
holder.itemView.setOnLongClickListener(null);
}
bind(holder, position);
}
public void onViewRecycled(@NonNull final ItemViewHolder holder, final int position) {
isBindViewHolder = false;
}
public long getItemId() {
return RecyclerView.NO_ID;
}
private int viewType;
BaseItemAdapter mAdapter;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public BaseItem(@LayoutRes int layoutId) {
viewType = getViewTypeByLayoutId(layoutId);
LAYOUT_SPARSE_ARRAY.put(viewType, layoutId);
}
public BaseItem(@NonNull View view) {
viewType = getViewTypeByView(view);
VIEW_SPARSE_ARRAY.put(viewType, view);
}
public int getViewType() {
return viewType;
}
public BaseItemAdapter getAdapter() {
return mAdapter;
}
public boolean isViewType(@LayoutRes int layoutId) {
return viewType == getViewTypeByLayoutId(layoutId);
}
public boolean isViewType(@NonNull View view) {
return viewType == getViewTypeByView(view);
}
private int getViewTypeByLayoutId(@LayoutRes int layoutId) {
return layoutId + getClass().hashCode();
}
private int getViewTypeByView(@NonNull View view) {
return view.hashCode() + getClass().hashCode();
}
public void update() {
if (getAdapter() == null) return;
//noinspection unchecked
getAdapter().updateItem((T) this);
}
public List getItems() {
return getAdapter().getItems();
}
public int getCount() {
return getAdapter().getItemCount();
}
public int getIndex() {
//noinspection SuspiciousMethodCalls
return getAdapter().getItems().indexOf(this);
}
public OnItemClickListener getOnItemClickListener() {
return mOnItemClickListener;
}
public T setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
return (T) this;
}
public OnItemLongClickListener getOnItemLongClickListener() {
return mOnItemLongClickListener;
}
public T setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
mOnItemLongClickListener = onItemLongClickListener;
return (T) this;
}
public interface OnItemClickListener {
void onItemClick(ItemViewHolder holder, T item, int position);
}
public interface OnItemLongClickListener {
boolean onItemLongClick(ItemViewHolder holder, T item, int position);
}
}
================================================
FILE: lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java
================================================
package com.blankj.base.rv;
import android.view.ViewGroup;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2017/08/22
* desc :
*
*/
public class BaseItemAdapter- extends RecyclerView.Adapter
{
public List- mItems;
private RecyclerView mRecyclerView;
public BaseItemAdapter() {
this(false);
}
public BaseItemAdapter(boolean hasStableIds) {
setHasStableIds(hasStableIds);
}
@Override
public final int getItemViewType(int position) {
Item item = mItems.get(position);
item.mAdapter = this;
return item.getViewType();
}
@Override
public long getItemId(int position) {
return mItems.get(position).getItemId();
}
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return Item.onCreateViewHolder(parent, viewType);
}
@Override
public final void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
mItems.get(position).bindViewHolder(holder, position);
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position, @NonNull List
payloads) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads);
return;
}
mItems.get(position).partialUpdate(payloads);
}
@Override
public int getItemCount() {
return mItems.size();
}
@Override
public void onViewRecycled(@NonNull ItemViewHolder holder) {
super.onViewRecycled(holder);
int position = holder.getAdapterPosition();
if (position < 0 || position >= mItems.size()) {
return;
}
mItems.get(position).onViewRecycled(holder, position);
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mRecyclerView = recyclerView;
}
public RecyclerView getRecyclerView() {
return mRecyclerView;
}
public void setItems(@NonNull final List- items) {
mItems = items;
}
public List
- getItems() {
return Collections.unmodifiableList(mItems);
}
public Item getItem(@IntRange(from = 0) final int position) {
return mItems.get(position);
}
public boolean isEmpty() {
return mItems.isEmpty();
}
///////////////////////////////////////////////////////////////////////////
// id
///////////////////////////////////////////////////////////////////////////
public Item getItemById(final long id) {
int itemIndex = getItemIndexById(id);
if (itemIndex != -1) {
return mItems.get(itemIndex);
} else {
return null;
}
}
public int getItemIndexById(final long id) {
for (int i = 0; i < mItems.size(); i++) {
if (getItemId(i) == id) {
return i;
}
}
return -1;
}
public boolean hasItemWithId(final long id) {
return getItemIndexById(id) != -1;
}
public int replaceItemById(final long id, @NonNull final Item item) {
return replaceItemById(id, item, false);
}
public int replaceItemById(final long id, @NonNull final Item item, boolean notifyChanged) {
int itemIndex = getItemIndexById(id);
if (itemIndex != -1) {
replaceItem(itemIndex, item, notifyChanged);
}
return itemIndex;
}
public int removeItemById(final long id) {
return removeItemById(id, false);
}
public int removeItemById(final long id, boolean notifyRemoved) {
for (int i = 0; i < mItems.size(); i++) {
if (getItemId(i) == id) {
removeItem(i, notifyRemoved);
return i;
}
}
return -1;
}
///////////////////////////////////////////////////////////////////////////
// operate
///////////////////////////////////////////////////////////////////////////
public void updateItem(@NonNull final Item item) {
updateItems(item, 1, null);
}
public void updateItem(@IntRange(from = 0) final int index) {
updateItems(index, 1, null);
}
public void updateItem(@NonNull final Item item, Object payload) {
updateItems(item, 1, payload);
}
public void updateItem(@IntRange(from = 0) final int index, Object payload) {
updateItems(index, 1, payload);
}
public void updateItems(@NonNull final Item item, int itemCount) {
int itemIndex = mItems.indexOf(item);
if (itemIndex != -1) {
updateItems(itemIndex, itemCount);
}
}
public void updateItems(@IntRange(from = 0) final int index, int itemCount) {
updateItems(index, itemCount, null);
}
public void updateItems(@NonNull final Item item, int itemCount, Object payload) {
int itemIndex = mItems.indexOf(item);
if (itemIndex != -1) {
updateItems(itemIndex, itemCount, payload);
}
}
public void updateItems(@IntRange(from = 0) final int index, int itemCount, Object payload) {
notifyItemRangeChanged(index, itemCount, payload);
}
public void addItem(@NonNull final Item item) {
addItem(item, false);
}
public void addItem(@NonNull final Item item, boolean notifyInserted) {
mItems.add(item);
if (notifyInserted) notifyItemInserted(mItems.size() - 1);
}
public void addItem(@IntRange(from = 0) final int index, @NonNull final Item item) {
addItem(index, item, false);
}
public void addItem(@IntRange(from = 0) final int index, @NonNull final Item item, boolean notifyInserted) {
mItems.add(index, item);
if (notifyInserted) notifyItemInserted(index);
}
public void addItems(@NonNull final List
- items) {
addItems(items, false);
}
public void addItems(@NonNull final List
- items, boolean notifyInserted) {
mItems.addAll(items);
if (notifyInserted) notifyItemRangeInserted(mItems.size() - items.size() - 1, items.size());
}
public void addItems(@IntRange(from = 0) final int index, @NonNull final List
- items) {
addItems(index, items, false);
}
public void addItems(@IntRange(from = 0) final int index, @NonNull final List
- items, boolean notifyInserted) {
mItems.addAll(index, items);
if (notifyInserted) notifyItemRangeInserted(index, items.size());
}
public void swapItem(@IntRange(from = 0) final int firstIndex, @IntRange(from = 0) final int secondIndex) {
swapItem(firstIndex, secondIndex, false);
}
public void swapItem(@IntRange(from = 0) final int firstIndex,
@IntRange(from = 0) final int secondIndex, boolean notifyMoved) {
Collections.swap(mItems, firstIndex, secondIndex);
if (notifyMoved) notifyItemMoved(firstIndex, secondIndex);
}
public Item replaceItem(@IntRange(from = 0) final int index, @NonNull final Item item) {
return replaceItem(index, item, false);
}
public Item replaceItem(@IntRange(from = 0) final int index, @NonNull final Item item, boolean notifyChanged) {
Item prevItem = mItems.set(index, item);
if (notifyChanged) notifyItemChanged(index);
return prevItem;
}
public boolean replaceItems(@NonNull final List
- items) {
return replaceItems(items, false);
}
public boolean replaceItems(@NonNull final List
- items, boolean notifyChanged) {
mItems.clear();
boolean added = mItems.addAll(items);
if (notifyChanged) notifyDataSetChanged();
return added;
}
public Item removeItem(@IntRange(from = 0) final int index) {
return removeItem(index, false);
}
public Item removeItem(@IntRange(from = 0) final int index, boolean notifyRemoved) {
Item removedItem = mItems.remove(index);
if (notifyRemoved) notifyItemRemoved(index);
return removedItem;
}
public int removeItem(@NonNull final Item item) {
return removeItem(item, false);
}
public int removeItem(@NonNull final Item item, boolean notifyRemoved) {
int itemIndex = mItems.indexOf(item);
if (itemIndex != -1) {
mItems.remove(itemIndex);
if (notifyRemoved) notifyItemRemoved(itemIndex);
}
return itemIndex;
}
public void clear() {
clear(false);
}
public void clear(boolean notifyDataSetChanged) {
mItems.clear();
if (notifyDataSetChanged) notifyDataSetChanged();
}
public void sortItems(@NonNull final Comparator
- comparator) {
sortItems(comparator, false);
}
public void sortItems(@NonNull final Comparator
- comparator, boolean notifyDataSetChanged) {
Collections.sort(mItems, comparator);
if (notifyDataSetChanged) notifyDataSetChanged();
}
}
================================================
FILE: lib/base/src/main/java/com/blankj/base/rv/ItemViewHolder.java
================================================
package com.blankj.base.rv;
import androidx.annotation.IdRes;
import androidx.recyclerview.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import java.util.List;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2017/08/22
* desc :
*
*/
public class ItemViewHolder extends RecyclerView.ViewHolder {
private SparseArray viewArray = new SparseArray<>();
public ItemViewHolder(View itemView) {
super(itemView);
}
@SuppressWarnings("unchecked")
public T findViewById(@IdRes final int viewId) {
View view = viewArray.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
viewArray.put(viewId, view);
}
return (T) view;
}
public void setOnClickListener(@IdRes final int viewId, View.OnClickListener listener) {
findViewById(viewId).setOnClickListener(listener);
}
public void setOnLongClickListener(@IdRes final int viewId, View.OnLongClickListener listener) {
findViewById(viewId).setOnLongClickListener(listener);
}
}
================================================
FILE: lib/base/src/main/java/com/blankj/base/rv/RecycleViewDivider.java
================================================
package com.blankj.base.rv;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2017/08/17
* desc :
*
*/
public class RecycleViewDivider extends RecyclerView.ItemDecoration {
public static final int HORIZONTAL = LinearLayout.HORIZONTAL;
public static final int VERTICAL = LinearLayout.VERTICAL;
protected Drawable mDivider;
protected int mOrientation;
protected boolean mShowFooterDivider;
protected final Rect mBounds = new Rect();
public RecycleViewDivider(Context context, int orientation, @DrawableRes int resId) {
this(context, orientation, resId, false);
}
public RecycleViewDivider(Context context, int orientation, @NonNull Drawable divider) {
this(context, orientation, divider, false);
}
public RecycleViewDivider(Context context, int orientation, @DrawableRes int resId, boolean showFooterDivider) {
this(context, orientation, ContextCompat.getDrawable(context, resId), showFooterDivider);
}
public RecycleViewDivider(Context context, int orientation, @NonNull Drawable divider, boolean showFooterDivider) {
setOrientation(orientation);
mDivider = divider;
mShowFooterDivider = showFooterDivider;
}
private void setOrientation(int orientation) {
if (orientation != HORIZONTAL && orientation != VERTICAL) {
throw new IllegalArgumentException(
"Invalid orientation. It should be either HORIZONTAL or VERTICAL");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (parent.getLayoutManager() == null) {
return;
}
if (mOrientation == VERTICAL) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
@SuppressLint("NewApi")
protected void drawVertical(Canvas canvas, RecyclerView parent) {
canvas.save();
final int left;
final int right;
if (parent.getClipToPadding()) {
left = parent.getPaddingLeft();
right = parent.getWidth() - parent.getPaddingRight();
canvas.clipRect(left, parent.getPaddingTop(), right,
parent.getHeight() - parent.getPaddingBottom());
} else {
left = 0;
right = parent.getWidth();
}
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
if (i == childCount - 1 && !mShowFooterDivider) continue;
final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, mBounds);
final int bottom = mBounds.bottom + Math.round(ViewCompat.getTranslationY(child));
final int top = bottom - mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(canvas);
}
canvas.restore();
}
@SuppressLint("NewApi")
protected void drawHorizontal(Canvas canvas, RecyclerView parent) {
canvas.save();
final int top;
final int bottom;
if (parent.getClipToPadding()) {
top = parent.getPaddingTop();
bottom = parent.getHeight() - parent.getPaddingBottom();
canvas.clipRect(parent.getPaddingLeft(), top,
parent.getWidth() - parent.getPaddingRight(), bottom);
} else {
top = 0;
bottom = parent.getHeight();
}
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
if (i == childCount - 1 && !mShowFooterDivider) continue;
final View child = parent.getChildAt(i);
parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds);
final int right = mBounds.right + Math.round(ViewCompat.getTranslationX(child));
final int left = right - mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(canvas);
}
canvas.restore();
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
================================================
FILE: lib/base/src/main/java/com/blankj/base/view/EmptyGoneTextView.java
================================================
package com.blankj.base.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
import com.blankj.utilcode.util.StringUtils;
import androidx.annotation.Nullable;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/09/03
* desc :
*
*/
@SuppressLint("AppCompatCustomView")
public class EmptyGoneTextView extends TextView {
public EmptyGoneTextView(Context context) {
this(context, null);
}
public EmptyGoneTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setVisibility(GONE);
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
if (StringUtils.isEmpty(text)) {
setVisibility(GONE);
} else {
setVisibility(VISIBLE);
}
}
}
================================================
FILE: lib/base/src/main/res/layout/activity_back.xml
================================================
================================================
FILE: lib/base/src/main/res/layout/fragment_lazy.xml
================================================
================================================
FILE: lib/common/.gitignore
================================================
/build
================================================
FILE: lib/common/build.gradle
================================================
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api Config.modules.lib_base.dep
}
================================================
FILE: lib/common/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: lib/common/src/main/AndroidManifest.xml
================================================
================================================
FILE: lib/common/src/main/java/com/blankj/common/CommonApplication.java
================================================
package com.blankj.common;
import com.blankj.base.BaseApplication;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/06/05
* desc : app about common
*
*/
public class CommonApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java
================================================
package com.blankj.common.activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.blankj.base.BaseActivity;
import com.blankj.base.rv.BaseItemAdapter;
import com.blankj.base.rv.RecycleViewDivider;
import com.blankj.common.R;
import com.blankj.common.dialog.CommonDialogLoading;
import com.blankj.common.item.CommonItem;
import com.blankj.swipepanel.SwipePanel;
import com.blankj.utilcode.util.LanguageUtils;
import com.blankj.utilcode.util.SizeUtils;
import java.util.List;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/06/05
* desc :
*
*/
public abstract class CommonActivity extends BaseActivity {
private CommonActivityItemsView mItemsView;
private CommonActivityTitleView mTitleView;
private CommonActivityDrawerView mDrawerView;
private CommonDialogLoading mDialogLoading;
public View commonContentView;
// @Override
// protected void attachBaseContext(Context newBase) {
// super.attachBaseContext(LanguageUtils.attachBaseContext(newBase));
// }
///////////////////////////////////////////////////////////////////////////
// title view
///////////////////////////////////////////////////////////////////////////
public boolean isSwipeBack() {
return true;
}
@StringRes
public int bindTitleRes() {
return View.NO_ID;
}
public CharSequence bindTitle() {
return "";
}
public boolean isSupportScroll() {
return true;
}
public CommonActivityTitleView bindTitleView() {
return null;
}
///////////////////////////////////////////////////////////////////////////
// items view
///////////////////////////////////////////////////////////////////////////
public CommonActivityItemsView bindItemsView() {
return null;
}
public List bindItems() {
return null;
}
///////////////////////////////////////////////////////////////////////////
// drawer view
///////////////////////////////////////////////////////////////////////////
public CommonActivityDrawerView bindDrawerView() {
return null;
}
public boolean bindDrawer() {
return false;
}
@CallSuper
@Override
public void initData(@Nullable Bundle bundle) {
mTitleView = bindTitleView();
if (mTitleView == null) {
int titleRes = bindTitleRes();
if (titleRes != View.NO_ID) {
mTitleView = new CommonActivityTitleView(this, titleRes, isSupportScroll());
} else {
CharSequence title = bindTitle();
if (!TextUtils.isEmpty(title)) {
mTitleView = new CommonActivityTitleView(this, title, isSupportScroll());
}
}
}
mItemsView = bindItemsView();
if (mItemsView == null) {
List items = bindItems();
if (items != null) {
mItemsView = new CommonActivityItemsView(this, items);
}
}
mDrawerView = bindDrawerView();
if (mDrawerView == null) {
if (bindDrawer()) {
mDrawerView = new CommonActivityDrawerView(this);
}
}
if (mTitleView != null && mItemsView != null) {
mTitleView.setIsSupportScroll(false);
}
findViewById(android.R.id.content).setBackgroundColor(getResources().getColor(R.color.lightGrayDark));
initSwipeBack();
}
@Override
public int bindLayout() {
return View.NO_ID;
}
@Override
public void setContentView() {
if (mTitleView != null) {
mContentView = LayoutInflater.from(this).inflate(mTitleView.bindLayout(), null);
setContentView(mContentView);
commonContentView = mTitleView.getContentView();
} else if (mDrawerView != null) {
mContentView = LayoutInflater.from(this).inflate(mDrawerView.bindLayout(), null);
setContentView(mContentView);
commonContentView = mDrawerView.getContentView();
} else {
if (mItemsView != null) {
mContentView = LayoutInflater.from(this).inflate(mItemsView.bindLayout(), null);
setContentView(mContentView);
} else {
super.setContentView();
}
commonContentView = mContentView;
return;
}
if (mItemsView != null) {
LayoutInflater.from(this).inflate(mItemsView.bindLayout(), (ViewGroup) commonContentView);
} else {
if (bindLayout() > 0) {
LayoutInflater.from(this).inflate(bindLayout(), (ViewGroup) commonContentView);
}
}
}
private void initSwipeBack() {
if (isSwipeBack()) {
final SwipePanel swipeLayout = new SwipePanel(this);
swipeLayout.setLeftDrawable(R.drawable.common_back);
swipeLayout.setLeftEdgeSize(SizeUtils.dp2px(16));
swipeLayout.setLeftSwipeColor(getResources().getColor(R.color.colorPrimary));
swipeLayout.wrapView(findViewById(android.R.id.content));
swipeLayout.setOnFullSwipeListener(new SwipePanel.OnFullSwipeListener() {
@Override
public void onFullSwipe(int direction) {
swipeLayout.close(direction);
finish();
}
});
}
}
@CallSuper
@Override
public void initView(@Nullable Bundle savedInstanceState, @Nullable View contentView) {
if (mItemsView != null) {
mItemsView.initView();
}
}
@Override
public void doBusiness() {
}
@Override
public void onDebouncingClick(@NonNull View view) {
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mTitleView != null) {
return mTitleView.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
public void showLoading() {
showLoading(null);
}
public void showLoading(Runnable listener) {
if (mDialogLoading != null) {
return;
}
mDialogLoading = new CommonDialogLoading().init(this, listener);
mDialogLoading.show();
}
public void dismissLoading() {
if (mDialogLoading != null) {
mDialogLoading.dismiss();
mDialogLoading = null;
}
}
public CommonActivityItemsView getItemsView() {
return mItemsView;
}
public CommonActivityTitleView getTitleView() {
return mTitleView;
}
public CommonActivityDrawerView getDrawerView() {
return mDrawerView;
}
private BaseItemAdapter mCommonItemAdapter;
public void setCommonItems(RecyclerView rv, List items) {
mCommonItemAdapter = new BaseItemAdapter<>();
mCommonItemAdapter.setItems(items);
rv.setAdapter(mCommonItemAdapter);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.addItemDecoration(new RecycleViewDivider(this, RecycleViewDivider.VERTICAL, R.drawable.common_item_divider));
}
public void updateCommonItems(List data) {
mCommonItemAdapter.setItems(data);
mCommonItemAdapter.notifyDataSetChanged();
}
public void updateCommonItem(int position) {
mCommonItemAdapter.notifyItemChanged(position);
}
public BaseItemAdapter getCommonItemAdapter() {
return mCommonItemAdapter;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityDrawerView.java
================================================
package com.blankj.common.activity;
import android.content.Intent;
import android.net.Uri;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import com.blankj.common.R;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.StringUtils;
import com.google.android.material.navigation.NavigationView;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.drawerlayout.widget.DrawerLayout;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/11/01
* desc :
*
*/
public class CommonActivityDrawerView {
public AppCompatActivity mBaseActivity;
public DrawerLayout mBaseDrawerRootLayout;
public FrameLayout mBaseDrawerContainerView;
private NavigationView.OnNavigationItemSelectedListener mListener = new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.baseDrawerActionGitHub) {
return goWeb(R.string.github);
} else if (id == R.id.baseDrawerActionBlog) {
return goWeb(R.string.blog);
}
return false;
}
};
public CommonActivityDrawerView(@NonNull AppCompatActivity activity) {
mBaseActivity = activity;
}
public int bindLayout() {
return R.layout.common_activity_drawer;
}
public View getContentView() {
mBaseDrawerRootLayout = mBaseActivity.findViewById(R.id.baseDrawerRootLayout);
mBaseDrawerContainerView = mBaseActivity.findViewById(R.id.baseDrawerContainerView);
NavigationView nav = mBaseActivity.findViewById(R.id.baseDrawerNavView);
nav.setNavigationItemSelectedListener(mListener);
return mBaseDrawerContainerView;
}
private boolean goWeb(@StringRes int id) {
return ActivityUtils.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(StringUtils.getString(id))));
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityItemsView.java
================================================
package com.blankj.common.activity;
import com.blankj.base.rv.BaseItemAdapter;
import com.blankj.base.rv.RecycleViewDivider;
import com.blankj.common.R;
import com.blankj.common.item.CommonItem;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/11/01
* desc :
*
*/
public class CommonActivityItemsView {
public AppCompatActivity mBaseActivity;
private List mItems;
public BaseItemAdapter mCommonItemAdapter;
public RecyclerView mCommonItemRv;
public CommonActivityItemsView(@NonNull AppCompatActivity activity, @NonNull List items) {
mBaseActivity = activity;
mItems = items;
}
public int bindLayout() {
return R.layout.common_item;
}
public void initView() {
mCommonItemAdapter = new BaseItemAdapter<>();
mCommonItemAdapter.setItems(mItems);
mCommonItemRv = mBaseActivity.findViewById(R.id.commonItemRv);
mCommonItemRv.setAdapter(mCommonItemAdapter);
mCommonItemRv.setLayoutManager(new LinearLayoutManager(mBaseActivity));
mCommonItemRv.addItemDecoration(new RecycleViewDivider(mBaseActivity, RecycleViewDivider.VERTICAL, R.drawable.common_item_divider));
}
public void updateItems(List data) {
mCommonItemAdapter.setItems(data);
mCommonItemAdapter.notifyDataSetChanged();
}
public void updateItem(int position) {
mCommonItemAdapter.notifyItemChanged(position);
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityTitleView.java
================================================
package com.blankj.common.activity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewStub;
import android.widget.FrameLayout;
import com.blankj.common.R;
import com.blankj.utilcode.util.BarUtils;
import com.blankj.utilcode.util.ColorUtils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/11/01
* desc :
*
*/
public class CommonActivityTitleView {
public AppCompatActivity mBaseActivity;
public CharSequence mTitle;
public boolean mIsSupportScroll;
public CoordinatorLayout baseTitleRootLayout;
public Toolbar baseTitleToolbar;
public FrameLayout baseTitleContentView;
public ViewStub mViewStub;
public CommonActivityTitleView(@NonNull AppCompatActivity activity, @StringRes int resId) {
this(activity, activity.getString(resId), true);
}
public CommonActivityTitleView(@NonNull AppCompatActivity activity, @NonNull CharSequence title) {
this(activity, title, true);
}
public CommonActivityTitleView(@NonNull AppCompatActivity activity, @StringRes int resId, boolean isSupportScroll) {
this(activity, activity.getString(resId), isSupportScroll);
}
public CommonActivityTitleView(@NonNull AppCompatActivity activity, @NonNull CharSequence title, boolean isSupportScroll) {
mBaseActivity = activity;
mTitle = title;
mIsSupportScroll = isSupportScroll;
}
public void setIsSupportScroll(boolean isSupportScroll) {
mIsSupportScroll = isSupportScroll;
}
public int bindLayout() {
return R.layout.common_activity_title;
}
public View getContentView() {
baseTitleRootLayout = mBaseActivity.findViewById(R.id.baseTitleRootLayout);
baseTitleToolbar = mBaseActivity.findViewById(R.id.baseTitleToolbar);
if (mIsSupportScroll) {
mViewStub = mBaseActivity.findViewById(R.id.baseTitleStubScroll);
} else {
mViewStub = mBaseActivity.findViewById(R.id.baseTitleStubNoScroll);
}
mViewStub.setVisibility(View.VISIBLE);
baseTitleContentView = mBaseActivity.findViewById(R.id.commonTitleContentView);
setTitleBar();
BarUtils.setStatusBarColor(mBaseActivity, ColorUtils.getColor(R.color.colorPrimary));
BarUtils.addMarginTopEqualStatusBarHeight(baseTitleRootLayout);
return baseTitleContentView;
}
private void setTitleBar() {
mBaseActivity.setSupportActionBar(baseTitleToolbar);
ActionBar titleBar = mBaseActivity.getSupportActionBar();
if (titleBar != null) {
titleBar.setDisplayHomeAsUpEnabled(true);
titleBar.setTitle(mTitle);
}
}
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
mBaseActivity.finish();
return true;
}
return mBaseActivity.onOptionsItemSelected(item);
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/dialog/CommonDialogContent.java
================================================
package com.blankj.common.dialog;
import android.content.Context;
import android.text.TextUtils;
import android.util.Pair;
import android.view.View;
import android.view.Window;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.blankj.base.dialog.BaseDialogFragment;
import com.blankj.base.dialog.DialogLayoutCallback;
import com.blankj.common.R;
import com.blankj.utilcode.util.ClickUtils;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/11/18
* desc :
*
*/
public class CommonDialogContent extends BaseDialogFragment {
private RelativeLayout cdcTitleRl;
private TextView cdcTitleTv;
private RelativeLayout cdcContentRl;
private TextView cdcContentTv;
private RelativeLayout cdcBottomRl;
private TextView cdcBottomPositiveTv;
private TextView cdcBottomNegativeTv;
public CommonDialogContent init(Context context, final CharSequence title, final CharSequence content,
final Pair positiveBtnAction,
final Pair negativeBtnAction) {
super.init(context, new DialogLayoutCallback() {
@Override
public int bindTheme() {
return R.style.CommonContentDialogStyle;
}
@Override
public int bindLayout() {
return R.layout.common_dialog_content;
}
@Override
public void initView(final BaseDialogFragment dialog, View contentView) {
cdcTitleRl = contentView.findViewById(R.id.cdcTitleRl);
cdcTitleTv = contentView.findViewById(R.id.cdcTitleTv);
cdcContentRl = contentView.findViewById(R.id.cdcContentRl);
cdcContentTv = contentView.findViewById(R.id.cdcContentTv);
cdcBottomRl = contentView.findViewById(R.id.cdcBottomRl);
cdcBottomPositiveTv = contentView.findViewById(R.id.cdcBottomPositiveTv);
cdcBottomNegativeTv = contentView.findViewById(R.id.cdcBottomNegativeTv);
if (TextUtils.isEmpty(title)) {
cdcTitleRl.setVisibility(View.GONE);
} else {
cdcTitleTv.setText(title);
}
if (TextUtils.isEmpty(content)) {
cdcContentRl.setVisibility(View.GONE);
} else {
cdcContentTv.setText(content);
}
if (positiveBtnAction == null && negativeBtnAction == null) {
cdcBottomRl.setVisibility(View.GONE);
} else {
if (positiveBtnAction != null) {
ClickUtils.applyPressedBgDark(cdcBottomPositiveTv);
cdcBottomPositiveTv.setText(positiveBtnAction.first);
cdcBottomPositiveTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
positiveBtnAction.second.onClick(v);
}
});
}
if (negativeBtnAction != null) {
ClickUtils.applyPressedBgDark(cdcBottomNegativeTv);
cdcBottomNegativeTv.setText(negativeBtnAction.first);
cdcBottomNegativeTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
negativeBtnAction.second.onClick(v);
}
});
}
}
}
@Override
public void setWindowStyle(Window window) {
}
@Override
public void onCancel(BaseDialogFragment dialog) {
}
@Override
public void onDismiss(BaseDialogFragment dialog) {
}
});
return this;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/dialog/CommonDialogLoading.java
================================================
package com.blankj.common.dialog;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.blankj.base.dialog.BaseDialogFragment;
import com.blankj.base.dialog.DialogLayoutCallback;
import com.blankj.common.R;
import com.blankj.utilcode.util.BarUtils;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/29
* desc :
*
*/
public class CommonDialogLoading extends BaseDialogFragment {
public CommonDialogLoading init(Context context, final Runnable onCancelListener) {
super.init(context, new DialogLayoutCallback() {
@Override
public int bindTheme() {
return R.style.CommonLoadingDialogStyle;
}
@Override
public int bindLayout() {
return R.layout.common_dialog_loading;
}
@Override
public void initView(BaseDialogFragment dialog, View contentView) {
if (onCancelListener == null) {
setCancelable(false);
} else {
setCancelable(true);
}
}
@Override
public void setWindowStyle(final Window window) {
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
BarUtils.setStatusBarColor(window, Color.TRANSPARENT);
}
@Override
public void onCancel(BaseDialogFragment dialog) {
if (onCancelListener != null) {
onCancelListener.run();
}
}
@Override
public void onDismiss(BaseDialogFragment dialog) {
}
});
return this;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/fragment/CommonFragment.java
================================================
package com.blankj.common.fragment;
import android.os.Bundle;
import android.view.View;
import com.blankj.base.BaseFragment;
import com.blankj.base.rv.BaseItemAdapter;
import com.blankj.base.rv.RecycleViewDivider;
import com.blankj.common.R;
import com.blankj.common.activity.CommonActivityItemsView;
import com.blankj.common.item.CommonItem;
import java.util.List;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/11/03
* desc :
*
*/
public class CommonFragment extends BaseFragment {
private CommonActivityItemsView mItemsView;
///////////////////////////////////////////////////////////////////////////
// items view
///////////////////////////////////////////////////////////////////////////
public CommonActivityItemsView bindItemsView() {
return null;
}
public List bindItems() {
return null;
}
@CallSuper
@Override
public void initData(@Nullable Bundle bundle) {
mItemsView = bindItemsView();
if (mItemsView == null) {
List items = bindItems();
if (items != null) {
mItemsView = new CommonActivityItemsView(mActivity, items);
}
}
}
@Override
public int bindLayout() {
return View.NO_ID;
}
@Override
public void setContentView() {
if (mItemsView != null) {
mContentView = mInflater.inflate(mItemsView.bindLayout(), null);
} else {
super.setContentView();
}
}
@CallSuper
@Override
public void initView(@Nullable Bundle savedInstanceState, @Nullable View contentView) {
if (mItemsView != null) {
mItemsView.initView();
}
}
@Override
public void doBusiness() {
log("doBusiness");
}
@Override
public void onDebouncingClick(@NonNull View view) {
}
public CommonActivityItemsView getItemsView() {
return mItemsView;
}
private BaseItemAdapter mCommonItemAdapter;
public void setCommonItems(RecyclerView rv, List items) {
mCommonItemAdapter = new BaseItemAdapter<>();
mCommonItemAdapter.setItems(items);
rv.setAdapter(mCommonItemAdapter);
rv.setLayoutManager(new LinearLayoutManager(mActivity));
rv.addItemDecoration(new RecycleViewDivider(mActivity, RecycleViewDivider.VERTICAL, R.drawable.common_item_divider));
}
public void updateCommonItems(List data) {
mCommonItemAdapter.setItems(data);
mCommonItemAdapter.notifyDataSetChanged();
}
public void updateCommonItem(int position) {
mCommonItemAdapter.notifyItemChanged(position);
}
public BaseItemAdapter getCommonItemAdapter() {
return mCommonItemAdapter;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/helper/PermissionHelper.kt
================================================
package com.blankj.common.helper
import android.content.Context
import android.util.Pair
import android.view.View
import com.blankj.common.R
import com.blankj.common.dialog.CommonDialogContent
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.*
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 2018/01/06
* desc : helper about permission
* ```
*/
object PermissionHelper {
fun request(context: Context, callback: PermissionUtils.SimpleCallback,
@PermissionConstants.PermissionGroup vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { activity, shouldRequest -> showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.SingleCallback {
override fun callback(isAllGranted: Boolean, granted: MutableList,
deniedForever: MutableList, denied: MutableList) {
LogUtils.d(isAllGranted, granted, deniedForever, denied)
if (isAllGranted) {
callback.onGranted()
return
}
if (deniedForever.isNotEmpty()) {
showOpenAppSettingDialog(context)
return
}
val activity = ActivityUtils.getActivityByContext(context)
if (activity != null) {
SnackbarUtils.with(activity.findViewById(android.R.id.content))
.setMessage("Permission denied: ${permissions2String(denied)}")
.showError(true)
}
callback.onDenied()
}
fun permissions2String(permissions: MutableList): String {
if (permissions.isEmpty()) return "[]"
val sb: StringBuilder = StringBuilder()
for (permission in permissions) {
sb.append(", " + permission.substring(permission.lastIndexOf('.') + 1))
}
return "[${sb.substring(2)}]"
}
})
.request()
}
fun showRationaleDialog(context: Context, shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_rationale_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
shouldRequest.again(true)
}),
Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
shouldRequest.again(false)
}))
.show()
}
fun showExplainDialog(context: Context, denied: List, shouldRequest: PermissionUtils.OnExplainListener.ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
"We needs the permissions of $denied to test the utils of permission.",
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
shouldRequest.start(true)
}),
Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
ToastUtils.showShort("request failed.")
shouldRequest.start(false)
}))
.show()
}
fun showOpenAppSettingDialog(context: Context) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_denied_forever_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
PermissionUtils.launchAppDetailsSettings()
}),
Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
}))
.show()
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItem.java
================================================
package com.blankj.common.item;
import com.blankj.base.rv.BaseItem;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.ColorUtils;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/25
* desc :
*
*/
public class CommonItem extends BaseItem {
private int backgroundColor = ColorUtils.getColor(R.color.lightGray);
public CommonItem(int layoutId) {
super(layoutId);
}
@CallSuper
@Override
public void bind(@NonNull final ItemViewHolder holder, int position) {
holder.itemView.setBackgroundColor(backgroundColor);
}
public CommonItem setBackgroundColor(int backgroundColor) {
this.backgroundColor = backgroundColor;
return this;
}
public int getBackgroundColor() {
return backgroundColor;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemClick.java
================================================
package com.blankj.common.item;
import android.view.View;
import android.widget.TextView;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.ClickUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/31
* desc :
*
*/
public class CommonItemClick extends CommonItem {
private CharSequence mTitle;
private CharSequence mContent;
private boolean mIsJump;
public CommonItemClick(@StringRes int title) {
this(StringUtils.getString(title), "", false, null);
}
public CommonItemClick(@NonNull CharSequence title) {
this(title, "", false, null);
}
public CommonItemClick(@StringRes int title, boolean isJump) {
this(StringUtils.getString(title), "", isJump);
}
public CommonItemClick(@NonNull CharSequence title, boolean isJump) {
this(title, "", isJump, null);
}
public CommonItemClick(@StringRes int title, CharSequence content) {
this(StringUtils.getString(title), content, false, null);
}
public CommonItemClick(@NonNull CharSequence title, CharSequence content) {
this(title, content, false, null);
}
public CommonItemClick(@StringRes int title, CharSequence content, boolean isJump) {
this(StringUtils.getString(title), content, isJump);
}
public CommonItemClick(@NonNull CharSequence title, CharSequence content, boolean isJump) {
this(title, content, isJump, null);
}
public CommonItemClick(@StringRes int title, final Runnable simpleClickListener) {
this(StringUtils.getString(title), "", false, simpleClickListener);
}
public CommonItemClick(@NonNull CharSequence title, final Runnable simpleClickListener) {
this(title, "", false, simpleClickListener);
}
public CommonItemClick(@StringRes int title, boolean isJump, final Runnable simpleClickListener) {
this(StringUtils.getString(title), "", isJump, simpleClickListener);
}
public CommonItemClick(@NonNull CharSequence title, boolean isJump, final Runnable simpleClickListener) {
this(title, "", isJump, simpleClickListener);
}
public CommonItemClick(@StringRes int title, CharSequence content, final Runnable simpleClickListener) {
this(StringUtils.getString(title), content, false, simpleClickListener);
}
public CommonItemClick(@NonNull CharSequence title, CharSequence content, final Runnable simpleClickListener) {
this(title, content, false, simpleClickListener);
}
public CommonItemClick(@StringRes int title, CharSequence content, boolean isJump, final Runnable simpleClickListener) {
this(StringUtils.getString(title), content, isJump, simpleClickListener);
}
public CommonItemClick(@NonNull CharSequence title, CharSequence content, boolean isJump, final Runnable simpleClickListener) {
super(R.layout.common_item_title_click);
mTitle = title;
mContent = content;
mIsJump = isJump;
if (simpleClickListener == null) return;
setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(ItemViewHolder holder, CommonItemClick item, int position) {
if (simpleClickListener != null) {
simpleClickListener.run();
}
}
});
}
public CommonItemClick setOnClickUpdateContentListener(@NonNull final Utils.Supplier supplier) {
setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(ItemViewHolder holder, CommonItemClick item, int position) {
item.mContent = supplier.get();
update();
}
});
return this;
}
@Override
public void bind(@NonNull ItemViewHolder holder, int position) {
super.bind(holder, position);
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
final TextView contentTv = holder.findViewById(R.id.commonItemContentTv);
titleTv.setText(mTitle);
contentTv.setText(mContent);
ClickUtils.applyPressedBgDark(holder.itemView);
holder.findViewById(R.id.commonItemGoIv).setVisibility(mIsJump ? View.VISIBLE : View.GONE);
}
public void setTitle(CharSequence title) {
mTitle = title;
update();
}
public CharSequence getTitle() {
return mTitle;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemImage.java
================================================
package com.blankj.common.item;
import android.widget.ImageView;
import android.widget.TextView;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/31
* desc :
*
*/
public class CommonItemImage extends CommonItem {
private CharSequence mTitle;
private Utils.Consumer mSetImageConsumer;
public CommonItemImage(@StringRes int title, @NonNull Utils.Consumer setImageConsumer) {
this(StringUtils.getString(title), setImageConsumer);
}
public CommonItemImage(@NonNull CharSequence title, @NonNull Utils.Consumer setImageConsumer) {
super(R.layout.common_item_title_image);
mTitle = title;
mSetImageConsumer = setImageConsumer;
}
@Override
public void bind(@NonNull ItemViewHolder holder, int position) {
super.bind(holder, position);
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
titleTv.setText(mTitle);
ImageView commonItemIv = holder.findViewById(R.id.commonItemIv);
mSetImageConsumer.accept(commonItemIv);
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java
================================================
package com.blankj.common.item;
import android.view.MotionEvent;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.StringUtils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/31
* desc :
*
*/
public class CommonItemSeekBar extends CommonItem {
private CharSequence mTitle;
private CharSequence mContent;
private int mMaxProgress;
private int mCurProgress;
private ProgressListener mProgressListener;
public CommonItemSeekBar(@StringRes int title, int maxProgress, @NonNull ProgressListener listener) {
this(StringUtils.getString(title), maxProgress, listener);
}
public CommonItemSeekBar(@NonNull CharSequence title, int maxProgress, @NonNull ProgressListener listener) {
super(R.layout.common_item_title_seekbar);
mTitle = title;
mMaxProgress = maxProgress;
mCurProgress = listener.getCurValue();
mProgressListener = listener;
mContent = String.valueOf(mCurProgress);
}
@Override
public void bind(@NonNull ItemViewHolder holder, int position) {
super.bind(holder, position);
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
final TextView contentTv = holder.findViewById(R.id.commonItemContentTv);
titleTv.setText(mTitle);
contentTv.setText(mContent);
final SeekBar seekBar = holder.findViewById(R.id.commonItemSb);
seekBar.setMax(mMaxProgress);
seekBar.setProgress(mCurProgress);
holder.itemView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return seekBar.dispatchTouchEvent(event);
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mProgressListener.onProgressChanged(seekBar, progress, fromUser);
int curValue = mProgressListener.getCurValue();
mCurProgress = curValue;
contentTv.setText(String.valueOf(curValue));
seekBar.setProgress(curValue);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mProgressListener.onStartTrackingTouch(seekBar);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mProgressListener.onStopTrackingTouch(seekBar);
}
});
}
public void setTitle(CharSequence title) {
mTitle = title;
update();
}
public CharSequence getTitle() {
return mTitle;
}
public static abstract class ProgressListener implements SeekBar.OnSeekBarChangeListener {
public abstract int getCurValue();
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemSwitch.java
================================================
package com.blankj.common.item;
import android.annotation.SuppressLint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Switch;
import android.widget.TextView;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.ClickUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/31
* desc :
*
*/
public class CommonItemSwitch extends CommonItem {
private CharSequence mTitle;
private CharSequence mContent;
private boolean mState;
private Utils.Supplier mGetStateSupplier;
private Utils.Consumer mSetStateConsumer;
public CommonItemSwitch(@StringRes int title, @NonNull Utils.Supplier getStateSupplier, @NonNull Utils.Consumer setStateConsumer) {
this(StringUtils.getString(title), getStateSupplier, setStateConsumer);
}
public CommonItemSwitch(@NonNull CharSequence title, @NonNull Utils.Supplier getStateSupplier, @NonNull Utils.Consumer setStateConsumer) {
super(R.layout.common_item_title_switch);
mTitle = title;
mGetStateSupplier = getStateSupplier;
mSetStateConsumer = setStateConsumer;
mState = getStateSupplier.get();
mContent = String.valueOf(mState);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void bind(@NonNull final ItemViewHolder holder, int position) {
super.bind(holder, position);
ClickUtils.applyPressedBgDark(holder.itemView);
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
final TextView contentTv = holder.findViewById(R.id.commonItemContentTv);
titleTv.setText(mTitle);
contentTv.setText(mContent);
final Switch switchView = holder.findViewById(R.id.commonItemSwitch);
switchView.setChecked(mState);
switchView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
holder.itemView.onTouchEvent(event);
return true;
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSetStateConsumer.accept(!mState);
mState = mGetStateSupplier.get();
contentTv.setText(String.valueOf(mState));
switchView.setChecked(mState);
}
});
}
public void setTitle(CharSequence title) {
mTitle = title;
update();
}
public CharSequence getTitle() {
return mTitle;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemTitle.java
================================================
package com.blankj.common.item;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.TextView;
import com.blankj.base.rv.ItemViewHolder;
import com.blankj.common.R;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2019/10/31
* desc :
*
*/
public class CommonItemTitle extends CommonItem {
private CharSequence mTitle;
private Utils.Supplier mGetTitleSupplier;
private boolean mIsTitleCenter;
private CharSequence mContent;
public CommonItemTitle(@NonNull Utils.Supplier getTitleSupplier, boolean isTitleCenter) {
super(R.layout.common_item_title_content);
mTitle = mGetTitleSupplier.get();
mGetTitleSupplier = getTitleSupplier;
mIsTitleCenter = isTitleCenter;
}
public CommonItemTitle(@StringRes int title, boolean isTitleCenter) {
this(StringUtils.getString(title), isTitleCenter);
}
public CommonItemTitle(@NonNull CharSequence title, boolean isTitleCenter) {
super(R.layout.common_item_title_content);
mTitle = title;
mIsTitleCenter = isTitleCenter;
}
public CommonItemTitle(@NonNull CharSequence title, CharSequence content) {
super(R.layout.common_item_title_content);
mTitle = title;
mContent = content;
}
@Override
public void bind(@NonNull ItemViewHolder holder, int position) {
super.bind(holder, position);
if (mGetTitleSupplier != null) {
mTitle = mGetTitleSupplier.get();
}
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
final TextView contentTv = holder.findViewById(R.id.commonItemContentTv);
titleTv.setText(mTitle);
contentTv.setText(mContent);
if (isViewType(R.layout.common_item_title_content)) {
if (mIsTitleCenter) {
holder.itemView.setBackgroundColor(Color.TRANSPARENT);
titleTv.setGravity(Gravity.CENTER_HORIZONTAL);
titleTv.getPaint().setFakeBoldText(true);
} else {
titleTv.setGravity(Gravity.START);
titleTv.getPaint().setFakeBoldText(false);
}
}
}
public void setTitle(CharSequence title) {
setTitle(title, true);
}
public void setContent(CharSequence content) {
setContent(content, true);
}
public void setTitle(CharSequence title, boolean isUpdate) {
mTitle = title;
if (isUpdate) {
update();
}
}
public void setContent(CharSequence content, boolean isUpdate) {
mContent = content;
if (isUpdate) {
update();
}
}
public CharSequence getTitle() {
return mTitle;
}
}
================================================
FILE: lib/common/src/main/java/com/blankj/common/view/RotateView.java
================================================
package com.blankj.common.view;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2020/03/28
* desc :
*
*/
public class RotateView extends View {
private ObjectAnimator headerAnimator;
public RotateView(Context context) {
this(context, null);
}
public RotateView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RotateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (headerAnimator == null) {
initAnimator();
}
if (visibility == VISIBLE) {
headerAnimator.start();
} else {
headerAnimator.end();
}
}
private void initAnimator() {
headerAnimator = ObjectAnimator.ofFloat(this, "rotation", 0f, 360f);
headerAnimator.setRepeatCount(ObjectAnimator.INFINITE);
headerAnimator.setInterpolator(new LinearInterpolator());
headerAnimator.setRepeatMode(ObjectAnimator.RESTART);
headerAnimator.setDuration(1000);
headerAnimator.start();
}
}
================================================
FILE: lib/common/src/main/res/anim/slide_in_left.xml
================================================
================================================
FILE: lib/common/src/main/res/anim/slide_in_right.xml
================================================
================================================
FILE: lib/common/src/main/res/anim/slide_out_left.xml
================================================
================================================
FILE: lib/common/src/main/res/anim/slide_out_right.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_button_bg.xml
================================================
-
-
================================================
FILE: lib/common/src/main/res/drawable/common_button_txt_color.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_content_dialog_bg.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_content_dialog_btn_bg.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_item_divider.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_loading_bg.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_rotate_loading.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_scrollbar_thumb.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/common_seekbar_progress.xml
================================================
-
-
-
================================================
FILE: lib/common/src/main/res/drawable/common_seekbar_thumb.xml
================================================
-
-
================================================
FILE: lib/common/src/main/res/drawable/common_splash.xml
================================================
-
================================================
FILE: lib/common/src/main/res/drawable/main_menu_blog.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable/main_menu_github.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable-xxhdpi/common_switch_thumb.xml
================================================
================================================
FILE: lib/common/src/main/res/drawable-xxhdpi/common_switch_track.xml
================================================
-
-
================================================
FILE: lib/common/src/main/res/layout/common_activity_drawer.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_activity_drawer_nav_header.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_activity_title.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_activity_title_stub_no_scroll.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_activity_title_stub_scroll.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_dialog_content.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_dialog_loading.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item_title_click.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item_title_content.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item_title_image.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item_title_seekbar.xml
================================================
================================================
FILE: lib/common/src/main/res/layout/common_item_title_switch.xml
================================================
================================================
FILE: lib/common/src/main/res/menu/common_drawer.xml
================================================
================================================
FILE: lib/common/src/main/res/values/colors.xml
================================================
#3F51B5
#303F9F
#FF4081
#34A48E
#8034A48E
#245C50
#FF73A3
#80245C50
#FFFFFF
#191919
#bf0c43
#f9ba15
#8eac00
#127a97
#452b72
- @color/rainbow_red
- @color/rainbow_yellow
- @color/rainbow_green
- @color/rainbow_blue
- @color/rainbow_purple
#ED5565
#DA4453
#FC6E51
#E9573F
#FFCE54
#F6BB42
#A0D468
#8CC152
#48CFAD
#37BC9B
#62C554
#479841
#4FC1E9
#3BAFDA
#5D9CEC
#4A89DC
#AC92EC
#967ADC
#EC87C0
#D770AD
#F5F7FA
#E6E9ED
#CCD1D9
#AAB2BD
#656D78
#434A54
================================================
FILE: lib/common/src/main/res/values/dimens.xml
================================================
4dp
8dp
16dp
6dp
8dp
16dp
24dp
128dp
1dp
2dp
4dp
6dp
40dp
160dp
14sp
16sp
18sp
20sp
24sp
40sp
40dp
8dp
196dp
64dp
================================================
FILE: lib/common/src/main/res/values/strings.xml
================================================
https://github.com/Blankj/AndroidUtilCode
https://blankj.com
Core Util
Sub Util
Blankj
Demo of AndroidUtilCode
navigation_drawer_open
navigation_drawer_close
You have rejected us to apply for authorization, please agree to authorization, otherwise the function can\'t be used normally!
We need some of the permissions you rejected or the system failed to apply failed, please manually set to the page authorize, otherwise the function can\'t be used normally!
================================================
FILE: lib/common/src/main/res/values/styles.xml
================================================
================================================
FILE: lib/subutil/.gitignore
================================================
/build
================================================
FILE: lib/subutil/README-CN.md
================================================
## How to use
从下面选择拷贝你需要用到的类到你项目中即可。
## APIs
* ### 应用商店相关 -> [AppStoreUtils.java][appStore.java] -> [Demo][appStore.demo]
```
getAppStoreIntent: 获取跳转应用商店意图
```
* ### 电池相关 -> [BatteryUtils.java][battery.java] -> [Demo][battery.demo]
```
registerBatteryStatusChangedListener : 注册电池状态改变监听器
isRegisteredBatteryStatusChangedListener: 判断是否注册电池状态改变监听器
unregisterBatteryStatusChangedListener : 注销电池状态改变监听器
```
* ### 坐标转换相关 -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02 : BD09 坐标转 GCJ02 坐标
gcj02ToBd09 : GCJ02 坐标转 BD09 坐标
gcj02ToWGS84: GCJ02 坐标转 WGS84 坐标
wgs84ToGcj02: WGS84 坐标转 GCJ02 坐标
bd09ToWGS84 : BD09 坐标转 WGS84 坐标
wgs84ToBd09 : WGS84 坐标转 BD09 坐标
```
* ### 国家相关 -> [CountryUtils.java][country.java] -> [Demo][country.demo]
```
getCountryCodeBySim : 根据 Sim 卡获取国家码
getCountryCodeByLanguage: 根据系统语言获取国家码
getCountryBySim : 根据 Sim 卡获取国家
getCountryByLanguage : 根据系统语言获取国家
```
* ### 危险相关 -> [DangerousUtils.java][dangerous.java] -> [Demo][dangerous.demo]
```
installAppSilent : 静默安装 App
uninstallAppSilent : 静默卸载 App
shutdown : 关机
reboot : 重启
reboot2Recovery : 重启到 recovery
reboot2Bootloader : 重启到 bootloader
setMobileDataEnabled: 打开或关闭移动数据
sendSmsSilent : 发送短信
```
* ### 定位相关 -> [LocationUtils.java][location.java] -> [Demo][location.demo]
```
isGpsEnabled : 判断 Gps 是否可用
isLocationEnabled: 判断定位是否可用
openGpsSettings : 打开 Gps 设置界面
register : 注册
unregister : 注销
getAddress : 根据经纬度获取地理位置
getCountryName : 根据经纬度获取所在国家
getLocality : 根据经纬度获取所在地
getStreet : 根据经纬度获取所在街道
isBetterLocation : 是否更好的位置
isSameProvider : 是否相同的提供者
```
* ### 拼音相关 -> [PinyinUtils.java][pinyin.java] -> [Demo][pinyin.demo]
```
ccs2Pinyin : 汉字转拼音
ccs2Pinyin : 汉字转拼音
getPinyinFirstLetter : 获取第一个汉字首字母
getPinyinFirstLetters: 获取所有汉字的首字母
getSurnamePinyin : 根据名字获取姓氏的拼音
getSurnameFirstLetter: 根据名字获取姓氏的首字母
```
[appStore.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
[appStore.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[country.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CountryUtils.java
[country.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt
[dangerous.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
[dangerous.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/LocationUtils.java
[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/PinyinUtils.java
[pinyin.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt
================================================
FILE: lib/subutil/README.md
================================================
## How to use
You should copy the following classes which you want to use in your project.
## APIs
* ### About AppStore -> [AppStoreUtils.java][appStore.java] -> [Demo][appStore.demo]
```
getAppStoreIntent
```
* ### About Battery -> [BatteryUtils.java][battery.java] -> [Demo][battery.demo]
```
registerBatteryStatusChangedListener
isRegisteredBatteryStatusChangedListener
unregisterBatteryStatusChangedListener
```
* ### About Coordinate -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02
gcj02ToBd09
gcj02ToWGS84
wgs84ToGcj02
bd09ToWGS84
wgs84ToBd09
```
* ### About Country -> [CountryUtils.java][country.java] -> [Demo][country.demo]
```
getCountryCodeBySim
getCountryCodeByLanguage
getCountryBySim
getCountryByLanguage
```
* ### About Dangerous -> [DangerousUtils.java][dangerous.java] -> [Demo][dangerous.demo]
```
installAppSilent
uninstallAppSilent
shutdown
reboot
reboot2Recovery
reboot2Bootloader
setMobileDataEnabled
sendSmsSilent
```
* ### About Location -> [LocationUtils.java][location.java] -> [Demo][location.demo]
```
isGpsEnabled
isLocationEnabled
openGpsSettings
register
unregister
getAddress
getCountryName
getLocality
getStreet
isBetterLocation
isSameProvider
```
* ### About Pinyin -> [PinyinUtils.java][pinyin.java] -> [Demo][pinyin.demo]
```
ccs2Pinyin
ccs2Pinyin
getPinyinFirstLetter
getPinyinFirstLetters
getSurnamePinyin
getSurnameFirstLetter
```
[appStore.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
[appStore.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[country.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CountryUtils.java
[country.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt
[dangerous.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
[dangerous.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/LocationUtils.java
[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/PinyinUtils.java
[pinyin.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt
================================================
FILE: lib/subutil/build.gradle
================================================
apply {
plugin "readme-sub"
}
readme {
readmeFile file('./README.md')
readmeCnFile file('./README-CN.md')
}
dependencies {
compileOnly Config.libs.androidx_appcompat.path
compileOnly Config.libs.androidx_material.path
compileOnly Config.modules.lib_utilcode.dep
api(Config.libs.glide.path) {
exclude group: "com.android.support"
}
api Config.libs.retrofit.path
api Config.libs.gson.path
testImplementation Config.modules.lib_utilcode.dep
testImplementation Config.libs.test_junit.path
testImplementation Config.libs.test_robolectric.path
}
================================================
FILE: lib/subutil/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/Blankj/Library/Android/android_sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-keep class com.blankj.subutil.** { *; }
#-keepclassmembers class com.blankj.subutil.** { *; }
-dontwarn com.blankj.subutil.**
================================================
FILE: lib/subutil/src/main/AndroidManifest.xml
================================================
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
================================================
package com.blankj.subutil.util;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.util.Log;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.RomUtils;
import com.blankj.utilcode.util.Utils;
import java.util.List;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/05/20
* desc : utils about app store
*
*/
public final class AppStoreUtils {
private static final String TAG = "AppStoreUtils";
private static final String GOOGLE_PLAY_APP_STORE_PACKAGE_NAME = "com.android.vending";
/**
* 获取跳转到应用商店的 Intent
*
* @return 跳转到应用商店的 Intent
*/
public static Intent getAppStoreIntent() {
return getAppStoreIntent(Utils.getApp().getPackageName(), false);
}
/**
* 获取跳转到应用商店的 Intent
*
* @param isIncludeGooglePlayStore 是否包括 Google Play 商店
* @return 跳转到应用商店的 Intent
*/
public static Intent getAppStoreIntent(boolean isIncludeGooglePlayStore) {
return getAppStoreIntent(Utils.getApp().getPackageName(), isIncludeGooglePlayStore);
}
/**
* 获取跳转到应用商店的 Intent
*
* @param packageName 包名
* @return 跳转到应用商店的 Intent
*/
public static Intent getAppStoreIntent(final String packageName) {
return getAppStoreIntent(packageName, false);
}
/**
* 获取跳转到应用商店的 Intent
* 优先跳转到手机自带的应用市场
*
* @param packageName 包名
* @param isIncludeGooglePlayStore 是否包括 Google Play 商店
* @return 跳转到应用商店的 Intent
*/
public static Intent getAppStoreIntent(final String packageName, boolean isIncludeGooglePlayStore) {
if (RomUtils.isSamsung()) {// 三星单独处理跳转三星市场
Intent samsungAppStoreIntent = getSamsungAppStoreIntent(packageName);
if (samsungAppStoreIntent != null) return samsungAppStoreIntent;
}
if (RomUtils.isLeeco()) {// 乐视单独处理跳转乐视市场
Intent leecoAppStoreIntent = getLeecoAppStoreIntent(packageName);
if (leecoAppStoreIntent != null) return leecoAppStoreIntent;
}
Uri uri = Uri.parse("market://details?id=" + packageName);
Intent intent = new Intent();
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
List resolveInfos = Utils.getApp().getPackageManager()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfos == null || resolveInfos.size() == 0) {
Log.e(TAG, "No app store!");
return null;
}
Intent googleIntent = null;
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.packageName;
if (!GOOGLE_PLAY_APP_STORE_PACKAGE_NAME.equals(pkgName)) {
if (AppUtils.isAppSystem(pkgName)) {
intent.setPackage(pkgName);
return intent;
}
} else {
intent.setPackage(GOOGLE_PLAY_APP_STORE_PACKAGE_NAME);
googleIntent = intent;
}
}
if (isIncludeGooglePlayStore && googleIntent != null) {
return googleIntent;
}
intent.setPackage(resolveInfos.get(0).activityInfo.packageName);
return intent;
}
private static Intent getSamsungAppStoreIntent(final String packageName) {
Intent intent = new Intent();
intent.setClassName("com.sec.android.app.samsungapps", "com.sec.android.app.samsungapps.Main");
intent.setData(Uri.parse("http://www.samsungapps.com/appquery/appDetail.as?appId=" + packageName));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (getAvailableIntentSize(intent) > 0) {
return intent;
}
return null;
}
private static Intent getLeecoAppStoreIntent(final String packageName) {
Intent intent = new Intent();
intent.setClassName("com.letv.app.appstore", "com.letv.app.appstore.appmodule.details.DetailsActivity");
intent.setAction("com.letv.app.appstore.appdetailactivity");
intent.putExtra("packageName", packageName);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (getAvailableIntentSize(intent) > 0) {
return intent;
}
return null;
}
private static int getAvailableIntentSize(final Intent intent) {
return Utils.getApp().getPackageManager()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
.size();
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
================================================
package com.blankj.subutil.util;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build;
import android.os.PowerManager;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.Utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.Set;
import androidx.annotation.IntDef;
import androidx.annotation.RequiresApi;
/**
*
* author: blankj
* blog : http://blankj.com
* time : 2020/03/31
* desc :
*
*/
public final class BatteryUtils {
@IntDef({BatteryStatus.UNKNOWN, BatteryStatus.DISCHARGING, BatteryStatus.CHARGING,
BatteryStatus.NOT_CHARGING, BatteryStatus.FULL})
@Retention(RetentionPolicy.SOURCE)
public @interface BatteryStatus {
int UNKNOWN = BatteryManager.BATTERY_STATUS_UNKNOWN;
int DISCHARGING = BatteryManager.BATTERY_STATUS_DISCHARGING;
int CHARGING = BatteryManager.BATTERY_STATUS_CHARGING;
int NOT_CHARGING = BatteryManager.BATTERY_STATUS_NOT_CHARGING;
int FULL = BatteryManager.BATTERY_STATUS_FULL;
}
/**
* Return whether the app is on the device's power whitelist.
*
* @return {@code true}: yes {@code false}: no
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public static boolean isIgnoringBatteryOptimizations() {
return isIgnoringBatteryOptimizations(Utils.getApp().getPackageName());
}
/**
* Return whether the app is on the device's power whitelist.
*
* @return {@code true}: yes {@code false}: no
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public static boolean isIgnoringBatteryOptimizations(String pkgName) {
try {
PowerManager pm = (PowerManager) Utils.getApp().getSystemService(Context.POWER_SERVICE);
//noinspection ConstantConditions
return pm.isIgnoringBatteryOptimizations(pkgName);
} catch (Exception e) {
return true;
}
}
/**
* Register the status of battery changed listener.
*
* @param listener The status of battery changed listener.
*/
public static void registerBatteryStatusChangedListener(final OnBatteryStatusChangedListener listener) {
BatteryChangedReceiver.getInstance().registerListener(listener);
}
/**
* Return whether the status of battery changed listener has been registered.
*
* @param listener The status of battery changed listener.
* @return true to registered, false otherwise.
*/
public static boolean isRegistered(final OnBatteryStatusChangedListener listener) {
return BatteryChangedReceiver.getInstance().isRegistered(listener);
}
/**
* Unregister the status of battery changed listener.
*
* @param listener The status of battery changed listener.
*/
public static void unregisterBatteryStatusChangedListener(final OnBatteryStatusChangedListener listener) {
BatteryChangedReceiver.getInstance().unregisterListener(listener);
}
public static final class BatteryChangedReceiver extends BroadcastReceiver {
private static BatteryChangedReceiver getInstance() {
return BatteryChangedReceiver.LazyHolder.INSTANCE;
}
private Set mListeners = new HashSet<>();
void registerListener(final OnBatteryStatusChangedListener listener) {
if (listener == null) return;
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
int preSize = mListeners.size();
mListeners.add(listener);
if (preSize == 0 && mListeners.size() == 1) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
Utils.getApp().registerReceiver(BatteryChangedReceiver.getInstance(), intentFilter);
}
}
});
}
boolean isRegistered(final OnBatteryStatusChangedListener listener) {
if (listener == null) return false;
return mListeners.contains(listener);
}
void unregisterListener(final OnBatteryStatusChangedListener listener) {
if (listener == null) return;
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
int preSize = mListeners.size();
mListeners.remove(listener);
if (preSize == 1 && mListeners.size() == 0) {
Utils.getApp().unregisterReceiver(BatteryChangedReceiver.getInstance());
}
}
});
}
@Override
public void onReceive(Context context, final Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryStatus.UNKNOWN);
for (OnBatteryStatusChangedListener listener : mListeners) {
listener.onBatteryStatusChanged(new Status(level, status));
}
}
});
}
}
private static class LazyHolder {
private static final BatteryChangedReceiver INSTANCE = new BatteryChangedReceiver();
}
}
public interface OnBatteryStatusChangedListener {
void onBatteryStatusChanged(Status status);
}
public static final class Status {
private int level;
@BatteryStatus
private int status;
Status(int level, int status) {
this.level = level;
this.status = status;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@BatteryStatus
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return batteryStatus2String(status) + ": " + level + "%";
}
public static String batteryStatus2String(@BatteryStatus int status) {
if (status == BatteryStatus.DISCHARGING) {
return "discharging";
}
if (status == BatteryStatus.CHARGING) {
return "charging";
}
if (status == BatteryStatus.NOT_CHARGING) {
return "not_charging";
}
if (status == BatteryStatus.FULL) {
return "full";
}
return "unknown";
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/BitUtils.java
================================================
package com.blankj.subutil.util;
import android.util.Log;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2018/03/21
* desc : 位运算工具类
*
*/
public final class BitUtils {
private BitUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 获取运算数指定位置的值
* 例如: 0000 1011 获取其第 0 位的值为 1, 第 2 位 的值为 0
*
* @param source 需要运算的数
* @param pos 指定位置 (0...7)
* @return 指定位置的值(0 or 1)
*/
public static byte getBitValue(byte source, int pos) {
return (byte) ((source >> pos) & 1);
}
/**
* 将运算数指定位置的值置为指定值
* 例: 0000 1011 需要更新为 0000 1111, 即第 2 位的值需要置为 1
*
* @param source 需要运算的数
* @param pos 指定位置 (0<=pos<=7)
* @param value 只能取值为 0, 或 1, 所有大于0的值作为1处理, 所有小于0的值作为0处理
* @return 运算后的结果数
*/
public static byte setBitValue(byte source, int pos, byte value) {
byte mask = (byte) (1 << pos);
if (value > 0) {
source |= mask;
} else {
source &= (~mask);
}
return source;
}
/**
* 将运算数指定位置取反值
* 例: 0000 1011 指定第 3 位取反, 结果为 0000 0011; 指定第2位取反, 结果为 0000 1111
*
* @param source
* @param pos 指定位置 (0<=pos<=7)
* @return 运算后的结果数
*/
public static byte reverseBitValue(byte source, int pos) {
byte mask = (byte) (1 << pos);
return (byte) (source ^ mask);
}
/**
* 检查运算数的指定位置是否为1
*
* @param source 需要运算的数
* @param pos 指定位置 (0<=pos<=7)
* @return true 表示指定位置值为1, false 表示指定位置值为 0
*/
public static boolean checkBitValue(byte source, int pos) {
source = (byte) (source >>> pos);
return (source & 1) == 1;
}
/**
* 入口函数做测试
*
* @param args
*/
public static void main(String[] args) {
// 取十进制 11 (二级制 0000 1011) 为例子
byte source = 11;
// 取第2位值并输出, 结果应为 0000 1011
for (byte i = 7; i >= 0; i--) {
Log.d("BitUtils", getBitValue(source, i) + "");
}
// 将第6位置为1并输出 , 结果为 75 (0100 1011)
Log.d("BitUtils", setBitValue(source, 6, (byte) 1) + "");
// 将第6位取反并输出, 结果应为75(0100 1011)
Log.d("BitUtils", reverseBitValue(source, 6) + "");
// 检查第6位是否为1,结果应为false
Log.d("BitUtils", checkBitValue(source, 6) + "");
// 输出为1的位, 结果应为 0 1 3
for (byte i = 0; i < 8; i++) {
if (checkBitValue(source, i)) {
Log.d("BitUtils", i + "");
}
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CameraUtils.java
================================================
package com.blankj.subutil.util;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2016/09/19
* desc : 相机相关工具类
*
*/
public final class CameraUtils {
// private CameraUtils() {
// throw new UnsupportedOperationException("u can't instantiate me...");
// }
//
// /**
// * 获取打开照程序界面的Intent
// */
// public static Intent getOpenCameraIntent() {
// return new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// }
//
// /**
// * 获取跳转至相册选择界面的Intent
// */
// public static Intent getImagePickerIntent() {
// Intent intent = new Intent(Intent.ACTION_PICK, null);
// return intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
// }
//
// /**
// * 获取[跳转至相册选择界面,并跳转至裁剪界面,默认可缩放裁剪区域]的Intent
// */
// public static Intent getImagePickerIntent(int outputX, int outputY, Uri fromFileURI,
// Uri saveFileURI) {
// return getImagePickerIntent(1, 1, outputX, outputY, true, fromFileURI, saveFileURI);
// }
//
// /**
// * 获取[跳转至相册选择界面,并跳转至裁剪界面,默认可缩放裁剪区域]的Intent
// */
// public static Intent getImagePickerIntent(int aspectX, int aspectY, int outputX, int outputY, Uri fromFileURI,
// Uri saveFileURI) {
// return getImagePickerIntent(aspectX, aspectY, outputX, outputY, true, fromFileURI, saveFileURI);
// }
//
// /**
// * 获取[跳转至相册选择界面,并跳转至裁剪界面,可以指定是否缩放裁剪区域]的Intent
// *
// * @param aspectX 裁剪框尺寸比例X
// * @param aspectY 裁剪框尺寸比例Y
// * @param outputX 输出尺寸宽度
// * @param outputY 输出尺寸高度
// * @param canScale 是否可缩放
// * @param fromFileURI 文件来源路径URI
// * @param saveFileURI 输出文件路径URI
// */
// public static Intent getImagePickerIntent(int aspectX, int aspectY, int outputX, int outputY, boolean canScale,
// Uri fromFileURI, Uri saveFileURI) {
// Intent intent = new Intent(Intent.ACTION_PICK);
// intent.setDataAndType(fromFileURI, "image/*");
// intent.putExtra("crop", "true");
// intent.putExtra("aspectX", aspectX <= 0 ? 1 : aspectX);
// intent.putExtra("aspectY", aspectY <= 0 ? 1 : aspectY);
// intent.putExtra("outputX", outputX);
// intent.putExtra("outputY", outputY);
// intent.putExtra("scale", canScale);
// // 图片剪裁不足黑边解决
// intent.putExtra("scaleUpIfNeeded", true);
// intent.putExtra("return-data", false);
// intent.putExtra(MediaStore.EXTRA_OUTPUT, saveFileURI);
// intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// // 去除人脸识别
// return intent.putExtra("noFaceDetection", true);
// }
//
// /**
// * 获取[跳转至相册选择界面,并跳转至裁剪界面,默认可缩放裁剪区域]的Intent
// */
// public static Intent getCameraIntent(final Uri saveFileURI) {
// Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// return mIntent.putExtra(MediaStore.EXTRA_OUTPUT, saveFileURI);
// }
//
// /**
// * 获取[跳转至裁剪界面,默认可缩放]的Intent
// */
// public static Intent getCropImageIntent(int outputX, int outputY, Uri fromFileURI,
// Uri saveFileURI) {
// return getCropImageIntent(1, 1, outputX, outputY, true, fromFileURI, saveFileURI);
// }
//
// /**
// * 获取[跳转至裁剪界面,默认可缩放]的Intent
// */
// public static Intent getCropImageIntent(int aspectX, int aspectY, int outputX, int outputY, Uri fromFileURI,
// Uri saveFileURI) {
// return getCropImageIntent(aspectX, aspectY, outputX, outputY, true, fromFileURI, saveFileURI);
// }
//
//
// /**
// * 获取[跳转至裁剪界面]的Intent
// */
// public static Intent getCropImageIntent(int aspectX, int aspectY, int outputX, int outputY, boolean canScale,
// Uri fromFileURI, Uri saveFileURI) {
// Intent intent = new Intent("com.android.camera.action.CROP");
// intent.setDataAndType(fromFileURI, "image/*");
// intent.putExtra("crop", "true");
// // X方向上的比例
// intent.putExtra("aspectX", aspectX <= 0 ? 1 : aspectX);
// // Y方向上的比例
// intent.putExtra("aspectY", aspectY <= 0 ? 1 : aspectY);
// intent.putExtra("outputX", outputX);
// intent.putExtra("outputY", outputY);
// intent.putExtra("scale", canScale);
// // 图片剪裁不足黑边解决
// intent.putExtra("scaleUpIfNeeded", true);
// intent.putExtra("return-data", false);
// // 需要将读取的文件路径和裁剪写入的路径区分,否则会造成文件0byte
// intent.putExtra(MediaStore.EXTRA_OUTPUT, saveFileURI);
// // true-->返回数据类型可以设置为Bitmap,但是不能传输太大,截大图用URI,小图用Bitmap或者全部使用URI
// intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// // 取消人脸识别功能
// intent.putExtra("noFaceDetection", true);
// return intent;
// }
//
// /**
// * 获得选中相册的图片
// *
// * @param context 上下文
// * @param data onActivityResult返回的Intent
// * @return bitmap
// */
// public static Bitmap getChoosedImage(final Activity context, final Intent data) {
// if (data == null) return null;
// Bitmap bm = null;
// ContentResolver cr = context.getContentResolver();
// Uri originalUri = data.getData();
// try {
// bm = MediaStore.Images.Media.getBitmap(cr, originalUri);
// } catch (IOException e) {
// e.printStackTrace();
// }
// return bm;
// }
//
// /**
// * 获得选中相册的图片路径
// *
// * @param context 上下文
// * @param data onActivityResult返回的Intent
// * @return
// */
// public static String getChoosedImagePath(final Activity context, final Intent data) {
// if (data == null) return null;
// String path = "";
// ContentResolver resolver = context.getContentResolver();
// Uri originalUri = data.getData();
// if (null == originalUri) return null;
// String[] projection = {MediaStore.Images.Media.DATA};
// Cursor cursor = resolver.query(originalUri, projection, null, null, null);
// if (null != cursor) {
// try {
// int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
// cursor.moveToFirst();
// path = cursor.getString(column_index);
// } catch (IllegalArgumentException e) {
// e.printStackTrace();
// } finally {
// try {
// if (!cursor.isClosed()) {
// cursor.close();
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }
// return StringUtils.isEmpty(path) ? originalUri.getPath() : null;
// }
//
// /**
// * 获取拍照之后的照片文件(JPG格式)
// *
// * @param data onActivityResult回调返回的数据
// * @param filePath The path of file.
// * @return 文件
// */
// public static File getTakePictureFile(final Intent data, final String filePath) {
// if (data == null) return null;
// Bundle extras = data.getExtras();
// if (extras == null) return null;
// Bitmap photo = extras.getParcelable("data");
// File file = new File(filePath);
// if (ImageUtils.save(photo, file, Bitmap.CompressFormat.JPEG)) return file;
// return null;
// }
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
================================================
package com.blankj.subutil.util;
import static java.lang.Math.PI;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2018/03/21
* desc : 坐标相关工具类
*
*/
public final class CoordinateUtils {
private final static double X_PI = 3.14159265358979324 * 3000.0 / 180.0;
private final static double A = 6378245.0;
private final static double EE = 0.00669342162296594323;
/**
* BD09 坐标转 GCJ02 坐标
*
* @param lng BD09 坐标纬度
* @param lat BD09 坐标经度
* @return GCJ02 坐标:[经度,纬度]
*/
public static double[] bd09ToGcj02(double lng, double lat) {
double x = lng - 0.0065;
double y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);
double gg_lng = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
return new double[]{gg_lng, gg_lat};
}
/**
* GCJ02 坐标转 BD09 坐标
*
* @param lng GCJ02 坐标经度
* @param lat GCJ02 坐标纬度
* @return BD09 坐标:[经度,纬度]
*/
public static double[] gcj02ToBd09(double lng, double lat) {
double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI);
double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI);
double bd_lng = z * Math.cos(theta) + 0.0065;
double bd_lat = z * Math.sin(theta) + 0.006;
return new double[]{bd_lng, bd_lat};
}
/**
* GCJ02 坐标转 WGS84 坐标
*
* @param lng GCJ02 坐标经度
* @param lat GCJ02 坐标纬度
* @return WGS84 坐标:[经度,纬度]
*/
public static double[] gcj02ToWGS84(double lng, double lat) {
if (outOfChina(lng, lat)) {
return new double[]{lng, lat};
}
double dlat = transformLat(lng - 105.0, lat - 35.0);
double dlng = transformLng(lng - 105.0, lat - 35.0);
double radlat = lat / 180.0 * PI;
double magic = Math.sin(radlat);
magic = 1 - EE * magic * magic;
double sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (A / sqrtmagic * Math.cos(radlat) * PI);
double mglat = lat + dlat;
double mglng = lng + dlng;
return new double[]{lng * 2 - mglng, lat * 2 - mglat};
}
/**
* WGS84 坐标转 GCJ02 坐标
*
* @param lng WGS84 坐标经度
* @param lat WGS84 坐标纬度
* @return GCJ02 坐标:[经度,纬度]
*/
public static double[] wgs84ToGcj02(double lng, double lat) {
if (outOfChina(lng, lat)) {
return new double[]{lng, lat};
}
double dlat = transformLat(lng - 105.0, lat - 35.0);
double dlng = transformLng(lng - 105.0, lat - 35.0);
double radlat = lat / 180.0 * PI;
double magic = Math.sin(radlat);
magic = 1 - EE * magic * magic;
double sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (A / sqrtmagic * Math.cos(radlat) * PI);
double mglat = lat + dlat;
double mglng = lng + dlng;
return new double[]{mglng, mglat};
}
/**
* BD09 坐标转 WGS84 坐标
*
* @param lng BD09 坐标经度
* @param lat BD09 坐标纬度
* @return WGS84 坐标:[经度,纬度]
*/
public static double[] bd09ToWGS84(double lng, double lat) {
double[] gcj = bd09ToGcj02(lng, lat);
return gcj02ToWGS84(gcj[0], gcj[1]);
}
/**
* WGS84 坐标转 BD09 坐标
*
* @param lng WGS84 坐标经度
* @param lat WGS84 坐标纬度
* @return BD09 坐标:[经度,纬度]
*/
public static double[] wgs84ToBd09(double lng, double lat) {
double[] gcj = wgs84ToGcj02(lng, lat);
return gcj02ToBd09(gcj[0], gcj[1]);
}
/**
* Mercator 坐标转 WGS84 坐标
*
* @param lng Mercator 坐标经度
* @param lat Mercator 坐标纬度
* @return WGS84 坐标:[经度,纬度]
*/
public static double[] mercatorToWGS84(double lng, double lat) {
double x = lng / 20037508.34d * 180.;
double y = lat / 20037508.34d * 180.;
y = 180 / PI * (2 * Math.atan(Math.exp(y * PI / 180.0)) - PI / 2);
return new double[]{x, y};
}
/**
* WGS84 坐标转 Mercator 坐标
*
* @param lng WGS84 坐标经度
* @param lat WGS84 坐标纬度
* @return Mercator 坐标:[经度,纬度]
*/
public static double[] wgs84ToMercator(double lng, double lat) {
double x = lng * 20037508.34D / 180.0;
double y = Math.log(Math.tan((90.0 + lat) * PI / 360.0)) / (PI / 180.);
y = y * 20037508.34D / 180.0;
return new double[]{x, y};
}
private static double transformLat(double lng, double lat) {
double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret;
}
private static double transformLng(double lng, double lat) {
double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
return ret;
}
private static boolean outOfChina(double lng, double lat) {
return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CountryUtils.java
================================================
package com.blankj.subutil.util;
import android.content.Context;
import android.content.res.Resources;
import android.telephony.TelephonyManager;
import com.blankj.utilcode.util.Utils;
import java.util.HashMap;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/06/11
* desc : utils about country code
*
*/
public class CountryUtils {
private static HashMap countryCodeMap;
/**
* Return the country code by sim card.
*
* @param defaultValue The default value.
* @return the country code
*/
public static String getCountryCodeBySim(String defaultValue) {
String code = getCountryCodeFromMap().get(getCountryBySim());
if (code == null) {
return defaultValue;
}
return code;
}
/**
* Return the country code by system language.
*
* @param defaultValue The default value.
* @return the country code
*/
public static String getCountryCodeByLanguage(String defaultValue) {
String code = getCountryCodeFromMap().get(getCountryByLanguage());
if (code == null) {
return defaultValue;
}
return code;
}
/**
* Return the country by sim card.
*
* @return the country
*/
public static String getCountryBySim() {
TelephonyManager manager = (TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE);
if (manager != null) {
return manager.getSimCountryIso().toUpperCase();
}
return "";
}
/**
* Return the country by system language.
*
* @return the country
*/
public static String getCountryByLanguage() {
return Resources.getSystem().getConfiguration().locale.getCountry();
}
private static HashMap getCountryCodeFromMap() {
if (countryCodeMap == null) {
countryCodeMap = new HashMap<>(256);
countryCodeMap.put("AL", "+355");
countryCodeMap.put("DZ", "+213");
countryCodeMap.put("AF", "+93");
countryCodeMap.put("AR", "+54");
countryCodeMap.put("AE", "+971");
countryCodeMap.put("AW", "+297");
countryCodeMap.put("OM", "+968");
countryCodeMap.put("AZ", "+994");
countryCodeMap.put("AC", "+247");
countryCodeMap.put("EG", "+20");
countryCodeMap.put("ET", "+251");
countryCodeMap.put("IE", "+353");
countryCodeMap.put("EE", "+372");
countryCodeMap.put("AD", "+376");
countryCodeMap.put("AO", "+244");
countryCodeMap.put("AI", "+1");
countryCodeMap.put("AG", "+1");
countryCodeMap.put("AT", "+43");
countryCodeMap.put("AX", "+358");
countryCodeMap.put("AU", "+61");
countryCodeMap.put("BB", "+1");
countryCodeMap.put("PG", "+675");
countryCodeMap.put("BS", "+1");
countryCodeMap.put("PK", "+92");
countryCodeMap.put("PY", "+595");
countryCodeMap.put("PS", "+970");
countryCodeMap.put("BH", "+973");
countryCodeMap.put("PA", "+507");
countryCodeMap.put("BR", "+55");
countryCodeMap.put("BY", "+375");
countryCodeMap.put("BM", "+1");
countryCodeMap.put("BG", "+359");
countryCodeMap.put("MP", "+1");
countryCodeMap.put("BJ", "+229");
countryCodeMap.put("BE", "+32");
countryCodeMap.put("IS", "+354");
countryCodeMap.put("PR", "+1");
countryCodeMap.put("PL", "+48");
countryCodeMap.put("BA", "+387");
countryCodeMap.put("BO", "+591");
countryCodeMap.put("BZ", "+501");
countryCodeMap.put("BW", "+267");
countryCodeMap.put("BT", "+975");
countryCodeMap.put("BF", "+226");
countryCodeMap.put("BI", "+257");
countryCodeMap.put("KP", "+850");
countryCodeMap.put("GQ", "+240");
countryCodeMap.put("DK", "+45");
countryCodeMap.put("DE", "+49");
countryCodeMap.put("TL", "+670");
countryCodeMap.put("TG", "+228");
countryCodeMap.put("DO", "+1");
countryCodeMap.put("DM", "+1");
countryCodeMap.put("RU", "+7");
countryCodeMap.put("EC", "+593");
countryCodeMap.put("ER", "+291");
countryCodeMap.put("FR", "+33");
countryCodeMap.put("FO", "+298");
countryCodeMap.put("PF", "+689");
countryCodeMap.put("GF", "+594");
countryCodeMap.put("VA", "+39");
countryCodeMap.put("PH", "+63");
countryCodeMap.put("FJ", "+679");
countryCodeMap.put("FI", "+358");
countryCodeMap.put("CV", "+238");
countryCodeMap.put("FK", "+500");
countryCodeMap.put("GM", "+220");
countryCodeMap.put("CG", "+242");
countryCodeMap.put("CD", "+243");
countryCodeMap.put("CO", "+57");
countryCodeMap.put("CR", "+506");
countryCodeMap.put("GG", "+44");
countryCodeMap.put("GD", "+1");
countryCodeMap.put("GL", "+299");
countryCodeMap.put("GE", "+995");
countryCodeMap.put("CU", "+53");
countryCodeMap.put("GP", "+590");
countryCodeMap.put("GU", "+1");
countryCodeMap.put("GY", "+592");
countryCodeMap.put("KZ", "+7");
countryCodeMap.put("HT", "+509");
countryCodeMap.put("KR", "+82");
countryCodeMap.put("NL", "+31");
countryCodeMap.put("BQ", "+599");
countryCodeMap.put("SX", "+1");
countryCodeMap.put("ME", "+382");
countryCodeMap.put("HN", "+504");
countryCodeMap.put("KI", "+686");
countryCodeMap.put("DJ", "+253");
countryCodeMap.put("KG", "+996");
countryCodeMap.put("GN", "+224");
countryCodeMap.put("GW", "+245");
countryCodeMap.put("CA", "+1");
countryCodeMap.put("GH", "+233");
countryCodeMap.put("GA", "+241");
countryCodeMap.put("KH", "+855");
countryCodeMap.put("CZ", "+420");
countryCodeMap.put("ZW", "+263");
countryCodeMap.put("CM", "+237");
countryCodeMap.put("QA", "+974");
countryCodeMap.put("KY", "+1");
countryCodeMap.put("CC", "+61");
countryCodeMap.put("KM", "+269");
countryCodeMap.put("XK", "+383");
countryCodeMap.put("CI", "+225");
countryCodeMap.put("KW", "+965");
countryCodeMap.put("HR", "+385");
countryCodeMap.put("KE", "+254");
countryCodeMap.put("CK", "+682");
countryCodeMap.put("CW", "+599");
countryCodeMap.put("LV", "+371");
countryCodeMap.put("LS", "+266");
countryCodeMap.put("LA", "+856");
countryCodeMap.put("LB", "+961");
countryCodeMap.put("LT", "+370");
countryCodeMap.put("LR", "+231");
countryCodeMap.put("LY", "+218");
countryCodeMap.put("LI", "+423");
countryCodeMap.put("RE", "+262");
countryCodeMap.put("LU", "+352");
countryCodeMap.put("RW", "+250");
countryCodeMap.put("RO", "+40");
countryCodeMap.put("MG", "+261");
countryCodeMap.put("IM", "+44");
countryCodeMap.put("MV", "+960");
countryCodeMap.put("MT", "+356");
countryCodeMap.put("MW", "+265");
countryCodeMap.put("MY", "+60");
countryCodeMap.put("ML", "+223");
countryCodeMap.put("MK", "+389");
countryCodeMap.put("MH", "+692");
countryCodeMap.put("MQ", "+596");
countryCodeMap.put("YT", "+262");
countryCodeMap.put("MU", "+230");
countryCodeMap.put("MR", "+222");
countryCodeMap.put("US", "+1");
countryCodeMap.put("AS", "+1");
countryCodeMap.put("VI", "+1");
countryCodeMap.put("MN", "+976");
countryCodeMap.put("MS", "+1");
countryCodeMap.put("BD", "+880");
countryCodeMap.put("PE", "+51");
countryCodeMap.put("FM", "+691");
countryCodeMap.put("MM", "+95");
countryCodeMap.put("MD", "+373");
countryCodeMap.put("MA", "+212");
countryCodeMap.put("MC", "+377");
countryCodeMap.put("MZ", "+258");
countryCodeMap.put("MX", "+52");
countryCodeMap.put("NA", "+264");
countryCodeMap.put("ZA", "+27");
countryCodeMap.put("SS", "+211");
countryCodeMap.put("NR", "+674");
countryCodeMap.put("NI", "+505");
countryCodeMap.put("NP", "+977");
countryCodeMap.put("NE", "+227");
countryCodeMap.put("NG", "+234");
countryCodeMap.put("NU", "+683");
countryCodeMap.put("NO", "+47");
countryCodeMap.put("NF", "+672");
countryCodeMap.put("PW", "+680");
countryCodeMap.put("PT", "+351");
countryCodeMap.put("JP", "+81");
countryCodeMap.put("SE", "+46");
countryCodeMap.put("CH", "+41");
countryCodeMap.put("SV", "+503");
countryCodeMap.put("WS", "+685");
countryCodeMap.put("RS", "+381");
countryCodeMap.put("SL", "+232");
countryCodeMap.put("SN", "+221");
countryCodeMap.put("CY", "+357");
countryCodeMap.put("SC", "+248");
countryCodeMap.put("SA", "+966");
countryCodeMap.put("BL", "+590");
countryCodeMap.put("CX", "+61");
countryCodeMap.put("ST", "+239");
countryCodeMap.put("SH", "+290");
countryCodeMap.put("PN", "+870");
countryCodeMap.put("KN", "+1");
countryCodeMap.put("LC", "+1");
countryCodeMap.put("MF", "+590");
countryCodeMap.put("SM", "+378");
countryCodeMap.put("PM", "+508");
countryCodeMap.put("VC", "+1");
countryCodeMap.put("LK", "+94");
countryCodeMap.put("SK", "+421");
countryCodeMap.put("SI", "+386");
countryCodeMap.put("SJ", "+47");
countryCodeMap.put("SZ", "+268");
countryCodeMap.put("SD", "+249");
countryCodeMap.put("SR", "+597");
countryCodeMap.put("SB", "+677");
countryCodeMap.put("SO", "+252");
countryCodeMap.put("TJ", "+992");
countryCodeMap.put("TH", "+66");
countryCodeMap.put("TZ", "+255");
countryCodeMap.put("TO", "+676");
countryCodeMap.put("TC", "+1");
countryCodeMap.put("TA", "+290");
countryCodeMap.put("TT", "+1");
countryCodeMap.put("TN", "+216");
countryCodeMap.put("TV", "+688");
countryCodeMap.put("TR", "+90");
countryCodeMap.put("TM", "+993");
countryCodeMap.put("TK", "+690");
countryCodeMap.put("WF", "+681");
countryCodeMap.put("VU", "+678");
countryCodeMap.put("GT", "+502");
countryCodeMap.put("VE", "+58");
countryCodeMap.put("BN", "+673");
countryCodeMap.put("UG", "+256");
countryCodeMap.put("UA", "+380");
countryCodeMap.put("UY", "+598");
countryCodeMap.put("UZ", "+998");
countryCodeMap.put("GR", "+30");
countryCodeMap.put("ES", "+34");
countryCodeMap.put("EH", "+212");
countryCodeMap.put("SG", "+65");
countryCodeMap.put("NC", "+687");
countryCodeMap.put("NZ", "+64");
countryCodeMap.put("HU", "+36");
countryCodeMap.put("SY", "+963");
countryCodeMap.put("JM", "+1");
countryCodeMap.put("AM", "+374");
countryCodeMap.put("YE", "+967");
countryCodeMap.put("IQ", "+964");
countryCodeMap.put("UM", "+1");
countryCodeMap.put("IR", "+98");
countryCodeMap.put("IL", "+972");
countryCodeMap.put("IT", "+39");
countryCodeMap.put("IN", "+91");
countryCodeMap.put("ID", "+62");
countryCodeMap.put("GB", "+44");
countryCodeMap.put("VG", "+1");
countryCodeMap.put("IO", "+246");
countryCodeMap.put("JO", "+962");
countryCodeMap.put("VN", "+84");
countryCodeMap.put("ZM", "+260");
countryCodeMap.put("JE", "+44");
countryCodeMap.put("TD", "+235");
countryCodeMap.put("GI", "+350");
countryCodeMap.put("CL", "+56");
countryCodeMap.put("CF", "+236");
countryCodeMap.put("CN", "+86");
countryCodeMap.put("MO", "+853");
countryCodeMap.put("TW", "+886");
countryCodeMap.put("HK", "+852");
}
return countryCodeMap;
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
================================================
package com.blankj.subutil.util;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.PowerManager;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import com.blankj.utilcode.util.IntentUtils;
import com.blankj.utilcode.util.ShellUtils;
import com.blankj.utilcode.util.Utils;
import java.io.File;
import java.lang.reflect.Method;
import java.util.List;
import androidx.annotation.RequiresPermission;
import static android.Manifest.permission.MODIFY_PHONE_STATE;
import static android.Manifest.permission.SEND_SMS;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/06/29
* desc :
*
*/
public class DangerousUtils {
private DangerousUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
///////////////////////////////////////////////////////////////////////////
// AppUtils
///////////////////////////////////////////////////////////////////////////
/**
* Install the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param filePath The path of file.
* @return {@code true}: success {@code false}: fail
*/
public static boolean installAppSilent(final String filePath) {
return installAppSilent(getFileByPath(filePath), null);
}
/**
* Install the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param file The file.
* @return {@code true}: success {@code false}: fail
*/
public static boolean installAppSilent(final File file) {
return installAppSilent(file, null);
}
/**
* Install the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param filePath The path of file.
* @param params The params of installation(e.g.,-r, -s).
* @return {@code true}: success {@code false}: fail
*/
public static boolean installAppSilent(final String filePath, final String params) {
return installAppSilent(getFileByPath(filePath), params);
}
/**
* Install the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param file The file.
* @param params The params of installation(e.g.,-r, -s).
* @return {@code true}: success {@code false}: fail
*/
public static boolean installAppSilent(final File file, final String params) {
return installAppSilent(file, params, isDeviceRooted());
}
/**
* Install the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param file The file.
* @param params The params of installation(e.g.,-r, -s).
* @param isRooted True to use root, false otherwise.
* @return {@code true}: success {@code false}: fail
*/
public static boolean installAppSilent(final File file,
final String params,
final boolean isRooted) {
if (!isFileExists(file)) return false;
String filePath = '"' + file.getAbsolutePath() + '"';
String command = "LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm install " +
(params == null ? "" : params + " ")
+ filePath;
ShellUtils.CommandResult commandResult = ShellUtils.execCmd(command, isRooted);
if (commandResult.successMsg != null
&& commandResult.successMsg.toLowerCase().contains("success")) {
return true;
} else {
Log.e("AppUtils", "installAppSilent successMsg: " + commandResult.successMsg +
", errorMsg: " + commandResult.errorMsg);
return false;
}
}
/**
* Uninstall the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param packageName The name of the package.
* @return {@code true}: success {@code false}: fail
*/
public static boolean uninstallAppSilent(final String packageName) {
return uninstallAppSilent(packageName, false);
}
/**
* Uninstall the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param packageName The name of the package.
* @param isKeepData Is keep the data.
* @return {@code true}: success {@code false}: fail
*/
public static boolean uninstallAppSilent(final String packageName, final boolean isKeepData) {
return uninstallAppSilent(packageName, isKeepData, isDeviceRooted());
}
/**
* Uninstall the app silently.
* Without root permission must hold
* {@code android:sharedUserId="android.uid.shell"} and
* {@code }
*
* @param packageName The name of the package.
* @param isKeepData Is keep the data.
* @param isRooted True to use root, false otherwise.
* @return {@code true}: success {@code false}: fail
*/
public static boolean uninstallAppSilent(final String packageName,
final boolean isKeepData,
final boolean isRooted) {
if (isSpace(packageName)) return false;
String command = "LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm uninstall "
+ (isKeepData ? "-k " : "")
+ packageName;
ShellUtils.CommandResult commandResult = ShellUtils.execCmd(command, isRooted);
if (commandResult.successMsg != null
&& commandResult.successMsg.toLowerCase().contains("success")) {
return true;
} else {
Log.e("AppUtils", "uninstallAppSilent successMsg: " + commandResult.successMsg +
", errorMsg: " + commandResult.errorMsg);
return false;
}
}
private static boolean isFileExists(final File file) {
return file != null && file.exists();
}
private static File getFileByPath(final String filePath) {
return isSpace(filePath) ? null : new File(filePath);
}
private static boolean isSpace(final String s) {
if (s == null) return true;
for (int i = 0, len = s.length(); i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
private static boolean isDeviceRooted() {
String su = "su";
String[] locations = {"/system/bin/", "/system/xbin/", "/sbin/", "/system/sd/xbin/",
"/system/bin/failsafe/", "/data/local/xbin/", "/data/local/bin/", "/data/local/",
"/system/sbin/", "/usr/bin/", "/vendor/bin/"};
for (String location : locations) {
if (new File(location + su).exists()) {
return true;
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////
// DeviceUtils
///////////////////////////////////////////////////////////////////////////
/**
* Shutdown the device
* Requires root permission
* or hold {@code android:sharedUserId="android.uid.system"},
* {@code }
* in manifest.
*
* @return {@code true}: success {@code false}: fail
*/
public static boolean shutdown() {
try {
ShellUtils.CommandResult result = ShellUtils.execCmd("reboot -p", true);
if (result.result == 0) return true;
Utils.getApp().startActivity(IntentUtils.getShutdownIntent());
return true;
} catch (Exception e) {
return false;
}
}
/**
* Reboot the device.
* Requires root permission
* or hold {@code android:sharedUserId="android.uid.system"} in manifest.
*
* @return {@code true}: success {@code false}: fail
*/
public static boolean reboot() {
try {
ShellUtils.CommandResult result = ShellUtils.execCmd("reboot", true);
if (result.result == 0) return true;
Intent intent = new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
Utils.getApp().sendBroadcast(intent);
return true;
} catch (Exception e) {
return false;
}
}
/**
* Reboot the device.
* Requires root permission
* or hold {@code android:sharedUserId="android.uid.system"},
* {@code }
*
* @param reason code to pass to the kernel (e.g., "recovery") to
* request special boot modes, or null.
* @return {@code true}: success {@code false}: fail
*/
public static boolean reboot(final String reason) {
try {
PowerManager pm = (PowerManager) Utils.getApp().getSystemService(Context.POWER_SERVICE);
pm.reboot(reason);
return true;
} catch (Exception e) {
return false;
}
}
/**
* Reboot the device to recovery.
* Requires root permission.
*
* @return {@code true}: success {@code false}: fail
*/
public static boolean reboot2Recovery() {
ShellUtils.CommandResult result = ShellUtils.execCmd("reboot recovery", true);
return result.result == 0;
}
/**
* Reboot the device to bootloader.
* Requires root permission.
*
* @return {@code true}: success {@code false}: fail
*/
public static boolean reboot2Bootloader() {
ShellUtils.CommandResult result = ShellUtils.execCmd("reboot bootloader", true);
return result.result == 0;
}
/**
* Enable or disable mobile data.
* Must hold {@code android:sharedUserId="android.uid.system"},
* {@code }
*
* @param enabled True to enabled, false otherwise.
* @return {@code true}: success {@code false}: fail
*/
@RequiresPermission(MODIFY_PHONE_STATE)
public static boolean setMobileDataEnabled(final boolean enabled) {
try {
TelephonyManager tm =
(TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE);
if (tm == null) return false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
tm.setDataEnabled(enabled);
return true;
}
Method setDataEnabledMethod =
tm.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
setDataEnabledMethod.invoke(tm, enabled);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* Send sms silently.
* Must hold {@code }
*
* @param phoneNumber The phone number.
* @param content The content.
*/
@RequiresPermission(SEND_SMS)
public static void sendSmsSilent(final String phoneNumber, final String content) {
if (TextUtils.isEmpty(content)) return;
PendingIntent sentIntent = PendingIntent.getBroadcast(Utils.getApp(), 0, new Intent("send"), 0);
SmsManager smsManager = SmsManager.getDefault();
if (content.length() >= 70) {
List ms = smsManager.divideMessage(content);
for (String str : ms) {
smsManager.sendTextMessage(phoneNumber, null, str, sentIntent, null);
}
} else {
smsManager.sendTextMessage(phoneNumber, null, content, sentIntent, null);
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/GlideUtils.java
================================================
//package com.blankj.subutil.util;
//
//import android.content.Context;
//import android.graphics.drawable.PictureDrawable;
//import android.widget.ImageView;
//
//import com.blankj.subutil.R;
//import com.blankj.subutil.util.image.GlideApp;
//import com.bumptech.glide.Glide;
//import com.bumptech.glide.load.engine.DiskCacheStrategy;
//import com.bumptech.glide.request.RequestOptions;
//
///**
// *
// * author: Blankj
// * blog : http://blankj.com
// * time : 2018/05/16
// * desc :
// *
// */
//public final class GlideUtils {
//
//
//
// public static void setCircleImage(Context context, String url, ImageView view) {
// RequestOptions requestOptions = new RequestOptions()
// .placeholder(R.drawable.def_img_round_holder)
// .error(R.drawable.def_img_round_error)
// .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
// .circleCrop().dontAnimate();
// Glide.with(context).load(url).apply(requestOptions).into(view);
// }
//
// public static void setImage(Context context, String url, ImageView view) {
// if (url.endsWith(".svg") || url.endsWith(".SVG")) {
// setSvgImage(context, url, view);
// return;
// }
//
// RequestOptions requestOptions = new RequestOptions().placeholder(R.drawable.def_img)
// .error(R.drawable.def_img).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC).dontAnimate();
// Glide.with(context).load(url).apply(requestOptions).into(view);
// }
//
// private static void setSvgImage(Context context, String url, ImageView view) {
// GlideApp.with(context)
// .as(PictureDrawable.class)
// .error(R.drawable.def_img).load(url).into(view);
// }
//}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java
================================================
package com.blankj.subutil.util;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
/**
*
* author: MilkZS
* time : 2019/01/09
* desc : https 工具类
*
*/
public final class HttpsUtil {
private static final int CONNECT_TIMEOUT_TIME = 15000;
private static final int READ_TIMEOUT_TIME = 19000;
/**
* POST + JSON
*
* @param data send data
* @param url target url
* @return data receive from server
* @author MilkZS
*/
public static String postJson(String data, String url) {
return doHttpAction(data, true, true, url);
}
/**
* POST + FORM
*
* @param data send data
* @param url target url
* @return data receive from serv
* @author MilkZS
*/
public static String postForm(String data, String url) {
return doHttpAction(data, false, true, url);
}
/**
* GET + JSON
*
* @param data send data
* @param url target url
* @return data receive from server
* @author MilkZS
*/
public static String getJson(String data, String url) {
return doHttpAction(data, true, false, url);
}
/**
* GET + FORM
*
* @param data send data
* @param url target url
* @return data receive from server
* @author MilkZS
*/
public static String getForm(String data, String url) {
return doHttpAction(data, false, false, url);
}
private static String doHttpAction(String data, boolean json, boolean post, String url) {
HttpURLConnection connection = null;
DataOutputStream os = null;
InputStream is = null;
try {
URL sUrl = new URL(url);
connection = (HttpURLConnection) sUrl.openConnection();
connection.setConnectTimeout(CONNECT_TIMEOUT_TIME);
connection.setReadTimeout(READ_TIMEOUT_TIME);
if (post) {
connection.setRequestMethod("POST");
} else {
connection.setRequestMethod("GET");
}
//允许输入输出
connection.setDoInput(true);
connection.setDoOutput(true);
// 是否使用缓冲
connection.setUseCaches(false);
// 本次连接是否处理重定向,设置成true,系统自动处理重定向;
// 设置成false,则需要自己从http reply中分析新的url自己重新连接。
connection.setInstanceFollowRedirects(true);
// 设置请求头里的属性
if (json) {
connection.setRequestProperty("Content-Type", "application/json");
} else {
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", data.length() + "");
}
connection.connect();
os = new DataOutputStream(connection.getOutputStream());
os.write(data.getBytes(), 0, data.getBytes().length);
os.flush();
os.close();
is = connection.getInputStream();
Scanner scan = new Scanner(is);
scan.useDelimiter("\\A");
if (scan.hasNext()) return scan.next();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) connection.disconnect();
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/LocationUtils.java
================================================
package com.blankj.subutil.util;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.RequiresPermission;
import android.util.Log;
import com.blankj.utilcode.util.Utils;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 16/11/13
* desc : 定位相关工具类
*
*/
public final class LocationUtils {
private static final int TWO_MINUTES = 1000 * 60 * 2;
private static OnLocationChangeListener mListener;
private static MyLocationListener myLocationListener;
private static LocationManager mLocationManager;
private LocationUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
// /**
// * you have to check for Location Permission before use this method
// * add this code to your Manifest file.
// * you have also implement LocationListener and passed it to the method.
// *
// * @param Context
// * @param LocationListener
// * @return {@code Location}
// */
//
// @SuppressLint("MissingPermission")
// public static Location getLocation(Context context, LocationListener listener) {
// Location location = null;
// try {
// mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
// if (!isLocationEnabled()) {
// //no Network and GPS providers is enabled
// Toast.makeText(context
// , " you have to open GPS or INTERNET"
// , Toast.LENGTH_LONG)
// .show();
// } else {
// if (isLocationEnabled()) {
// mLocationManager.requestLocationUpdates(
// LocationManager.NETWORK_PROVIDER,
// MIN_TIME_BETWEEN_UPDATES,
// MIN_DISTANCE_CHANGE_FOR_UPDATES,
// listener);
//
// if (mLocationManager != null) {
// location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// if (location != null) {
// mLocationManager.removeUpdates(listener);
// return location;
// }
// }
// }
// //when GPS is enabled.
// if (isGpsEnabled()) {
// if (location == null) {
// mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
// MIN_TIME_BETWEEN_UPDATES,
// MIN_DISTANCE_CHANGE_FOR_UPDATES,
// listener);
//
// if (mLocationManager != null) {
// location =
// mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
// if (location != null) {
// mLocationManager.removeUpdates(listener);
// return location;
// }
// }
// }
// }
//
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// return location;
// }
/**
* 判断Gps是否可用
*
* @return {@code true}: 是 {@code false}: 否
*/
public static boolean isGpsEnabled() {
LocationManager lm = (LocationManager) Utils.getApp().getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* 判断定位是否可用
*
* @return {@code true}: 是 {@code false}: 否
*/
public static boolean isLocationEnabled() {
LocationManager lm = (LocationManager) Utils.getApp().getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
|| lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* 打开Gps设置界面
*/
public static void openGpsSettings() {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
Utils.getApp().startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
/**
* 注册
* 使用完记得调用{@link #unregister()}
* 需添加权限 {@code }
* 需添加权限 {@code }
* 需添加权限 {@code }
* 如果{@code minDistance}为0,则通过{@code minTime}来定时更新;
* {@code minDistance}不为0,则以{@code minDistance}为准;
* 两者都为0,则随时刷新。
*
* @param minTime 位置信息更新周期(单位:毫秒)
* @param minDistance 位置变化最小距离:当位置距离变化超过此值时,将更新位置信息(单位:米)
* @param listener 位置刷新的回调接口
* @return {@code true}: 初始化成功 {@code false}: 初始化失败
*/
@RequiresPermission(ACCESS_FINE_LOCATION)
public static boolean register(long minTime, long minDistance, OnLocationChangeListener listener) {
if (listener == null) return false;
mLocationManager = (LocationManager) Utils.getApp().getSystemService(Context.LOCATION_SERVICE);
if (!mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
&& !mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Log.d("LocationUtils", "无法定位,请打开定位服务");
return false;
}
mListener = listener;
String provider = mLocationManager.getBestProvider(getCriteria(), true);
Location location = mLocationManager.getLastKnownLocation(provider);
if (location != null) listener.getLastKnownLocation(location);
if (myLocationListener == null) myLocationListener = new MyLocationListener();
mLocationManager.requestLocationUpdates(provider, minTime, minDistance, myLocationListener);
return true;
}
/**
* 注销
*/
@RequiresPermission(ACCESS_COARSE_LOCATION)
public static void unregister() {
if (mLocationManager != null) {
if (myLocationListener != null) {
mLocationManager.removeUpdates(myLocationListener);
myLocationListener = null;
}
mLocationManager = null;
}
if (mListener != null) {
mListener = null;
}
}
/**
* 设置定位参数
*
* @return {@link Criteria}
*/
private static Criteria getCriteria() {
Criteria criteria = new Criteria();
// 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 设置是否要求速度
criteria.setSpeedRequired(false);
// 设置是否允许运营商收费
criteria.setCostAllowed(false);
// 设置是否需要方位信息
criteria.setBearingRequired(false);
// 设置是否需要海拔信息
criteria.setAltitudeRequired(false);
// 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
return criteria;
}
/**
* 根据经纬度获取地理位置
*
* @param latitude 纬度
* @param longitude 经度
* @return {@link Address}
*/
public static Address getAddress(double latitude, double longitude) {
Geocoder geocoder = new Geocoder(Utils.getApp(), Locale.getDefault());
try {
List addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) return addresses.get(0);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据经纬度获取所在国家
*
* @param latitude 纬度
* @param longitude 经度
* @return 所在国家
*/
public static String getCountryName(double latitude, double longitude) {
Address address = getAddress(latitude, longitude);
return address == null ? "unknown" : address.getCountryName();
}
/**
* 根据经纬度获取所在地
*
* @param latitude 纬度
* @param longitude 经度
* @return 所在地
*/
public static String getLocality(double latitude, double longitude) {
Address address = getAddress(latitude, longitude);
return address == null ? "unknown" : address.getLocality();
}
/**
* 根据经纬度获取所在街道
*
* @param latitude 纬度
* @param longitude 经度
* @return 所在街道
*/
public static String getStreet(double latitude, double longitude) {
Address address = getAddress(latitude, longitude);
return address == null ? "unknown" : address.getAddressLine(0);
}
/**
* 是否更好的位置
*
* @param newLocation The new Location that you want to evaluate
* @param currentBestLocation The current Location fix, to which you want to compare the new one
* @return {@code true}: 是 {@code false}: 否
*/
public static boolean isBetterLocation(Location newLocation, Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return true;
}
// Check whether the new location fix is newer or older
long timeDelta = newLocation.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return true;
// If the new location is more than two minutes older, it must be worse
} else if (isSignificantlyOlder) {
return false;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (newLocation.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(newLocation.getProvider(), currentBestLocation.getProvider());
// Determine location quality using a combination of timeliness and accuracy
if (isMoreAccurate) {
return true;
} else if (isNewer && !isLessAccurate) {
return true;
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
return true;
}
return false;
}
/**
* 是否相同的提供者
*
* @param provider0 提供者1
* @param provider1 提供者2
* @return {@code true}: 是 {@code false}: 否
*/
public static boolean isSameProvider(String provider0, String provider1) {
if (provider0 == null) {
return provider1 == null;
}
return provider0.equals(provider1);
}
private static class MyLocationListener
implements LocationListener {
/**
* 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
*
* @param location 坐标
*/
@Override
public void onLocationChanged(Location location) {
if (mListener != null) {
mListener.onLocationChanged(location);
}
}
/**
* provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数
*
* @param provider 提供者
* @param status 状态
* @param extras provider可选包
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (mListener != null) {
mListener.onStatusChanged(provider, status, extras);
}
switch (status) {
case LocationProvider.AVAILABLE:
Log.d("LocationUtils", "当前GPS状态为可见状态");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d("LocationUtils", "当前GPS状态为服务区外状态");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d("LocationUtils", "当前GPS状态为暂停服务状态");
break;
}
}
/**
* provider被enable时触发此函数,比如GPS被打开
*/
@Override
public void onProviderEnabled(String provider) {
}
/**
* provider被disable时触发此函数,比如GPS被关闭
*/
@Override
public void onProviderDisabled(String provider) {
}
}
public interface OnLocationChangeListener {
/**
* 获取最后一次保留的坐标
*
* @param location 坐标
*/
void getLastKnownLocation(Location location);
/**
* 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
*
* @param location 坐标
*/
void onLocationChanged(Location location);
/**
* provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数
*
* @param provider 提供者
* @param status 状态
* @param extras provider可选包
*/
void onStatusChanged(String provider, int status, Bundle extras);//位置状态发生改变
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/LunarUtils.java
================================================
package com.blankj.subutil.util;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2016/12/05
* desc : 日历相关工具类
*
*/
public final class LunarUtils {
private LunarUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/*
* |----4位闰月|-------------13位1为30天,0为29天|
*/
private static final 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 final int[] SOLAR_1_1 = {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(final int data, final int length, final int shift) {
return (data & (((1 << length) - 1) << shift)) >> shift;
}
/**
* 农历年转干支年
*
* @param lunarYear 农历年份
* @return 干支年
*/
public static String lunarYear2GanZhi(final int lunarYear) {
final String[] tianGan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
final String[] diZhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
return tianGan[(lunarYear - 4) % 10] + diZhi[(lunarYear - 4) % 12] + "年";
}
/**
* 农历转公历
*
* @param lunar 农历
* @return 公历
*/
public static Solar lunar2Solar(final Lunar lunar) {
int days = LUNAR_MONTH_DAYS[lunar.lunarYear - LUNAR_MONTH_DAYS[0]];
int leap = getBitInt(days, 4, 13);
int offset = 0;
int loopend = leap;
if (!lunar.isLeap) {
if (lunar.lunarMonth <= leap || leap == 0) {
loopend = lunar.lunarMonth - 1;
} else {
loopend = lunar.lunarMonth;
}
}
for (int i = 0; i < loopend; i++) {
offset += getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
}
offset += lunar.lunarDay;
int solar11 = SOLAR_1_1[lunar.lunarYear - SOLAR_1_1[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);
}
/**
* 公历转农历
*
* @param solar 公历
* @return 阴历
*/
public static Lunar solar2Lunar(final Solar solar) {
Lunar lunar = new Lunar();
int index = solar.solarYear - SOLAR_1_1[0];
int data = (solar.solarYear << 9) | (solar.solarMonth << 5) | (solar.solarDay);
int solar11 = 0;
if (SOLAR_1_1[index] > data) {
index--;
}
solar11 = SOLAR_1_1[index];
int y = getBitInt(solar11, 12, 9);
int m = getBitInt(solar11, 4, 5);
int d = getBitInt(solar11, 5, 0);
long offset = solarToInt(solar.solarYear, solar.solarMonth, solar.solarDay) - solarToInt(y, m, d);
int days = LUNAR_MONTH_DAYS[index];
int leap = getBitInt(days, 4, 13);
int lunarY = index + SOLAR_1_1[0];
int lunarM = 1;
int lunarD = 1;
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);
lunar.lunarYear = lunarY;
lunar.lunarMonth = lunarM;
lunar.isLeap = false;
if (leap != 0 && lunarM > leap) {
lunar.lunarMonth = lunarM - 1;
if (lunarM == leap + 1) {
lunar.isLeap = true;
}
}
lunar.lunarDay = lunarD;
return lunar;
}
private static Solar solarFromInt(final 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;
Solar solar = new Solar();
solar.solarYear = (int) y;
solar.solarMonth = (int) mm;
solar.solarDay = (int) dd;
return solar;
}
private static long solarToInt(int y, int m, final 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);
}
public static class Lunar {
public int lunarYear;
public int lunarMonth;
public int lunarDay;
public boolean isLeap;
Lunar() {
}
public Lunar(int lunarYear, int lunarMonth, int lunarDay, boolean isLeap) {
this.lunarYear = lunarYear;
this.lunarMonth = lunarMonth;
this.lunarDay = lunarDay;
this.isLeap = isLeap;
}
@Override
public String toString() {
return "" + lunarYear + ", " + lunarMonth + ", " + lunarDay + ", " + isLeap;
}
}
public static class Solar {
public int solarYear;
public int solarMonth;
public int solarDay;
Solar() {
}
public Solar(int solarYear, int solarMonth, int solarDay) {
this.solarYear = solarYear;
this.solarMonth = solarMonth;
this.solarDay = solarDay;
}
@Override
public String toString() {
return "" + solarYear + ", " + solarMonth + ", " + solarDay;
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/PinyinUtils.java
================================================
package com.blankj.subutil.util;
import androidx.collection.SimpleArrayMap;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 16/11/16
* desc : 拼音相关工具类
*
*/
public final class PinyinUtils {
private PinyinUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 汉字转拼音
*
* @param ccs 汉字字符串(Chinese characters)
* @return 拼音
*/
public static String ccs2Pinyin(final CharSequence ccs) {
return ccs2Pinyin(ccs, "");
}
/**
* 汉字转拼音
*
* @param ccs 汉字字符串(Chinese characters)
* @param split 汉字拼音之间的分隔符
* @return 拼音
*/
public static String ccs2Pinyin(final CharSequence ccs, final CharSequence split) {
if (ccs == null || ccs.length() == 0) return null;
StringBuilder sb = new StringBuilder();
for (int i = 0, len = ccs.length(); i < len; i++) {
char ch = ccs.charAt(i);
if (ch >= 0x4E00 && ch <= 0x9FA5) {
int sp = (ch - 0x4E00) * 6;
sb.append(pinyinTable.substring(sp, sp + 6).trim());
} else {
sb.append(ch);
}
sb.append(split);
}
return sb.toString();
}
/**
* 获取第一个汉字首字母
*
* @param ccs 汉字字符串(Chinese characters)
* @return 拼音
*/
public static String getPinyinFirstLetter(final CharSequence ccs) {
if (ccs == null || ccs.length() == 0) return null;
return ccs2Pinyin(String.valueOf(ccs.charAt(0))).substring(0, 1);
}
/**
* 获取所有汉字的首字母
*
* @param ccs 汉字字符串(Chinese characters)
* @return 所有汉字的首字母
*/
public static String getPinyinFirstLetters(final CharSequence ccs) {
return getPinyinFirstLetters(ccs, "");
}
/**
* 获取所有汉字的首字母
*
* @param ccs 汉字字符串(Chinese characters)
* @param split 首字母之间的分隔符
* @return 所有汉字的首字母
*/
public static String getPinyinFirstLetters(final CharSequence ccs, final CharSequence split) {
if (ccs == null || ccs.length() == 0) return null;
int len = ccs.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
sb.append(ccs2Pinyin(String.valueOf(ccs.charAt(i))).substring(0, 1)).append(split);
}
return sb.toString();
}
/**
* 根据名字获取姓氏的拼音
*
* @param name 名字
* @return 姓氏的拼音
*/
public static String getSurnamePinyin(final CharSequence name) {
if (name == null || name.length() == 0) return null;
if (name.length() >= 2) {
CharSequence str = name.subSequence(0, 2);
if (str.equals("澹台")) return "tantai";
else if (str.equals("尉迟")) return "yuchi";
else if (str.equals("万俟")) return "moqi";
else if (str.equals("单于")) return "chanyu";
}
char ch = name.charAt(0);
if (SURNAMES.containsKey(ch)) {
return SURNAMES.get(ch);
}
if (ch >= 0x4E00 && ch <= 0x9FA5) {
int sp = (ch - 0x4E00) * 6;
return pinyinTable.substring(sp, sp + 6).trim();
} else {
return String.valueOf(ch);
}
}
/**
* 根据名字获取姓氏的首字母
*
* @param name 名字
* @return 姓氏的首字母
*/
public static String getSurnameFirstLetter(final CharSequence name) {
String surname = getSurnamePinyin(name);
if (surname == null || surname.length() == 0) return null;
return String.valueOf(surname.charAt(0));
}
// 多音字姓氏映射表
private static final SimpleArrayMap SURNAMES;
/**
* 获取拼音对照表,对比过pinyin4j和其他方式,这样查表设计的好处就是读取快
* 当该类加载后会一直占有123KB的内存
* 如果你想存进文件,然后读取操作的话也是可以,但速度肯定没有这样空间换时间快,毕竟现在设备内存都很大
* 如需更多用法可以用pinyin4j开源库
*/
private static final String pinyinTable;
static {
SURNAMES = new SimpleArrayMap<>(35);
SURNAMES.put('乐', "yue");
SURNAMES.put('乘', "sheng");
SURNAMES.put('乜', "nie");
SURNAMES.put('仇', "qiu");
SURNAMES.put('会', "gui");
SURNAMES.put('便', "pian");
SURNAMES.put('区', "ou");
SURNAMES.put('单', "shan");
SURNAMES.put('参', "shen");
SURNAMES.put('句', "gou");
SURNAMES.put('召', "shao");
SURNAMES.put('员', "yun");
SURNAMES.put('宓', "fu");
SURNAMES.put('弗', "fei");
SURNAMES.put('折', "she");
SURNAMES.put('曾', "zeng");
SURNAMES.put('朴', "piao");
SURNAMES.put('查', "zha");
SURNAMES.put('洗', "xian");
SURNAMES.put('盖', "ge");
SURNAMES.put('祭', "zhai");
SURNAMES.put('种', "chong");
SURNAMES.put('秘', "bi");
SURNAMES.put('繁', "po");
SURNAMES.put('缪', "miao");
SURNAMES.put('能', "nai");
SURNAMES.put('蕃', "pi");
SURNAMES.put('覃', "qin");
SURNAMES.put('解', "xie");
SURNAMES.put('谌', "shan");
SURNAMES.put('适', "kuo");
SURNAMES.put('都', "du");
SURNAMES.put('阿', "e");
SURNAMES.put('难', "ning");
SURNAMES.put('黑', "he");
//noinspection StringBufferReplaceableByString
pinyinTable = new StringBuilder(125412)
.append("yi ding kao qi shang xia none wan zhang san shang xia ji bu yu mian gai chou chou zhuan qie pi shi shi qiu bing ye cong dong si cheng diu qiu liang diu you liang yan bing sang shu jiu ge ya qiang zhong ji jie feng guan chuan chan lin zhuo zhu none wan dan wei zhu jing li ju pie fu yi yi nai none jiu jiu tuo me yi none zhi wu zha hu fa le zhong ping pang qiao hu guai cheng cheng yi yin none mie jiu qi ye xi xiang gai diu none none shu none shi ji nang jia none shi none none mai luan none ru xi yan fu sha na gan none none none none qian zhi gui gan luan lin yi jue le none yu zheng shi shi er chu yu kui yu yun hu qi wu jing si sui gen gen ya xie ya qi ya ji tou wang kang ta jiao hai yi chan heng mu none xiang jing ting liang heng jing ye qin bo you xie dan lian duo wei ren ren ji none wang yi shen ren le ding ze jin pu chou ba zhang jin jie bing reng cong fo san lun none cang zi shi ta zhang fu xian xian cha hong tong ren qian gan ge di dai ling yi chao chang sa shang yi mu men ren jia chao yang qian zhong pi wan wu jian jia yao feng cang ren wang fen di fang zhong qi pei yu diao dun wen yi xin kang yi ji ai wu ji fu fa xiu jin bei chen fu tang zhong you huo hui yu cui yun san wei chuan che ya xian shang chang lun cang xun xin wei zhu chi xuan nao bo gu ni ni xie ban xu ling zhou shen qu si beng si jia pi yi si ai zheng dian han mai dan zhu bu qu bi shao ci wei di zhu zuo you yang ti zhan he bi tuo she yu yi fo zuo gou ning tong ni xuan ju yong wa qian none ka none pei huai he lao xiang ge yang bai fa ming jia nai bing ji heng huo gui quan tiao jiao ci yi shi xing shen tuo kan zhi gai lai yi chi kua guang li yin shi mi zhu xu you an lu mou er lun dong cha chi xun gong zhou yi ru jian xia jia zai lu: none jiao zhen ce qiao kuai chai ning nong jin wu hou jiong cheng zhen cuo chou qin lu: ju shu ting shen tuo bo nan hao bian tui yu xi cu e qiu xu kuang ku wu jun yi fu lang zu qiao li yong hun jing xian san pai su fu xi li mian ping bao yu si xia xin xiu yu ti che chou none yan liang li lai si jian xiu fu he ju xiao pai jian biao ti fei feng ya an bei yu xin bi chi chang zhi bing zan yao cui lia wan lai cang zong ge guan bei tian shu shu men dao tan jue chui xing peng tang hou yi qi ti gan jing jie xu chang jie fang zhi kong juan zong ju qian ni lun zhuo wo luo song leng hun dong zi ben wu ju nai cai jian zhai ye zhi sha qing none ying cheng qian yan nuan zhong chun jia jie wei yu bing ruo ti wei pian yan feng tang wo e xie che sheng kan di zuo cha ting bei ye huang yao zhan qiu yan you jian xu zha chai fu bi zhi zong mian ji yi xie xun si duan ce zhen ou tou tou bei za lou jie wei fen chang kui sou chi su xia fu yuan rong li ru yun gou ma bang dian tang hao jie xi shan qian jue cang chu san bei xiao yong yao ta suo wang fa bing jia dai zai tang none bin chu nuo zan lei cui yong zao zong peng song ao chuan yu zhai zu shang qian")
.append("g qiang chi sha han zhang qing yan di xi lou bei piao jin lian lu man qian xian qiu ying dong zhuan xiang shan qiao jiong tui zun pu xi lao chang guang liao qi deng chan wei zhang fan hui chuan tie dan jiao jiu seng fen xian jue e jiao jian tong lin bo gu xian su xian jiang min ye jin jia qiao pi feng zhou ai sai yi jun nong shan yi dang jing xuan kuai jian chu dan jiao sha zai none bin an ru tai chou chai lan ni jin qian meng wu neng qiong ni chang lie lei lu: kuang bao du biao zan zhi si you hao qin chen li teng wei long chu chan rang shu hui li luo zan nuo tang yan lei nang er wu yun zan yuan xiong chong zhao xiong xian guang dui ke dui mian tu chang er dui er jin tu si yan yan shi shi dang qian dou fen mao xin dou bai jing li kuang ru wang nei quan liang yu ba gong liu xi none lan gong tian guan xing bing qi ju dian zi none yang jian shou ji yi ji chan jiong mao ran nei yuan mao gang ran ce jiong ce zai gua jiong mao zhou mao gou xu mian mi rong yin xie kan jun nong yi mi shi guan meng zhong zui yuan ming kou none fu xie mi bing dong tai gang feng bing hu chong jue hu kuang ye leng pan fu min dong xian lie xia jian jing shu mei shang qi gu zhun song jing liang qing diao ling dong gan jian yin cou ai li cang ming zhun cui si duo jin lin lin ning xi du ji fan fan fan feng ju chu none feng none none fu feng ping feng kai huang kai gan deng ping qu xiong kuai tu ao chu ji dang han han zao dao diao dao ren ren chuangfen qie yi ji kan qian cun chu wen ji dan xing hua wan jue li yue lie liu ze gang chuangfu chu qu ju shan min ling zhong pan bie jie jie bao li shan bie chan jing gua gen dao chuangkui ku duo er zhi shua quan cha ci ke jie gui ci gui kai duo ji ti jing lou luo ze yuan cuo xue ke la qian cha chuan gua jian cuo li ti fei pou chan qi chuangzi gang wan bo ji duo qing yan zhuo jian ji bo yan ju huo sheng jian duo duan wu gua fu sheng jian ge zha kai chuangjuan chan tuan lu li fou shan piao kou jiao gua qiao jue hua zha zhuo lian ju pi liu gui jiao gui jian jian tang huo ji jian yi jian zhi chan cuan mo li zhu li ya quan ban gong jia wu mai lie jing keng xie zhi dong zhu nu jie qu shao yi zhu mo li jing lao lao juan kou yang wa xiao mou kuang jie lie he shi ke jing hao bo min chi lang yong yong mian ke xun juan qing lu bu meng lai le kai mian dong xu xu kan wu yi xun weng sheng lao mu lu piao shi ji qin qiang jiao quan xiang yi qiao fan juan tong ju dan xie mai xun xun lu: li che rang quan bao shao yun jiu bao gou wu yun none none gai gai bao cong none xiong peng ju tao ge pu an pao fu gong da jiu qiong bi hua bei nao chi fang jiu yi za jiang kang jiang kuang hu xia qu fan gui qie cang kuang fei hu yu gui kui hui dan kui lian lian suan du jiu qu xi pi qu yi an yan bian ni qu shi xin qian nian sa zu sheng wu hui ban shi xi wan hua xie wan bei zu zhuo xie dan mai nan dan ji bo shuai bu kuang bian bu zhan ka lu you lu xi gua wo xie jie jie wei ang qiong zhi mao yin we")
.append("i shao ji que luan shi juan xie xu jin que wu ji e qing xi none chang han e ting li zhe an li ya ya yan she zhi zha pang none ke ya zhi ce pang ti li she hou ting zui cuo fei yuan ce yuan xiang yan li jue sha dian chu jiu qin ao gui yan si li chang lan li yan yan yuan si si lin qiu qu qu none lei du xian zhuan san can can san can ai dai you cha ji you shuangfan shou guai ba fa ruo shi shu zhui qu shou bian xu jia pan sou ji yu sou die rui cong kou gu ju ling gua tao kou zhi jiao zhao ba ding ke tai chi shi you qiu po ye hao si tan chi le diao ji none hong mie yu mang chi ge xuan yao zi he ji diao cun tong ming hou li tu xiang zha he ye lu: a ma ou xue yi jun chou lin tun yin fei bi qin qin jie pou fou ba dun fen e han ting hang shun qi hu zhi yin wu wu chao na chuo xi chui dou wen hou ou wu gao ya jun lu: e ge mei dai qi cheng wu gao fu jiao hong chi sheng na tun m yi dai ou li bei yuan guo none qiang wu e shi quan pen wen ni mou ling ran you di zhou shi zhou zhan ling yi qi ping zi gua ci wei xu he nao xia pei yi xiao shen hu ming da qu ju gan za tuo duo pou pao bie fu bi he za he hai jiu yong fu da zhou wa ka gu ka zuo bu long dong ning zha si xian huo qi er e guang zha xi yi lie zi mie mi zhi yao ji zhou ge shuai zan xiao ke hui kua huai tao xian e xuan xiu guo yan lao yi ai pin shen tong hong xiong duo wa ha zai you di pai xiang ai gen kuang ya da xiao bi hui none hua none kuai duo none ji nong mou yo hao yuan long pou mang ge e chi shao li na zu he ku xiao xian lao bei zhe zha liang ba mi le sui fou bu han heng geng shuo ge you yan gu gu bai han suo chun yi ai jia tu xian guan li xi tang zuo miu che wu zao ya dou qi di qin ma none gong dou none lao liang suo zao huan none gou ji zuo wo feng yin hu qi shou wei shua chang er li qiang an jie yo nian yu tian lai sha xi tuo hu ai zhou nou ken zhuo zhuo shang di heng lin a xiao xiang tun wu wen cui jie hu qi qi tao dan dan wan zi bi cui chuo he ya qi zhe fei liang xian pi sha la ze qing gua pa zhe se zhuan nie guo luo yan di quan tan bo ding lang xiao none tang chi ti an jiu dan ka yong wei nan shan yu zhe la jie hou han die zhou chai kuai re yu yin zan yao wo mian hu yun chuan hui huan huan xi he ji kui zhong wei sha xu huang du nie xuan liang yu sang chi qiao yan dan pen shi li yo zha wei miao ying pen none kui xi yu jie lou ku cao huo ti yao he a xiu qiang se yong su hong xie ai suo ma cha hai ke da sang chen ru sou gong ji pang wu qian shi ge zi jie luo weng wa si chi hao suo jia hai suo qin nie he none sai ng ge na dia ai none tong bi ao ao lian cui zhe mo sou sou tan di qi jiao chong jiao kai tan san cao jia none xiao piao lou ga gu xiao hu hui guo ou xian ze chang xu po de ma ma hu lei du ga tang ye beng ying none jiao mi xiao hua ")
.append("mai ran zuo peng lao xiao ji zhu chao kui zui xiao si hao fu liao qiao xi xu chan dan hei xun wu zun pan chi kui can zan cu dan yu tun cheng jiao ye xi qi hao lian xu deng hui yin pu jue qin xun nie lu si yan ying da zhan o zhou jin nong hui hui qi e zao yi shi jiao yuan ai yong xue kuai yu pen dao ga xin dun dang none sai pi pi yin zui ning di han ta huo ru hao xia yan duo pi chou ji jin hao ti chang none none ca ti lu hui bao you nie yin hu mo huang zhe li liu none nang xiao mo yan li lu long mo dan chen pin pi xiang huo mo xi duo ku yan chan ying rang dian la ta xiao jiao chuo huan huo zhuan nie xiao ca li chan chai li yi luo nang zan su xi none jian za zhu lan nie nang none none wei hui yin qiu si nin jian hui xin yin nan tuan tuan dun kang yuan jiong pian yun cong hu hui yuan e guo kun cong wei tu wei lun guo jun ri ling gu guo tai guo tu you guo yin hun pu yu han yuan lun quan yu qing guo chui wei yuan quan ku pu yuan yuan e tu tu tu tuan lu:e hui yi yuan luan luan tu ya tu ting sheng yan lu none ya zai wei ge yu wu gui pi yi di qian qian zhen zhuo dang qia none none kuang chang qi nie mo ji jia zhi zhi ban xun tou qin fen jun keng dun fang fen ben tan kan huai zuo keng bi xing di jing ji kuai di jing jian tan li ba wu fen zhui po pan tang kun qu tan zhi tuo gan ping dian wa ni tai pi jiong yang fo ao liu qiu mu ke gou xue ba chi che ling zhu fu hu zhi chui la long long lu ao none pao none xing tong ji ke lu ci chi lei gai yin hou dui zhao fu guang yao duo duo gui cha yang yin fa gou yuan die xie ken shang shou e none dian hong ya kua da none dang kai none nao an xing xian huan bang pei ba yi yin han xu chui cen geng ai peng fang que yong jun jia di mai lang xuan cheng shan jin zhe lie lie pu cheng none bu shi xun guo jiong ye nian di yu bu wu juan sui pi cheng wan ju lun zheng kong zhong dong dai tan an cai shu beng kan zhi duo yi zhi yi pei ji zhun qi sao ju ni ku ke tang kun ni jian dui jin gang yu e peng gu tu leng none ya qian none an chen duo nao tu cheng yin hun bi lian guo die zhuan hou bao bao yu di mao jie ruan e geng kan zong yu huang e yao yan bao ji mei chang du tuo an feng zhong jie zhen heng gang chuan jian none lei gang huang leng duan wan xuan ji ji kuai ying ta cheng yong kai su su shi mi ta weng cheng tu tang qiao zhong li peng bang sai zang dui tian wu cheng xun ge zhen ai gong yan kan tian yuan wen xie liu none lang chang peng beng chen lu lu ou qian mei mo zhuan shuangshu lou chi man biao jing ce shu di zhang kan yong dian chen zhi ji guo qiang jin di shang mu cui yan ta zeng qi qiang liang none zhui qiao zeng xu shan shan ba pu kuai dong fan que mo dun dun zun zui sheng duo duo tan deng mu fen huang tan da ye chu none ao qiang ji qiao ken yi pi bi dian jiang ye yong xue tan lan ju huai dang rang qian xuan lan mi he kai ya dao hao ruan none lei kuang lu yan tan wei huai long long rui li ")
.append(" lin rang chan xun yan lei ba none shi ren none zhuangzhuangsheng yi mai qiao zhu zhuanghu hu kun yi hu xu kun shou mang zun shou yi zhi gu chu xiang feng bei none bian sui qun ling fu zuo xia xiong none nao xia kui xi wai yuan mao su duo duo ye qing none gou gou qi meng meng yin huo chen da ze tian tai fu guai yao yang hang gao shi ben tai tou yan bi yi kua jia duo none kuang yun jia ba en lian huan di yan pao juan qi nai feng xie fen dian none kui zou huan qi kai she ben yi jiang tao zhuangben xi huang fei diao sui beng dian ao she weng pan ao wu ao jiang lian duo yun jiang shi fen huo bei lian che nu: nu ding nai qian jian ta jiu nan cha hao xian fan ji shuo ru fei wang hong zhuangfu ma dan ren fu jing yan xie wen zhong pa du ji keng zhong yao jin yun miao pei chi yue zhuangniu yan na xin fen bi yu tuo feng yuan fang wu yu gui du ba ni zhou zhou zhao da nai yuan tou xuan zhi e mei mo qi bi shen qie e he xu fa zheng ni ban mu fu ling zi zi shi ran shan yang qian jie gu si xing wei zi ju shan pin ren yao tong jiang shu ji gai shang kuo juan jiao gou lao jian jian yi nian zhi ji ji xian heng guang jun kua yan ming lie pei yan you yan cha xian yin chi gui quan zi song wei hong wa lou ya rao jiao luan ping xian shao li cheng xie mang none suo mu wei ke lai chuo ding niang keng nan yu na pei sui juan shen zhi han di zhuange pin tui xian mian wu yan wu xi yan yu si yu wa li xian ju qu chui qi xian zhui dong chang lu ai e e lou mian cong pou ju po cai ling wan biao xiao shu qi hui fu wo rui tan fei none jie tian ni quan jing hun jing qian dian xing hu wan lai bi yin chou chuo fu jing lun yan lan kun yin ya none li dian xian none hua ying chan shen ting yang yao wu nan chuo jia tou xu yu wei ti rou mei dan ruan qin none wu qian chun mao fu jie duan xi zhong mei huang mian an ying xuan none wei mei yuan zhen qiu ti xie tuo lian mao ran si pian wei wa jiu hu ao none bao xu tou gui zou yao pi xi yuan ying rong ru chi liu mei pan ao ma gou kui qin jia sao zhen yuan cha yong ming ying ji su niao xian tao pang lang niao bao ai pi pin yi piao yu lei xuan man yi zhang kang yong ni li di gui yan jin zhuan chang ce han nen lao mo zhe hu hu ao nen qiang none bi gu wu qiao tuo zhan mao xian xian mo liao lian hua gui deng zhi xu none hua xi hui rao xi yan chan jiao mei fan fan xian yi wei chan fan shi bi shan sui qiang lian huan none niao dong yi can ai niang ning ma tiao chou jin ci yu pin none xu nai yan tai ying can niao none ying mian none ma shen xing ni du liu yuan lan yan shuangling jiao niang lan xian ying shuangshuai quan mi li luan yan zhu lan zi jie jue jue kong yun zi zi cun sun fu bei zi xiao xin meng si tai bao ji gu nu xue none chan hai luan sun nao mie cong jian shu chan ya zi ni fu zi li xue bo ru nai nie nie ying luan mian ning rong ta gui zhai qiong yu shou an tu song wan rou yao hong yi jing zhun mi guai dang hong zong guan zhou ding wa")
.append("n yi bao shi shi chong shen ke xuan shi you huan yi tiao shi xian gong cheng qun gong xiao zai zha bao hai yan xiao jia shen chen rong huang mi kou kuan bin su cai zan ji yuan ji yin mi kou qing he zhen jian fu ning bing huan mei qin han yu shi ning jin ning zhi yu bao kuan ning qin mo cha ju gua qin hu wu liao shi ning zhai shen wei xie kuan hui liao jun huan yi yi bao qin chong bao feng cun dui si xun dao lu: dui shou po feng zhuan fu she ke jiang jiang zhuan wei zun xun shu dui dao xiao ji shao er er er ga jian shu chen shang shang yuan ga chang liao xian xian none wang wang you liao liao yao mang wang wang wang ga yao duo kui zhong jiu gan gu gan gan gan gan shi yin chi kao ni jin wei niao ju pi ceng xi bi ju jie tian qu ti jie wu diao shi shi ping ji xie chen xi ni zhan xi none man e lou ping ti fei shu xie tu lu: lu: xi ceng lu: ju xie ju jue liao jue shu xi che tun ni shan wa xian li e none none long yi qi ren wu han shen yu chu sui qi none yue ban yao ang ya wu jie e ji qian fen wan qi cen qian qi cha jie qu gang xian ao lan dao ba zhai zuo yang ju gang ke gou xue bo li tiao qu yan fu xiu jia ling tuo pei you dai kuang yue qu hu po min an tiao ling chi none dong none kui xiu mao tong xue yi none he ke luo e fu xun die lu lang er gai quan tong yi mu shi an wei hu zhi mi li ji tong kui you none xia li yao jiao zheng luan jiao e e yu ye bu qiao qun feng feng nao li you xian hong dao shen cheng tu geng jun hao xia yin wu lang kan lao lai xian que kong chong chong ta none hua ju lai qi min kun kun zu gu cui ya ya gang lun lun leng jue duo cheng guo yin dong han zheng wei yao pi yan song jie beng zu jue dong zhan gu yin zi ze huang yu wei yang feng qiu dun ti yi zhi shi zai yao e zhu kan lu: yan mei gan ji ji huan ting sheng mei qian wu yu zong lan jie yan yan wei zong cha sui rong ke qin yu qi lou tu dui xi weng cang dang rong jie ai liu wu song qiao zi wei beng dian cuo qian yong nie cuo ji none none song zong jiang liao none chan di cen ding tu lou zhang zhan zhan ao cao qu qiang zui zui dao dao xi yu bo long xiang ceng bo qin jiao yan lao zhan lin liao liao jin deng duo zun jiao gui yao qiao yao jue zhan yi xue nao ye ye yi e xian ji xie ke sui di ao zui none yi rong dao ling za yu yue yin none jie li sui long long dian ying xi ju chan ying kui yan wei nao quan chao cuan luan dian dian nie yan yan yan nao yan chuan gui chuan zhou huang jing xun chao chao lie gong zuo qiao ju gong none wu none none cha qiu qiu ji yi si ba zhi zhao xiang yi jin xun juan none xun jin fu za bi shi bu ding shuai fan nie shi fen pa zhi xi hu dan wei zhang tang dai ma pei pa tie fu lian zhi zhou bo zhi di mo yi yi ping qia juan ru shuai dai zhen shui qiao zhen shi qun xi bang dai gui chou ping zhang sha wan dai wei chang sha qi ze guo mao du hou zhen xu mi wei wo fu yi bang ping none gong pan huang dao mi jia teng hui zhong sen ")
.append("man mu biao guo ze mu bang zhang jiong chan fu zhi hu fan chuangbi bi none mi qiao dan fen meng bang chou mie chu jie xian lan gan ping nian jian bing bing xing gan yao huan you you ji guang pi ting ze guang zhuangmo qing bi qin dun chuanggui ya bai jie xu lu wu none ku ying di pao dian ya miao geng ci fu tong pang fei xiang yi zhi tiao zhi xiu du zuo xiao tu gui ku pang ting you bu bing cheng lai bi ji an shu kang yong tuo song shu qing yu yu miao sou ce xiang fei jiu he hui liu sha lian lang sou jian pou qing jiu jiu qin ao kuo lou yin liao dai lu yi chu chan tu si xin miao chang wu fei guang none guai bi qiang xie lin lin liao lu none ying xian ting yong li ting yin xun yan ting di po jian hui nai hui gong nian kai bian yi qi nong fen ju yan yi zang bi yi yi er san shi er shi shi gong diao yin hu fu hong wu tui chi qiang ba shen di zhang jue tao fu di mi xian hu chao nu jing zhen yi mi quan wan shao ruo xuan jing diao zhang jiang qiang beng dan qiang bi bi she dan jian gou none fa bi kou none bie xiao dan kuang qiang hong mi kuo wan jue ji ji gui dang lu lu tuan hui zhi hui hui yi yi yi yi huo huo shan xing zhang tong yan yan yu chi cai biao diao bin peng yong piao zhang ying chi chi zhuo tuo ji pang zhong yi wang che bi di ling fu wang zheng cu wang jing dai xi xun hen yang huai lu: hou wang cheng zhi xu jing tu cong none lai cong de pai xi none qi chang zhi cong zhou lai yu xie jie jian chi jia bian huang fu xun wei pang yao wei xi zheng piao chi de zheng zhi bie de chong che jiao wei jiao hui mei long xiang bao qu xin xin bi yi le ren dao ding gai ji ren ren chan tan te te gan qi dai cun zhi wang mang xi fan ying tian min min zhong chong wu ji wu xi ye you wan zong zhong kuai yu bian zhi chi cui chen tai tun qian nian hun xiong niu wang xian xin kang hu kai fen huai tai song wu ou chang chuangju yi bao chao min pi zuo zen yang kou ban nu nao zheng pa bu tie hu hu ju da lian si zhou di dai yi tu you fu ji peng xing yuan ni guai fu xi bi you qie xuan zong bing huang xu chu pi xi xi tan none zong dui none none yi chi nen xun shi xi lao heng kuang mou zhi xie lian tiao huang die hao kong gui heng xi xiao shu sai hu qiu yang hui hui chi jia yi xiong guai lin hui zi xu chi xiang nu: hen en ke dong tian gong quan xi qia yue peng ken de hui e none tong yan kai ce nao yun mang yong yong juan mang kun qiao yue yu yu jie xi zhe lin ti han hao qie ti bu yi qian hui xi bei man yi heng song quan cheng kui wu wu you li liang huan cong yi yue li nin nao e que xuan qian wu min cong fei bei de cui chang men li ji guan guan xing dao qi kong tian lun xi kan kun ni qing chou dun guo chan jing wan yuan jin ji lin yu huo he quan yan ti ti nie wang chuo hu hun xi chang xin wei hui e rui zong jian yong dian ju can cheng de bei qie can dan guan duo nao yun xiang zhui die huang chun qiong re xing ce bian hun zong ti qiao chou bei xuan wei ge qian wei yu yu bi xuan huan")
.append(" min bi yi mian yong kai dang yin e chen mou qia ke yu ai qie yan nuo gan yun zong sai leng fen none kui kui que gong yun su su qi yao song huang none gu ju chuangta xie kai zheng yong cao sun shen bo kai yuan xie hun yong yang li sao tao yin ci xu qian tai huang yun shen ming none she cong piao mo mu guo chi can can can cui min ni zhang tong ao shuangman guan que zao jiu hui kai lian ou song jin yin lu: shang wei tuan man qian zhe yong qing kang di zhi lu: juan qi qi yu ping liao zong you chuangzhi tong cheng qi qu peng bei bie chun jiao zeng chi lian ping kui hui qiao cheng yin yin xi xi dan tan duo dui dui su jue ce xiao fan fen lao lao chong han qi xian min jing liao wu can jue chou xian tan sheng pi yi chu xian nao dan tan jing song han jiao wei huan dong qin qin qu cao ken xie ying ao mao yi lin se jun huai men lan ai lin yan gua xia chi yu yin dai meng ai meng dui qi mo lan men chou zhi nuo nuo yan yang bo zhi xing kuang you fu liu mie cheng none chan meng lan huai xuan rang chan ji ju huan she yi lian nan mi tang jue gang gang zhuangge yue wu jian xu shu rong xi cheng wo jie ge jian qiang huo qiang zhan dong qi jia die cai jia ji shi kan ji kui gai deng zhan chuangge jian jie yu jian yan lu xi zhan xi xi chuo dai qu hu hu hu e shi li mao hu li fang suo bian dian jiong shang yi yi shan hu fei yan shou shou cai zha qiu le pu ba da reng fu none zai tuo zhang diao kang yu ku han shen cha chi gu kou wu tuo qian zhi cha kuo men sao yang niu ban che rao xi qian ban jia yu fu ao xi pi zhi zi e dun zhao cheng ji yan kuang bian chao ju wen hu yue jue ba qin zhen zheng yun wan na yi shu zhua pou tou dou kang zhe pou fu pao ba ao ze tuan kou lun qiang none hu bao bing zhi peng tan pu pi tai yao zhen zha yang bao he ni yi di chi pi za mo mo chen ya chou qu min chu jia fu zha zhu dan chai mu nian la fu pao ban pai lin na guai qian ju tuo ba tuo tuo ao ju zhuo pan zhao bai bai di ni ju kuo long jian qia yong lan ning bo ze qian hen kuo shi jie zheng nin gong gong quan shuan tun zan kao chi xie ce hui pin zhuai shi na bo chi gua zhi kuo duo duo zhi qie an nong zhen ge jiao kua dong ru tiao lie zha lu: die wa jue none ju zhi luan ya wo ta xie nao dang jiao zheng ji hui xian none ai tuo nuo cuo bo geng ti zhen cheng suo suo keng mei long ju peng jian yi ting shan nuo wan xie cha feng jiao wu jun jiu tong kun huo tu zhuo pou lu: ba han shao nie juan she shu ye jue bu huan bu jun yi zhai lu: sou tuo lao sun bang jian huan dao none wan qin peng she lie min men fu bai ju dao wo ai juan yue zong chen chui jie tu ben na nian nuo zu wo xi xian cheng dian sao lun qing gang duo shou diao pou di zhang gun ji tao qia qi pai shu qian ling ye ya jue zheng liang gua yi huo shan ding lu:e cai tan che bing jie ti kong tui yan cuo zou ju tian qian ken bai shou jie lu guai none none zhi dan none chan sao guan peng yuan nuo jian zheng jiu jian yu ya")
.append("n kui nan hong rou pi wei sai zou xuan miao ti nie cha shi zong zhen yi shun heng bian yang huan yan zan an xu ya wo ke chuai ji ti la la cheng kai jiu jiu tu jie hui geng chong shuo she xie yuan qian ye cha zha bei yao none none lan wen qin chan ge lou zong geng jiao gou qin yong que chou chuai zhan sun sun bo chu rong bang cuo sao ke yao dao zhi nu xie jian sou qiu gao xian shuo sang jin mie e chui nuo shan ta jie tang pan ban da li tao hu zhi wa xia qian wen qiang chen zhen e xie nuo quan cha zha ge wu en she gong she shu bai yao bin sou tan sha chan suo liao chong chuangguo bing feng shuai di qi none zhai lian cheng chi guan lu luo lou zong gai hu zha chuangtang hua cui nai mo jiang gui ying zhi ao zhi chi man shan kou shu suo tuan zhao mo mo zhe chan keng biao jiang yin gou qian liao ji ying jue pie pie lao dun xian ruan kui zan yi xian cheng cheng sa nao heng si han huang da zun nian lin zheng hui zhuangjiao ji cao dan dan che bo che jue xiao liao ben fu qiao bo cuo zhuo zhuan tuo pu qin dun nian none xie lu jiao cuan ta han qiao zhua jian gan yong lei kuo lu shan zhuo ze pu chuo ji dang se cao qing jing huan jie qin kuai dan xie ge pi bo ao ju ye none none sou mi ji tai zhuo dao xing lan ca ju ye ru ye ye ni huo ji bin ning ge zhi jie kuo mo jian xie lie tan bai sou lu lu:e rao zhi pan yang lei sa shu zan nian xian jun huo lu:e la han ying lu long qian qian zan qian lan san ying mei rang chan none cuan xie she luo jun mi li zan luan tan zuan li dian wa dang jiao jue lan li nang zhi gui gui qi xin po po shou kao you gai gai gong gan ban fang zheng bo dian kou min wu gu ge ce xiao mi chu ge di xu jiao min chen jiu shen duo yu chi ao bai xu jiao duo lian nie bi chang dian duo yi gan san ke yan dun qi dou xiao duo jiao jing yang xia hun shu ai qiao ai zheng di zhen fu shu liao qu xiong xi jiao none qiao zhuo yi lian bi li xue xiao wen xue qi qi zhai bin jue zhai lang fei ban ban lan yu lan wei dou sheng liao jia hu xie jia yu zhen jiao wo tiao dou jin chi yin fu qiang zhan qu zhuo zhan duan zhuo si xin zhuo zhuo qin lin zhuo chu duan zhu fang xie hang wu shi pei you none pang qi zhan mao lu: pei pi liu fu fang xuan jing jing ni zu zhao yi liu shao jian none yi qi zhi fan piao fan zhan guai sui yu wu ji ji ji huo ri dan jiu zhi zao xie tiao xun xu ga la gan han tai di xu chan shi kuang yang shi wang min min tun chun wu yun bei ang ze ban jie kun sheng hu fang hao gui chang xuan ming hun fen qin hu yi xi xin yan ze fang tan shen ju yang zan bing xing ying xuan pei zhen ling chun hao mei zuo mo bian xu hun zhao zong shi shi yu fei die mao ni chang wen dong ai bing ang zhou long xian kuang tiao chao shi huang huang xuan kui xu jiao jin zhi jin shang tong hong yan gai xiang shai xiao ye yun hui han han jun wan xian kun zhou xi sheng sheng bu zhe zhe wu han hui hao chen wan tian zhuo zui zhou pu jing xi shan yi xi qing qi jing gui zhen yi zhi an wan lin ")
.append("liang chang wang xiao zan none xuan geng yi xia yun hui fu min kui he ying du wei shu qing mao nan jian nuan an yang chun yao suo pu ming jiao kai gao weng chang qi hao yan li ai ji gui men zan xie hao mu mo cong ni zhang hui bao han xuan chuan liao xian dan jing pie lin tun xi yi ji kuang dai ye ye li tan tong xiao fei qin zhao hao yi xiang xing sen jiao bao jing none ai ye ru shu meng xun yao pu li chen kuang die none yan huo lu xi rong long nang luo luan shai tang yan chu yue yue qu ye geng zhuai hu he shu cao cao sheng man ceng ceng ti zui can xu hui yin qie fen pi yue you ruan peng ban fu ling fei qu none nu: tiao shuo zhen lang lang juan ming huang wang tun chao ji qi ying zong wang tong lang none meng long mu deng wei mo ben zha zhu shu none zhu ren ba po duo duo dao li qiu ji jiu bi xiu ting ci sha none za quan qian yu gan wu cha shan xun fan wu zi li xing cai cun ren shao zhe di zhang mang chi yi gu gong du yi qi shu gang tiao none none none lai shan mang yang ma miao si yuan hang fei bei jie dong gao yao xian chu chun pa shu hua xin chou zhu chou song ban song ji yue yun gou ji mao pi bi wang ang fang fen yi fu nan xi hu ya dou xun zhen yao lin rui e mei zhao guo zhi zong yun none dou shu zao none li lu jian cheng song qiang feng nan xiao xian ku ping tai xi zhi guai xiao jia jia gou bao mo yi ye sang shi nie bi tuo yi ling bing ni la he ban fan zhong dai ci yang fu bo mou gan qi ran rou mao zhao song zhe xia you shen ju tuo zuo nan ning yong di zhi zha cha dan gu none jiu ao fu jian bo duo ke nai zhu bi liu chai zha si zhu pei shi guai cha yao cheng jiu shi zhi liu mei none rong zha none biao zhan zhi long dong lu none li lan yong shu xun shuan qi zhen qi li chi xiang zhen li su gua kan bing ren xiao bo ren bing zi chou yi ci xu zhu jian zui er er yu fa gong kao lao zhan li none yang he gen zhi chi ge zai luan fa jie heng gui tao guang wei kuang ru an an juan yi zhuo ku zhi qiong tong sang sang huan jie jiu xue duo zhui yu zan none ying none none zhan ya rao zhen dang qi qiao hua gui jiang zhuangxun suo suo zhen bei ting kuo jing bo ben fu rui tong jue xi lang liu feng qi wen jun gan cu liang qiu ting you mei bang long peng zhuangdi xuan tu zao ao gu bi di han zi zhi ren bei geng jian huan wan nuo jia tiao ji xiao lu: kuan shao cen fen song meng wu li li dou cen ying suo ju ti xie kun zhuo shu chan fan wei jing li bing none none tao zhi lai lian jian zhuo ling li qi bing lun cong qian mian qi qi cai gun chan de fei pai bang pou hun zong cheng zao ji li peng yu yu gu hun dong tang gang wang di xi fan cheng zhan qi yuan yan yu quan yi sen ren chui leng qi zhuo fu ke lai zou zou zhao guan fen fen chen qiong nie wan guo lu hao jie yi chou ju ju cheng zuo liang qiang zhi zhui ya ju bei jiao zhuo zi bin peng ding chu shan none none jian gui xi du qian none kui none luo zhi none none none none peng shan none tuo sen duo ye fu wei wei duan jia zong")
.append(" jian yi shen xi yan yan chuan zhan chun yu he zha wo bian bi yao huo xu ruo yang la yan ben hun kui jie kui si feng xie tuo ji jian mu mao chu hu hu lian leng ting nan yu you mei song xuan xuan ying zhen pian die ji jie ye chu shun yu cou wei mei di ji jie kai qiu ying rou heng lou le none gui pin none gai tan lan yun yu chen lu: ju none none none xie jia yi zhan fu nuo mi lang rong gu jian ju ta yao zhen bang sha yuan zi ming su jia yao jie huang gan fei zha qian ma sun yuan xie rong shi zhi cui yun ting liu rong tang que zhai si sheng ta ke xi gu qi kao gao sun pan tao ge xun dian nou ji shuo gou chui qiang cha qian huai mei xu gang gao zhuo tuo qiao yang dian jia jian zui none long bin zhu none xi qi lian hui yong qian guo gai gai tuan hua qi sen cui beng you hu jiang hu huan kui yi yi gao kang gui gui cao man jin di zhuangle lang chen cong li xiu qing shuangfan tong guan ji suo lei lu liang mi lou chao su ke chu tang biao lu jiu shu zha shu zhang men mo niao yang tiao peng zhu sha xi quan heng jian cong none none qiang none ying er xin zhi qiao zui cong pu shu hua kui zhen zun yue zhan xi xun dian fa gan mo wu qiao rao lin liu qiao xian run fan zhan tuo lao yun shun tui cheng tang meng ju cheng su jue jue tan hui ji nuo xiang tuo ning rui zhu tong zeng fen qiong ran heng cen gu liu lao gao chu none none none none ji dou none lu none none yuan ta shu jiang tan lin nong yin xi sui shan zui xuan cheng gan ju zui yi qin pu yan lei feng hui dang ji sui bo bi ding chu zhua gui ji jia jia qing zhe jian qiang dao yi biao song she lin li cha meng yin tao tai mian qi none bin huo ji qian mi ning yi gao jian yin er qing yan qi mi zhao gui chun ji kui po deng chu none mian you zhi guang qian lei lei sa lu none cuan lu: mie hui ou lu: zhi gao du yuan li fei zhu sou lian none chu none zhu lu yan li zhu chen jie e su huai nie yu long lai none xian none ju xiao ling ying jian yin you ying xiang nong bo chan lan ju shuangshe wei cong quan qu none none yu luo li zan luan dang jue none lan lan zhu lei li ba nang yu ling none qian ci huan xin yu yu qian ou xu chao chu qi kai yi jue xi xu xia yu kuai lang kuan shuo xi e yi qi hu chi qin kuan kan kuan kan chuan sha none yin xin xie yu qian xiao yi ge wu tan jin ou hu ti huan xu pen xi xiao hu she none lian chu yi kan yu chuo huan zhi zheng ci bu wu qi bu bu wai ju qian chi se chi se zhong sui sui li cuo yu li gui dai dai si jian zhe mo mo yao mo cu yang tian sheng dai shang xu xun shu can jue piao qia qiu su qing yun lian yi fou zhi ye can hun dan ji ye none yun wen chou bin ti jin shang yin diao cu hui cuan yi dan du jiang lian bin du jian jian shu ou duan zhu yin qing yi sha ke ke yao xun dian hui hui gu que ji yi ou hui duan yi xiao wu guan mu mei mei ai zuo du yu bi bi bi pi pi bi chan mao none none pi none jia zhan sai mu tuo xun er rong xian ju mu hao qiu dou none ta")
.append("n pei ju duo cui bi san none mao sui shu yu tuo he jian ta san lu: mu li tong rong chang pu lu zhan sao zhan meng lu qu die shi di min jue mang qi pie nai qi dao xian chuan fen ri nei none fu shen dong qing qi yin xi hai yang an ya ke qing ya dong dan lu: qing yang yun yun shui shui zheng bing yong dang shui le ni tun fan gui ting zhi qiu bin ze mian cuan hui diao han cha zhuo chuan wan fan dai xi tuo mang qiu qi shan pai han qian wu wu xun si ru gong jiang chi wu none none tang zhi chi qian mi gu wang qing jing rui jun hong tai quan ji bian bian gan wen zhong fang xiong jue hu none qi fen xu xu qin yi wo yun yuan hang yan shen chen dan you dun hu huo qi mu rou mei ta mian wu chong tian bi sha zhi pei pan zhui za gou liu mei ze feng ou li lun cang feng wei hu mo mei shu ju zan tuo tuo duo he li mi yi fu fei you tian zhi zhao gu zhan yan si kuang jiong ju xie qiu yi jia zhong quan bo hui mi ben zhuo chu le you gu hong gan fa mao si hu ping ci fan zhi su ning cheng ling pao bo qi si ni ju yue zhu sheng lei xuan xue fu pan min tai yang ji yong guan beng xue long lu dan luo xie po ze jing yin zhou jie yi hui hui zui cheng yin wei hou jian yang lie si ji er xing fu sa zi zhi yin wu xi kao zhu jiang luo none an dong yi mou lei yi mi quan jin po wei xiao xie hong xu su kuang tao qie ju er zhou ru ping xun xiong zhi guang huan ming huo wa qia pai wu qu liu yi jia jing qian jiang jiao zhen shi zhuo ce none hui ji liu chan hun hu nong xun jin lie qiu wei zhe jun han bang mang zhuo you xi bo dou huan hong yi pu ying lan hao lang han li geng fu wu li chun feng yi yu tong lao hai jin jia chong weng mei sui cheng pei xian shen tu kun pin nie han jing xiao she nian tu yong xiao xian ting e su tun juan cen ti li shui si lei shui tao du lao lai lian wei wo yun huan di none run jian zhang se fu guan xing shou shuan ya chuo zhang ye kong wan han tuo dong he wo ju gan liang hun ta zhuo dian qie de juan zi xi xiao qi gu guo han lin tang zhou peng hao chang shu qi fang chi lu nao ju tao cong lei zhi peng fei song tian pi dan yu ni yu lu gan mi jing ling lun yin cui qu huai yu nian shen piao chun hu yuan lai hun qing yan qian tian miao zhi yin mi ben yuan wen re fei qing yuan ke ji she yuan se lu zi du none jian mian pi xi yu yuan shen shen rou huan zhu jian nuan yu qiu ting qu du feng zha bo wo wo di wei wen ru xie ce wei ge gang yan hong xuan mi ke mao ying yan you hong miao xing mei zai hun nai kui shi e pai mei lian qi qi mei tian cou wei can tuan mian xu mo xu ji pen jian jian hu feng xiang yi yin zhan shi jie zhen huang tan yu bi min shi tu sheng yong ju zhong none qiu jiao none yin tang long huo yuan nan ban you quan chui liang chan yan chun nie zi wan shi man ying la kui none jian xu lou gui gai none none po jin gui tang yuan suo yuan lian yao meng zhun sheng ke tai ta wa liu gou sao ming zha shi yi lun ma pu wei li ")
.append("cai wu xi wen qiang ce shi su yi zhen sou yun xiu yin rong hun su su ni ta shi ru wei pan chu chu pang weng cang mie he dian hao huang xi zi di zhi ying fu jie hua ge zi tao teng sui bi jiao hui gun yin gao long zhi yan she man ying chun lu: lan luan xiao bin tan yu xiu hu bi biao zhi jiang kou shen shang di mi ao lu hu hu you chan fan yong gun man qing yu piao ji ya jiao qi xi ji lu lu: long jin guo cong lou zhi gai qiang li yan cao jiao cong chun tuan ou teng ye xi mi tang mo shang han lian lan wa li qian feng xuan yi man zi mang kang luo peng shu zhang zhang chong xu huan kuo jian yan chuangliao cui ti yang jiang cong ying hong xiu shu guan ying xiao none none xu lian zhi wei pi yu jiao po xiang hui jie wu pa ji pan wei xiao qian qian xi lu xi sun dun huang min run su liao zhen zhong yi di wan dan tan chao xun kui none shao tu zhu sa hei bi shan chan chan shu tong pu lin wei se se cheng jiong cheng hua jiao lao che gan cun heng si shu peng han yun liu hong fu hao he xian jian shan xi ao lu lan none yu lin min zao dang huan ze xie yu li shi xue ling man zi yong kuai can lian dian ye ao huan lian chan man dan dan yi sui pi ju ta qin ji zhuo lian nong guo jin fen se ji sui hui chu ta song ding se zhu lai bin lian mi shi shu mi ning ying ying meng jin qi bi ji hao ru zui wo tao yin yin dui ci huo jing lan jun ai pu zhuo wei bin gu qian xing bin kuo fei none bin jian dui luo luo lu: li you yang lu si jie ying du wang hui xie pan shen biao chan mie liu jian pu se cheng gu bin huo xian lu qin han ying rong li jing xiao ying sui wei xie huai hao zhu long lai dui fan hu lai none none ying mi ji lian jian ying fen lin yi jian yue chan dai rang jian lan fan shuangyuan zhuo feng she lei lan cong qu yong qian fa guan que yan hao none sa zan luan yan li mi dan tan dang jiao chan none hao ba zhu lan lan nang wan luan quan xian yan gan yan yu huo biao mie guang deng hui xiao xiao none hong ling zao zhuan jiu zha xie chi zhuo zai zai can yang qi zhong fen niu gui wen po yi lu chui pi kai pan yan kai pang mu chao liao gui kang dun guang xin zhi guang xin wei qiang bian da xia zheng zhu ke zhao fu ba duo duo ling zhuo xuan ju tan pao jiong pao tai tai bing yang tong han zhu zha dian wei shi lian chi ping none hu shuo lan ting jiao xu xing quan lie huan yang xiao xiu xian yin wu zhou yao shi wei tong tong zai kai hong luo xia zhu xuan zheng po yan hui guang zhe hui kao none fan shao ye hui none tang jin re none xi fu jiong che pu jing zhuo ting wan hai peng lang shan hu feng chi rong hu none shu lang xun xun jue xiao xi yan han zhuangqu di xie qi wu none none han yan huan men ju dao bei fen lin kun hun chun xi cui wu hong ju fu yue jiao cong feng ping qiong cui xi qiong xin zhuo yan yan yi jue yu gang ran pi yan none sheng chang shao none none none none chen he kui zhong duan ya hui feng lian xuan xing huang jiao jian bi ying zhu wei tuan tian xi nuan nuan chan yan jiong jiong yu mei sha wu ye ")
.append(" xin qiong rou mei huan xu zhao wei fan qiu sui yang lie zhu none gao gua bao hu yun xia none none bian wei tui tang chao shan yun bo huang xie xi wu xi yun he he xi yun xiong nai kao none yao xun ming lian ying wen rong none none qiang liu xi bi biao cong lu jian shu yi lou feng sui yi teng jue zong yun hu yi zhi ao wei liao han ou re jiong man none shang cuan zeng jian xi xi xi yi xiao chi huang chan ye qian ran yan xian qiao zun deng dun shen jiao fen si liao yu lin tong shao fen fan yan xun lan mei tang yi jing men none none ying yu yi xue lan tai zao can sui xi que cong lian hui zhu xie ling wei yi xie zhao hui none none lan ru xian kao xun jin chou dao yao he lan biao rong li mo bao ruo di lu: ao xun kuang shuo none li lu jue liao yan xi xie long yan none rang yue lan cong jue tong guan none che mi tang lan zhu lan ling cuan yu zhua lan pa zheng pao zhao yuan ai wei none jue jue fu ye ba die ye yao zu shuanger pan chuan ke zang zang qiang die qiang pian ban pan shao jian pai du yong tou tou bian die bang bo bang you none du ya cheng niu cheng pin jiu mou ta mu lao ren mang fang mao mu ren wu yan fa bei si jian gu you gu sheng mu di qian quan quan zi te xi mang keng qian wu gu xi li li pou ji gang zhi ben quan run du ju jia jian feng pian ke ju kao chu xi bei luo jie ma san wei li dun tong se jiang xi li du lie pi piao bao xi chou wei kui chou quan quan ba fan qiu bo chai chuo an jie zhuangguang ma you kang bo hou ya han huan zhuangyun kuang niu di qing zhong yun bei pi ju ni sheng pao xia tuo hu ling fei pi ni sheng you gou yue ju dan bo gu xian ning huan hen jiao he zhao ji huan shan ta rong shou tong lao du xia shi kuai zheng yu sun yu bi mang xi juan li xia yin suan lang bei zhi yan sha li zhi xian jing han fei yao ba qi ni biao yin li lie jian qiang kun yan guo zong mi chang yi zhi zheng ya meng cai cu she lie none luo hu zong hu wei feng wo yuan xing zhu mao wei yuan xian tuan ya nao xie jia hou bian you you mei cha yao sun bo ming hua yuan sou ma yuan dai yu shi hao none yi zhen chuanghao man jing jiang mo zhang chan ao ao hao cui ben jue bi bi huang bu lin yu tong yao liao shuo xiao shou none xi ge juan du hui kuai xian xie ta xian xun ning bian huo nou meng lie nao guang shou lu ta xian mi rang huan nao luo xian qi qu xuan miao zi lu: lu yu su wang qiu ga ding le ba ji hong di chuan gan jiu yu qi yu yang ma hong wu fu min jie ya bin bian beng yue jue yun jue wan jian mei dan pi wei huan xian qiang ling dai yi an ping dian fu xuan xi bo ci gou jia shao po ci ke ran sheng shen yi zu jia min shan liu bi zhen zhen jue fa long jin jiao jian li guang xian zhou gong yan xiu yang xu luo su zhu qin ken xun bao er xiang yao xia heng gui chong xu ban pei none dang ying hun wen e cheng ti wu wu cheng jun mei bei ting xian chuo han xuan yan qiu quan lang li xiu fu liu ya xi ling li jin lian suo suo none wan dian bing zhan cui min yu")
.append(" ju chen lai wen sheng wei dian chu zhuo pei cheng hu qi e kun chang qi beng wan lu cong guan yan diao bei lin qin pi pa qiang zhuo qin fa none qiong du jie hun yu mao mei chun xuan ti xing dai rou min zhen wei ruan huan xie chuan jian zhuan yang lian quan xia duan yuan ye nao hu ying yu huang rui se liu none rong suo yao wen wu jin jin ying ma tao liu tang li lang gui tian qiang cuo jue zhao yao ai bin tu chang kun zhuan cong jin yi cui cong qi li ying suo qiu xuan ao lian man zhang yin none ying wei lu wu deng none zeng xun qu dang lin liao qiong su huang gui pu jing fan jin liu ji none jing ai bi can qu zao dang jiao gun tan hui huan se sui tian none yu jin fu bin shu wen zui lan xi ji xuan ruan huo gai lei du li zhi rou li zan qiong zhe gui sui la long lu li zan lan ying mi xiang xi guan dao zan huan gua bao die pao hu zhi piao ban rang li wa none jiang qian ban pen fang dan weng ou none none none hu ling yi ping ci none juan chang chi none dang meng bu chui ping bian zhou zhen none ci ying qi xian lou di ou meng zhuan beng lin zeng wu pi dan weng ying yan gan dai shen tian tian han chang sheng qing shen chan chan rui sheng su shen yong shuai lu fu yong beng none ning tian you jia shen zha dian fu nan dian ping ding hua ting quan zai meng bi qi liu xun liu chang mu yun fan fu geng tian jie jie quan wei fu tian mu none pan jiang wa da nan liu ben zhen chu mu mu ce none gai bi da zhi lu:e qi lu:e pan none fan hua yu yu mu jun yi liu she die chou hua dang chuo ji wan jiang cheng chang tun lei ji cha liu die tuan lin jiang jiang chou bo die die pi nie dan shu shu zhi yi chuangnai ding bi jie liao gong ge jiu zhou xia shan xu nu:e li yang chen you ba jie jue xi xia cui bi yi li zong chuangfeng zhu pao pi gan ke ci xie qi dan zhen fa zhi teng ju ji fei ju dian jia xuan zha bing nie zheng yong jing quan chong tong yi jie wei hui duo yang chi zhi hen ya mei dou jing xiao tong tu mang pi xiao suan pu li zhi cuo duo wu sha lao shou huan xian yi peng zhang guan tan fei ma lin chi ji tian an chi bi bi min gu dui e wei yu cui ya zhu xi dan shen zhong ji yu hou feng la yang shen tu yu gua wen huan ku jia yin yi lou sao jue chi xi guan yi wen ji chuangban lei liu chai shou nu:e dian da bie tan zhang biao shen cu luo yi zong chou zhang zhai sou suo que diao lou lou mo jin yin ying huang fu liao long qiao liu lao xian fei dan yin he ai ban xian guan guai nong yu wei yi yong pi lei li shu dan lin dian lin lai bie ji chi yang xuan jie zheng none li huo lai ji dian xian ying yin qu yong tan dian luo luan luan bo none gui po fa deng fa bai bai qie bi zao zao mao de pa jie huang gui ci ling gao mo ji jiao peng gao ai e hao han bi wan chou qian xi ai jiong hao huang hao ze cui hao xiao ye po hao jiao ai xing huang li piao he jiao pi gan pao zhou jun qiu cun que zha gu jun jun zhou zha gu zhan du min qi ying yu bei zhao zhong pen he ying he yi bo wan he ang zhan yan jian ")
.append("he yu kui fan gai dao pan fu qiu sheng dao lu zhan meng lu jin xu jian pan guan an lu xu zhou dang an gu li mu ding gan xu mang mang zhi qi wan tian xiang dun xin xi pan feng dun min ming sheng shi yun mian pan fang miao dan mei mao kan xian kou shi yang zheng yao shen huo da zhen kuang ju shen yi sheng mei mo zhu zhen zhen mian di yuan die yi zi zi chao zha xuan bing mi long sui tong mi die yi er ming xuan chi kuang juan mou zhen tiao yang yan mo zhong mai zhe zheng mei suo shao han huan di cheng cuo juan e wan xian xi kun lai jian shan tian hun wan ling shi qiong lie ya jing zheng li lai sui juan shui sui du pi pi mu hun ni lu gao jie cai zhou yu hun ma xia xing hui gun none chun jian mei du hou xuan ti kui gao rui mao xu fa wen miao chou kui mi weng kou dang chen ke sou xia qiong mao ming man shui ze zhang yi diao kou mo shun cong lou chi man piao cheng ji meng huan run pie xi qiao pu zhu deng shen shun liao che xian kan ye xu tong wu lin kui jian ye ai hui zhan jian gu zhao ju wei chou ji ning xun yao huo meng mian bin mian li guang jue xuan mian huo lu meng long guan man xi chu tang kan zhu mao jin lin yu shuo ce jue shi yi shen zhi hou shen ying ju zhou jiao cuo duan ai jiao zeng huo bai shi ding qi ji zi gan wu tuo ku qiang xi fan kuang dang ma sha dan jue li fu min nuo hua kang zhi qi kan jie fen e ya pi zhe yan sui zhuan che dun pan yan none feng fa mo zha qu yu ke tuo tuo di zhai zhen e fu mu zhu la bian nu ping peng ling pao le po bo po shen za ai li long tong none li kuang chu keng quan zhu kuang gui e nao jia lu wei ai luo ken xing yan dong peng xi none hong shuo xia qiao none wei qiao none keng xiao que chan lang hong yu xiao xia mang long none che che wo liu ying mang que yan cuo kun yu none none lu chen jian none song zhuo keng peng yan zhui kong ceng qi zong qing lin jun bo ding min diao jian he liu ai sui que ling bei yin dui wu qi lun wan dian gang bei qi chen ruan yan die ding zhou tuo jie ying bian ke bi wei shuo zhen duan xia dang ti nao peng jian di tan cha none qi none feng xuan que que ma gong nian su e ci liu si tang bang hua pi wei sang lei cuo tian xia xi lian pan wei yun dui zhe ke la none qing gun zhuan chan qi ao peng lu lu kan qiang chen yin lei biao qi mo qi cui zong qing chuo none ji shan lao qu zeng deng jian xi lin ding dian huang pan za qiao di li jian jiao xi zhang qiao dun jian yu zhui he huo zhai lei ke chu ji que dang wo jiang pi pi yu pin qi ai ke jian yu ruan meng pao zi bo none mie ca xian kuang lei lei zhi li li fan que pao ying li long long mo bo shuangguan lan zan yan shi shi li reng she yue si qi ta ma xie yao xian zhi qi zhi beng shu chong none yi shi you zhi tiao fu fu mi zu zhi suan mei zuo qu hu zhu shen sui ci chai mi lu: yu xiang wu tiao piao zhu gui xia zhi ji gao zhen gao shui jin zhen gai kun di dao huo tao qi gu guan zui ling lu bing jin dao zhi lu shan bei zhe hui you xi ")
.append(" yin zi huo zhen fu yuan wu xian yang ti yi mei si di none zhuo zhen yong ji gao tang chi ma ta none xuan qi yu xi ji si chan xuan hui sui li nong ni dao li rang yue ti zan lei rou yu yu li xie qin he tu xiu si ren tu zi cha gan yi xian bing nian qiu qiu zhong fen hao yun ke miao zhi jing bi zhi yu mi ku ban pi ni li you zu pi ba ling mo cheng nian qin yang zuo zhi zhi shu ju zi tai ji cheng tong zhi huo he yin zi zhi jie ren du yi zhu hui nong fu xi kao lang fu ze shui lu: kun gan jing ti cheng tu shao shui ya lun lu gu zuo ren zhun bang bai ji zhi zhi kun leng peng ke bing chou zui yu su none none yi xi bian ji fu bi nuo jie zhong zong xu cheng dao wen lian zi yu ji xu zhen zhi dao jia ji gao gao gu rong sui none ji kang mu shan men zhi ji lu su ji ying wen qiu se none yi huang qie ji sui xiao pu jiao zhuo tong none lu: sui nong se hui rang nuo yu none ji tui wen cheng huo gong lu: biao none rang jue li zan xue wa jiu qiong xi qiong kong yu sen jing yao chuan zhun tu lao qie zhai yao bian bao yao bing yu zhu jiao qiao diao wu gui yao zhi chuan yao tiao jiao chuangjiong xiao cheng kou cuan wo dan ku ke zhui xu su none kui dou none yin wo wa ya yu ju qiong yao yao tiao liao yu tian diao ju liao xi wu kui chuangju none kuan long cheng cui piao zao cuan qiao qiong dou zao zao qie li chu shi fu qian chu hong qi qian gong shi shu miao ju zhan zhu ling long bing jing jing zhang yi si jun hong tong song jing diao yi shu jing qu jie ping duan shao zhuan ceng deng cun huai jing kan jing zhu zhu le peng yu chi gan mang zhu none du ji xiao ba suan ji zhen zhao sun ya zhui yuan hu gang xiao cen pi bi jian yi dong shan sheng xia di zhu na chi gu li qie min bao tiao si fu ce ben fa da zi di ling ze nu fu gou fan jia ge fan shi mao po none jian qiong long none bian luo gui qu chi yin yao xian bi qiong gua deng jiao jin quan sun ru fa kuang zhu tong ji da hang ce zhong kou lai bi shai dang zheng ce fu yun tu pa li lang ju guan jian han tong xia zhi cheng suan shi zhu zuo xiao shao ting jia yan gao kuai gan chou kuang gang yun none qian xiao jian pu lai zou bi bi bi ge chi guai yu jian zhao gu chi zheng qing sha zhou lu bo ji lin suan jun fu zha gu kong qian qian jun chui guan yuan ce ju bo ze qie tuo luo dan xiao ruo jian none bian sun xiang xian ping zhen sheng hu shi zhu yue chun fu wu dong shuo ji jie huang xing mei fan chuan zhuan pian feng zhu hong qie hou qiu miao qian none kui none lou yun he tang yue chou gao fei ruo zheng gou nie qian xiao cuan gong pang du li bi zhuo chu shai chi zhu qiang long lan jian bu li hui bi di cong yan peng sen cuan pai piao dou yu mie zhuan ze xi guo yi hu chan kou cu ping zao ji gui su lou zha lu nian suo cuan none suo le duan liang xiao bo mi shai dang liao dan dian fu jian min kui dai qiao deng huang sun lao zan xiao lu shi zan none pai qi pai gan ju du lu yan bo dang sai ke gou qian lian bu zhou lai none la")
.append("n kui yu yue hao zhen tai ti mi chou ji none qi teng zhuan zhou fan sou zhou qian kuo teng lu lu jian tuo ying yu lai long none lian lan qian yue zhong qu lian bian duan zuan li shai luo ying yue zhuo xu mi di fan shen zhe shen nu: xie lei xian zi ni cun zhang qian none bi ban wu sha kang rou fen bi cui yin li chi tai none ba li gan ju po mo cu zhan zhou li su tiao li xi su hong tong zi ce yue zhou lin zhuangbai none fen mian qu none liang xian fu liang can jing li yue lu ju qi cui bai chang lin zong jing guo none san san tang bian rou mian hou xu zong hu jian zan ci li xie fu nuo bei gu xiu gao tang qiu none cao zhuangtang mi san fen zao kang jiang mo san san nuo chi liang jiang kuai bo huan shu zong jian nuo tuan nie li zuo di nie tiao lan mi mi jiu xi gong zheng jiu you ji cha zhou xun yue hong yu he wan ren wen wen qiu na zi tou niu fou jie shu chun pi yin sha hong zhi ji fen yun ren dan jin su fang suo cui jiu zha ba jin fu zhi qi zi chou hong zha lei xi fu xie shen bei zhu qu ling zhu shao gan yang fu tuo zhen dai chu shi zhong xian zu jiong ban ju pa shu zui kuang jing ren heng xie jie zhu chou gua bai jue kuang hu ci geng geng tao xie ku jiao quan gai luo xuan beng xian fu gei tong rong tiao yin lei xie quan xu hai die tong si jiang xiang hui jue zhi jian juan chi mian zhen lu: cheng qiu shu bang tong xiao wan qin geng xiu ti xiu xie hong xi fu ting sui dui kun fu jing hu zhi yan jiong feng ji xu none zong lin duo li lu: liang chou quan shao qi qi zhun qi wan qian xian shou wei qi tao wan gang wang beng zhui cai guo cui lun liu qi zhan bei chuo ling mian qi jie tan zong gun zou yi zi xing liang jin fei rui min yu zong fan lu: xu none shang none xu xiang jian ke xian ruan mian ji duan zhong di min miao yuan xie bao si qiu bian huan geng zong mian wei fu wei yu gou miao jie lian zong bian yun yin ti gua zhi yun cheng chan dai jia yuan zong xu sheng none geng none ying jin yi zhui ni bang gu pan zhou jian cuo quan shuangyun xia shuai xi rong tao fu yun zhen gao ru hu zai teng xian su zhen zong tao huang cai bi feng cu li suo yin xi zong lei zhuan qian man zhi lu: mo piao lian mi xuan zong ji shan sui fan shuai beng yi sao mou zhou qiang hun xian xi none xiu ran xuan hui qiao zeng zuo zhi shan san lin yu fan liao chuo zun jian rao chan rui xiu hui hua zuan xi qiang none da sheng hui xi se jian jiang huan qiao cong jie jiao bo chan yi nao sui yi shai xu ji bin qian jian pu xun zuan qi peng li mo lei xie zuan kuang you xu lei xian chan none lu chan ying cai xiang xian zui zuan luo xi dao lan lei lian mi jiu yu hong zhou xian he yue ji wan kuang ji ren wei yun hong chun pi sha gang na ren zong lun fen zhi wen fang zhu zhen niu shu xian gan xie fu lian zu shen xi zhi zhong zhou ban fu chu shao yi jing dai bang rong jie ku rao die hang hui ji xuan jiang luo jue jiao tong geng xiao juan xiu xi sui tao ji ti ji xu ling yin xu qi fei chuo shang gun sheng wei mian shou beng chou tao liu quan ")
.append("zong zhan wan lu: zhui zi ke xiang jian mian lan ti miao ji yun hui si duo duan bian xian gou zhui huan di lu: bian min yuan jin fu ru zhen feng cui gao chan li yi jian bin piao man lei ying suo mou sao xie liao shan zeng jiang qian qiao huan jiao zuan fou xie gang fou que fou que bo ping hou none gang ying ying qing xia guan zun tan none qing weng ying lei tan lu guan wang gang wang wang han none luo fu mi fa gu zhu ju mao gu min gang ba gua ti juan fu lin yan zhao zui gua zhuo yu zhi an fa lan shu si pi ma liu ba fa li chao wei bi ji zeng tong liu ji juan mi zhao luo pi ji ji luan yang mie qiang ta mei yang you you fen ba gao yang gu qiang zang gao ling yi zhu di xiu qiang yi xian rong qun qun qian huan suo xian yi yang qiang xian yu geng jie tang yuan xi fan shan fen shan lian lei geng nou qiang chan yu gong yi chong weng fen hong chi chi cui fu xia pen yi la yi pi ling liu zhi qu xi xie xiang xi xi qi qiao hui hui shu se hong jiang zhai cui fei tao sha chi zhu jian xuan shi pian zong wan hui hou he he han ao piao yi lian qu none lin pen qiao ao fan yi hui xuan dao yao lao none kao mao zhe qi gou gou gou die die er shua ruan er nai zhuan lei ting zi geng chao hao yun pa pi chi si qu jia ju huo chu lao lun ji tang ou lou nou jiang pang ze lou ji lao huo you mo huai er zhe ding ye da song qin yun chi dan dan hong geng zhi none nie dan zhen che ling zheng you wa liao long zhi ning tiao er ya die guo none lian hao sheng lie pin jing ju bi di guo wen xu ping cong none none ting yu cong kui lian kui cong lian weng kui lian lian cong ao sheng song ting kui nie zhi dan ning none ji ting ting long yu yu zhao si su yi su si zhao zhao rou yi lei ji qiu ken cao ge di huan huang yi ren xiao ru zhou yuan du gang rong gan cha wo chang gu zhi qin fu fei ban pei pang jian fang zhun you na ang ken ran gong yu wen yao jin pi qian xi xi fei ken jing tai shen zhong zhang xie shen wei zhou die dan fei ba bo qu tian bei gua tai zi ku zhi ni ping zi fu pang zhen xian zuo pei jia sheng zhi bao mu qu hu ke yi yin xu yang long dong ka lu jing nu yan pang kua yi guang hai ge dong zhi jiao xiong xiong er an xing pian neng zi none cheng tiao zhi cui mei xie cui xie mo mai ji xie none kuai sa zang qi nao mi nong luan wan bo wen wan qiu jiao jing you heng cuo lie shan ting mei chun shen xie none juan cu xiu xin tuo pao cheng nei fu dou tuo niao nao pi gu luo li lian zhang cui jie liang shui pi biao lun pian guo juan chui dan tian nei jing jie la ye a ren shen chuo fu fu ju fei qiang wan dong pi guo zong ding wu mei ruan zhuan zhi cou gua ou di an xing nao shu shuan nan yun zhong rou e sai tu yao jian wei jiao yu jia duan bi chang fu xian ni mian wa teng tui bang qian lu: wa shou tang su zhui ge yi bo liao ji pi xie gao lu: bin none chang lu guo pang chuai biao jiang fu tang mo xi zhuan lu: jiao ying lu: zhi xue chun lin tong peng ni chuai liao cui gui xiao teng fan zhi jiao shan hu ")
.append(" cui run xin sui fen ying shan gua dan kuai nong tun lian bei yong jue chu yi juan la lian sao tun gu qi cui bin xun nao huo zang xian biao xing kuan la yan lu hu za luo qu zang luan ni za chen qian wo guang zang lin guang zi jiao nie chou ji gao chou mian nie zhi zhi ge jian die zhi xiu tai zhen jiu xian yu cha yao yu chong xi xi jiu yu yu xing ju jiu xin she she she jiu shi tan shu shi tian dan pu pu guan hua tian chuan shun xia wu zhou dao chuan shan yi none pa tai fan ban chuan hang fang ban bi lu zhong jian cang ling zhu ze duo bo xian ge chuan jia lu hong pang xi none fu zao feng li shao yu lang ting none wei bo meng nian ju huang shou zong bian mao die none bang cha yi sou cang cao lou dai none yao chong none dang qiang lu yi jie jian huo meng qi lu lu chan shuanggen liang jian jian se yan fu ping yan yan cao cao yi le ting jiao ai nai tiao jiao jie peng wan yi chai mian mi gan qian yu yu shao xiong du xia qi mang zi hui sui zhi xiang bi fu tun wei wu zhi qi shan wen qian ren fou kou jie lu zhu ji qin qi yan fen ba rui xin ji hua hua fang wu jue gou zhi yun qin ao chu mao ya fei reng hang cong yin you bian yi none wei li pi e xian chang cang zhu su yi yuan ran ling tai tiao di miao qing li rao ke mu pei bao gou min yi yi ju pie ruo ku zhu ni bo bing shan qiu yao xian ben hong ying zha dong ju die nie gan hu ping mei fu sheng gu bi wei fu zhuo mao fan qie mao mao ba zi mo zi di chi gou jing long none niao none xue ying qiong ge ming li rong yin gen qian chai chen yu xiu zi lie wu duo kui ce jian ci gou guang mang cha jiao jiao fu yu zhu zi jiang hui yin cha fa rong ru chong mang tong zhong none zhu xun huan kua quan gai da jing xing chuan cao jing er an shou chi ren jian ti huang ping li jin lao rong zhuangda jia rao bi ce qiao hui ji dang none rong hun ying luo ying qian jin sun yin mai hong zhou yao du wei chu dou fu ren yin he bi bu yun di tu sui sui cheng chen wu bie xi geng li pu zhu mo li zhuangji duo qiu sha suo chen feng ju mei meng xing jing che xin jun yan ting you cuo guan han you cuo jia wang you niu shao xian lang fu e mo wen jie nan mu kan lai lian shi wo tu xian huo you ying ying none chun mang mang ci yu jing di qu dong jian zou gu la lu ju wei jun nie kun he pu zai gao guo fu lun chang chou song chui zhan men cai ba li tu bo han bao qin juan xi qin di jie pu dang jin zhao tai geng hua gu ling fei jin an wang beng zhou yan zu jian lin tan shu tian dao hu ji he cui tao chun bei chang huan fei lai qi meng ping wei dan sha huan yan yi tiao qi wan ce nai none tuo jiu tie luo none none meng none none ding ying ying ying xiao sa qiu ke xiang wan yu yu fu lian xuan xuan nan ze wo chun xiao yu pian mao an e luo ying huo gua jiang wan zuo zuo ju bao rou xi xie an qu jian fu lu: lu: pen feng hong hong hou yan tu zhu zi xiang shen ge qia jing mi huang shen pu ge dong zhou qian wei bo wei pa ji hu zang ji")
.append("a duan yao jun cong quan wei xian kui ting hun xi shi qi lan zong yao yuan mei yun shu di zhuan guan none qiong chan kai kui none jiang lou wei pai none sou yin shi chun shi yun zhen lang nu meng he que suan yuan li ju xi bang chu xu tu liu huo zhen qian zu po cuo yuan chu yu kuai pan pu pu na shuo xi fen yun zheng jian ji ruo cang en mi hao sun zhen ming none xu liu xi gu lang rong weng gai cuo shi tang luo ru suo xian bei yao gui bi zong gun none xiu ce none lan none ji li can lang yu none ying mo diao xiu wu tong zhu peng an lian cong xi ping qiu jin chun jie wei tui cao yu yi ji liao bi lu xu bu zhang luo qiang man yan leng ji biao gun han di su lu she shang di mie xun man bo di cuo zhe sen xuan yu hu ao mi lou cu zhong cai po jiang mi cong niao hui jun yin jian nian shu yin kui chen hu sha kou qian ma cang ze qiang dou lian lin kou ai bi li wei ji qian sheng fan meng ou chan dian xun jiao rui rui lei yu qiao chu hua jian mai yun bao you qu lu rao hui e ti fei jue zui fa ru fen kui shun rui ya xu fu jue dang wu tong si xiao xi yong wen shao qi jian yun sun ling yu xia weng ji hong si deng lei xuan yun yu xi hao bo hao ai wei hui wei ji ci xiang luan mie yi leng jiang can shen qiang lian ke yuan da ti tang xue bi zhan sun lian fan ding xiao gu xie shu jian kao hong sa xin xun yao bai sou shu xun dui pin wei neng chou mai ru piao tai qi zao chen zhen er ni ying gao cong xiao qi fa jian xu kui jie bian di mi lan jin zang miao qiong qie xian none ou xian su lu: yi xu xie li yi la lei jiao di zhi pi teng yao mo huan biao fan sou tan tui qiong qiao wei liu hui shu gao yun none li zhu zhu ai lin zao xuan chen lai huo tuo wu rui rui qi heng lu su tui mang yun pin yu xun ji jiong xuan mo none su jiong none nie bo rang yi xian yu ju lian lian yin qiang ying long tou wei yue ling qu yao fan mi lan kui lan ji dang none lei lei tong feng zhi wei kui zhan huai li ji mi lei huai luo ji nao lu jian none none lei quan xiao yi luan men bie hu hu lu nu:e lu: zhi xiao qian chu hu xu cuo fu xu xu lu hu yu hao jiao ju guo bao yan zhan zhan kui ban xi shu chong qiu diao ji qiu ding shi none di zhe she yu gan zi hong hui meng ge sui xia chai shi yi ma xiang fang e pa chi qian wen wen rui bang pi yue yue jun qi ran yin qi can yuan jue hui qian qi zhong ya hao mu wang fen fen hang gong zao fu ran jie fu chi dou bao xian ni te qiu you zha ping chi you he han ju li fu ran zha gou pi bo xian zhu diao bie bing gu ran qu she tie ling gu dan gu ying li cheng qu mou ge ci hui hui mang fu yang wa lie zhu yi xian kuo jiao li yi ping ji ha she yi wang mo qiong qie gui gong zhi man none zhe jia nao si qi xing lie qiu shao yong jia tui che bai e han shu xuan feng shen zhen fu xian zhe wu fu li lang bi chu yuan you jie dan yan ting dian tui hui wo zhi song fei ju mi qi qi yu jun la meng qiang si xi ")
.append("lun li die tiao tao kun gan han yu bang fei pi wei dun yi yuan su quan qian rui ni qing wei liang guo wan dong e ban zhuo wang can yang ying guo chan none la ke ji xie ting mai xu mian yu jie shi xuan huang yan bian rou wei fu yuan mei wei fu ruan xie you you mao xia ying shi chong tang zhu zong ti fu yuan kui meng la du hu qiu die li gua yun ju nan lou chun rong ying jiang tun lang pang si xi xi xi yuan weng lian sou ban rong rong ji wu xiu han qin yi bi hua tang yi du nai he hu xi ma ming yi wen ying teng yu cang none none man none shang shi cao chi di ao lu wei zhi tang chen piao qu pi yu jian luo lou qin zhong yin jiang shuai wen jiao wan zhe zhe ma ma guo liao mao xi cong li man xiao none zhang mang xiang mo zi si qiu te zhi peng peng jiao qu bie liao pan gui xi ji zhuan huang fei lao jue jue hui yin chan jiao shan rao xiao wu chong xun si none cheng dang li xie shan yi jing da chan qi zi xiang she luo qin ying chai li ze xuan lian zhu ze xie mang xie qi rong jian meng hao ru huo zhuo jie bin he mie fan lei jie la mi li chun li qiu nie lu du xiao zhu long li long feng ye pi rang gu juan ying none xi can qu quan du can man qu jie zhu zha xue huang nu: pei nu: xin zhong mo er mie mie shi xing yan kan yuan none ling xuan shu xian tong long jie xian ya hu wei dao chong wei dao zhun heng qu yi yi bu gan yu biao cha yi shan chen fu gun fen shuai jie na zhong dan ri zhong zhong xie qi xie ran zhi ren qin jin jun yuan mei chai ao niao hui ran jia tuo ling dai bao pao yao zuo bi shao tan ju he xue xiu zhen yi pa bo di wa fu gun zhi zhi ran pan yi mao none na kou xuan chan qu bei yu xi none bo none fu yi chi ku ren jiang jia cun mo jie er ge ru zhu gui yin cai lie none none zhuangdang none kun ken niao shu jia kun cheng li juan shen pou ge yi yu chen liu qiu qun ji yi bu zhuangshui sha qun li lian lian ku jian fou tan bi gun tao yuan ling chi chang chou duo biao liang shang pei pei fei yuan luo guo yan du ti zhi ju qi ji zhi gua ken none ti shi fu chong xie bian die kun duan xiu xiu he yuan bao bao fu yu tuan yan hui bei chu lu: none none yun ta gou da huai rong yuan ru nai jiong suo ban tun chi sang niao ying jie qian huai ku lian lan li zhe shi lu: yi die xie xian wei biao cao ji qiang sen bao xiang none pu jian zhuan jian zui ji dan za fan bo xiang xin bie rao man lan ao duo hui cao sui nong chan lian bi jin dang shu tan bi lan pu ru zhi none shu wa shi bai xie bo chen lai long xi xian lan zhe dai none zan shi jian pan yi none ya xi xi yao feng tan none none fu ba he ji ji jian guan bian yan gui jue pian mao mi mi mie shi si zhan luo jue mo tiao lian yao zhi jun xi shan wei xi tian yu lan e du qin pang ji ming ping gou qu zhan jin guan deng jian luo qu jian wei jue qu luo lan shen di guan jian guan yan gui mi shi chan lan jue ji xi di tian yu gou jin qu jiao jiu jin cu jue zhi chao ji gu dan zui di shan")
.append("g hua quan ge zhi jie gui gong chu jie huan qiu xing su ni ji lu zhi zhu bi xing hu shang gong zhi xue chu xi yi li jue xi yan xi yan yan ding fu qiu qiu jiao hong ji fan xun diao hong cha tao xu jie yi ren xun yin shan qi tuo ji xun yin e fen ya yao song shen yin xin jue xiao ne chen you zhi xiong fang xin chao she xian sa zhun xu yi yi su chi he shen he xu zhen zhu zheng gou zi zi zhan gu fu jian die ling di yang li nao pan zhou gan shi ju ao zha tuo yi qu zhao ping bi xiong chu ba da zu tao zhu ci zhe yong xu xun yi huang he shi cha jiao shi hen cha gou gui quan hui jie hua gai xiang hui shen chou tong mi zhan ming e hui yan xiong gua er beng tiao chi lei zhu kuang kua wu yu teng ji zhi ren su lang e kuang e^ shi ting dan bei chan you heng qiao qin shua an yu xiao cheng jie xian wu wu gao song pu hui jing shuo zhen shuo du none chang shui jie ke qu cong xiao sui wang xuan fei chi ta yi na yin diao pi chuo chan chen zhun ji qi tan chui wei ju qing jian zheng ze zou qian zhuo liang jian zhu hao lun shen biao huai pian yu die xu pian shi xuan shi hun hua e zhong di xie fu pu ting jian qi yu zi chuan xi hui yin an xian nan chen feng zhu yang yan heng xuan ge nuo qi mou ye wei none teng zou shan jian bo none huang huo ge ying mi xiao mi xi qiang chen nu:e si su bang chi qian shi jiang yuan xie xue tao yao yao hu yu biao cong qing li mo mo shang zhe miu jian ze zha lian lou can ou guan xi zhuo ao ao jin zhe yi hu jiang man chao han hua chan xu zeng se xi she dui zheng nao lan e ying jue ji zun jiao bo hui zhuan wu jian zha shi qiao tan zen pu sheng xuan zao zhan dang sui qian ji jiao jing lian nou yi ai zhan pi hui hua yi yi shan rang nou qian zhui ta hu zhou hao ni ying jian yu jian hui du zhe xuan zan lei shen wei chan li yi bian zhe yan e chou wei chou yao chan rang yin lan chen huo zhe huan zan yi dang zhan yan du yan ji ding fu ren ji jie hong tao rang shan qi tuo xun yi xun ji ren jiang hui ou ju ya ne xu e lun xiong song feng she fang jue zheng gu he ping zu shi xiong zha su zhen di zhou ci qu zhao bi yi yi kuang lei shi gua shi jie hui cheng zhu shen hua dan gou quan gui xun yi zheng gai xiang cha hun xu zhou jie wu yu qiao wu gao you hui kuang shuo song ei qing zhu zou nuo du zhuo fei ke wei yu shei shen diao chan liang zhun sui tan shen yi mou chen die huang jian xie xue ye wei e yu xuan chan zi an yan di mi pian xu mo dang su xie yao bang shi qian mi jin man zhe jian miu tan jian qiao lan pu jue yan qian zhan chen gu qian hong ya jue hong han hong qi xi huo liao han du long dou jiang qi chi feng deng wan bi shu xian feng zhi zhi yan yan shi chu hui tun yi tun yi jian ba hou e cu xiang huan jian ken gai qu fu xi bin hao yu zhu jia fen xi hu wen huan bin di zong fen yi zhi bao chai han pi na pi gou duo you diao mo si xiu huan kun he he mo an mao li ni bi yu jia tuan mao pi xi e ju")
.append(" mo chu tan huan qu bei zhen yuan fu cai gong te yi hang wan pin huo fan tan guan ze zhi er zhu shi bi zi er gui pian bian mai dai sheng kuang fei tie yi chi mao he bi lu lin hui gai pian zi jia xu zei jiao gai zang jian ying xun zhen she bin bin qiu she chuan zang zhou lai zan si chen shang tian pei geng xian mai jian sui fu dan cong cong zhi ji zhang du jin xiong shun yun bao zai lai feng cang ji sheng ai zhuan fu gou sai ze liao wei bai chen zhuan zhi zhui biao yun zeng tan zan yan none shan wan ying jin gan xian zang bi du shu yan none xuan long gan zang bei zhen fu yuan gong cai ze xian bai zhang huo zhi fan tan pin bian gou zhu guan er jian bi shi tie gui kuang dai mao fei he yi zei zhi jia hui zi lin lu zang zi gai jin qiu zhen lai she fu du ji shu shang ci bi zhou geng pei dan lai feng zhui fu zhuan sai ze yan zan yun zeng shan ying gan chi xi she nan xiong xi cheng he cheng zhe xia tang zou zou li jiu fu zhao gan qi shan qiong qin xian ci jue qin chi ci chen chen die ju chao di se zhan zhu yue qu jie chi chu gua xue zi tiao duo lie gan suo cu xi zhao su yin ju jian que tang chuo cui lu qu dang qiu zi ti qu chi huang qiao qiao yao zao yue none zan zan zu pa bao ku he dun jue fu chen jian fang zhi ta yue pa qi yue qiang tuo tai yi nian ling mei ba die ku tuo jia ci pao qia zhu ju die zhi fu pan ju shan bo ni ju li gen yi ji dai xian jiao duo chu quan kua zhuai gui qiong kui xiang chi lu beng zhi jia tiao cai jian da qiao bi xian duo ji ju ji shu tu chu xing nie xiao bo xue qun mou shu liang yong jiao chou xiao none ta jian qi wo wei chuo jie ji nie ju ju lun lu leng huai ju chi wan quan ti bo zu qie qi cu zong cai zong pan zhi zheng dian zhi yu duo dun chun yong zhong di zha chen chuai jian gua tang ju fu zu die pian rou nuo ti cha tui jian dao cuo xi ta qiang zhan dian ti ji nie pan liu zhan bi chong lu liao cu tang dai su xi kui ji zhi qiang di man zong lian beng zao nian bie tui ju deng ceng xian fan chu zhong dun bo cu zu jue jue lin ta qiao qiao pu liao dun cuan kuang zao ta bi bi zhu ju chu qiao dun chou ji wu yue nian lin lie zhi li zhi chan chu duan wei long lin xian wei zuan lan xie rang xie nie ta qu jie cuan zuan xi kui jue lin shen gong dan none qu ti duo duo gong lang none luo ai ji ju tang none none yan none kang qu lou lao duo zhi none ti dao none yu che ya gui jun wei yue xin di xuan fan ren shan qiang shu tun chen dai e na qi mao ruan ren qian zhuan hong hu qu huang di ling dai ao zhen fan kuang ang peng bei gu gu pao zhu rong e ba zhou zhi yao ke yi qing shi ping er qiong ju jiao guang lu kai quan zhou zai zhi ju liang yu shao you huan yun zhe wan fu qing zhou ni ling zhe zhan liang zi hui wang chuo guo kan yi peng qian gun nian ping guan bei lun pai liang ruan rou ji yang xian chuan cou chun ge you hong shu fu zi fu wen ben zhan yu wen tao gu zhen xia yuan lu jiu chao zhuan wei hun none che jiao zhan ")
.append("pu lao fen fan lin ge se kan huan yi ji dui er yu xian hong lei pei li li lu lin che ya gui xuan dai ren zhuan e lun ruan hong gu ke lu zhou zhi yi hu zhen li yao qing shi zai zhi jiao zhou quan lu jiao zhe fu liang nian bei hui gun wang liang chuo zi cou fu ji wen shu pei yuan xia zhan lu zhe lin xin gu ci ci pi zui bian la la ci xue ban bian bian bian none bian ban ci bian bian chen ru nong nong zhen chuo chuo none reng bian bian none none liao da chan gan qian yu yu qi xun yi guo mai qi za wang none zhun ying ti yun jin hang ya fan wu ta e hai zhei none jin yuan wei lian chi che ni tiao zhi yi jiong jia chen dai er di po wang die ze tao shu tuo none jing hui tong you mi beng ji nai yi jie zhui lie xun tui song shi tao pang hou ni dun jiong xuan xun bu you xiao qiu tou zhu qiu di di tu jing ti dou yi zhe tong guang wu shi cheng su zao qun feng lian suo hui li none zui ben cuo jue beng huan dai lu you zhou jin yu chuo kui wei ti yi da yuan luo bi nuo yu dang sui dun sui yan chuan chi ti yu shi zhen you yun e bian guo e xia huang qiu dao da wei none yi gou yao chu liu xun ta di chi yuan su ta qian none yao guan zhang ao shi ce su su zao zhe dun zhi lou chi cuo lin zun rao qian xuan yu yi wu liao ju shi bi yao mai xie sui huan zhan deng er miao bian bian la li yuan you luo li yi ting deng qi yong shan han yu mang ru qiong none kuang fu kang bin fang xing nei none shen bang yuan cun huo xie bang wu ju you han tai qiu bi pi bing shao bei wa di zou ye lin kuang gui zhu shi ku yu gai he qie zhi ji xun hou xing jiao xi gui nuo lang jia kuai zheng lang yun yan cheng dou xi lu: fu wu fu gao hao lang jia geng jun ying bo xi bei li yun bu xiao qi pi qing guo none tan zou ping lai ni chen you bu xiang dan ju yong qiao yi dou yan mei ruo bei e yu juan yu yun hou kui xiang xiang sou tang ming xi ru chu zi zou ju wu xiang yun hao yong bi mao chao fu liao yin zhuan hu qiao yan zhang fan wu xu deng bi xin bi ceng wei zheng mao shan lin po dan meng ye cao kuai feng meng zou kuang lian zan chan you qi yan chan cuo ling huan xi feng zan li you ding qiu zhuo pei zhou yi gan yu jiu yan zui mao dan xu tou zhen fen none none yun tai tian qia tuo zuo han gu su fa chou dai ming lao chuo chou you tong zhi xian jiang cheng yin tu jiao mei ku suan lei pu zui hai yan shi niang wei lu lan yan tao pei zhan chun tan zui chuo cu kun ti xian du hu xu xing tan qiu chun yun fa ke sou mi quan chou cuo yun yong ang zha hai tang jiang piao lao yu li zao lao yi jiang bu jiao xi tan fa nong yi li ju yan yi niang ru xun chou yan ling mi mi niang xin jiao shi mi yan bian cai shi you shi shi li zhong ye liang li jin jin ga yi liao dao zhao ding li qiu he fu zhen zhi ba luan fu nai diao shan qiao kou chuan zi fan yu hua han gong qi mang jian di si xi yi chai ta tu xi nu: qian none jian pi ye yin ba fang chen jian tou yue yan fu bu ")
.append(" na xin e jue dun gou yin qian ban ji ren chao niu fen yun yi qin pi guo hong yin jun shi yi zhong nie gai ri huo tai kang none lu none none duo zi ni tu shi min gu ke ling bing yi gu ba pi yu si zuo bu you dian jia zhen shi shi tie ju zhan ta she xuan zhao bao he bi sheng chu shi bo zhu chi za po tong qian fu zhai liu qian fu li yue pi yang ban bo jie gou shu zheng mu ni xi di jia mu tan shen yi si kuang ka bei jian tong xing hong jiao chi er ge bing shi mou jia yin jun zhou chong shang tong mo lei ji yu xu ren cun zhi qiong shan chi xian xing quan pi yi zhu hou ming kua yao xian xian xiu jun cha lao ji yong ru mi yi yin guang an diu you se kao qian luan none ai diao han rui shi keng qiu xiao zhe xiu zang ti cuo gua gong zhong dou lu: mei lang wan xin yun bei wu su yu chan ting bo han jia hong cuan feng chan wan zhi si xuan wu wu tiao gong zhuo lu:e xing qin shen han none ye chu zeng ju xian e mang pu li shi rui cheng gao li te none zhu none tu liu zui ju chang yuan jian gang diao tao chang lun guo ling bei lu li qing pei juan min zui peng an pi xian ya zhui lei a kong ta kun du wei chui zi zheng ben nie cong chun tan ding qi qian zhuo qi yu jin guan mao chang dian xi lian tao gu cuo shu zhen lu meng lu hua biao ga lai ken zhui none nai wan zan none de xian none huo liang none men kai ying di lian guo xian du tu wei cong fu rou ji e rou chen ti zha hong yang duan xia yu keng xing huang wei fu zhao cha qie she hong kui nuo mou qiao qiao hou zhen huo huan ye min jian duan jian si kui hu xuan zang jie zhen bian zhong zi xiu ye mei pai ai jie none mei cha ta bang xia lian suo xi liu zu ye nou weng rong tang suo qiang ge shuo chui bo pan ta bi sang gang zi wu ying huang tiao liu kai sun sha sou wan hao zhen zhen luo yi yuan tang nie xi jia ge ma juan rong none suo none none none na lu suo kou zu tuan xiu guan xuan lian shou ao man mo luo bi wei liu di qiao huo yin lu ao keng qiang cui qi chang tang man yong chan feng jing biao shu lou xiu cong long zan jian cao li xia xi kang none beng none none zheng lu hua ji pu hui qiang po lin suo xiu san cheng kui san liu nao huang pie sui fan qiao chuan yang tang xiang jue jiao zun liao jie lao dui tan zan ji jian zhong deng lou ying dui jue nou ti pu tie none none ding shan kai jian fei sui lu juan hui yu lian zhuo qiao qian zhuo lei bi tie huan ye duo guo dang ju fen da bei yi ai dang xun diao zhu heng zhui ji nie ta huo qing bin ying kui ning xu jian jian qiang cha zhi mie li lei ji zuan kuang shang peng la du shuo chuo lu: biao bao lu none none long e lu xin jian lan bo jian yao chan xiang jian xi guan cang nie lei cuan qu pan luo zuan luan zao nie jue tang shu lan jin ga yi zhen ding zhao po liao tu qian chuan shan sa fan diao men nu: yang chai xing gai bu tai ju dun chao zhong na bei gang ban qian yao qin jun wu gou kang fang huo tou niu ba yu qian zheng qian gu bo ke po bu bo yue zuan mu tan jia dian you ti")
.append("e bo ling shuo qian mao bao shi xuan tuo bi ni pi duo xing kao lao er mang ya you cheng jia ye nao zhi dang tong lu: diao yin kai zha zhu xian ting diu xian hua quan sha ha yao ge ming zheng se jiao yi chan chong tang an yin ru zhu lao pu wu lai te lian keng xiao suo li zeng chu guo gao e xiu cuo lu:e feng xin liu kai jian rui ti lang qin ju a qing zhe nuo cuo mao ben qi de ke kun chang xi gu luo chui zhui jin zhi xian juan huo pei tan ding jian ju meng zi qie ying kai qiang si e cha qiao zhong duan sou huang huan ai du mei lou zi fei mei mo zhen bo ge nie tang juan nie na liu hao bang yi jia bin rong biao tang man luo beng yong jing di zu xuan liu chan jue liao pu lu dun lan pu cuan qiang deng huo lei huan zhuo lian yi cha biao la chan xiang chang chang jiu ao die qu liao mi zhang men ma shuan shan huo men yan bi han bi none kai kang beng hong run san xian xian jian min xia min dou zha nao none peng ke ling bian bi run he guan ge he fa chu hong gui min none kun lang lu: ting sha yan yue yue chan qu lin chang shai kun yan min yan e hun yu wen xiang none xiang qu yao wen ban an wei yin kuo que lan du none none tian nie da kai he que chuangguan dou qi kui tang guan piao kan xi hui chan pi dang huan ta wen none men shuan shan yan han bi wen chuangrun wei xian hong jian min kang men zha nao gui wen ta min lu: kai fa ge he kun jiu yue lang du yu yan chang xi wen hun yan yan chan lan qu hui kuo que he tian da que kan huan fu fu le dui xin qian wu yi tuo yin yang dou e sheng ban pei keng yun ruan zhi pi jing fang yang yin zhen jie cheng e qu di zu zuo dian ling a tuo tuo po bing fu ji lu long chen xing duo lou mo jiang shu duo xian er gui wu gai shan jun qiao xing chun fu bi shan shan sheng zhi pu dou yuan zhen chu xian zhi nie yun xian pei pei zou yi dui lun yin ju chui chen pi ling tao xian lu none xian yin zhu yang reng shan chong yan yin yu ti yu long wei wei nie dui sui an huang jie sui yin gai yan hui ge yun wu wei ai xi tang ji zhang dao ao xi yin sa rao lin tui deng pi sui sui yu xian fen ni er ji dao xi yin zhi hui long xi li li li zhui he zhi sun juan nan yi que yan qin ya xiong ya ji gu huan zhi gou jun ci yong ju chu hu za luo yu chou diao sui han huo shuangguan chu za yong ji sui chou liu li nan xue za ji ji yu yu xue na fou se mu wen fen pang yun li li yang ling lei an bao meng dian dang hang wu zhao xu ji mu chen xiao zha ting zhen pei mei ling qi chou huo sha fei weng zhan ying ni chou tun lin none dong ying wu ling shuangling xia hong yin mai mo yun liu meng bin wu wei kuo yin xi yi ai dan deng xian yu lu long dai ji pang yang ba pi wei none xi ji mai meng meng lei li huo ai fei dai long ling ai feng li bao none he he bing qing qing jing qi zhen jing cheng qing jing jing dian jing tian fei fei kao mi mian mian pao ye tian hui ye ge ding ren jian ren di du wu ren qin jin xue niu ba yin sa ren ")
.append("mo zu da ban yi yao tao bei jia hong pao yang mo yin jia tao ji xie an an hen gong gong da qiao ting man ying sui tiao qiao xuan kong beng ta zhang bing kuo ju la xie rou bang yi qiu qiu he xiao mu ju jian bian di jian none tao gou ta bei xie pan ge bi kuo tang lou gui qiao xue ji jian jiang chan da huo xian qian du wa jian lan wei ren fu mei juan ge wei qiao han chang none rou xun she wei ge bei tao gou yun gao bi wei hui shu wa du wei ren fu han wei yun tao jiu jiu xian xie xian ji yin za yun shao luo peng huang ying yun peng yin yin xiang hu ye ding qing pan xiang shun han xu yi xu gu song kui qi hang yu wan ban dun di dan pan po ling cheng jing lei he qiao e e wei jie gua shen yi yi ke dui pian ping lei fu jia tou hui kui jia le ting cheng ying jun hu han jing tui tui pin lai tui zi zi chui ding lai yan han qian ke cui jiong qin yi sai ti e e yan hun kan yong zhuan yan xian xin yi yuan sang dian dian jiang ku lei liao piao yi man qi yao hao qiao gu xun qian hui zhan ru hong bin xian pin lu lan nie quan ye ding qing han xiang shun xu xu wan gu dun qi ban song hang yu lu ling po jing jie jia ting he ying jiong ke yi pin hui tui han ying ying ke ti yong e zhuan yan e nie man dian sang hao lei zhan ru pin quan feng biao none fu xia zhan biao sa fa tai lie gua xuan shao ju biao si wei yang yao sou kai sao fan liu xi liao piao piao liu biao biao biao liao none se feng biao feng yang zhan biao sa ju si sou yao liu piao biao biao fei fan fei fei shi shi can ji ding si tuo jian sun xiang tun ren yu juan chi yin fan fan sun yin zhu yi zhai bi jie tao liu ci tie si bao shi duo hai ren tian jiao jia bing yao tong ci xiang yang yang er yan le yi can bo nei e bu jun dou su yu shi yao hun guo shi jian zhui bing xian bu ye tan fei zhang wei guan e nuan hun hu huang tie hui jian hou he xing fen wei gu cha song tang bo gao xi kui liu sou tao ye yun mo tang man bi yu xiu jin san kui zhuan shan chi dan yi ji rao cheng yong tao hui xiang zhan fen hai meng yan mo chan xiang luo zuan nang shi ding ji tuo xing tun xi ren yu chi fan yin jian shi bao si duo yi er rao xiang he le jiao xi bing bo dou e yu nei jun guo hun xian guan cha kui gu sou chan ye mo bo liu xiu jin man san zhuan nang shou kui guo xiang fen ba ni bi bo tu han fei jian yan ai fu xian wen xin fen bin xing ma yu feng han di tuo tuo chi xun zhu zhi pei xin ri sa yin wen zhi dan lu: you bo bao kuai tuo yi qu wen qu jiong bo zhao yuan peng zhou ju zhu nu ju pi zang jia ling zhen tai fu yang shi bi tuo tuo si liu ma pian tao zhi rong teng dong xun quan shen jiong er hai bo none yin luo none dan xie liu ju song qin mang liang han tu xuan tui jun e cheng xing ai lu zhui zhou she pian kun tao lai zong ke qi qi yan fei sao yan jie yao wu pian cong pian qian fei huang jian huo yu ti quan xia zong kui rou si gua tuo kui sou qian cheng zhi liu pang teng xi cao ")
.append(" du yan yuan zou sao shan li zhi shuanglu xi luo zhang mo ao can piao cong qu bi zhi yu xu hua bo su xiao lin zhan dun liu tuo zeng tan jiao tie yan luo zhan jing yi ye tuo bin zou yan peng lu: teng xiang ji shuangju xi huan li biao ma yu tuo xun chi qu ri bo lu: zang shi si fu ju zou zhu tuo nu jia yi tai xiao ma yin jiao hua luo hai pian biao li cheng yan xing qin jun qi qi ke zhui zong su can pian zhi kui sao wu ao liu qian shan piao luo cong zhan zhou ji shuangxiang gu wei wei wei yu gan yi ang tou jie bo bi ci ti di ku hai qiao hou kua ge tui geng pian bi ke qia yu sui lou bo xiao bang bo cuo kuan bin mo liao lou nao du zang sui ti bin kuan lu gao gao qiao kao qiao lao zao biao kun kun ti fang xiu ran mao dan kun bin fa tiao pi zi fa ran ti pao pi mao fu er rong qu none xiu gua ji peng zhua shao sha ti li bin zong ti peng song zheng quan zong shun jian duo hu la jiu qi lian zhen bin peng mo san man man seng xu lie qian qian nong huan kuai ning bin lie rang dou dou nao hong xi dou kan dou dou jiu chang yu yu li juan fu qian gui zong liu gui shang yu gui mei ji qi jie kui hun ba po mei xu yan xiao liang yu tui qi wang liang wei jian chi piao bi mo ji xu chou yan zhan yu dao ren ji ba hong tuo diao ji yu e que sha hang tun mo gai shen fan yuan pi lu wen hu lu za fang fen na you none none he xia qu han pi ling tuo ba qiu ping fu bi ji wei ju diao ba you gun pi nian xing tai bao fu zha ju gu none none none ta jie shua hou xiang er an wei tiao zhu yin lie luo tong yi qi bing wei jiao pu gui xian ge hui none none kao none duo jun ti mian shao za suo qin yu nei zhe gun geng none wu qiu ting fu huan chou li sha sha gao meng none none none none yong ni zi qi qing xiang nei chun ji diao qie gu zhou dong lai fei ni yi kun lu jiu chang jing lun ling zou li meng zong zhi nian none none none shi sao hun ti hou xing ju la zong ji bian bian huan quan ji wei wei yu chun rou die huang lian yan qiu qiu jian bi e yang fu sai jian ha tuo hu none ruo none wen jian hao wu pang sao liu ma shi shi guan zi teng ta yao ge rong qian qi wen ruo none lian ao le hui min ji tiao qu jian sao man xi qiu biao ji ji zhu jiang qiu zhuan yong zhang kang xue bie jue qu xiang bo jiao xun su huang zun shan shan fan gui lin xun miao xi none xiang fen guan hou kuai zei sao zhan gan gui sheng li chang none none ai ru ji xu huo none li lie li mie zhen xiang e lu guan li xian yu dao ji you tun lu fang ba ke ba ping nian lu you zha fu ba bao hou pi tai gui jie kao wei er tong zei hou kuai ji jiao xian zha xiang xun geng li lian jian li shi tiao gun sha huan jun ji yong qing ling qi zou fei kun chang gu ni nian diao jing shen shi zi fen die bi chang ti wen wei sai e qiu fu huang quan jiang bian sao ao qi ta guan yao pang jian le biao xue bie man min yong wei xi gui shan lin zun hu gan li shan guan niao yi fu li jiu bu ya")
.append("n fu diao ji feng none gan shi feng ming bao yuan zhi hu qian fu fen wen jian shi yu fou yiao ju jue pi huan zhen bao yan ya zheng fang feng wen ou te jia nu ling mie fu tuo wen li bian zhi ge yuan zi qu xiao chi dan ju you gu zhong yu yang rong ya zhi yu none ying zhui wu er gua ai zhi yan heng jiao ji lie zhu ren ti hong luo ru mou ge ren jiao xiu zhou chi luo none none none luan jia ji yu huan tuo bu wu juan yu bo xun xun bi xi jun ju tu jing ti e e kuang hu wu shen la none none lu bing shu fu an zhao peng qin qian bei diao lu que jian ju tu ya yuan qi li ye zhui kong duo kun sheng qi jing ni e jing zi lai dong qi chun geng ju qu none none ji shu none chi miao rou fu qiu ti hu ti e jie mao fu chun tu yan he yuan pian yun mei hu ying dun mu ju none cang fang ge ying yuan xuan weng shi he chu tang xia ruo liu ji gu jian zhun han zi ci yi yao yan ji li tian kou ti ti ni tu ma jiao liu zhen chen li zhuan zhe ao yao yi ou chi zhi liao rong lou bi shuangzhuo yu wu jue yin tan si jiao yi hua bi ying su huang fan jiao liao yan kao jiu xian xian tu mai zun yu ying lu tuan xian xue yi pi shu luo qi yi ji zhe yu zhan ye yang pi ning hu mi ying meng di yue yu lei bo lu he long shuangyue ying guan qu li luan niao jiu ji yuan ming shi ou ya cang bao zhen gu dong lu ya xiao yang ling chi qu yuan xue tuo si zhi er gua xiu heng zhou ge luan hong wu bo li juan hu e yu xian ti wu que miao an kun bei peng qian chun geng yuan su hu he e gu qiu ci mei wu yi yao weng liu ji yi jian he yi ying zhe liu liao jiao jiu yu lu huan zhan ying hu meng guan shuanglu jin ling jian xian cuo jian jian yan cuo lu you cu ji biao cu pao zhu jun zhu jian mi mi wu liu chen jun lin ni qi lu jiu jun jing li xiang yan jia mi li she zhang lin jing qi ling yan cu mai mai ge chao fu mian mian fu pao qu qu mou fu xian lai qu mian chi feng fu qu mian ma ma mo hui none zou nen fen huang huang jin guang tian tou hong xi kuang hong shu li nian chi hei hei yi qian zhen xi tuan mo mo qian dai chu you dian yi xia yan qu mei yan qing yu li dang du can yin an yan tan an zhen dai can yi mei dan yan du lu zhi fen fu fu min min yuan cu qu chao wa zhu zhi mang ao bie tuo bi yuan chao tuo ding mi nai ding zi gu gu dong fen tao yuan pi chang gao qi yuan tang teng shu shu fen fei wen ba diao tuo tong qu sheng shi you shi ting wu nian jing hun ju yan tu si xi xian yan lei bi yao yan han hui wu hou xi ge zha xiu weng zha nong nang qi zhai ji zi ji ji qi ji chi chen chen he ya ken xie bao ze shi zi chi nian ju tiao ling ling chu quan xie yin nie jiu nie chuo kun yu chu yi ni cuo chuo qu nian xian yu e wo yi chi zou dian chu jin ya chi chen he yin ju ling bao tiao zi yin yu chuo qu wo long pang gong pang yan long long gong kan ta ling ta long gong kan gui qiu bie gui yue chui he jue ")
.append("xie yue ").toString();
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/RetrofitUtils.java
================================================
package com.blankj.subutil.util;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2018/08/25
* desc : utils about retrofit
*
*/
public final class RetrofitUtils {
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
================================================
package com.blankj.subutil.util;
/**
*
* author: Faramarz Afzali
* time : 2020/09/05
* desc : This class is intended for converting temperatures into different units.
* C refers to the Celsius unit
* F refers to the Fahrenheit unit
* K refers to the Kelvin unit
*
*/
public final class TemperatureUtils {
public static float cToF(float temp) {
return (temp * 9) / 5 + 32;
}
public static float cToK(float temp) {
return temp + 273.15f;
}
public static float fToC(float temp) {
return (temp - 32) * 5 / 9;
}
public static float fToK(float temp) {
return temp + 255.3722222222f;
}
public static float kToC(float temp) {
return temp - 273.15f;
}
public static float kToF(float temp) {
return temp - 459.67f;
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/Utils.java
================================================
package com.blankj.subutil.util;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
/**
*
* author:
* ___ ___ ___ ___
* _____ / /\ /__/\ /__/| / /\
* / /::\ / /::\ \ \:\ | |:| / /:/
* / /:/\:\ ___ ___ / /:/\:\ \ \:\ | |:| /__/::\
* / /:/~/::\ /__/\ / /\ / /:/~/::\ _____\__\:\ __| |:| \__\/\:\
* /__/:/ /:/\:| \ \:\ / /:/ /__/:/ /:/\:\ /__/::::::::\ /__/\_|:|____ \ \:\
* \ \:\/:/~/:/ \ \:\ /:/ \ \:\/:/__\/ \ \:\~~\~~\/ \ \:\/:::::/ \__\:\
* \ \::/ /:/ \ \:\/:/ \ \::/ \ \:\ ~~~ \ \::/~~~~ / /:/
* \ \:\/:/ \ \::/ \ \:\ \ \:\ \ \:\ /__/:/
* \ \::/ \__\/ \ \:\ \ \:\ \ \:\ \__\/
* \__\/ \__\/ \__\/ \__\/
* blog : http://blankj.com
* time : 16/12/08
* desc : utils about initialization
*
*/
public final class Utils {
@SuppressLint("StaticFieldLeak")
private static Application sApplication;
private Utils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Init utils.
* Init it in the class of Application.
*
* @param context context
*/
public static void init(final Context context) {
if (context == null) {
init(getApplicationByReflect());
return;
}
init((Application) context.getApplicationContext());
}
/**
* Init utils.
* Init it in the class of Application.
*
* @param app application
*/
public static void init(final Application app) {
if (sApplication == null) {
if (app == null) {
Utils.sApplication = getApplicationByReflect();
} else {
Utils.sApplication = app;
}
}
}
/**
* Return the context of Application object.
*
* @return the context of Application object
*/
public static Application getApp() {
if (sApplication != null) return sApplication;
return getApplicationByReflect();
}
private static Application getApplicationByReflect() {
try {
@SuppressLint("PrivateApi")
Class> activityThread = Class.forName("android.app.ActivityThread");
Object at = activityThread.getMethod("currentActivityThread").invoke(null);
Object app = activityThread.getMethod("getApplication").invoke(at);
if (app == null) {
throw new NullPointerException("u should init first");
}
init((Application) app);
return sApplication;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
throw new NullPointerException("u should init first");
}
public static final class ContentProvider4SubUtil extends ContentProvider {
@Override
public boolean onCreate() {
Utils.init(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Chain.java
================================================
package com.blankj.subutil.util.http;
public interface Chain {
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
================================================
package com.blankj.subutil.util.http;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public final class ExecutorFactory {
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final Executor DEFAULT_WORK_EXECUTOR = new ThreadPoolExecutor(2 * CPU_COUNT + 1,
2 * CPU_COUNT + 1,
30, TimeUnit.SECONDS,
new LinkedBlockingQueue(128),
new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(@NonNull Runnable r) {
return new Thread(r, "http-pool-" + mCount.getAndIncrement());
}
}
);
private static final Executor DEFAULT_MAIN_EXECUTOR = new Executor() {
private final Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable command) {
mHandler.post(command);
}
};
public static Executor getDefaultWorkExecutor() {
return DEFAULT_WORK_EXECUTOR;
}
public static Executor getDefaultMainExecutor() {
return DEFAULT_MAIN_EXECUTOR;
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Headers.java
================================================
package com.blankj.subutil.util.http;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Headers {
private Map> header = new HashMap<>();
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
================================================
package com.blankj.subutil.util.http;
import android.accounts.NetworkErrorException;
import androidx.annotation.NonNull;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.concurrent.Executor;
import javax.net.ssl.HttpsURLConnection;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/02/08
* desc : utils about http
*
*/
public final class HttpUtils {
private static final String BOUNDARY = java.util.UUID.randomUUID().toString();
private static final String TWO_HYPHENS = "--";
private static final int CONNECT_TIMEOUT_TIME = 15000;
private static final int READ_TIMEOUT_TIME = 20000;
private static final int BUFFER_SIZE = 8192;
private static final Config CONFIG = new Config();
private final Config mConfig;
private static HttpUtils sHttpUtils;
private HttpUtils(@NonNull Config config) {
mConfig = config;
}
public static HttpUtils getInstance(@NonNull Config config) {
if (sHttpUtils == null) {
synchronized (HttpUtils.class) {
sHttpUtils = new HttpUtils(config);
}
}
return sHttpUtils;
}
public static void call(@NonNull final Request request, @NonNull final ResponseCallback callback) {
new Call(request, callback).run();
}
private static HttpURLConnection getConnection(final Request request) throws IOException {
HttpURLConnection conn = (HttpURLConnection) request.mURL.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
httpsConn.setSSLSocketFactory(CONFIG.sslConfig.mSSLSocketFactory);
httpsConn.setHostnameVerifier(CONFIG.sslConfig.mHostnameVerifier);
}
System.out.println(conn.getHeaderField("USE"));
addHeader(conn, request.mHeader);
addBody(conn, request.mBody);
conn.setConnectTimeout(CONFIG.connectTimeout);
conn.setReadTimeout(CONFIG.readTimeout);
return conn;
}
private static void addBody(HttpURLConnection conn, Request.Body body) throws IOException {
if (body == null) {
conn.setRequestMethod("GET");
} else {
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setRequestProperty("content-type", body.mediaType);
if (body.length > 0) {
conn.setRequestProperty("content-length", String.valueOf(body.length));
}
BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream(), 10240);
if (body.bis != null) {
byte[] buffer = new byte[10240];
for (int len; (len = body.bis.read(buffer)) != -1; ) {
bos.write(buffer, 0, len);
}
bos.close();
body.bis.close();
}
}
}
private static void addHeader(final HttpURLConnection conn, final Map headerMap) {
if (headerMap != null) {
for (String key : headerMap.keySet()) {
conn.setRequestProperty(key, headerMap.get(key));
}
}
}
private static boolean isSpace(final String s) {
if (s == null) return true;
for (int i = 0, len = s.length(); i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
static String is2String(final InputStream is, final String charset) {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
try {
for (int len; (len = is.read(buffer)) != -1; ) {
result.write(buffer, 0, len);
}
return result.toString(charset);
} catch (Exception e) {
e.printStackTrace();
return "";
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
static boolean writeFileFromIS(final File file,
final InputStream is) {
if (!createOrExistsFile(file) || is == null) return false;
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(file));
byte[] data = new byte[8192];
for (int len; (len = is.read(data)) != -1; ) {
os.write(data, 0, len);
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static boolean createOrExistsFile(final File file) {
if (file == null) return false;
if (file.exists()) return file.isFile();
if (!createOrExistsDir(file.getParentFile())) return false;
try {
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private static boolean createOrExistsDir(final File file) {
return file != null && (file.exists() ? file.isDirectory() : file.mkdirs());
}
public static class Config {
private Executor workExecutor = ExecutorFactory.getDefaultWorkExecutor();
private Executor mainExecutor = ExecutorFactory.getDefaultMainExecutor();
private SSLConfig sslConfig = SSLConfig.DEFAULT_SSL_CONFIG;
private int connectTimeout = CONNECT_TIMEOUT_TIME;
private int readTimeout = READ_TIMEOUT_TIME;
private Charset charset = Charset.defaultCharset();
private Proxy proxy = null;
}
static class Call implements Runnable {
private Request request;
private ResponseCallback callback;
public Call(Request request, ResponseCallback callback) {
this.request = request;
this.callback = callback;
}
@Override
public void run() {
HttpURLConnection conn = null;
try {
conn = getConnection(request);
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
InputStream is = conn.getInputStream();
callback.onResponse(new Response(conn.getHeaderFields(), is));
is.close();
} else if (responseCode == 301 || responseCode == 302) {
String location = conn.getHeaderField("Location");
call(request, callback);
} else {
String errorMsg = null;
InputStream es = conn.getErrorStream();
if (es != null) {
errorMsg = is2String(es, "utf-8");
}
callback.onFailed(new NetworkErrorException("error code: " + responseCode +
(isSpace(errorMsg) ? "" : ("\n" + "error message: " + errorMsg))));
}
} catch (IOException e) {
callback.onFailed(e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Interceptor.java
================================================
package com.blankj.subutil.util.http;
import java.io.IOException;
public interface Interceptor {
Response intercept(Chain chain) throws IOException;
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Request.java
================================================
package com.blankj.subutil.util.http;
import androidx.annotation.NonNull;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.util.HashMap;
import java.util.Map;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2019/02/17
*
*/
public final class Request {
URL mURL;
Map mHeader;
Body mBody;
public static Request withUrl(@NonNull final String url) {
return new Request(url);
}
private Request(final String url) {
try {
mURL = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public Request addHeader(@NonNull final String name, @NonNull final String value) {
if (mHeader == null) {
mHeader = new HashMap<>();
}
mHeader.put(name, value);
return this;
}
public Request addHeader(@NonNull final Map header) {
if (this.mHeader == null) {
this.mHeader = new HashMap<>();
}
this.mHeader.putAll(header);
return this;
}
public Request post(@NonNull final Body body) {
this.mBody = body;
return this;
}
public static class Body {
String mediaType;
BufferedInputStream bis;
long length;
private Body(final String mediaType, final byte[] body) {
this.mediaType = mediaType;
bis = new BufferedInputStream(new ByteArrayInputStream(body));
length = body.length;
}
private Body(final String mediaType, final InputStream body) {
this.mediaType = mediaType;
if (body instanceof BufferedInputStream) {
bis = (BufferedInputStream) body;
} else {
bis = new BufferedInputStream(body);
}
length = -1;
}
private static String getCharsetFromMediaType(String mediaType) {
mediaType = mediaType.toLowerCase().replace(" ", "");
int index = mediaType.indexOf("charset=");
if (index == -1) return "utf-8";
int st = index + 8;
int end = mediaType.length();
if (st >= end) {
throw new IllegalArgumentException("MediaType is not correct: \"" + mediaType + "\"");
}
for (int i = st; i < end; i++) {
char c = mediaType.charAt(i);
if (c >= 'A' && c <= 'Z') continue;
if (c >= 'a' && c <= 'z') continue;
if (c >= '0' && c <= '9') continue;
if (c == '-' && i != 0) continue;
if (c == '+' && i != 0) continue;
if (c == ':' && i != 0) continue;
if (c == '_' && i != 0) continue;
if (c == '.' && i != 0) continue;
end = i;
break;
}
String charset = mediaType.substring(st, end);
return checkCharset(charset);
}
public static Body create(@NonNull String mediaType, @NonNull byte[] content) {
return new Body(mediaType, content);
}
public static Body form(@NonNull final Map form) {
return form(form, "utf-8");
}
public static Body form(@NonNull final Map form, String charset) {
String mediaType = "application/x-www-form-urlencoded;charset=" + checkCharset(charset);
final StringBuilder sb = new StringBuilder();
for (String key : form.keySet()) {
if (sb.length() > 0) sb.append("&");
sb.append(key).append("=").append(form.get(key));
}
try {
return new Body(mediaType, sb.toString().getBytes(charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
public static Body json(@NonNull final String json) {
return json(json, "utf-8");
}
public static Body json(@NonNull final String json, String charset) {
String mediaType = "application/json;charset=" + checkCharset(charset);
try {
return new Body(mediaType, json.getBytes(charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
// public static RequestBody file(String mediaType, final File file) {
//
// return new RequestBody(mediaType, );
// }
}
private static String checkCharset(final String charset) {
if (Charset.isSupported(charset)) return charset;
throw new IllegalCharsetNameException(charset);
}
}
================================================
FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Response.java
================================================
package com.blankj.subutil.util.http;
import com.google.gson.Gson;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
/**
*