diff --git a/app/src/main/java/cc/niushuai/didicheck/base/activity/BaseActivity.java b/app/src/main/java/cc/niushuai/didicheck/base/activity/BaseActivity.java new file mode 100644 index 0000000..52af317 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/base/activity/BaseActivity.java @@ -0,0 +1,148 @@ +package cc.niushuai.didicheck.base.activity; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * 基类 + * Created by huanghaibin on 2017/11/16. + */ + +public abstract class BaseActivity extends AppCompatActivity { + + private static boolean isMiUi = false; + + protected void initWindow() { + + } + + protected abstract int getLayoutId(); + + protected abstract void initView(); + + protected abstract void initData(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initWindow(); + setContentView(getLayoutId()); + initView(); + initData(); + } + + /** + * 设置小米黑色状态栏字体 + */ + @SuppressLint("PrivateApi") + private void setMIUIStatusBarDarkMode() { + if (isMiUi) { + Class clazz = getWindow().getClass(); + try { + int darkModeFlag; + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + extraFlagField.invoke(getWindow(), darkModeFlag, darkModeFlag); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /* + * 静态域,获取系统版本是否基于MIUI + */ + + static { + try { + @SuppressLint("PrivateApi") Class sysClass = Class.forName("android.os.SystemProperties"); + Method getStringMethod = sysClass.getDeclaredMethod("get", String.class); + String version = (String) getStringMethod.invoke(sysClass, "ro.miui.ui.version.name"); + isMiUi = version.compareTo("V6") >= 0 && Build.VERSION.SDK_INT < 24; + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 设置魅族手机状态栏图标颜色风格 + * 可以用来判断是否为Flyme用户 + * + * @param window 需要设置的窗口 + * @param dark 是否把状态栏字体及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + @SuppressWarnings("JavaReflectionMemberAccess") + public static boolean setMeiZuDarkMode(Window window, boolean dark) { + boolean result = false; + if (Build.VERSION.SDK_INT >= 24) { + return false; + } + if (window != null) { + try { + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class + .getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + } + return result; + } + + @SuppressLint("InlinedApi") + private int getStatusBarLightMode() { + int result = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (isMiUi) { + result = 1; + } else if (setMeiZuDarkMode(getWindow(), true)) { + result = 2; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + result = 3; + } + } + return result; + } + + + @SuppressLint("InlinedApi") + protected void setStatusBarDarkMode() { + int type = getStatusBarLightMode(); + if (type == 1) { + setMIUIStatusBarDarkMode(); + } else if (type == 2) { + setMeiZuDarkMode(getWindow(), true); + } else if (type == 3) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/base/adapter/BaseRecyclerAdapter.java b/app/src/main/java/cc/niushuai/didicheck/base/adapter/BaseRecyclerAdapter.java new file mode 100644 index 0000000..607772c --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/base/adapter/BaseRecyclerAdapter.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2016 huanghaibin_dev + * WebSite https://github.com/MiracleTimes-Dev + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cc.niushuai.didicheck.base.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +/** + * 基本的适配器 + */ +@SuppressWarnings("unused") +public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter { + + protected LayoutInflater mInflater; + protected List mItems; + private OnItemClickListener onItemClickListener; + private OnClickListener onClickListener; + + public BaseRecyclerAdapter(Context context) { + this.mItems = new ArrayList<>(); + mInflater = LayoutInflater.from(context); + onClickListener = new OnClickListener() { + @Override + public void onClick(int position, long itemId) { + if (onItemClickListener != null) + onItemClickListener.onItemClick(position, itemId); + } + }; + + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType); + holder.itemView.setTag(holder); + holder.itemView.setOnClickListener(onClickListener); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + onBindViewHolder(holder, mItems.get(position), position); + } + + protected abstract RecyclerView.ViewHolder onCreateDefaultViewHolder(ViewGroup parent, int type); + + protected abstract void onBindViewHolder(RecyclerView.ViewHolder holder, T item, int position); + + @Override + public int getItemCount() { + return mItems.size(); + } + + void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + void addAll(List items) { + if (items != null && items.size() > 0) { + mItems.addAll(items); + notifyItemRangeInserted(mItems.size(), items.size()); + } + } + + final void addItem(T item) { + if (item != null) { + this.mItems.add(item); + notifyItemChanged(mItems.size()); + } + } + + final List getItems() { + return mItems; + } + + + final T getItem(int position) { + if (position < 0 || position >= mItems.size()) + return null; + return mItems.get(position); + } + + static abstract class OnClickListener implements View.OnClickListener { + @Override + public void onClick(View v) { + RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag(); + onClick(holder.getAdapterPosition(), holder.getItemId()); + } + + public abstract void onClick(int position, long itemId); + } + + + interface OnItemClickListener { + void onItemClick(int position, long itemId); + } + + public final void removeItem(T item) { + if (this.mItems.contains(item)) { + int position = mItems.indexOf(item); + this.mItems.remove(item); + notifyItemRemoved(position); + } + } + + protected final void removeItem(int position) { + if (this.getItemCount() > position) { + this.mItems.remove(position); + notifyItemRemoved(position); + } + } + + protected final void clear(){ + mItems.clear(); + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/base/fragment/BaseFragment.java b/app/src/main/java/cc/niushuai/didicheck/base/fragment/BaseFragment.java new file mode 100644 index 0000000..ee19825 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/base/fragment/BaseFragment.java @@ -0,0 +1,52 @@ +package cc.niushuai.didicheck.base.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + + +public abstract class BaseFragment extends Fragment { + protected View mRootView; + protected LayoutInflater mInflater; + protected Context mContext; + + @Override + public void onAttach(Context context) { + mContext = context; + super.onAttach(context); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (mRootView != null) { + ViewGroup parent = (ViewGroup) mRootView.getParent(); + if (parent != null) + parent.removeView(mRootView); + } else { + mRootView = inflater.inflate(getLayoutId(), container, false); + mInflater = inflater; + initView(); + initData(); + } + return mRootView; + } + + @Override + public void onDetach() { + mContext = null; + super.onDetach(); + } + + protected abstract int getLayoutId(); + + protected abstract void initView(); + + protected abstract void initData(); +} diff --git a/app/src/main/java/cc/niushuai/didicheck/base/fragment/FragmentAdapter.java b/app/src/main/java/cc/niushuai/didicheck/base/fragment/FragmentAdapter.java new file mode 100644 index 0000000..4bf74f1 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/base/fragment/FragmentAdapter.java @@ -0,0 +1,95 @@ +package cc.niushuai.didicheck.base.fragment; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.fragment.app.FragmentTransaction; + +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings("unused") +public class FragmentAdapter extends FragmentPagerAdapter { + private List mFragment = new ArrayList<>(); + private final FragmentManager mFragmentManager; + private boolean mUpdateFlag; + private Fragment mCurFragment; + private String[] mTitles; + + public FragmentAdapter(FragmentManager fm) { + super(fm); + this.mFragmentManager = fm; + } + + public boolean isUpdateFlag() { + return mUpdateFlag; + } + + public void setUpdateFlag(boolean mUpdateFlag) { + this.mUpdateFlag = mUpdateFlag; + } + + @Override + public int getItemPosition(@NonNull Object object) { + return POSITION_NONE; + } + + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + if (mUpdateFlag) { + Fragment fragment = (Fragment) super.instantiateItem(container, position); + String tag = fragment.getTag(); + FragmentTransaction transaction = mFragmentManager.beginTransaction(); + transaction.remove(fragment); + fragment = getItem(position); + if (!fragment.isAdded()) { + transaction.add(container.getId(), fragment, tag) + .attach(fragment) + .commitAllowingStateLoss(); + } + return fragment; + } + return super.instantiateItem(container, position); + } + + public void reset(List fragments) { + mFragment.clear(); + mFragment.addAll(fragments); + } + + @Override + public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + super.setPrimaryItem(container, position, object); + if (object instanceof Fragment) { + mCurFragment = (Fragment) object; + } + } + + public Fragment getCurFragment() { + return mCurFragment; + } + + public void reset(String[] titles) { + this.mTitles = titles; + } + + @Override + public Fragment getItem(int position) { + return mFragment.get(position); + } + + @Override + public int getCount() { + return mFragment.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + return mTitles[position]; + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupItemDecoration.java b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupItemDecoration.java new file mode 100644 index 0000000..11cf2c2 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupItemDecoration.java @@ -0,0 +1,283 @@ +package cc.niushuai.didicheck.ui.group; + +import android.annotation.SuppressLint; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.text.TextUtils; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.HashMap; +import java.util.Map; + +/** + * 分组浮动的ItemDecoration + * Created by haibin on 2017/5/15. + */ +@SuppressWarnings("all") +public class GroupItemDecoration extends RecyclerView.ItemDecoration { + protected int mGroupHeight; + protected int mGroutBackground; + protected Paint mBackgroundPaint; + protected Paint mTextPaint; + protected float mTextBaseLine; + protected int mPaddingLeft, mPaddingRight; + protected boolean isCenter; + protected boolean isHasHeader; + protected int mChildItemOffset; + @SuppressLint("UseSparseArrays") + protected Map mGroup = new HashMap<>(); + + public GroupItemDecoration() { + super(); + init(); + } + + private void init() { + mBackgroundPaint = new Paint(); + mBackgroundPaint.setColor(0xFFf5f7f8); + mBackgroundPaint.setStyle(Paint.Style.FILL); + mBackgroundPaint.setAntiAlias(true); + + mTextPaint = new Paint(); + mTextPaint.setColor(0xFF353535); + mTextPaint.setAntiAlias(true); + } + + /** + * 先于RecyclerView的Item onDraw调用 + * + * @param c RecyclerView canvas + * @param parent RecyclerView + * @param state stare + */ + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDraw(c, parent, state); + onDrawGroup(c, parent); + } + + /** + * 绘制分组Group + * + * @param c Canvas + * @param parent RecyclerView + */ + protected void onDrawGroup(Canvas c, RecyclerView parent) { + int paddingLeft = parent.getPaddingLeft(); + int right = parent.getWidth() - parent.getPaddingRight(); + int top, bottom; + int count = parent.getChildCount(); + for (int i = 0; i < parent.getChildCount(); i++) { + View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + int key = params.getViewLayoutPosition(); + if (mGroup.containsKey(key)) { + top = child.getTop() - params.topMargin - mGroupHeight; + bottom = top + mGroupHeight; + c.drawRect(paddingLeft, top, right, bottom, mBackgroundPaint); + String group = mGroup.get(params.getViewLayoutPosition()).toString(); + float x; + float y = top + mTextBaseLine; + if (isCenter) { + x = parent.getMeasuredWidth() / 2 - getTextX(group); + } else { + x = mPaddingLeft; + } + c.drawText(group, x, y, mTextPaint); + } + } + } + + /** + * 后于RecyclerView的Item onDraw调用 + * + * @param c RecyclerView canvas + * @param parent RecyclerView + * @param state stare + */ + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDrawOver(c, parent, state); + onDrawOverGroup(c, parent); + } + + /** + * 绘制悬浮组 + * + * @param c Canvas + * @param parent RecyclerView + */ + protected void onDrawOverGroup(Canvas c, RecyclerView parent) { + int firstVisiblePosition = ((LinearLayoutManager) parent.getLayoutManager()).findFirstVisibleItemPosition(); + if (firstVisiblePosition == RecyclerView.NO_POSITION) { + return; + } + Group group = getCroup(firstVisiblePosition); + if (group == null) + return; + String groupTitle = group.toString(); + if (TextUtils.isEmpty(groupTitle)) { + return; + } + boolean isRestore = false; + Group nextGroup = getCroup(firstVisiblePosition + 1); + if (nextGroup != null && !group.equals(nextGroup)) { + //说明是当前组最后一个元素,但不一定碰撞了 + View child = parent.findViewHolderForAdapterPosition(firstVisiblePosition).itemView; + if (child.getTop() + child.getMeasuredHeight() < mGroupHeight) { + //进一步检测碰撞 + c.save();//保存画布当前的状态 + isRestore = true; + c.translate(0, child.getTop() + child.getMeasuredHeight() - mGroupHeight); + } + } + int left = parent.getPaddingLeft(); + int right = parent.getWidth() - parent.getPaddingRight(); + int top = parent.getPaddingTop(); + int bottom = top + mGroupHeight; + c.drawRect(left, top, right, bottom, mBackgroundPaint); + float x; + float y = top + mTextBaseLine; + if (isCenter) { + x = parent.getMeasuredWidth() / 2 - getTextX(groupTitle); + } else { + x = mPaddingLeft; + } + c.drawText(groupTitle, x, y, mTextPaint); + if (isRestore) { + //还原画布为初始状态 + c.restore(); + } + } + + /** + * 设置item的上下左右偏移量 + * + * @param outRect rect + * @param view item + * @param parent RecyclerView + * @param state stare + */ + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + getItemOffsets(outRect, view, parent, parent.getChildViewHolder(view).getAdapterPosition()); + } + + /** + * 设置item的上下左右偏移量,不做任何处理就是默认状态 + * + * @param outRect outRect + * @param view view + * @param parent RecyclerView + * @param adapterPosition position + */ + protected void getItemOffsets(Rect outRect, View view, RecyclerView parent, int adapterPosition) { + if (mGroup.containsKey(adapterPosition)) { + outRect.set(0, mGroupHeight, 0, mGroup.containsKey(adapterPosition + 1) ? 0 : mChildItemOffset); + } else { + outRect.set(0, 0, 0, mGroup.containsKey(adapterPosition + 1) ? 0 : mChildItemOffset); + } + } + + /** + * 获得当前ViewPosition所在的组 + * + * @param position 当前View的position + * @return 当前ViewPosition所在的组 + */ + protected Group getCroup(int position) { + while (position >= 0) { + if (mGroup.containsKey(position)) { + return mGroup.get(position); + } + position--; + } + return null; + } + + /** + * 通知更新分组信息 + * + * @param adapter GroupRecyclerAdapter + */ + public void notifyDataSetChanged(GroupRecyclerAdapter adapter) { + mGroup.clear(); + if (adapter == null) return; + int key = 0; + for (int i = 0; i < adapter.getGroupCount(); i++) { + if (i == 0) { + mGroup.put(isHasHeader ? 1 : 0, adapter.getGroup(i)); + key += adapter.getChildCount(i) + (isHasHeader ? 1 : 0); + ; + } else { + mGroup.put(key, adapter.getGroup(i)); + key += adapter.getChildCount(i); + } + } + } + + public void setChildItemOffset(int childItemOffset){ + this.mChildItemOffset = childItemOffset; + } + + public void setBackground(int groupBackground) { + mBackgroundPaint.setColor(groupBackground); + } + + public void setTextColor(int textColor) { + mTextPaint.setColor(textColor); + } + + public void setTextSize(float textSize) { + mTextPaint.setTextSize(textSize); + Paint.FontMetrics metrics = mTextPaint.getFontMetrics(); + mTextBaseLine = mGroupHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2; + } + + public void setGroupHeight(int groupHeight) { + mGroupHeight = groupHeight; + Paint.FontMetrics metrics = mTextPaint.getFontMetrics(); + mTextBaseLine = mGroupHeight / 2 - metrics.descent + (metrics.bottom - metrics.top) / 2; + } + + public void setPadding(int mPaddingLeft, int mPaddingRight) { + this.mPaddingLeft = mPaddingLeft; + this.mPaddingRight = mPaddingRight; + } + + public void setCenter(boolean isCenter) { + this.isCenter = isCenter; + } + + public void setHasHeader(boolean hasHeader) { + isHasHeader = hasHeader; + } + + /** + * 获取文本的x坐标起点 + * + * @param str 文本 + * @return x + */ + protected float getTextX(String str) { + Rect bounds = new Rect(); + mTextPaint.getTextBounds(str, 0, str.length(), bounds); + return bounds.width() / 2; + } + + /** + * 获取文本的长度像素 + * @param str 文本 + * @return px + */ + protected float getTextLenghtPx(String str) { + Rect bounds = new Rect(); + mTextPaint.getTextBounds(str, 0, str.length(), bounds); + return bounds.width(); + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerAdapter.java b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerAdapter.java new file mode 100644 index 0000000..e8232b6 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerAdapter.java @@ -0,0 +1,135 @@ +package cc.niushuai.didicheck.ui.group; + +import android.content.Context; + + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import cc.niushuai.didicheck.base.adapter.BaseRecyclerAdapter; + + +/** + * 分组的RecyclerAdapter + * Created by haibin on 2017/5/15. + */ +@SuppressWarnings("unused") +public abstract class GroupRecyclerAdapter extends BaseRecyclerAdapter { + private LinkedHashMap> mGroups; + private List mGroupTitles; + + public GroupRecyclerAdapter(Context context) { + super(context); + mGroups = new LinkedHashMap<>(); + mGroupTitles = new ArrayList<>(); + } + + /** + * 返回特定的标题 + */ + Parent getGroup(int groupPosition) { + return mGroupTitles.get(groupPosition); + } + + /** + * 获得分组的数量 + * + * @return 组的数量 + */ + int getGroupCount() { + return mGroupTitles.size(); + } + + /** + * 获取某一组的数量 + * + * @param groupPosition groupPosition + * @return 某一组的数量 + */ + int getChildCount(int groupPosition) { + if (mGroupTitles == null || mGroups.size() == 0) + return 0; + if (mGroups.get(mGroupTitles.get(groupPosition)) == null) + return 0; + return mGroups.get(mGroupTitles.get(groupPosition)).size(); + } + + /** + * 重置分组数据 + * + * @param groups groups + * @param titles titles + */ + protected void resetGroups(LinkedHashMap> groups, List titles) { + if (groups == null || titles == null) { + return; + } + mGroups.clear(); + mGroupTitles.clear(); + mGroups.putAll(groups); + mGroupTitles.addAll(titles); + mItems.clear(); + for (Parent key : mGroups.keySet()) { + mItems.addAll(mGroups.get(key)); + } + notifyDataSetChanged(); + } + + /** + * 清除分组数据 + */ + public final void clearGroup() { + mGroupTitles.clear(); + mGroups.clear(); + clear(); + } + + /** + * 从分组移除数据 + * + * @param position 下标 + * @return 分组是否为空,要移除分组 + */ + public boolean removeGroupItem(int position) { + int group = getGroupIndex(position); + removeGroupChildren(group); + int count = getChildCount(group); + removeItem(position); + if (count <= 0) { + mGroupTitles.remove(group); + return true; + } + return false; + } + + /** + * 获取所在分组 + * + * @param position 下标 + * @return 获取所在分组 + */ + private int getGroupIndex(int position) { + int count = 0; + if (position <= count) + return 0; + int i = 0; + for (Parent parent : mGroups.keySet()) { + count += mGroups.get(parent).size(); + if (position < count) { + return i; + } + i++; + } + return 0; + } + + private void removeGroupChildren(int groupPosition) { + if (groupPosition >= mGroupTitles.size()) + return; + List childList = mGroups.get(mGroupTitles.get(groupPosition)); + if (childList != null && childList.size() != 0) { + childList.remove(childList.size() - 1); + } + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerView.java b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerView.java new file mode 100644 index 0000000..36276a4 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/group/GroupRecyclerView.java @@ -0,0 +1,92 @@ +package cc.niushuai.didicheck.ui.group; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import cc.niushuai.didicheck.R; + + +/** + * 带分组浮动的RecyclerView + * Created by haibin on 2017/5/15. + */ +@SuppressWarnings("all") +public class GroupRecyclerView extends RecyclerView { + private GroupItemDecoration mItemDecoration; + private int mGroupHeight; + private int mGroutBackground, mTextColor; + private int mTextSize; + private int mPaddingLeft, mPaddingRight; + private boolean isCenter; + protected int mChildItemOffset; + private boolean isHasHeader; + private OnGroupChangeListener mListener; + + public GroupRecyclerView(Context context) { + super(context); + } + + public GroupRecyclerView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GroupRecyclerView); + mTextSize = array.getDimensionPixelSize(R.styleable.GroupRecyclerView_group_text_size, 16); + mGroupHeight = (int) array.getDimension(R.styleable.GroupRecyclerView_group_height, 52); + mChildItemOffset = (int) array.getDimension(R.styleable.GroupRecyclerView_group_child_offset, 20); + mTextColor = array.getColor(R.styleable.GroupRecyclerView_group_text_color, 0xFFFFFFFF); + mGroutBackground = array.getColor(R.styleable.GroupRecyclerView_group_background, 0x80000000); + isCenter = array.getBoolean(R.styleable.GroupRecyclerView_group_center, false); + isHasHeader = array.getBoolean(R.styleable.GroupRecyclerView_group_has_header, true); + mPaddingLeft = (int) array.getDimension(R.styleable.GroupRecyclerView_group_padding_left, 16); + mPaddingRight = (int) array.getDimension(R.styleable.GroupRecyclerView_group_padding_right, 16); + array.recycle(); + } + + + @Override + public void setAdapter(Adapter adapter) { + if (adapter instanceof GroupRecyclerAdapter) { + super.setAdapter(adapter); + } else { + throw new IllegalStateException("Adapter must instanceof " + + "GroupRecyclerAdapter or extends GroupRecyclerAdapter"); + } + } + + @Override + public void addItemDecoration(ItemDecoration decor) { + if (decor instanceof GroupItemDecoration) + super.addItemDecoration(decor); + else + throw new IllegalStateException("ItemDecoration must instanceof " + + "GroupItemDecoration or extends GroupItemDecoration"); + mItemDecoration = (GroupItemDecoration) decor; + mItemDecoration.setTextSize(mTextSize); + mItemDecoration.setBackground(mGroutBackground); + mItemDecoration.setTextColor(mTextColor); + mItemDecoration.setGroupHeight(mGroupHeight); + mItemDecoration.setPadding(mPaddingLeft, mPaddingRight); + mItemDecoration.setCenter(isCenter); + mItemDecoration.setHasHeader(isHasHeader); + mItemDecoration.setChildItemOffset(mChildItemOffset); + //mItemDecoration.notifyDataSetChanged((GroupRecyclerAdapter) getAdapter()); + } + + public void notifyDataSetChanged() { + mItemDecoration.notifyDataSetChanged((GroupRecyclerAdapter) getAdapter()); + } + + public void setOnGroupChangeListener(OnGroupChangeListener listener) { + this.mListener = listener; + } + + /** + * 分组最上面改变通知 + */ + public interface OnGroupChangeListener { + void onGroupChange(int groupPosition, String group); + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexMonthView.java b/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexMonthView.java new file mode 100644 index 0000000..a5ef64f --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexMonthView.java @@ -0,0 +1,91 @@ +package cc.niushuai.didicheck.ui.index; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MonthView; + +/** + * 下标标记的日历控件 + * Created by huanghaibin on 2017/11/15. + */ + +public class IndexMonthView extends MonthView { + private Paint mSchemeBasicPaint = new Paint(); + private int mPadding; + private int mH, mW; + + public IndexMonthView(Context context) { + super(context); + + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setColor(0xff333333); + mSchemeBasicPaint.setFakeBoldText(true); + mPadding = dipToPx(getContext(), 4); + mH = dipToPx(getContext(), 2); + mW = dipToPx(getContext(), 8); + } + + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + mSelectedPaint.setStyle(Paint.Style.FILL); + canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint); + return true; + } + + /** + * onDrawSelected + * @param canvas canvas + * @param calendar 日历calendar + * @param x 日历Card x起点坐标 + * @param y 日历Card y起点坐标 + */ + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + mSchemeBasicPaint.setColor(calendar.getSchemeColor()); + canvas.drawRect(x + mItemWidth / 2 - mW / 2, + y + mItemHeight - mH * 2 - mPadding, + x + mItemWidth / 2 + mW / 2, + y + mItemHeight - mH - mPadding, mSchemeBasicPaint); + } + + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + int cx = x + mItemWidth / 2; + int top = y - mItemHeight / 6; + if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, + calendar.isCurrentDay() ? mCurDayLunarTextPaint : + mCurMonthLunarTextPaint); + + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexWeekView.java b/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexWeekView.java new file mode 100644 index 0000000..c7a5206 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/index/IndexWeekView.java @@ -0,0 +1,103 @@ +package cc.niushuai.didicheck.ui.index; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.WeekView; + +/** + * 下标周视图 + * Created by huanghaibin on 2017/11/29. + */ + +public class IndexWeekView extends WeekView { + private Paint mSchemeBasicPaint = new Paint(); + private int mPadding; + private int mH, mW; + + public IndexWeekView(Context context) { + super(context); + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setColor(0xff333333); + mSchemeBasicPaint.setFakeBoldText(true); + mPadding = dipToPx(getContext(), 4); + mH = dipToPx(getContext(), 2); + mW = dipToPx(getContext(), 8); + } + + @Override + protected void onPreviewHook() { + + } + + /** + * 如果这里和 onDrawScheme 是互斥的,则 return false, + * return true 会先绘制 onDrawSelected,再绘制onDrawSelected + * + * @param canvas canvas + * @param calendar 日历日历calendar + * @param x 日历Card x起点坐标 + * @param hasScheme hasScheme 非标记的日期 + */ + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + mSelectedPaint.setStyle(Paint.Style.FILL); + canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint); + return true; + } + + /** + * 绘制下标标记 + * + * @param canvas canvas + * @param calendar 日历calendar + * @param x 日历Card x起点坐标 + */ + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + mSchemeBasicPaint.setColor(calendar.getSchemeColor()); + canvas.drawRect(x + mItemWidth / 2 - mW / 2, + mItemHeight - mH * 2 - mPadding, + x + mItemWidth / 2 + mW / 2, + mItemHeight - mH - mPadding, mSchemeBasicPaint); + } + + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + int cx = x + mItemWidth / 2; + int top = -mItemHeight / 6; + if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mSchemeTextPaint : mCurMonthTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, + calendar.isCurrentDay() ? mCurDayLunarTextPaint : + mCurMonthLunarTextPaint); + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, + calendar.isCurrentDay() ? mCurDayLunarTextPaint : + mCurMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/index/x.java b/app/src/main/java/cc/niushuai/didicheck/ui/index/x.java new file mode 100644 index 0000000..3edcdc0 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/ui/index/x.java @@ -0,0 +1,4 @@ +package cc.niushuai.didicheck.ui.index; + +public class x { +} diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java b/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java index c921e81..0f08cff 100644 --- a/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java +++ b/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java @@ -6,6 +6,7 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -62,7 +63,7 @@ public class HomeFragment extends Fragment { Log.d("Home", "onCreateView"); fragmentHomeBinding = FragmentHomeBinding.inflate(inflater, container, false); - ConstraintLayout rootLayout = fragmentHomeBinding.getRoot(); + LinearLayout rootLayout = fragmentHomeBinding.getRoot(); initTextView(); @@ -79,38 +80,37 @@ public class HomeFragment extends Fragment { } private void initVerticalCalendarView() { - CalendarView homeMainCalendar = fragmentHomeBinding.homeMainCalendar; -// homeMainCalendar.setSchemeDate(); - homeMainCalendar.setOnCalendarSelectListener(new CalendarView.OnCalendarSelectListener() { - @Override - public void onCalendarOutOfRange(Calendar calendar) { - Log.d("onCalendarOutOfRange", "" + calendar.getTimeInMillis()); - } - - @Override - public void onCalendarSelect(Calendar calendar, boolean isClick) { - Log.d("onCalendarSelect", isClick + "---" + calendar.getTimeInMillis()); - String dateStr = StrUtil.format("{}-{}-{}", calendar.getYear(), calendar.getMonth(), calendar.getDay()); - homeViewModel.setSelectDate(DateUtil.parseDate(dateStr)); - - // 刷新数据 - refreshDataListByDate(dateStr); - } - }); +// CalendarView homeMainCalendar = fragmentHomeBinding.homeMainCalendar; +// homeMainCalendar.setOnCalendarSelectListener(new CalendarView.OnCalendarSelectListener() { +// @Override +// public void onCalendarOutOfRange(Calendar calendar) { +// Log.d("onCalendarOutOfRange", "" + calendar.getTimeInMillis()); +// } +// +// @Override +// public void onCalendarSelect(Calendar calendar, boolean isClick) { +// Log.d("onCalendarSelect", isClick + "---" + calendar.getTimeInMillis()); +// String dateStr = StrUtil.format("{}-{}-{}", calendar.getYear(), calendar.getMonth(), calendar.getDay()); +// homeViewModel.setSelectDate(DateUtil.parseDate(dateStr)); +// +// // 刷新数据 +// refreshDataListByDate(dateStr); +// } +// }); } private void initRecyleView() { - RecyclerView homeDataZoneRecyclerView = fragmentHomeBinding.homeDataZoneRecyclerView; - homeDataZoneRecyclerView.addItemDecoration(new DividerItemDecoration(this.getActivity(), DividerItemDecoration.VERTICAL)); - DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); - itemAnimator.setAddDuration(1000); - itemAnimator.setRemoveDuration(1000); - homeDataZoneRecyclerView.setItemAnimator(itemAnimator); - - homeRecycleViewAdapter = new HomeRecycleViewAdapter(getActivity(), Collections.emptyList()); - fragmentHomeBinding.homeDataZoneRecyclerView.setAdapter(homeRecycleViewAdapter); - LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); - fragmentHomeBinding.homeDataZoneRecyclerView.setLayoutManager(layoutManager); +// RecyclerView homeDataZoneRecyclerView = fragmentHomeBinding.homeDataZoneRecyclerView; +// homeDataZoneRecyclerView.addItemDecoration(new DividerItemDecoration(this.getActivity(), DividerItemDecoration.VERTICAL)); +// DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); +// itemAnimator.setAddDuration(1000); +// itemAnimator.setRemoveDuration(1000); +// homeDataZoneRecyclerView.setItemAnimator(itemAnimator); +// +// homeRecycleViewAdapter = new HomeRecycleViewAdapter(getActivity(), Collections.emptyList()); +// fragmentHomeBinding.homeDataZoneRecyclerView.setAdapter(homeRecycleViewAdapter); +// LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); +// fragmentHomeBinding.homeDataZoneRecyclerView.setLayoutManager(layoutManager); } private void initCalendarView() { @@ -130,13 +130,13 @@ public class HomeFragment extends Fragment { } private void initTextView() { - TextView homeTitleTextView = fragmentHomeBinding.homeTitleTextView; - homeTitleTextView.setGravity(Gravity.CENTER); - homeViewModel.getTitle().observe(getViewLifecycleOwner(), value -> homeTitleTextView.setText(value)); - homeTitleTextView.setText("未完待续..."); - - homeViewModel.getSelectDate().observe(getViewLifecycleOwner(), value -> homeTitleTextView.setText(DateUtil.formatDate(value))); - homeViewModel.setSelectDate(new Date()); +// TextView homeTitleTextView = fragmentHomeBinding.homeTitleTextView; +// homeTitleTextView.setGravity(Gravity.CENTER); +// homeViewModel.getTitle().observe(getViewLifecycleOwner(), value -> homeTitleTextView.setText(value)); +// homeTitleTextView.setText("未完待续..."); +// +// homeViewModel.getSelectDate().observe(getViewLifecycleOwner(), value -> homeTitleTextView.setText(DateUtil.formatDate(value))); +// homeViewModel.setSelectDate(new Date()); } @Override @@ -166,12 +166,12 @@ public class HomeFragment extends Fragment { @Override public void onNext(List checkRecords) { Log.d("onNext", "查询到 " + date + " 数据 " + checkRecords.size()); - RecyclerView recyclerView = fragmentHomeBinding.homeDataZoneRecyclerView; - int childCount = recyclerView.getChildCount(); - if (childCount > 0) { - recyclerView.removeAllViews(); - } - homeRecycleViewAdapter.resetRecordList(checkRecords); +// RecyclerView recyclerView = fragmentHomeBinding.homeDataZoneRecyclerView; +// int childCount = recyclerView.getChildCount(); +// if (childCount > 0) { +// recyclerView.removeAllViews(); +// } +// homeRecycleViewAdapter.resetRecordList(checkRecords); } @Override diff --git a/app/src/main/res/drawable-v21/bg_material.xml b/app/src/main/res/drawable-v21/bg_material.xml new file mode 100644 index 0000000..f324ec8 --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_material.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/app/src/main/res/drawable-v21/bg_ripple.xml b/app/src/main/res/drawable-v21/bg_ripple.xml new file mode 100644 index 0000000..4dd3b12 --- /dev/null +++ b/app/src/main/res/drawable-v21/bg_ripple.xml @@ -0,0 +1,3 @@ + + diff --git a/app/src/main/res/drawable/bg_material.xml b/app/src/main/res/drawable/bg_material.xml new file mode 100644 index 0000000..20fd151 --- /dev/null +++ b/app/src/main/res/drawable/bg_material.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_ripple.xml b/app/src/main/res/drawable/bg_ripple.xml new file mode 100644 index 0000000..4dd3b12 --- /dev/null +++ b/app/src/main/res/drawable/bg_ripple.xml @@ -0,0 +1,3 @@ + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 2fdfba6..99ad7ef 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,50 +1,146 @@ - + android:background="#ffffff" + android:fitsSystemWindows="true" + android:orientation="vertical" + tools:context=".ui.main.home.HomeFragment" + tools:ignore="RtlHardcoded,HardcodedText,RtlSymmetry,SmallSp"> - - - + - + + + + + + - + - - + + + + + + + android:layout_height="match_parent" + android:background="#fff" + android:orientation="vertical" + app:calendar_content_view_id="@+id/recyclerView"> + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_calendar.png b/app/src/main/res/mipmap-xxxhdpi/ic_calendar.png new file mode 100644 index 0000000..48e7ea1 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_calendar.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_clear.png b/app/src/main/res/mipmap-xxxhdpi/ic_clear.png new file mode 100644 index 0000000..e8018ee Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_clear.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_colorful_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_colorful_logo.png new file mode 100644 index 0000000..d314515 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_colorful_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_custom.png b/app/src/main/res/mipmap-xxxhdpi/ic_custom.png new file mode 100644 index 0000000..3aeaff1 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_custom.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_flyme_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_flyme_logo.png new file mode 100644 index 0000000..607ddb9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_flyme_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_full.png b/app/src/main/res/mipmap-xxxhdpi/ic_full.png new file mode 100644 index 0000000..d1429ca Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_full.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_func.png b/app/src/main/res/mipmap-xxxhdpi/ic_func.png new file mode 100644 index 0000000..be9e1a2 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_func.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_increase.png b/app/src/main/res/mipmap-xxxhdpi/ic_increase.png new file mode 100644 index 0000000..b32033c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_increase.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_index_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_index_logo.png new file mode 100644 index 0000000..fb59323 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_index_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_more.png b/app/src/main/res/mipmap-xxxhdpi/ic_more.png new file mode 100644 index 0000000..86b138e Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_more.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_multi.png b/app/src/main/res/mipmap-xxxhdpi/ic_multi.png new file mode 100644 index 0000000..1bfb6d4 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_multi.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_progress.png b/app/src/main/res/mipmap-xxxhdpi/ic_progress.png new file mode 100644 index 0000000..7ce931d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_progress.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_range.png b/app/src/main/res/mipmap-xxxhdpi/ic_range.png new file mode 100644 index 0000000..f018e34 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_range.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_reduce.png b/app/src/main/res/mipmap-xxxhdpi/ic_reduce.png new file mode 100644 index 0000000..134c36b Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_reduce.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_simple_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_simple_logo.png new file mode 100644 index 0000000..64b2efb Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_simple_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_single.png b/app/src/main/res/mipmap-xxxhdpi/ic_single.png new file mode 100644 index 0000000..bf21dc6 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_single.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_solar_system.png b/app/src/main/res/mipmap-xxxhdpi/ic_solar_system.png new file mode 100644 index 0000000..cf612c2 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_solar_system.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_sun.png b/app/src/main/res/mipmap-xxxhdpi/ic_sun.png new file mode 100644 index 0000000..efb1e1a Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_sun.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_tab_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_tab_logo.png new file mode 100644 index 0000000..75c819a Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_tab_logo.png differ diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..79e2101 --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..1e3086a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,4 +7,12 @@ #FF018786 #FF000000 #FFFFFFFF + + #ffffff + #ffffff + #ffffff + + #e7e7e7 + #f2f2f2 + #009988 \ No newline at end of file