fragments, String[] titles) {
+ super(fm);
+ this.fragments = fragments;
+ this.titles = titles;
+ }
+
+ @Override
+ public int getCount() {
+ return fragments.size();
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return titles[position];
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return fragments.get(position);
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ // 覆写destroyItem并且空实现,这样每个Fragment中的视图就不会被销毁
+ // super.destroyItem(container, position, object);
+ }
+
+ @Override
+ public int getItemPosition(Object object) {
+ return PagerAdapter.POSITION_NONE;
+ }
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("instanceState", super.onSaveInstanceState());
+ bundle.putInt("mCurrentTab", mCurrentTab);
+ return bundle;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (state instanceof Bundle) {
+ Bundle bundle = (Bundle) state;
+ mCurrentTab = bundle.getInt("mCurrentTab");
+ state = bundle.getParcelable("instanceState");
+ if (mCurrentTab != 0 && mTabsContainer.getChildCount() > 0) {
+ updateTabSelection(mCurrentTab);
+ scrollToCurrentTab();
+ }
+ }
+ super.onRestoreInstanceState(state);
+ }
+
+ protected int dp2px(float dp) {
+ final float scale = mContext.getResources().getDisplayMetrics().density;
+ return (int) (dp * scale + 0.5f);
+ }
+
+ protected int sp2px(float sp) {
+ final float scale = this.mContext.getResources().getDisplayMetrics().scaledDensity;
+ return (int) (sp * scale + 0.5f);
+ }
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/CustomTabEntity.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/CustomTabEntity.java
new file mode 100644
index 0000000..ee39fe7
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/CustomTabEntity.java
@@ -0,0 +1,13 @@
+package com.flyco.tablayout.listener;
+
+import androidx.annotation.DrawableRes;
+
+public interface CustomTabEntity {
+ String getTabTitle();
+
+ @DrawableRes
+ int getTabSelectedIcon();
+
+ @DrawableRes
+ int getTabUnselectedIcon();
+}
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/OnTabSelectListener.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/OnTabSelectListener.java
new file mode 100644
index 0000000..edf6cdb
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/listener/OnTabSelectListener.java
@@ -0,0 +1,6 @@
+package com.flyco.tablayout.listener;
+
+public interface OnTabSelectListener {
+ void onTabSelect(int position);
+ void onTabReselect(int position);
+}
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ExtendTransformer.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ExtendTransformer.java
new file mode 100644
index 0000000..ce40c95
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ExtendTransformer.java
@@ -0,0 +1,52 @@
+package com.flyco.tablayout.transformer;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager.widget.ViewPager;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by li.zhipeng on 2019/1/3.
+ *
+ * tab切换的
+ */
+public class ExtendTransformer implements ViewPager.PageTransformer {
+
+ private ArrayList transformers = new ArrayList<>();
+
+
+ public ExtendTransformer() {
+ }
+
+ public void addViewPagerTransformer(IViewPagerTransformer transformer) {
+ if (!transformers.contains(transformer)) {
+ transformers.add(transformer);
+ }
+ }
+
+ public void removeViewPagerTransformer(IViewPagerTransformer transformer) {
+ transformers.remove(transformer);
+ }
+
+ public List getTransformers() {
+ return transformers;
+ }
+
+ public void setTransformers(List transformers) {
+ this.transformers.addAll(transformers);
+ }
+
+ @Override
+ public void transformPage(@NonNull View view, final float position) {
+ // 回调设置的页面切换效果设置
+ if (transformers != null && transformers.size() > 0) {
+ for (IViewPagerTransformer transformer : transformers) {
+ transformer.transformPage(view, position);
+ }
+ }
+ }
+
+
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ITabScaleTransformer.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ITabScaleTransformer.java
new file mode 100644
index 0000000..5a989a9
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/ITabScaleTransformer.java
@@ -0,0 +1,6 @@
+package com.flyco.tablayout.transformer;
+
+public interface ITabScaleTransformer {
+ void setNormalWidth(int position, int width, boolean isSelect);
+ void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/IViewPagerTransformer.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/IViewPagerTransformer.java
new file mode 100644
index 0000000..93235a5
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/IViewPagerTransformer.java
@@ -0,0 +1,12 @@
+package com.flyco.tablayout.transformer;
+
+import androidx.viewpager.widget.ViewPager;
+
+/**
+ * Created by li.zhipeng on 2019/1/3.
+ *
+ * ViewPager的扩展Transformer,配合SlidingScaleTabLayout使用
+ * 因为字体的切换效果设置了默认的Transformer,所以扩展此接口
+ */
+public interface IViewPagerTransformer extends ViewPager.PageTransformer {
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/TabScaleTransformer.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/TabScaleTransformer.java
new file mode 100644
index 0000000..5757d64
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/transformer/TabScaleTransformer.java
@@ -0,0 +1,110 @@
+package com.flyco.tablayout.transformer;
+
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.flyco.tablayout.SlidingScaleTabLayout;
+
+/**
+ * Created by li.zhipeng on 2019/1/3.
+ *
+ * tab切换的
+ */
+public class TabScaleTransformer implements ITabScaleTransformer {
+
+ private SlidingScaleTabLayout slidingScaleTabLayout;
+
+ private float textSelectSize;
+
+ private float textUnSelectSize;
+
+// private float maxScale;
+
+ private boolean openDmg;
+
+ public TabScaleTransformer(SlidingScaleTabLayout slidingScaleTabLayout,
+ float textSelectSize, float textUnSelectSize, boolean openDmg) {
+ this.slidingScaleTabLayout = slidingScaleTabLayout;
+ this.textSelectSize = textSelectSize;
+ this.textUnSelectSize = textUnSelectSize;
+// this.maxScale = (textSelectSize / textUnSelectSize) - 1;
+ this.openDmg = openDmg;
+ }
+
+ @Override
+ public void setNormalWidth(int position, int width, boolean isSelect) {
+ }
+
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ Log.i("TabScaleTransformer", "position:" + position);
+ // 字体大小相同,不需要切换
+ if (textSelectSize == textUnSelectSize) return;
+ if (openDmg) {
+ for (int i = 0; i < slidingScaleTabLayout.getTabCount(); i++) {
+ if (i != position && i != position + 1) {
+ changTabDmgWidth(i, 0);
+ }
+ }
+ changeDmgSize(position, positionOffset);
+ } else {
+ for (int i = 0; i < slidingScaleTabLayout.getTabCount(); i++) {
+ if (i != position && i != position + 1) {
+ updateTextSize(i, 1);
+ }
+ }
+ changeTextSize(position, positionOffset);
+ }
+ }
+
+ private void changeTextSize(final int position, final float positionOffset) {
+ updateTextSize(position, positionOffset);
+ if (position + 1 < slidingScaleTabLayout.getTabCount()) {
+ updateTextSize(position + 1, 1 - positionOffset);
+ }
+ }
+
+ private void updateTextSize(final int position, final float positionOffset) {
+ final TextView currentTab = slidingScaleTabLayout.getTitle(position);
+ // 必须要在View调用post更新样式,否则可能无效
+ currentTab.post(new Runnable() {
+ @Override
+ public void run() {
+ int textSize = (int) (textSelectSize - Math.abs((textSelectSize - textUnSelectSize) * positionOffset));
+ if (currentTab.getTextSize() != textSize) {
+ currentTab.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+ currentTab.requestLayout();
+ }
+ }
+ });
+ }
+
+ private void changeDmgSize(final int position, final float positionOffset) {
+ slidingScaleTabLayout.post(new Runnable() {
+ @Override
+ public void run() {
+// Log.i("lzp", "position:" + position + " positionOffset:" + positionOffset);
+ float scale = 1 - positionOffset;
+ changTabDmgWidth(position, scale);
+ if (position + 1 < slidingScaleTabLayout.getTabCount()) {
+ changTabDmgWidth(position + 1, positionOffset);
+ }
+ }
+ });
+ }
+
+ private void changTabDmgWidth(int position, float scale) {
+ final ImageView currentTabDmg = slidingScaleTabLayout.getDmgView(position);
+ if (currentTabDmg == null) return;
+ if (currentTabDmg.getDrawable() == null) return;
+ ViewGroup.LayoutParams params = currentTabDmg.getLayoutParams();
+ int width = (int) (currentTabDmg.getMinimumWidth() + (currentTabDmg.getMaxWidth() - currentTabDmg.getMinimumWidth()) * scale);
+ if (params.width != width) {
+ params.width = width;
+ currentTabDmg.setLayoutParams(params);
+ }
+// Log.i("lzp", "position:" + position + " scale:" + scale + " width:" + params.width);
+ }
+}
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/FragmentChangeManager.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/FragmentChangeManager.java
new file mode 100644
index 0000000..f47b315
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/FragmentChangeManager.java
@@ -0,0 +1,55 @@
+package com.flyco.tablayout.utils;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import java.util.ArrayList;
+
+public class FragmentChangeManager {
+ private FragmentManager mFragmentManager;
+ private int mContainerViewId;
+ /** Fragment切换数组 */
+ private ArrayList mFragments;
+ /** 当前选中的Tab */
+ private int mCurrentTab;
+
+ public FragmentChangeManager(FragmentManager fm, int containerViewId, ArrayList fragments) {
+ this.mFragmentManager = fm;
+ this.mContainerViewId = containerViewId;
+ this.mFragments = fragments;
+ initFragments();
+ }
+
+ /** 初始化fragments */
+ private void initFragments() {
+ for (Fragment fragment : mFragments) {
+ mFragmentManager.beginTransaction().add(mContainerViewId, fragment).hide(fragment).commit();
+ }
+
+ setFragments(0);
+ }
+
+ /** 界面切换控制 */
+ public void setFragments(int index) {
+ for (int i = 0; i < mFragments.size(); i++) {
+ FragmentTransaction ft = mFragmentManager.beginTransaction();
+ Fragment fragment = mFragments.get(i);
+ if (i == index) {
+ ft.show(fragment);
+ } else {
+ ft.hide(fragment);
+ }
+ ft.commit();
+ }
+ mCurrentTab = index;
+ }
+
+ public int getCurrentTab() {
+ return mCurrentTab;
+ }
+
+ public Fragment getCurrentFragment() {
+ return mFragments.get(mCurrentTab);
+ }
+}
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/UnreadMsgUtils.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/UnreadMsgUtils.java
new file mode 100644
index 0000000..0446bfa
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/UnreadMsgUtils.java
@@ -0,0 +1,58 @@
+package com.flyco.tablayout.utils;
+
+
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+import com.flyco.tablayout.widget.MsgView;
+
+/**
+ * 未读消息提示View,显示小红点或者带有数字的红点:
+ * 数字一位,圆
+ * 数字两位,圆角矩形,圆角是高度的一半
+ * 数字超过两位,显示99+
+ */
+public class UnreadMsgUtils {
+ public static void show(MsgView msgView, int num) {
+ if (msgView == null) {
+ return;
+ }
+ RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) msgView.getLayoutParams();
+ DisplayMetrics dm = msgView.getResources().getDisplayMetrics();
+ msgView.setVisibility(View.VISIBLE);
+ if (num <= 0) {//圆点,设置默认宽高
+ msgView.setStrokeWidth(0);
+ msgView.setText("");
+
+ lp.width = (int) (5 * dm.density);
+ lp.height = (int) (5 * dm.density);
+ msgView.setLayoutParams(lp);
+ } else {
+ lp.height = (int) (18 * dm.density);
+ if (num < 10) {//圆
+ lp.width = (int) (18 * dm.density);
+ msgView.setText(num + "");
+ } else if (num < 100) {//圆角矩形,圆角是高度的一半,设置默认padding
+ lp.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
+ msgView.setPadding((int) (6 * dm.density), 0, (int) (6 * dm.density), 0);
+ msgView.setText(num + "");
+ } else {//数字超过两位,显示99+
+ lp.width = RelativeLayout.LayoutParams.WRAP_CONTENT;
+ msgView.setPadding((int) (6 * dm.density), 0, (int) (6 * dm.density), 0);
+ msgView.setText("99+");
+ }
+ msgView.setLayoutParams(lp);
+ }
+ }
+
+ public static void setSize(MsgView rtv, int size) {
+ if (rtv == null) {
+ return;
+ }
+ RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) rtv.getLayoutParams();
+ lp.width = size;
+ lp.height = size;
+ rtv.setLayoutParams(lp);
+ }
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/ViewUtils.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/ViewUtils.java
new file mode 100644
index 0000000..2f54c6b
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/utils/ViewUtils.java
@@ -0,0 +1,39 @@
+package com.flyco.tablayout.utils;
+
+import android.graphics.Bitmap;
+import androidx.annotation.IdRes;
+import android.view.View;
+
+public class ViewUtils {
+
+ public static Bitmap generateViewCacheBitmap(View view) {
+ view.destroyDrawingCache();
+ int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+ int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+ view.measure(widthMeasureSpec, heightMeasureSpec);
+ int width = view.getMeasuredWidth();
+ int height = view.getMeasuredHeight();
+ view.layout(0, 0, width, height);
+ view.setDrawingCacheEnabled(true);
+ view.buildDrawingCache();
+ return Bitmap.createBitmap(view.getDrawingCache());
+ }
+
+ public static View findBrotherView(View view, @IdRes int id, int level) {
+ int count = 0;
+ View temp = view;
+ while (count < level) {
+ View target = temp.findViewById(id);
+ if (target != null) {
+ return target;
+ }
+ count += 1;
+ if (temp.getParent() instanceof View) {
+ temp = (View) temp.getParent();
+ } else {
+ break;
+ }
+ }
+ return null;
+ }
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/widget/MsgView.java b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/widget/MsgView.java
new file mode 100644
index 0000000..59dd2b6
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/java/com/flyco/tablayout/widget/MsgView.java
@@ -0,0 +1,157 @@
+package com.flyco.tablayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.StateListDrawable;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import com.flyco.tablayout.R;
+
+/** 用于需要圆角矩形框背景的TextView的情况,减少直接使用TextView时引入的shape资源文件 */
+public class MsgView extends TextView {
+ private Context context;
+ private GradientDrawable gd_background = new GradientDrawable();
+ private int backgroundColor;
+ private int cornerRadius;
+ private int strokeWidth;
+ private int strokeColor;
+ private boolean isRadiusHalfHeight;
+ private boolean isWidthHeightEqual;
+
+ public MsgView(Context context) {
+ this(context, null);
+ }
+
+ public MsgView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public MsgView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ this.context = context;
+ obtainAttributes(context, attrs);
+ }
+
+ private void obtainAttributes(Context context, AttributeSet attrs) {
+ TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MsgView);
+ backgroundColor = ta.getColor(R.styleable.MsgView_mv_backgroundColor, Color.TRANSPARENT);
+ cornerRadius = ta.getDimensionPixelSize(R.styleable.MsgView_mv_cornerRadius, 0);
+ strokeWidth = ta.getDimensionPixelSize(R.styleable.MsgView_mv_strokeWidth, 0);
+ strokeColor = ta.getColor(R.styleable.MsgView_mv_strokeColor, Color.TRANSPARENT);
+ isRadiusHalfHeight = ta.getBoolean(R.styleable.MsgView_mv_isRadiusHalfHeight, false);
+ isWidthHeightEqual = ta.getBoolean(R.styleable.MsgView_mv_isWidthHeightEqual, false);
+
+ ta.recycle();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (isWidthHeightEqual() && getWidth() > 0 && getHeight() > 0) {
+ int max = Math.max(getWidth(), getHeight());
+ int measureSpec = MeasureSpec.makeMeasureSpec(max, MeasureSpec.EXACTLY);
+ super.onMeasure(measureSpec, measureSpec);
+ return;
+ }
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ if (isRadiusHalfHeight()) {
+ setCornerRadius(getHeight() / 2);
+ } else {
+ setBgSelector();
+ }
+ }
+
+
+ public void setBackgroundColor(int backgroundColor) {
+ this.backgroundColor = backgroundColor;
+ setBgSelector();
+ }
+
+ public void setCornerRadius(int cornerRadius) {
+ this.cornerRadius = dp2px(cornerRadius);
+ setBgSelector();
+ }
+
+ public void setStrokeWidth(int strokeWidth) {
+ this.strokeWidth = dp2px(strokeWidth);
+ setBgSelector();
+ }
+
+ public void setStrokeColor(int strokeColor) {
+ this.strokeColor = strokeColor;
+ setBgSelector();
+ }
+
+ public void setIsRadiusHalfHeight(boolean isRadiusHalfHeight) {
+ this.isRadiusHalfHeight = isRadiusHalfHeight;
+ setBgSelector();
+ }
+
+ public void setIsWidthHeightEqual(boolean isWidthHeightEqual) {
+ this.isWidthHeightEqual = isWidthHeightEqual;
+ setBgSelector();
+ }
+
+ public int getBackgroundColor() {
+ return backgroundColor;
+ }
+
+ public int getCornerRadius() {
+ return cornerRadius;
+ }
+
+ public int getStrokeWidth() {
+ return strokeWidth;
+ }
+
+ public int getStrokeColor() {
+ return strokeColor;
+ }
+
+ public boolean isRadiusHalfHeight() {
+ return isRadiusHalfHeight;
+ }
+
+ public boolean isWidthHeightEqual() {
+ return isWidthHeightEqual;
+ }
+
+ protected int dp2px(float dp) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dp * scale + 0.5f);
+ }
+
+ protected int sp2px(float sp) {
+ final float scale = this.context.getResources().getDisplayMetrics().scaledDensity;
+ return (int) (sp * scale + 0.5f);
+ }
+
+ private void setDrawable(GradientDrawable gd, int color, int strokeColor) {
+ gd.setColor(color);
+ gd.setCornerRadius(cornerRadius);
+ gd.setStroke(strokeWidth, strokeColor);
+ }
+
+ public void setBgSelector() {
+ StateListDrawable bg = new StateListDrawable();
+
+ setDrawable(gd_background, backgroundColor, strokeColor);
+ bg.addState(new int[]{-android.R.attr.state_pressed}, gd_background);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {//16
+ setBackground(bg);
+ } else {
+ //noinspection deprecation
+ setBackgroundDrawable(bg);
+ }
+ }
+}
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_scale_tab.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_scale_tab.xml
new file mode 100644
index 0000000..1533d51
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_scale_tab.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab.xml
new file mode 100644
index 0000000..9a46415
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_bottom.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_bottom.xml
new file mode 100644
index 0000000..229e640
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_bottom.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_left.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_left.xml
new file mode 100644
index 0000000..dd9c729
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_left.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_right.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_right.xml
new file mode 100644
index 0000000..0d65d85
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_right.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_segment.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_segment.xml
new file mode 100644
index 0000000..6d36a01
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_segment.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_top.xml b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_top.xml
new file mode 100644
index 0000000..68478b6
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/layout/layout_tab_top.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlycoTabLayoutZ_Lib/src/main/res/values/attrs.xml b/FlycoTabLayoutZ_Lib/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..324c0ca
--- /dev/null
+++ b/FlycoTabLayoutZ_Lib/src/main/res/values/attrs.xml
@@ -0,0 +1,319 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 4002cee..f7ad324 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,8 +16,8 @@ android {
applicationId "com.uiui.zyos"
minSdkVersion 24
targetSdkVersion 29
- versionCode 2
- versionName "1.1"
+ versionCode 3
+ versionName "1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -106,6 +106,7 @@ dependencies {
// implementation fileTree(dir: 'libs', include: ['*.jar'])
compileOnly files('libs/framework.jar')
implementation project(path: ':niceimageview')
+ implementation project(path: ':FlycoTabLayoutZ_Lib')
//保持1.3.1 更新会报错
implementation 'androidx.appcompat:appcompat:1.3.1'
@@ -118,6 +119,7 @@ dependencies {
// Java language implementation
implementation "androidx.fragment:fragment:1.4.1"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
@@ -163,13 +165,15 @@ dependencies {
//指示器
implementation 'com.github.hackware1993:MagicIndicator:1.7.0' // for androidx
// implementation 'io.github.h07000223:flycoTabLayout:3.0.0'
- implementation 'com.github.liyujiang-gzu:FlycoTabLayout:781b8829a7'
+// implementation 'com.github.liyujiang-gzu:FlycoTabLayout:781b8829a7'
implementation 'com.king.view:circleprogressview:1.1.2'
//工具类
implementation 'com.blankj:utilcodex:1.31.0'
//aria
implementation 'com.arialyy.aria:core:3.8.15'
annotationProcessor 'com.arialyy.aria:compiler:3.8.15'
+ //动态权限框架
+ implementation 'com.github.getActivity:XXPermissions:16.6'
//videoplayer
implementation 'cn.jzvd:jiaozivideoplayer:7.7.0'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-core:1.0.16'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e4694dc..0316179 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -63,11 +63,6 @@
android:restoreAnyVersion="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
-
-
-
-
-
-
-
-
-
-
+ android:theme="@style/activity_styles" />
+
oldData = AlarmUtils.getInstance().getOldData();
+ alarmClockData = oldData.get(code);
+ if (alarmClockData == null) {
+ finish();
+ }
+ Log.e(TAG, "onCreate: " + alarmClockData);
+ showData(alarmClockData);
+ }
+
+ }
+
+ private void showData(AlarmClockData alarmClockData) {
+ audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_PLAY_SOUND);
+ tv_title.setText(alarmClockData.getTitle());
+ bt_ok.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ HashMap oldData = AlarmUtils.getInstance().getOldData();
+ AlarmClockData alarm = oldData.get(code);
+ if (alarm != null) {
+ alarm.setFinished(true);
+ AlarmUtils.getInstance().updateAlarmFinished(alarm);
+ }
+ NetInterfaceManager.getInstance()
+ .getUpdateAlarmObservable(alarmClockData.getId())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("showData", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("showData", "onNext: " + baseResponse);
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("showData", "onError: " + e.getMessage());
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("showData", "onComplete: ");
+ finish();
+ }
+ });
+
+ }
+ });
+ String voiceUrl = alarmClockData.getVoice();
+ String voicemd5 = alarmClockData.getVoice_md5();
+ String filePath = alarmClockData.getFile();
+
+ if (!TextUtils.isEmpty(voiceUrl)) {
+ cl_voice.setVisibility(View.VISIBLE);
+ String fileName = Utils.getFileNamefromURL(voiceUrl);
+ File file = new File(Utils.getDownLoadPath(NoticeActivity.this) + fileName);
+ String fileMD5 = FileUtils.getFileMD5ToString(file);
+// if (!md5.equals(fileMD5)) {
+// // TODO: 2021/12/16
+// } else {
+ mediaPlayer = new MediaPlayer();
+ try {
+ // 切歌之前先重置,释放掉之前的资源
+ mediaPlayer.reset();
+ FileInputStream fis = new FileInputStream(file);
+ mediaPlayer.setDataSource(fis.getFD());
+ // 设置播放源
+// mediaPlayer.setDataSource(file.getAbsolutePath());
+ // 开始播放前的准备工作,加载多媒体资源,获取相关信息
+ mediaPlayer.prepare();
+ // 开始播放
+ mediaPlayer.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ Log.e(TAG, "showData: " + e.getMessage());
+ }
+// }
+ } else {
+ cl_voice.setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(filePath)) {
+ cl_vp.setVisibility(View.VISIBLE);
+ String fileType = FileUtil.getFileType(filePath);
+ Log.e(TAG, "showData: " + fileType);
+ if (FileUtil.isPictureFile(fileType)) {
+ jz_video.setVisibility(View.GONE);
+ imageView.setVisibility(View.VISIBLE);
+ RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(this, 16F)));
+ Glide.with(NoticeActivity.this).load(filePath).apply(options).into(imageView);
+ } else if (FileUtil.isVideoFile(fileType)) {
+ jz_video.setVisibility(View.VISIBLE);
+ imageView.setVisibility(View.GONE);
+ String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ String realPath = Utils.getDownLoadPath(NoticeActivity.this) + fileName;
+ File file = new File(realPath);
+ JZDataSource jzDataSource;
+ if (!file.exists()) {
+ jzDataSource = new JZDataSource(filePath, "");
+ Log.e(TAG, "showData: not exists");
+ } else {
+ Log.e(TAG, "showData: exists " + file);
+ URI uri = file.toURI();
+ jzDataSource = new JZDataSource(uri.toString(), "");
+ }
+ jzDataSource.looping = true;
+ jz_video.setUp(jzDataSource, Jzvd.SCREEN_NORMAL);
+ jz_video.startPreloading();
+ jz_video.startVideoAfterPreloading();
+ jz_video.startVideo();
+ }
+ } else {
+ cl_vp.setVisibility(View.GONE);
+ }
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mediaPlayer != null) {
+ if (mediaPlayer.isPlaying()) {
+ mediaPlayer.stop();
+ }
+ mediaPlayer.release();
+ mediaPlayer = null;
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (Jzvd.backPress()) {
+ return;
+ }
+ super.onBackPressed();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ Jzvd.releaseAllVideos();
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/activity/main/MainAPresenter.java b/app/src/main/java/com/uiui/zyos/activity/main/MainAPresenter.java
index 5ddda4a..79a2b64 100644
--- a/app/src/main/java/com/uiui/zyos/activity/main/MainAPresenter.java
+++ b/app/src/main/java/com/uiui/zyos/activity/main/MainAPresenter.java
@@ -1,10 +1,23 @@
package com.uiui.zyos.activity.main;
import android.content.Context;
+import android.text.TextUtils;
import android.util.Log;
+import com.google.gson.JsonObject;
+import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.uiui.zyos.BuildConfig;
+import com.uiui.zyos.bean.BaseResponse;
+import com.uiui.zyos.manager.RemoteManager;
+import com.uiui.zyos.network.NetInterfaceManager;
+import com.uiui.zyos.utils.ApkUtils;
+import com.uiui.zyos.utils.AppUsedTimeUtils;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public class MainAPresenter implements MainContact.Presenter {
@@ -36,4 +49,71 @@ public class MainAPresenter implements MainContact.Presenter {
public void detachView() {
this.mView = null;
}
+
+ @Override
+ public void sendAPPUsage() {
+ AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis());
+ String packagename = AppUsedTimeUtils.getInstance().getAppPackageName();
+ Log.e(TAG, "onRestart packagename == " + packagename);
+ if (!TextUtils.isEmpty(packagename)) {
+ Log.e(TAG, "onRestart: " + ApkUtils.getAppNameByPackage(mContext, packagename));
+ Log.e(TAG, "onRestart: " + packagename);
+ NetInterfaceManager.getInstance()
+ .getAppUsageRecordControl()
+ .sendappUsageRecord(RemoteManager.getInstance().getSerial(),
+ ApkUtils.getAppNameByPackage(mContext, packagename),
+ packagename,
+ AppUsedTimeUtils.getInstance().getStartTime() / 1000,
+ AppUsedTimeUtils.getInstance().getEndTime() / 1000)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.e("sendAPPUsage", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(BaseResponse baseResponse) {
+ Log.e("sendAPPUsage", "onNext: " + baseResponse);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Log.e("sendAPPUsage", "onError: " + e.getMessage());
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("sendAPPUsage", "onComplete: ");
+ mView.sendAPPUsageFinish();
+ }
+ });
+ } else {
+ Log.e("onRestart", "app = null" + packagename);
+ mView.sendAPPUsageFinish();
+ }
+ }
+
+ @Override
+ public void sendRunningInfo() {
+ AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID);
+ AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis());
+ long time = AppUsedTimeUtils.getInstance().getStartTime();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("app_package", BuildConfig.APPLICATION_ID);
+ jsonObject.addProperty("version_name", ApkUtils.getAPPVersionName(mContext, BuildConfig.APPLICATION_ID));
+ jsonObject.addProperty("start_time", time / 1000);
+ String jsonString = jsonObject.toString();
+ Log.e(TAG, "sendRunningInfo: " + jsonString);
+ AppUsedTimeUtils.getInstance().sendRunningApp(new AppUsedTimeUtils.RunningAppCallback() {
+ @Override
+ public void onComplete() {
+ mView.sendRunningInfoFinish();
+ }
+ });
+ }
+
}
diff --git a/app/src/main/java/com/uiui/zyos/activity/main/MainActivity.java b/app/src/main/java/com/uiui/zyos/activity/main/MainActivity.java
index bb5ac6b..1b631c4 100644
--- a/app/src/main/java/com/uiui/zyos/activity/main/MainActivity.java
+++ b/app/src/main/java/com/uiui/zyos/activity/main/MainActivity.java
@@ -8,27 +8,43 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
+import android.graphics.Color;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.TranslateAnimation;
import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
+import com.hjq.permissions.OnPermissionCallback;
+import com.hjq.permissions.Permission;
+import com.hjq.permissions.XXPermissions;
import com.tencent.mmkv.MMKV;
import com.uiui.zyos.R;
import com.uiui.zyos.base.BaseActivity;
-import com.uiui.zyos.base.BaseFragmentPagerAdapter;
+import com.uiui.zyos.base.viewpager.BaseFragmentPagerAdapter;
+import com.uiui.zyos.config.CommonConfig;
import com.uiui.zyos.dialog.PrivacyPolicyDialog;
import com.uiui.zyos.fragment.main.MainFragment;
+import com.uiui.zyos.fragment.subject.SubjectFragment;
import com.uiui.zyos.fragment.user.UserFragment;
+import com.uiui.zyos.jxw.JxwPackageConfig;
+import com.uiui.zyos.manager.RemoteManager;
import com.uiui.zyos.service.NotificationService;
import com.uiui.zyos.utils.HomeWatcher;
+import com.uiui.zyos.utils.OpenApkUtils;
import com.uiui.zyos.utils.ToastUtil;
+import com.uiui.zyos.view.ScaleCircleNavigator;
+
+import net.lucode.hackware.magicindicator.MagicIndicator;
import java.util.ArrayList;
import java.util.List;
@@ -36,25 +52,49 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
-public class MainActivity extends BaseActivity implements MainContact.MainView {
+public class MainActivity extends BaseActivity implements MainContact.MainView, RemoteManager.ConnectedListener {
private static final String TAG = MainActivity.class.getSimpleName();
+
@BindView(R.id.viewPager)
ViewPager mViewPager;
+ @BindView(R.id.magicIndicator)
+ MagicIndicator mMagicIndicator;
- private MMKV mMMKV = MMKV.defaultMMKV();
+ @BindView(R.id.cl_0)
+ ConstraintLayout cl_0;
+ @BindView(R.id.cl_1)
+ ConstraintLayout cl_1;
+ @BindView(R.id.cl_2)
+ ConstraintLayout cl_2;
+ @BindView(R.id.cl_3)
+ ConstraintLayout cl_3;
+ @BindView(R.id.cl_4)
+ ConstraintLayout cl_4;
+ @BindView(R.id.cl_5)
+ ConstraintLayout cl_5;
+ @BindView(R.id.cl_6)
+ ConstraintLayout cl_6;
+ @BindView(R.id.cl_7)
+ ConstraintLayout cl_7;
- private MainAPresenter mMainAPresenter;
+
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+
+ private MainAPresenter mPresenter;
private HomeWatcher mHomeWatcher;
+ private ScaleCircleNavigator scaleCircleNavigator;
+
private FragmentManager mFragmentManager;
- // private FragmentTransaction mFragmentTransaction;
private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter;
+
private List mFragments;
-
+ private MainFragment mMainFragment;
+ private UserFragment mUserFragment;
+ private SubjectFragment mSubjectFragment;
private int defaultCurrent = 1;
-
@Override
public int getLayoutId() {
return R.layout.activity_main;
@@ -63,33 +103,146 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
@Override
public void initView() {
ButterKnife.bind(this);
- toggleNotificationListenerService(this);
- mMainAPresenter = new MainAPresenter(this);
- mMainAPresenter.attachView(this);
- mMainAPresenter.setLifecycle(lifecycleSubject);
+// toggleNotificationListenerService(this);
+ mPresenter = new MainAPresenter(this);
+ mPresenter.attachView(this);
+ mPresenter.setLifecycle(lifecycleSubject);
+ RemoteManager.setListener(this);
mFragmentManager = getSupportFragmentManager();
-// mFragmentTransaction = mFragmentManager.beginTransaction();
mFragments = new ArrayList<>();
+ mUserFragment =new UserFragment();
+ mSubjectFragment = new SubjectFragment();
+ mFragments.add(mUserFragment);
+ mFragments.add(mSubjectFragment);
mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments);
-// fragmentTransaction.add(R.id.viewPager, appListFragment);
-// fragmentTransaction.commit();
- mFragments.add(new UserFragment());
- mFragments.add(new MainFragment());
+
mViewPager.setAdapter(mBaseFragmentPagerAdapter);
- mViewPager.setOffscreenPageLimit(1);
+ mViewPager.setOffscreenPageLimit(2);
mViewPager.setCurrentItem(defaultCurrent);
+
+ scaleCircleNavigator = new ScaleCircleNavigator(this);
+ scaleCircleNavigator.setCircleCount(1 + mSubjectFragment.getFragmentSize());
+ scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY);
+ scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY);
+ scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() {
+ @Override
+ public void onClick(int index) {
+
+ }
+ });
+
+ mMagicIndicator.setNavigator(scaleCircleNavigator);
+// ViewPagerHelper.bind(mMagicIndicator, mViewPager);
+ mSubjectFragment.setPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ mMagicIndicator.onPageScrolled(position + 1, positionOffset, positionOffsetPixels);
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ mMagicIndicator.onPageSelected(position + 1);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ mMagicIndicator.onPageScrollStateChanged(state + 1);
+ }
+ });
+ mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+// Log.e(TAG, "onPageScrolled: position = " + position + " positionOffset = " + positionOffset + " positionOffsetPixels = " + positionOffsetPixels);
+ if (position <= 1) {
+ mMagicIndicator.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ Log.e(TAG, "onPageSelected: position = " + position);
+ if (position <= 1) {
+ mMagicIndicator.onPageSelected(position);
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ Log.e(TAG, "onPageSelected: state = " + state);
+ if (state <= 1) {
+ mMagicIndicator.onPageScrollStateChanged(state);
+ }
+ }
+ });
+ if (mFragments.size() > 1) {
+ mViewPager.setCurrentItem(defaultCurrent);
+ }
+
+ cl_0.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zyappstore");
+ }
+ });
+ cl_1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zybrowser");
+ }
+ });
+ cl_2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.safe.uiui");
+ }
+ });
+ cl_3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.mediatek.camera");
+ }
+ });
+ cl_4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(Settings.ACTION_SETTINGS);
+ startActivity(intent);
+ }
+ });
+ cl_5.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.android.gallery3d");
+ }
+ });
+ cl_6.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openQuality();
+ }
+ });
+ cl_7.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_dictionary_PACKAGE_NAME, JxwPackageConfig.JXW_dictionary_CLASS_NAME);
+ }
+ });
+
}
-
-
@Override
public void initData() {
registmNewAppReceiver();
registerUpdateDesktopReceiver();
}
+ @Override
+ public void onConnected() {
+ Log.e(TAG, "onConnected: ");
+ }
+
public static void toggleNotificationListenerService(Context context) {
Log.e(TAG, "toggleNotificationListenerService");
PackageManager pm = context.getPackageManager();
@@ -100,6 +253,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
+
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
@@ -129,11 +283,11 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
return;
}
switch (action) {
- default:
- break;
case Intent.ACTION_MAIN:
- mViewPager.setCurrentItem(defaultCurrent);
+// mMainFragment.setCurrentItem();
+// mViewPager.setCurrentItem(defaultCurrent);
break;
+ default:
}
}
@@ -158,7 +312,40 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
if (agree == 0) {
showPolicyDialog();
} else {
- getData();
+ XXPermissions.with(this)
+ // 申请单个权限
+// .permission(Permission.RECORD_AUDIO)
+ // 申请多个权限
+ .permission(Permission.Group.STORAGE)
+ // 设置权限请求拦截器(局部设置)
+ //.interceptor(new PermissionInterceptor())
+ // 设置不触发错误检测机制(局部设置)
+ //.unchecked()
+ .request(new OnPermissionCallback() {
+
+ @Override
+ public void onGranted(@NonNull List permissions, boolean allGranted) {
+ if (!allGranted) {
+ ToastUtil.show("获取部分权限成功,但部分权限未正常授予");
+ return;
+ }
+// ToastUtil.show("获取录音和日历权限成功");
+ Log.e(TAG, "onGranted: 获取存储权限成功");
+ getData();
+ }
+
+ @Override
+ public void onDenied(@NonNull List permissions, boolean doNotAskAgain) {
+ if (doNotAskAgain) {
+ ToastUtil.show("被永久拒绝授权,请手动授予存储权限");
+ // 如果是被永久拒绝就跳转到应用权限系统设置页面
+ XXPermissions.startPermissionActivity(MainActivity.this, permissions);
+ } else {
+// ToastUtil.show("获取录音和日历权限失败");
+ Log.e(TAG, "onGranted: 获取存储权限权限失败");
+ }
+ }
+ });
}
}
@@ -166,15 +353,14 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart: ");
+ mPresenter.sendAPPUsage();
+ mPresenter.sendRunningInfo();
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause: ");
- if (mHomeWatcher != null) {
- mHomeWatcher.stopWatch();// 在销毁时停止监听,不然会报错的。
- }
}
@Override
@@ -186,7 +372,10 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
@Override
protected void onDestroy() {
super.onDestroy();
- mMainAPresenter.detachView();
+ mPresenter.detachView();
+ if (mHomeWatcher != null) {
+ mHomeWatcher.stopWatch();// 在销毁时停止监听,不然会报错的。
+ }
if (mNewAppReceiver != null) {
unregisterReceiver(mNewAppReceiver);
}
@@ -209,11 +398,31 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
Log.e(TAG, "onRestoreInstanceState: " + System.currentTimeMillis());
}
+ private void hide(View view) {
+ TranslateAnimation mShowAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
+ Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
+ 0.0f, Animation.RELATIVE_TO_SELF, 1.0f);
+ mShowAction.setDuration(300);
+ view.startAnimation(mShowAction);
+ view.setVisibility(View.GONE);
+ }
+
+ private void show(View view) {
+ TranslateAnimation mHiddenAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
+ 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
+ Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF,
+ 0.0f);
+ mHiddenAction.setDuration(300);
+ view.startAnimation(mHiddenAction);
+ view.setVisibility(View.VISIBLE);
+ }
+
+
private void getData() {
- if (!isNotificationListenersEnabled()) {
- ToastUtil.show("请授予\"" + getString(R.string.app_name) + "\"使用通知权");
- gotoNotificationAccessSetting(this);
- }
+// if (!isNotificationListenersEnabled()) {
+// ToastUtil.show("请授予\"" + getString(R.string.app_name) + "\"使用通知权");
+// gotoNotificationAccessSetting(this);
+// }
addHomeWatcher();
}
@@ -347,4 +556,15 @@ public class MainActivity extends BaseActivity implements MainContact.MainView {
Log.e(TAG, "onReceive: " + intent.getAction());
}
}
+
+
+ @Override
+ public void sendAPPUsageFinish() {
+
+ }
+
+ @Override
+ public void sendRunningInfoFinish() {
+
+ }
}
diff --git a/app/src/main/java/com/uiui/zyos/activity/main/MainContact.java b/app/src/main/java/com/uiui/zyos/activity/main/MainContact.java
index 0d3855d..2d6c1d8 100644
--- a/app/src/main/java/com/uiui/zyos/activity/main/MainContact.java
+++ b/app/src/main/java/com/uiui/zyos/activity/main/MainContact.java
@@ -5,10 +5,14 @@ import com.uiui.zyos.base.BaseView;
public class MainContact {
public interface Presenter extends BasePresenter {
-
+ /*上传正在运行的APP*/
+ void sendAPPUsage();
+ /*上传后台运行的APP*/
+ void sendRunningInfo();
}
public interface MainView extends BaseView {
-
+ void sendAPPUsageFinish();
+ void sendRunningInfoFinish();
}
}
diff --git a/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java b/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java
new file mode 100644
index 0000000..f786bca
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java
@@ -0,0 +1,77 @@
+package com.uiui.zyos.adapter;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.uiui.zyos.R;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.utils.ApkUtils;
+import com.uiui.zyos.utils.AppUsedTimeUtils;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AppAdapter extends RecyclerView.Adapter {
+ private Context mContext;
+
+ private List desktopIcons;
+
+ @NonNull
+ @Override
+ public AppHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ mContext = parent.getContext();
+ return new AppHolder(LayoutInflater.from(mContext).inflate(R.layout.item_app, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull AppHolder holder, int position) {
+ DesktopIcon desktopIcon = desktopIcons.get(position);
+ String lable = desktopIcon.getLable();
+ holder.tv_appname.setText(lable);
+ Drawable icon = desktopIcon.getIcon();
+ holder.iv_icon.setImageDrawable(icon);
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp(desktopIcon.getPackageName(), desktopIcon.getClassName());
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return desktopIcons == null ? 0 : desktopIcons.size();
+ }
+
+ public List getDesktopIcons() {
+ return desktopIcons;
+ }
+
+ public void setDesktopIcons(List desktopIcons) {
+ this.desktopIcons = desktopIcons;
+ notifyDataSetChanged();
+ }
+
+ class AppHolder extends RecyclerView.ViewHolder {
+ ConstraintLayout root;
+ TextView tv_appname;
+ ImageView iv_icon;
+
+ public AppHolder(@NonNull View itemView) {
+ super(itemView);
+ root = itemView.findViewById(R.id.root);
+ tv_appname = itemView.findViewById(R.id.tv_appname);
+ iv_icon = itemView.findViewById(R.id.iv_icon);
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/alarm/AlarmOpenHelper.java b/app/src/main/java/com/uiui/zyos/alarm/AlarmOpenHelper.java
new file mode 100644
index 0000000..b2afe53
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/alarm/AlarmOpenHelper.java
@@ -0,0 +1,60 @@
+package com.uiui.zyos.alarm;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.os.Environment;
+
+import java.io.File;
+
+public class AlarmOpenHelper extends SQLiteOpenHelper {
+
+ public static final int DATABASE_VERSION = 1;
+ public static final String DATABASE_NAME = "AlarmDatabase.db";
+// public static final String DATABASE_FILE_NAME = Environment.getExternalStorageDirectory().getPath() + File.separator + DATABASE_NAME;
+
+ public static final String TABLE_ALARM = " AlarmTable";
+
+ public static final String KEY_ID = "id";
+ public static final String KEY_TYPE = "type";
+ public static final String KEY_TIME = "time";
+ public static final String KEY_TITLE = "title";
+ public static final String KEY_VOICE = "voice";
+ public static final String KEY_VOICE_MD5 = "voice_md5";
+ public static final String KEY_FILE = "file";
+ public static final String KEY_REMIND_TYPE = "remind_type";
+ public static final String KEY_IS_ONOFF = "is_onoff";
+ public static final String KEY_FINISHED = "finished";
+
+ String CREATE_ALARM_TABLE = "CREATE TABLE IF NOT EXISTS" + TABLE_ALARM +
+ "("
+ + KEY_ID + " INTEGER PRIMARY KEY,"
+ + KEY_TYPE + " INTEGER,"
+ + KEY_TIME + " TEXT,"
+ + KEY_TITLE + " TEXT,"
+ + KEY_VOICE + " TEXT,"
+ + KEY_VOICE_MD5 + " TEXT,"
+ + KEY_FILE + " TEXT,"
+ + KEY_REMIND_TYPE + " INTEGER,"
+ + KEY_IS_ONOFF + " INTEGER,"
+ + KEY_FINISHED + " BOOLEAN DEFAULT 0"
+ + ")";
+
+ public AlarmOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
+ super(context, name, factory, version);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL(CREATE_ALARM_TABLE);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ if (oldVersion >= newVersion) {
+ return;
+ }
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARM);
+ onCreate(db);
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/alarm/AlarmService.java b/app/src/main/java/com/uiui/zyos/alarm/AlarmService.java
new file mode 100644
index 0000000..39563ec
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/alarm/AlarmService.java
@@ -0,0 +1,16 @@
+package com.uiui.zyos.alarm;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class AlarmService extends Service {
+ public AlarmService() {
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/alarm/AlarmUtils.java b/app/src/main/java/com/uiui/zyos/alarm/AlarmUtils.java
new file mode 100644
index 0000000..2507227
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/alarm/AlarmUtils.java
@@ -0,0 +1,671 @@
+package com.uiui.zyos.alarm;
+
+import android.annotation.SuppressLint;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.arialyy.aria.core.Aria;
+import com.blankj.utilcode.util.FileUtils;
+import com.bumptech.glide.Glide;
+import com.uiui.zyos.bean.AlarmClockData;
+import com.uiui.zyos.service.main.MainService;
+import com.uiui.zyos.utils.FileUtil;
+import com.uiui.zyos.utils.Utils;
+
+import java.io.File;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+public class AlarmUtils {
+ @SuppressLint("StaticFieldLeak")
+ private static AlarmUtils sInstance;
+ private static String TAG = AlarmUtils.class.getSimpleName();
+ private Context mContext;
+ private AlarmManager alarmManager;
+ private SQLiteDatabase db;
+ private AlarmOpenHelper mAlarmOpenHelper;
+
+ public static final int ONE_DAY_TIME = 1000 * 60 * 60 * 24;
+
+
+ private AlarmUtils(Context context) {
+ this.mContext = context;
+// this.mAlarmOpenHelper = new AlarmOpenHelper(context, AlarmOpenHelper.DATABASE_NAME, null, AlarmOpenHelper.DATABASE_VERSION);
+ this.mAlarmOpenHelper = new AlarmOpenHelper(context, AlarmOpenHelper.DATABASE_NAME, null, AlarmOpenHelper.DATABASE_VERSION);
+ this.db = mAlarmOpenHelper.getWritableDatabase();
+ alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ }
+
+ public static void init(Context context) {
+ if (context == null) {
+ throw new RuntimeException("context is NULL");
+ }
+ if (sInstance == null) {
+ sInstance = new AlarmUtils(context);
+ }
+ }
+
+ public static AlarmUtils getInstance() {
+ if (sInstance == null) {
+ throw new IllegalStateException("You must be init AlarmUtils first");
+ }
+ return sInstance;
+ }
+
+ private void open() {
+ if (db == null || !db.isOpen()) {
+ db = mAlarmOpenHelper.getWritableDatabase();
+ }
+ }
+
+ /**
+ * 增加数据
+ *
+ * @param alarmClockData
+ * @return
+ */
+ public boolean addAlarmClock(AlarmClockData alarmClockData) {
+ open();
+ ContentValues values = new ContentValues();
+ values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId());
+ values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType());
+ values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime());
+ values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle());
+ values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice());
+ values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5());
+ values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile());
+ values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type());
+ values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff());
+ long id = 0;
+ db.beginTransaction();
+ try {
+ id = db.insert(AlarmOpenHelper.TABLE_ALARM, null, values);
+ } catch (Exception e) {
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ db.close();
+ return id > 0;
+ }
+
+
+ /**
+ * 更新数据
+ *
+ * @param alarmClockData
+ * @return
+ */
+ public boolean updateAlarmClock(AlarmClockData alarmClockData) {
+ open();
+ ContentValues values = new ContentValues();
+ values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId());
+ values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType());
+ values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime());
+ values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle());
+ values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice());
+ values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5());
+ values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile());
+ values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type());
+ values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff());
+ long id = 0;
+ db.beginTransaction();
+ try {
+ id = db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ db.setTransactionSuccessful();
+ } catch (Exception e) {
+ Log.e(TAG, "updateAlarmClock: " + e.getMessage());
+ } finally {
+ db.endTransaction();
+ }
+ db.close();
+ return id > 0;
+ }
+
+ /**
+ * 批量插入数据
+ *
+ * @param list
+ */
+ public void insertListValues(List list) {
+ open();
+ List contentValuesList = new ArrayList<>();
+ for (AlarmClockData alarmClockData : list) {
+ ContentValues values = new ContentValues();
+ values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId());
+ values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType());
+ values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime());
+ values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle());
+ values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice());
+ values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5());
+ values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile());
+ values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type());
+ values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff());
+ values.put(AlarmOpenHelper.KEY_FINISHED, alarmClockData.isFinished());
+ contentValuesList.add(values);
+ }
+ db.beginTransaction();
+ try {
+ for (ContentValues v : contentValuesList) {
+ db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, v, SQLiteDatabase.CONFLICT_REPLACE);
+ }
+ db.setTransactionSuccessful();
+ } catch (Exception e) {
+ Log.e(TAG, "insertListValues: " + e.getMessage());
+ } finally {
+ db.endTransaction();
+ }
+ db.close();
+ }
+
+ /**
+ * 删除数据
+ *
+ * @param alarmClockData
+ * @return
+ */
+ public boolean deleteAlarmClock(AlarmClockData alarmClockData) {
+ if (alarmClockData == null) {
+ return false;
+ }
+ return deleteAlarmClock(alarmClockData.getId());
+ }
+
+ public boolean deleteAlarmClock(int RowID) {
+ open();
+ long id = 0;
+ db.beginTransaction();
+ try {
+ id = db.delete(AlarmOpenHelper.TABLE_ALARM, "id =" + RowID, null);
+ db.setTransactionSuccessful();
+ } catch (Exception e) {
+ Log.e(TAG, "deleteAlarmClock: " + e.getMessage());
+ } finally {
+ db.endTransaction();
+ }
+ db.close();
+ return id > 0;
+ }
+
+ public void deleteAllAlarmClock() {
+ HashSet pendingIntents = getOldPendingIntents();
+ Iterator pendingIntentIterator = pendingIntents.iterator();
+ while (pendingIntentIterator.hasNext()) {
+ PendingIntent pendingIntent = pendingIntentIterator.next();
+ alarmManager.cancel(pendingIntent);
+ pendingIntentIterator.remove();
+ }
+ List alarmClockData = getAllAlarms();
+ for (AlarmClockData data : alarmClockData) {
+ deleteAlarmClock(data.getId());
+ }
+ }
+
+ /**
+ * 获取所有Alarm
+ *
+ * @return
+ */
+ public List getAllAlarms() {
+ open();
+ List list = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM;
+ open();
+ Cursor cursor = db.rawQuery(selectQuery, null);
+ if (cursor.moveToFirst()) {
+ do {
+ AlarmClockData alarmClockData = new AlarmClockData();
+ alarmClockData.setId(Integer.parseInt(cursor.getString(0)));
+ alarmClockData.setType(cursor.getInt(1));
+ alarmClockData.setTime(cursor.getString(2));
+ alarmClockData.setTitle(cursor.getString(3));
+ alarmClockData.setVoice(cursor.getString(4));
+ alarmClockData.setVoice_md5(cursor.getString(5));
+ alarmClockData.setFile(cursor.getString(6));
+ alarmClockData.setRemind_type(cursor.getInt(7));
+ alarmClockData.setIs_onoff(cursor.getInt(8));
+ if (cursor.getInt(9) == 1) {
+ alarmClockData.setFinished(true);
+ } else {
+ alarmClockData.setFinished(false);
+ }
+ list.add(alarmClockData);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ db.close();
+ return list;
+ }
+
+
+ private HashSet pendingIntents;
+
+ /**
+ * 设置闹钟列表
+ *
+ * @param data
+ */
+ public void setAlarmClockData(List data) {
+ if (pendingIntents == null) {
+ pendingIntents = getOldPendingIntents();
+ }
+ Iterator pendingIntentIterator = pendingIntents.iterator();
+ while (pendingIntentIterator.hasNext()) {
+ PendingIntent pendingIntent = pendingIntentIterator.next();
+ alarmManager.cancel(pendingIntent);
+ pendingIntentIterator.remove();
+ }
+// for (PendingIntent pendingIntent : pendingIntents) {
+//
+// }
+ List newData = mergeData(data);
+ for (AlarmClockData clockData : newData) {
+ setAlarm(clockData);
+ checkResource(clockData.getFile());
+ }
+ insertListValues(newData);
+ }
+
+ private void checkResource(String url) {
+ if (TextUtils.isEmpty(url)) {
+ return;
+ }
+ String fileName = url.substring(url.lastIndexOf("/") + 1, url.length());
+ if (FileUtil.isVideoFile(fileName)) {
+ String realPath = Utils.getDownLoadPath(mContext) + fileName;
+ File file = new File(realPath);
+ if (!file.exists()) {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
+ // .ignoreFilePathOccupy()
+ .create(); //启动下载}
+ }
+ }else if (FileUtil.isPictureFile(fileName)){
+ Glide.with(mContext).load(url);
+ }
+ }
+
+ /**
+ * 合并闹钟列表,删除不存在闹钟
+ *
+ * @param alarmClockDataList
+ * @return
+ */
+ private List mergeData(List alarmClockDataList) {
+ HashMap alarmClockDataMap = new HashMap<>();
+ if (alarmClockDataList != null) {
+ for (AlarmClockData alarmClockData : alarmClockDataList) {
+ alarmClockDataMap.put(alarmClockData.getId(), alarmClockData);
+ }
+ }
+ HashMap oldData = getOldData();
+ List deleteData = new ArrayList<>();
+ for (Map.Entry entry : oldData.entrySet()) {
+ if (alarmClockDataMap.get(entry.getKey()) == null) {
+ deleteData.add(entry.getValue());
+ }
+ }
+ for (AlarmClockData alarmClockData : deleteData) {
+ deleteAlarmClock(alarmClockData);
+ }
+
+ List newData = new ArrayList<>();
+ if (alarmClockDataList == null) {
+ return newData;
+ }
+ for (AlarmClockData alarm : alarmClockDataList) {
+ AlarmClockData oldAlarm = oldData.get(alarm.getId());
+ if (oldAlarm == null) {
+ newData.add(alarm);
+ } else {
+ if (oldAlarm.equals(alarm)) {
+ newData.add(oldAlarm);
+ } else {
+ newData.add(alarm);
+ }
+ }
+ }
+ return newData;
+ }
+
+ /**
+ * 更新完成状态
+ *
+ * @param alarmClockData
+ * @return
+ */
+ public boolean updateAlarmFinished(AlarmClockData alarmClockData) {
+ open();
+ ContentValues values = new ContentValues();
+ values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId());
+ values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType());
+ values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime());
+ values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle());
+ values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice());
+ values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5());
+ values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile());
+ values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type());
+ values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff());
+ values.put(AlarmOpenHelper.KEY_FINISHED, alarmClockData.isFinished());
+ long id = 0;
+ db.beginTransaction();
+ try {
+ id = db.update(AlarmOpenHelper.TABLE_ALARM, values, AlarmOpenHelper.KEY_ID + "=?", new String[]{String.valueOf(alarmClockData.getId())});
+ db.setTransactionSuccessful();
+ } catch (Exception e) {
+ Log.e(TAG, "updateAlarmFinished: " + e.getMessage());
+ } finally {
+ db.endTransaction();
+ }
+ db.close();
+ return id > 0;
+ }
+
+ public HashMap getOldData() {
+ List alarmClockData = getAllAlarms();
+ if (alarmClockData == null || alarmClockData.size() == 0) {
+ return new HashMap<>();
+ } else {
+ HashMap hashMap = new HashMap<>();
+ for (AlarmClockData clockData : alarmClockData) {
+ hashMap.put(clockData.getId(), clockData);
+ }
+ return hashMap;
+ }
+ }
+
+
+ /**
+ * 获取最近一次的闹钟
+ *
+ * @return
+ */
+ public AlarmClockData getRecentAlarmClock() {
+ List alarmClockData = getAllAlarms();
+ if (alarmClockData == null || alarmClockData.size() == 0) {
+ return null;
+ } else {
+ Collections.sort(alarmClockData, new Comparator() {
+ @Override
+ public int compare(AlarmClockData o1, AlarmClockData o2) {
+ if ((o1.getTimeStamp()) <= (o2.getTimeStamp())) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ });
+ return alarmClockData.get(0);
+ }
+ }
+
+ private HashSet getOldPendingIntents() {
+ HashSet pendingIntents = new HashSet<>();
+ HashMap data = getOldData();
+ for (AlarmClockData alarmClockData : data.values()) {
+ pendingIntents.add(getPendingIntent(alarmClockData));
+ }
+ return pendingIntents;
+ }
+
+ private PendingIntent getPendingIntent(AlarmClockData alarmClock) {
+ Intent intent = new Intent(MainService.ALARMWAKEUP);
+ intent.putExtra("title", alarmClock.getTitle());
+ intent.putExtra("id", alarmClock.getId());
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, alarmClock.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ return startPendingIntent;
+ }
+
+ private long getTimestamp(String timeString) {
+ if (TextUtils.isEmpty(timeString)) {
+ return 0;
+ }
+ if (timeString.length() == 5) {
+ String[] timeSplit = timeString.split(":");
+ int hour = Integer.parseInt(timeSplit[0]);
+ int minute = Integer.parseInt(timeSplit[1]);
+ Calendar c = Calendar.getInstance();
+ int year = c.get(Calendar.YEAR);
+ int month = c.get(Calendar.MONTH);
+ int day = c.get(Calendar.DAY_OF_MONTH);
+ c.set(year, month, day, hour, minute, 0);
+ long mTimeInfo = c.getTimeInMillis();
+ Log.e(TAG, "getTimestamp: " + mTimeInfo);
+// long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + ONE_DAY_TIME;
+ return mTimeInfo;
+ } else {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ try {
+ Date date = simpleDateFormat.parse(timeString);
+ long timestamp = date.getTime();
+ Log.e(TAG, "getTimestamp2: " + timestamp);
+ return timestamp;
+ } catch (ParseException e) {
+ return System.currentTimeMillis();
+ }
+ }
+ }
+
+ private long getZeroTiemstamp() {
+ //设置时区
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ long zeroTime = calendar.getTimeInMillis();
+ Log.e(TAG, "getZeroTiemstamp: " + zeroTime);
+ return zeroTime;
+ }
+
+ /*一次性*/
+ public static final int ONCE = 1;
+ /*每天*/
+ public static final int LOOP = 2;
+ /*周一到周五*/
+ public static final int WORKING_DAY = 3;
+ /*休息日*/
+ public static final int OFF_DAY = 4;
+
+ /**
+ * 设置闹钟
+ *
+ * @param alarm
+ */
+ public void setAlarm(AlarmClockData alarm) {
+ int id = alarm.getId();
+ int type = alarm.getType();
+ String timeString = alarm.getTime();
+ String title = alarm.getTitle();
+ Log.e(TAG, "setAlarm: " + title);
+ long timeStamp = getTimestamp(timeString);
+ Log.e(TAG, "setAlarm: " + timeStamp);
+ boolean finished = alarm.isFinished();
+ String url = alarm.getVoice();
+ String md5 = alarm.getVoice_md5();
+ if (!TextUtils.isEmpty(url)) {
+ ariaDownload(url, md5);
+ }
+ switch (type) {
+ case ONCE:
+ if (!finished) {
+ if (timeStamp < System.currentTimeMillis()) {
+ Intent intent = new Intent(MainService.ALARMWAKEUP);
+ intent.putExtra("title", title);
+ intent.putExtra("id", id);
+ mContext.sendBroadcast(intent);
+ } else {
+ setOnceAlarm(MainService.ALARMWAKEUP, title, id, timeStamp);
+ }
+ }
+ break;
+ case LOOP:
+ setDayLoopAlarm(MainService.ALARMWAKEUP, title, id, timeString);
+ break;
+ case WORKING_DAY:
+ setWorkDayAlarm(MainService.ALARMWAKEUP, title, id, timeString);
+ break;
+ case OFF_DAY:
+ setOffDayAlarm(MainService.ALARMWAKEUP, title, id, timeString);
+ break;
+ default:
+ }
+ }
+
+ /**
+ * @param action
+ * @param requestCode
+ * @param timestamp 设置一次性闹钟
+ */
+ public void setOnceAlarm(String action, String extra, int requestCode, long timestamp) {
+ Intent intent = new Intent(action);
+ intent.putExtra("title", extra);
+ intent.putExtra("id", requestCode);
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ pendingIntents.add(startPendingIntent);
+ alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
+ Log.e(TAG, "setOnceAlarm: " + "id: " + requestCode + " title: " + extra + " timeString: " + timestamp);
+ }
+
+ /**
+ * @param action
+ * @param requestCode
+ * @param timeString 设置循环周期为一天的闹钟
+ */
+ public void setDayLoopAlarm(String action, String extra, int requestCode, String timeString) {
+ long timestamp = getTimestamp(timeString);
+ if (System.currentTimeMillis() > timestamp) {
+ timestamp += AlarmManager.INTERVAL_DAY;
+ }
+ Intent intent = new Intent(action);
+ intent.putExtra("title", extra);
+ intent.putExtra("id", requestCode);
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ pendingIntents.add(startPendingIntent);
+ alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
+ Log.e(TAG, "setDayLoopAlarm: " + "title: " + extra + " timeString: " + timestamp);
+// setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp);
+ }
+
+ /**
+ * @param action
+ * @param requestCode
+ * @param timestamp 设置循环周期为一小时的闹钟
+ */
+ public void setHourLoopAlarm(String action, String extra, int requestCode, long timestamp) {
+ setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_HOUR, timestamp);
+ }
+
+ /**
+ * @param action
+ * @param requestCode
+ * @param intervalMillis
+ * @param timestamp 循环闹钟
+ */
+ public void setLoopAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) {
+ Intent intent = new Intent(action);
+ intent.putExtra("title", extra);
+ intent.putExtra("id", requestCode);
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ pendingIntents.add(startPendingIntent);
+ alarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent);
+ Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp);
+ }
+
+ public void setWorkDayAlarm(String action, String extra, int requestCode, String timeString) {
+ long timestamp = getTimestamp(timeString);
+ Calendar calendar = Calendar.getInstance();
+ int day_of_week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+ switch (day_of_week) {
+ case 6:
+ case 7:
+ timestamp += (8 - day_of_week) * AlarmManager.INTERVAL_DAY;
+ break;
+ default:
+ if (System.currentTimeMillis() > timestamp) {
+ timestamp += AlarmManager.INTERVAL_DAY;
+ }
+ break;
+ }
+ Intent intent = new Intent(action);
+ intent.putExtra("title", extra);
+ intent.putExtra("id", requestCode);
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ pendingIntents.add(startPendingIntent);
+ alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
+ Log.e(TAG, "setWorkDayAlarm: " + "title: " + extra + " timeString: " + timestamp);
+ }
+
+ public void setOffDayAlarm(String action, String extra, int requestCode, String timeString) {
+ long timestamp = getTimestamp(timeString);
+ Calendar calendar = Calendar.getInstance();
+ int day_of_week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+ switch (day_of_week) {
+ case 6:
+ if (System.currentTimeMillis() > timestamp) {
+ timestamp += AlarmManager.INTERVAL_DAY;
+ }
+ break;
+ case 7:
+ break;
+ default:
+ timestamp += (6 - day_of_week) * AlarmManager.INTERVAL_DAY;
+ break;
+ }
+ Intent intent = new Intent(action);
+ intent.putExtra("title", extra);
+ intent.putExtra("id", requestCode);
+ PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ pendingIntents.add(startPendingIntent);
+ alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
+ Log.e(TAG, "setOffDayAlarm: " + "title: " + extra + " timeString: " + timestamp);
+ }
+
+
+ public void ariaDownload(String url, String md5) {
+ String fileName = Utils.getFileNamefromURL(url);
+ File file = new File(Utils.getDownLoadPath(mContext) + fileName);
+ if (file.exists() && !file.isDirectory()) {
+ String fileMD5 = FileUtils.getFileMD5ToString(file);
+ Log.e("ariaDownload", "fileOnlineMD5=" + md5);
+ Log.e("ariaDownload", "fileMD5=" + fileMD5);
+ if (!md5.equals(fileMD5)) {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
+// .ignoreFilePathOccupy()
+ .setExtendField(md5)
+ .create(); //启动下载}
+ } else {
+ Log.e("ariaDownload", "fileName = " + fileName + " exists");
+ }
+ } else {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
+// .ignoreFilePathOccupy()
+ .setExtendField(md5)
+ .create(); //启动下载}
+ }
+ }
+
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/base/BaseApplication.java b/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
index 4f75013..0f365f1 100644
--- a/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
+++ b/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
@@ -15,11 +15,14 @@ import com.tencent.android.tpush.XGPushConfig;
import com.tencent.android.tpush.XGPushManager;
import com.tencent.mmkv.MMKV;
import com.uiui.zyos.BuildConfig;
+import com.uiui.zyos.alarm.AlarmUtils;
import com.uiui.zyos.manager.ConnectManager;
import com.uiui.zyos.manager.RemoteManager;
import com.uiui.zyos.network.NetInterfaceManager;
import com.uiui.zyos.push.PushManager;
import com.uiui.zyos.service.main.MainService;
+import com.uiui.zyos.utils.AppUsedTimeUtils;
+import com.uiui.zyos.utils.OpenApkUtils;
import com.uiui.zyos.utils.SystemUtils;
import com.uiui.zyos.utils.Utils;
@@ -49,10 +52,19 @@ public class BaseApplication extends Application {
tpushInit();
aliyunPushInit();
RemoteManager.init(this);
- RemoteManager.getInstance().aliyunPushInit();
+ RemoteManager.setListener(new RemoteManager.ConnectedListener() {
+ @Override
+ public void onConnected() {
+ RemoteManager.getInstance().aliyunPushInit();
+ RemoteManager.getInstance().tpushInit();
+ }
+ });
+ AlarmUtils.init(this);
+ AppUsedTimeUtils.init(this);
+ OpenApkUtils.init(this);
ConnectManager.init(this);
NetInterfaceManager.init(this);
- startService(new Intent(this, MainService.class));
+// startService(new Intent(this, MainService.class));
}
}
@@ -63,19 +75,6 @@ public class BaseApplication extends Application {
public void onSuccess(Object data, int flag) {
//token在设备卸载重装的时候有可能会变
Log.e("TPush", "注册成功,设备token为:" + data);
- List accountInfoList = new ArrayList<>();
- accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), RemoteManager.getInstance().getSerial()));
- XGPushManager.upsertAccounts(getApplicationContext(), accountInfoList, new XGIOperateCallback() {
- @Override
- public void onSuccess(Object data, int flag) {
- Log.e("TPush", "onSuccess, data:" + data + ", flag:" + flag);
- }
-
- @Override
- public void onFail(Object data, int errCode, String msg) {
- Log.e("TPush", "onFail, data:" + data + ", code:" + errCode + ", msg:" + msg);
- }
- });
}
@Override
diff --git a/app/src/main/java/com/uiui/zyos/base/BaseFragment.java b/app/src/main/java/com/uiui/zyos/base/BaseFragment.java
index 469f977..cf59681 100644
--- a/app/src/main/java/com/uiui/zyos/base/BaseFragment.java
+++ b/app/src/main/java/com/uiui/zyos/base/BaseFragment.java
@@ -1,7 +1,9 @@
package com.uiui.zyos.base;
import android.os.Bundle;
+import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
@@ -60,6 +62,12 @@ public abstract class BaseFragment extends Fragment implements LifecycleProvider
lifecycleSubject.onNext(FragmentEvent.CREATE);
}
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
diff --git a/app/src/main/java/com/uiui/zyos/base/BaseLazyFragment.java b/app/src/main/java/com/uiui/zyos/base/BaseLazyFragment.java
new file mode 100644
index 0000000..4a28d7a
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/base/BaseLazyFragment.java
@@ -0,0 +1,100 @@
+package com.uiui.zyos.base;
+
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+/**
+ * Author: wangjie
+ * Email: tiantian.china.2@gmail.com
+ * Date: 1/23/15.
+ */
+public abstract class BaseLazyFragment extends Fragment {
+ private static final String TAG = BaseLazyFragment.class.getSimpleName();
+ private boolean isPrepared;
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ initPrepare();
+ }
+
+
+ /**
+ * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
+ */
+ private boolean isFirstResume = true;
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (isFirstResume) {
+ isFirstResume = false;
+ return;
+ }
+ if (getUserVisibleHint()) {
+ onUserVisible();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getUserVisibleHint()) {
+ onUserInvisible();
+ }
+ }
+
+ private boolean isFirstVisible = true;
+ private boolean isFirstInvisible = true;
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ if (isVisibleToUser) {
+ if (isFirstVisible) {
+ isFirstVisible = false;
+ initPrepare();
+ } else {
+ onUserVisible();
+ }
+ } else {
+ if (isFirstInvisible) {
+ isFirstInvisible = false;
+ onFirstUserInvisible();
+ } else {
+ onUserInvisible();
+ }
+ }
+ }
+
+ public synchronized void initPrepare() {
+ if (isPrepared) {
+ onFirstUserVisible();
+ } else {
+ isPrepared = true;
+ }
+ }
+
+ /**
+ * 第一次fragment可见(进行初始化工作)
+ */
+ public abstract void onFirstUserVisible();
+
+ /**
+ * fragment可见(切换回来或者onResume)
+ */
+ public abstract void onUserVisible();
+
+ /**
+ * 第一次fragment不可见(不建议在此处理事件)
+ */
+ public abstract void onFirstUserInvisible();
+
+ /**
+ * fragment不可见(切换掉或者onPause)
+ */
+ public abstract void onUserInvisible();
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/base/BaseFragmentPagerAdapter.java b/app/src/main/java/com/uiui/zyos/base/viewpager/BaseFragmentPagerAdapter.java
similarity index 99%
rename from app/src/main/java/com/uiui/zyos/base/BaseFragmentPagerAdapter.java
rename to app/src/main/java/com/uiui/zyos/base/viewpager/BaseFragmentPagerAdapter.java
index 72aa5d9..eddcc78 100644
--- a/app/src/main/java/com/uiui/zyos/base/BaseFragmentPagerAdapter.java
+++ b/app/src/main/java/com/uiui/zyos/base/viewpager/BaseFragmentPagerAdapter.java
@@ -1,4 +1,4 @@
-package com.uiui.zyos.base;
+package com.uiui.zyos.base.viewpager;
import android.util.SparseArray;
diff --git a/app/src/main/java/com/uiui/zyos/base/viewpager/SubjectViewPagerAdapter.java b/app/src/main/java/com/uiui/zyos/base/viewpager/SubjectViewPagerAdapter.java
new file mode 100644
index 0000000..fff57cb
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/base/viewpager/SubjectViewPagerAdapter.java
@@ -0,0 +1,31 @@
+package com.uiui.zyos.base.viewpager;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+
+import com.uiui.zyos.base.BaseFragment;
+
+import java.util.List;
+
+public class SubjectViewPagerAdapter extends FragmentPagerAdapter {
+
+ private List mfragmentList;
+
+
+ public SubjectViewPagerAdapter(@NonNull FragmentManager fm) {
+ super(fm);
+ }
+
+ @NonNull
+ @Override
+ public Fragment getItem(int position) {
+ return null;
+ }
+
+ @Override
+ public int getCount() {
+ return 0;
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/adapter/CustomPagerAdapter.java b/app/src/main/java/com/uiui/zyos/base/viewpager/ViewPager2Adapter.java
similarity index 57%
rename from app/src/main/java/com/uiui/zyos/adapter/CustomPagerAdapter.java
rename to app/src/main/java/com/uiui/zyos/base/viewpager/ViewPager2Adapter.java
index 68179bb..6ebd341 100644
--- a/app/src/main/java/com/uiui/zyos/adapter/CustomPagerAdapter.java
+++ b/app/src/main/java/com/uiui/zyos/base/viewpager/ViewPager2Adapter.java
@@ -1,21 +1,28 @@
-package com.uiui.zyos.adapter;
+package com.uiui.zyos.base.viewpager;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import java.util.List;
-public class CustomPagerAdapter extends FragmentStateAdapter {
+public class ViewPager2Adapter extends FragmentStateAdapter {
List fragmentList;
- public CustomPagerAdapter(FragmentManager fm, List fragmentList, Lifecycle lifecycle) {
+ public ViewPager2Adapter(FragmentManager fm, List fragmentList, Lifecycle lifecycle) {
super(fm, lifecycle);
this.fragmentList = fragmentList;
}
+
+ public ViewPager2Adapter(@NonNull FragmentActivity fragmentActivity, List fragments) {
+ super(fragmentActivity);
+ this.fragmentList = fragments;
+ }
+
@NonNull
@Override
public Fragment createFragment(int position) {
diff --git a/app/src/main/java/com/uiui/zyos/bean/AlarmClockData.java b/app/src/main/java/com/uiui/zyos/bean/AlarmClockData.java
new file mode 100644
index 0000000..5a3ed60
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/bean/AlarmClockData.java
@@ -0,0 +1,164 @@
+package com.uiui.zyos.bean;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+import com.uiui.zyos.alarm.AlarmUtils;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class AlarmClockData implements Serializable {
+ private static final long serialVersionUID = -5856502480745183157L;
+
+ int id;
+ int type;//类型 1一次 2循环 3周一到周五 4 周六周日
+ String time;//"2021-11-15 18:33:23",//时间格式化字符串,循环类型是18:33:23
+ String title;//标题
+ String voice;//语音文件地址
+ String voice_md5;
+ String file;//图片或视频文件地址
+ int remind_type;
+ int is_onoff;//0关闭 1开启
+
+ boolean finished = false;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getVoice() {
+ return voice;
+ }
+
+ public void setVoice(String voice) {
+ this.voice = voice;
+ }
+
+ public String getVoice_md5() {
+ return voice_md5;
+ }
+
+ public void setVoice_md5(String voice_md5) {
+ this.voice_md5 = voice_md5;
+ }
+
+ public String getFile() {
+ return file;
+ }
+
+ public void setFile(String file) {
+ this.file = file;
+ }
+
+ public boolean isFinished() {
+ return finished;
+ }
+
+ public void setFinished(boolean finished) {
+ this.finished = finished;
+ }
+
+ public int getRemind_type() {
+ return remind_type;
+ }
+
+ public void setRemind_type(int remind_type) {
+ this.remind_type = remind_type;
+ }
+
+ public int getIs_onoff() {
+ return is_onoff;
+ }
+
+ public void setIs_onoff(int is_onoff) {
+ this.is_onoff = is_onoff;
+ }
+
+ public long getTimeStamp() {
+ if (TextUtils.isEmpty(time)) {
+ return 0L;
+ }
+ if (time.length() == 5) {
+ String[] timeSplit = time.split(":");
+ int hour = Integer.parseInt(timeSplit[0]);
+ int minute = Integer.parseInt(timeSplit[1]);
+ Calendar c = Calendar.getInstance();
+ c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH),
+ c.get(Calendar.DAY_OF_MONTH), hour, minute, 0);
+ long mTimeInfo = c.getTimeInMillis();
+ Log.e("AlarmClockData", "getTimeStamp: " + mTimeInfo);
+ long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + AlarmUtils.ONE_DAY_TIME;
+ return actualTime;
+ } else {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ try {
+ Date date = simpleDateFormat.parse(time);
+ long timestamp = date.getTime();
+ return timestamp;
+ } catch (ParseException e) {
+ return System.currentTimeMillis();
+ }
+ }
+ }
+
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (obj == null) return false;
+ if (!(obj instanceof AlarmClockData)) return false;
+ if (id != ((AlarmClockData) obj).id) return false;
+ if (type != ((AlarmClockData) obj).type) return false;
+ if (!time.equals(((AlarmClockData) obj).time)) return false;
+ if (!title.equals(((AlarmClockData) obj).title)) return false;
+ if (!voice.equals(((AlarmClockData) obj).voice)) return false;
+ if (!voice_md5.equals(((AlarmClockData) obj).voice_md5)) return false;
+ if (!file.equals(((AlarmClockData) obj).file)) return false;
+ if (remind_type != ((AlarmClockData) obj).remind_type) return false;
+ if (is_onoff != ((AlarmClockData) obj).is_onoff) return false;
+
+ return true;
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/bean/DesktopIcon.java b/app/src/main/java/com/uiui/zyos/bean/DesktopIcon.java
index 7c1468e..44290d7 100644
--- a/app/src/main/java/com/uiui/zyos/bean/DesktopIcon.java
+++ b/app/src/main/java/com/uiui/zyos/bean/DesktopIcon.java
@@ -7,6 +7,8 @@ import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
+import androidx.annotation.NonNull;
+
import java.io.Serializable;
public class DesktopIcon implements Serializable, Parcelable {
@@ -114,4 +116,9 @@ public class DesktopIcon implements Serializable, Parcelable {
return desktopIcon;
}
+ @NonNull
+ @Override
+ public String toString() {
+ return packageName + className;
+ }
}
diff --git a/app/src/main/java/com/uiui/zyos/bean/LessonApp.java b/app/src/main/java/com/uiui/zyos/bean/LessonApp.java
new file mode 100644
index 0000000..290b916
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/bean/LessonApp.java
@@ -0,0 +1,79 @@
+package com.uiui.zyos.bean;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class LessonApp implements Serializable {
+ private static final long serialVersionUID = -7239207868023265592L;
+
+ int id;
+ List app;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public List getApp() {
+ return app;
+ }
+
+ public void setApp(List app) {
+ this.app = app;
+ }
+
+ public class App implements Serializable {
+ private static final long serialVersionUID = -3442928771696560097L;
+
+ int id;
+ String app_package;
+ String app_md5;
+ String app_url;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getApp_package() {
+ return app_package;
+ }
+
+ public void setApp_package(String app_package) {
+ this.app_package = app_package;
+ }
+
+ public String getApp_md5() {
+ return app_md5;
+ }
+
+ public void setApp_md5(String app_md5) {
+ this.app_md5 = app_md5;
+ }
+
+ public String getApp_url() {
+ return app_url;
+ }
+
+ public void setApp_url(String app_url) {
+ this.app_url = app_url;
+ }
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/bean/LessonJson.java b/app/src/main/java/com/uiui/zyos/bean/LessonJson.java
new file mode 100644
index 0000000..6d6eb79
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/bean/LessonJson.java
@@ -0,0 +1,64 @@
+package com.uiui.zyos.bean;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class LessonJson implements Serializable {
+ private static final long serialVersionUID = 6825242822560631014L;
+
+ int is_lesson;
+ String start_time;
+ String end_time;
+ int is_monitor;
+ String pkgs;
+
+ public int getIs_lesson() {
+ return is_lesson;
+ }
+
+ public void setIs_lesson(int is_lesson) {
+ this.is_lesson = is_lesson;
+ }
+
+ public String getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(String start_time) {
+ this.start_time = start_time;
+ }
+
+ public String getEnd_time() {
+ return end_time;
+ }
+
+ public void setEnd_time(String end_time) {
+ this.end_time = end_time;
+ }
+
+ public int getIs_monitor() {
+ return is_monitor;
+ }
+
+ public void setIs_monitor(int is_monitor) {
+ this.is_monitor = is_monitor;
+ }
+
+ public String getPkgs() {
+ return pkgs;
+ }
+
+ public void setPkgs(String pkgs) {
+ this.pkgs = pkgs;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/bean/LessonSetting.java b/app/src/main/java/com/uiui/zyos/bean/LessonSetting.java
new file mode 100644
index 0000000..ffcaa7e
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/bean/LessonSetting.java
@@ -0,0 +1,64 @@
+package com.uiui.zyos.bean;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class LessonSetting implements Serializable {
+ private static final long serialVersionUID = -6129161360078961573L;
+
+ int id;
+ int is_lesson;//是否开启网课模式 0否1是
+ String start_time;//可用时段 开始时间
+ String end_time;//可用时段 结束时间
+ int is_monitor;//是否开启网课监控 0否1是
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getIs_lesson() {
+ return is_lesson;
+ }
+
+ public void setIs_lesson(int is_lesson) {
+ this.is_lesson = is_lesson;
+ }
+
+ public String getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(String start_time) {
+ this.start_time = start_time;
+ }
+
+ public String getEnd_time() {
+ return end_time;
+ }
+
+ public void setEnd_time(String end_time) {
+ this.end_time = end_time;
+ }
+
+ public int getIs_monitor() {
+ return is_monitor;
+ }
+
+ public void setIs_monitor(int is_monitor) {
+ this.is_monitor = is_monitor;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/bean/SnInfo.java b/app/src/main/java/com/uiui/zyos/bean/SnInfo.java
index 3b58ca2..e1391f5 100644
--- a/app/src/main/java/com/uiui/zyos/bean/SnInfo.java
+++ b/app/src/main/java/com/uiui/zyos/bean/SnInfo.java
@@ -24,9 +24,11 @@ public class SnInfo implements Serializable {
String is_lock;
String is_reset;
String grade;
- String name;
int admin_id;
String mobile;
+ String avatar;
+ long binding_time;
+
/*
*3 商用——企业用户
@@ -143,12 +145,12 @@ public class SnInfo implements Serializable {
this.is_reset = is_reset;
}
- public String getName() {
- return name;
+ public String getGrade() {
+ return grade;
}
- public void setName(String name) {
- this.name = name;
+ public void setGrade(String grade) {
+ this.grade = grade;
}
public int getAdmin_id() {
@@ -159,12 +161,28 @@ public class SnInfo implements Serializable {
this.admin_id = admin_id;
}
- public String getGrade() {
- return grade;
+ public String getMobile() {
+ return mobile;
}
- public void setGrade(String grade) {
- this.grade = grade;
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public long getBinding_time() {
+ return binding_time;
+ }
+
+ public void setBinding_time(long binding_time) {
+ this.binding_time = binding_time;
}
public int getType_id() {
@@ -175,14 +193,6 @@ public class SnInfo implements Serializable {
this.type_id = type_id;
}
- public String getMobile() {
- return mobile;
- }
-
- public void setMobile(String mobile) {
- this.mobile = mobile;
- }
-
@NonNull
@Override
public String toString() {
diff --git a/app/src/main/java/com/uiui/zyos/config/CommonConfig.java b/app/src/main/java/com/uiui/zyos/config/CommonConfig.java
index 86485d6..0c34b9d 100644
--- a/app/src/main/java/com/uiui/zyos/config/CommonConfig.java
+++ b/app/src/main/java/com/uiui/zyos/config/CommonConfig.java
@@ -1,6 +1,14 @@
package com.uiui.zyos.config;
public class CommonConfig {
+ public static final String MMKV_ID = "InterProcessKV";
+
+ public static final String CLOUD_LESSON_SETTINGS_KEY = "cloud_lesson_settings_key";
+
+ public static final String isLogined = "isLogined";
+ public static final String AES_KEY = "0123456789ABCDEF";
+
+
/*是否激活接口请求缓存*/
public static final String ACTIVATIONBEAN_KEY = "UIUI_ACTIVATIONBEAN_KEY";
/*是否激活*/
diff --git a/app/src/main/java/com/uiui/zyos/dialog/FoundationDialog.java b/app/src/main/java/com/uiui/zyos/dialog/FoundationDialog.java
new file mode 100644
index 0000000..623e71d
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/dialog/FoundationDialog.java
@@ -0,0 +1,76 @@
+package com.uiui.zyos.dialog;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.uiui.zyos.R;
+
+public class FoundationDialog extends AlertDialog {
+ private Context mContext;
+ private OnClickListener mOnClickListener;
+
+ private ConstraintLayout cl_pinyin;
+ private ConstraintLayout cl_stroke;
+ private ConstraintLayout cl_radicals;
+ private ConstraintLayout cl_order;
+
+ public FoundationDialog(@NonNull Context context) {
+ super(context, R.style.CustomDialog);
+ this.mContext = context;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.foundation_dialog);
+ cl_pinyin = findViewById(R.id.cl_pinyin);
+ cl_stroke = findViewById(R.id.cl_stroke);
+ cl_radicals = findViewById(R.id.cl_radicals);
+ cl_order = findViewById(R.id.cl_order);
+ cl_pinyin.setOnClickListener(view -> {
+ if (mOnClickListener!=null) {
+ mOnClickListener.onClickListener1();
+ }
+ });
+ cl_stroke.setOnClickListener(view -> {
+ if (mOnClickListener!=null) {
+ mOnClickListener.onClickListener2();
+ }
+ });
+ cl_radicals.setOnClickListener(view -> {
+ if (mOnClickListener!=null) {
+ mOnClickListener.onClickListener3();
+ }
+ });
+ cl_order.setOnClickListener(view -> {
+ if (mOnClickListener!=null) {
+ mOnClickListener.onClickListener4();
+ }
+ });
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ }
+
+ public void setOnClickListener(OnClickListener onClickListener){
+ this.mOnClickListener = onClickListener;
+ }
+
+ public interface OnClickListener{
+ void onClickListener1();
+ void onClickListener2();
+ void onClickListener3();
+ void onClickListener4();
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/disklrucache/CacheHelper.java b/app/src/main/java/com/uiui/zyos/disklrucache/CacheHelper.java
index 70ed83f..bb29c4c 100644
--- a/app/src/main/java/com/uiui/zyos/disklrucache/CacheHelper.java
+++ b/app/src/main/java/com/uiui/zyos/disklrucache/CacheHelper.java
@@ -9,6 +9,7 @@ import android.util.Log;
import com.jakewharton.disklrucache.DiskLruCache;
import com.tencent.mmkv.BuildConfig;
import com.tencent.mmkv.MMKV;
+import com.uiui.zyos.config.CommonConfig;
import org.json.JSONArray;
import org.json.JSONException;
@@ -31,7 +32,7 @@ import java.io.Serializable;
public class CacheHelper {
private static final String TAG = CacheHelper.class.getSimpleName();
- private MMKV mMMKV = MMKV.defaultMMKV();
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
private static final String DIR_NAME = "diskCache";
private static final int MAX_COUNT = 5 * 1024 * 1024;
diff --git a/app/src/main/java/com/uiui/zyos/fragment/biology/BiologyFragment.java b/app/src/main/java/com/uiui/zyos/fragment/biology/BiologyFragment.java
index 31d39e7..a616dc3 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/biology/BiologyFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/biology/BiologyFragment.java
@@ -1,21 +1,43 @@
package com.uiui.zyos.fragment.biology;
+import android.app.Activity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link BiologyFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class BiologyFragment extends Fragment {
+public class BiologyFragment extends BaseFragment {
+ private static final String TAG = BiologyFragment.class.getSimpleName();
+
+ @BindView(R.id.imageView1)
+ ImageView imageView1;
+ @BindView(R.id.imageView2)
+ ImageView imageView2;
+ @BindView(R.id.imageView3)
+ ImageView imageView3;
+ @BindView(R.id.imageView4)
+ ImageView imageView4;
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +49,7 @@ public class BiologyFragment extends Fragment {
public BiologyFragment() {
// Required empty public constructor
+ Log.e(TAG, "BiologyFragment: " );
}
/**
@@ -54,12 +77,65 @@ public class BiologyFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_biology, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_biology, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
}
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView(){
+ imageView1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|生物");
+ }
+ });
+ imageView2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/生物|e:JWFD");
+ }
+ });
+ imageView3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openLaboratory("生物实验室");
+ }
+ });
+ imageView4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("1");
+ }
+ });
+
+ }
+
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/chemical/ChemicalFragment.java b/app/src/main/java/com/uiui/zyos/fragment/chemical/ChemicalFragment.java
index c46bf1b..4dee22f 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/chemical/ChemicalFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/chemical/ChemicalFragment.java
@@ -1,21 +1,44 @@
package com.uiui.zyos.fragment.chemical;
+import android.app.Activity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link ChemicalFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class ChemicalFragment extends Fragment {
+public class ChemicalFragment extends BaseFragment {
+ private static final String TAG = ChemicalFragment.class.getSimpleName();
+
+ @BindView(R.id.imageView1)
+ ImageView imageView1;
+ @BindView(R.id.imageView2)
+ ImageView imageView2;
+ @BindView(R.id.imageView3)
+ ImageView imageView3;
+ @BindView(R.id.imageView4)
+ ImageView imageView4;
+
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +50,7 @@ public class ChemicalFragment extends Fragment {
public ChemicalFragment() {
// Required empty public constructor
+ Log.e(TAG, "ChemicalFragment: ");
}
/**
@@ -54,12 +78,65 @@ public class ChemicalFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_chemical, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_chemical, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
}
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView() {
+ imageView1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|化学");
+ }
+ });
+ imageView2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/化学|e:JWFD");
+ }
+ });
+ imageView3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openLaboratory("化学实验室");
+ }
+ });
+ imageView4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("1");
+ }
+ });
+
+ }
+
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/chinese/ChineseFragment.java b/app/src/main/java/com/uiui/zyos/fragment/chinese/ChineseFragment.java
index 44fa95d..086e08f 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/chinese/ChineseFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/chinese/ChineseFragment.java
@@ -12,19 +12,23 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import com.blankj.utilcode.util.NetworkUtils;
import com.uiui.zyos.R;
import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.dialog.FoundationDialog;
+import com.uiui.zyos.jxw.JxwPackageConfig;
import com.uiui.zyos.manager.RemoteManager;
+import com.uiui.zyos.utils.OpenApkUtils;
import com.uiui.zyos.utils.Utils;
-import java.util.Calendar;
-import java.util.Date;
-
+import butterknife.BindView;
import butterknife.ButterKnife;
@@ -36,8 +40,30 @@ import butterknife.ButterKnife;
public class ChineseFragment extends BaseFragment implements ChineseContact.ChineseView, NetworkUtils.OnNetworkStatusChangedListener {
private static final String TAG = ChineseFragment.class.getSimpleName();
+ @BindView(R.id.iv_sync_video)
+ ImageView iv_sync_video;
+ @BindView(R.id.tv_more_app)
+ TextView tv_more_app;
+ @BindView(R.id.cl_tutoring)
+ ConstraintLayout cl_tutoring;
+ @BindView(R.id.cl_near_antonyms)
+ ConstraintLayout cl_near_antonyms;
+ @BindView(R.id.cl_composition)
+ ConstraintLayout cl_composition;
+ @BindView(R.id.cl_read)
+ ConstraintLayout cl_read;
+ @BindView(R.id.cl_rhetoric)
+ ConstraintLayout cl_rhetoric;
+ @BindView(R.id.cl_classical)
+ ConstraintLayout cl_classical;
+ @BindView(R.id.iv_dictation)
+ ImageView iv_dictation;
+ @BindView(R.id.iv_character)
+ ImageView iv_character;
+ @BindView(R.id.iv_foundation)
+ ImageView iv_foundation;
- private View rootView;
+ private View rootView;// 设置为全局的
private Activity mContext;
private ChinesePresenter mChinesePresenter;
@@ -62,6 +88,7 @@ public class ChineseFragment extends BaseFragment implements ChineseContact.Chin
public ChineseFragment() {
// Required empty public constructor
+ Log.e(TAG, "ChineseFragment: ");
}
/**
@@ -90,6 +117,7 @@ public class ChineseFragment extends BaseFragment implements ChineseContact.Chin
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
}
@Override
@@ -107,21 +135,125 @@ public class ChineseFragment extends BaseFragment implements ChineseContact.Chin
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
- rootView = inflater.inflate(R.layout.fragment_chinese, container, false);
- mContext = (Activity) rootView.getContext();
- mChinesePresenter = new ChinesePresenter(mContext);
- mChinesePresenter.attachView(this);
- mChinesePresenter.setLifecycle(lifecycleSubject);
- ButterKnife.bind(this, rootView);
- initView();
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_chinese, container, false);
+ mContext = (Activity) rootView.getContext();
+ mChinesePresenter = new ChinesePresenter(mContext);
+ mChinesePresenter.attachView(this);
+ mChinesePresenter.setLifecycle(lifecycleSubject);
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
return rootView;
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
private void initView() {
Log.e(TAG, "initView: " + Utils.getBatteryLevel(mContext));
registerBatteryReceiver();
registTimeReceiver();
mContext.registerReceiver(mbatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ iv_sync_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|语文");
+ }
+ });
+ tv_more_app.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ }
+ });
+ cl_tutoring.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/语文|e:JWFD");
+ }
+ });
+ cl_near_antonyms.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_NEAR_ANTONYMS_PACKAGE_NAME,JxwPackageConfig.JXW_NEAR_ANTONYMS_CLASS_NAME);
+ }
+ });
+ cl_composition.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openComposition();
+ }
+ });
+ cl_read.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_READING_PACKAGE_NAME,JxwPackageConfig.JXW_READING_CLASS_NAME);
+ }
+ });
+ cl_rhetoric.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("d:/同步学习/语文|e:JWFD");
+ }
+ });
+ cl_classical.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("f:/ansystem/固化数据/中学文言文.JXW");
+ }
+ });
+
+ iv_dictation.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("1");
+ }
+ });
+ iv_character.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_CHARACTER_PACKAGE_NAME,JxwPackageConfig.JXW_CHARACTER_CLASS_NAME);
+ }
+ });
+ iv_foundation.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ FoundationDialog foundationDialog = new FoundationDialog(mContext);
+ foundationDialog.setOnClickListener(new FoundationDialog.OnClickListener() {
+ @Override
+ public void onClickListener1() {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_PINYIN_PACKAGE_NAME,JxwPackageConfig.JXW_PINYIN_CLASS_NAME);
+ }
+
+ @Override
+ public void onClickListener2() {
+ OpenApkUtils.getInstance().openAppWithoutArgs( JxwPackageConfig.JXW_BIHUA_PACKAGE_NAME, JxwPackageConfig.JXW_BIHUA_CLASS_NAME);
+ }
+
+ @Override
+ public void onClickListener3() {
+ OpenApkUtils.getInstance().openAppWithoutArgs( JxwPackageConfig.JXW_PIANPANG_PACKAGE_NAME, JxwPackageConfig.JXW_PIANPANG_CLASS_NAME);
+
+ }
+
+ @Override
+ public void onClickListener4() {
+ OpenApkUtils.getInstance().openAppWithoutArgs( JxwPackageConfig.JXW_BISHUN_PACKAGE_NAME, JxwPackageConfig.JXW_BISHUN_CLASS_NAME);
+ }
+ });
+ foundationDialog.show();
+ }
+ });
}
private void initData() {
@@ -240,19 +372,6 @@ public class ChineseFragment extends BaseFragment implements ChineseContact.Chin
}
}
- // 根据日期取得星期几
- public static String getWeek() {
- Date date = new Date();
- String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int weekIndex = cal.get(Calendar.DAY_OF_WEEK) - 1;
- if (weekIndex < 0) {
- weekIndex = 0;
- }
- return weeks[weekIndex];
- }
-
@Override
public void onDestroy() {
super.onDestroy();
diff --git a/app/src/main/java/com/uiui/zyos/fragment/complex/ComplexFragment.java b/app/src/main/java/com/uiui/zyos/fragment/complex/ComplexFragment.java
new file mode 100644
index 0000000..8a45962
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/fragment/complex/ComplexFragment.java
@@ -0,0 +1,190 @@
+package com.uiui.zyos.fragment.complex;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.fragment.app.Fragment;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.jxw.JxwPackageConfig;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link ComplexFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class ComplexFragment extends BaseFragment {
+ private static final String TAG = ComplexFragment.class.getSimpleName();
+
+ @BindView(R.id.cl_politics_video)
+ ConstraintLayout cl_politics_video;
+ @BindView(R.id.cl_politics_coach)
+ ConstraintLayout cl_politics_coach;
+ @BindView(R.id.cl_history_video)
+ ConstraintLayout cl_history_video;
+ @BindView(R.id.cl_history_coach)
+ ConstraintLayout cl_history_coach;
+ @BindView(R.id.cl_geography_video)
+ ConstraintLayout cl_geography_video;
+ @BindView(R.id.cl_geography_coach)
+ ConstraintLayout cl_geography_coach;
+ @BindView(R.id.cl_science_video)
+ ConstraintLayout cl_science_video;
+ @BindView(R.id.cl_science_coach)
+ ConstraintLayout cl_science_coach;
+
+ @BindView(R.id.iv_video)
+ ImageView iv_video;
+ @BindView(R.id.iv_famous_teacher)
+ ImageView iv_famous_teacher;
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+
+ public ComplexFragment() {
+ // Required empty public constructor
+ Log.e(TAG, "ComplexFragment: ");
+ }
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment ComplexFragment.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static ComplexFragment newInstance(String param1, String param2) {
+ ComplexFragment fragment = new ComplexFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_complex, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
+ }
+
+ private void initView() {
+ cl_politics_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|政治");
+ }
+ });
+ cl_politics_coach.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/政治|e:JWFD");
+ }
+ });
+ cl_history_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|历史");
+ }
+ });
+ cl_history_coach.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/历史|e:JWFD");
+ }
+ });
+ cl_geography_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|地理");
+ }
+ });
+ cl_geography_coach.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/地理|e:JWFD");
+ }
+ });
+ cl_science_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|科学");
+ }
+ });
+ cl_science_coach.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/科学|e:JWFD");
+ }
+ });
+ iv_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|政治");
+ }
+ });
+ iv_famous_teacher.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_teacher_PACKAGE_NAME, JxwPackageConfig.JXW_teacher_CLASS_NAME);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/english/EnglishFragment.java b/app/src/main/java/com/uiui/zyos/fragment/english/EnglishFragment.java
index b92ade9..9319366 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/english/EnglishFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/english/EnglishFragment.java
@@ -1,21 +1,51 @@
package com.uiui.zyos.fragment.english;
+import android.app.Activity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.jxw.JxwPackageConfig;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link EnglishFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class EnglishFragment extends Fragment {
+public class EnglishFragment extends BaseFragment {
+ private static final String TAG = EnglishFragment.class.getSimpleName();
+
+ @BindView(R.id.imageView5)
+ ImageView imageView5;
+ @BindView(R.id.imageView6)
+ ImageView imageView6;
+ @BindView(R.id.imageView7)
+ ImageView imageView7;
+ @BindView(R.id.imageView8)
+ ImageView imageView8;
+ @BindView(R.id.imageView9)
+ ImageView imageView9;
+ @BindView(R.id.imageView10)
+ ImageView imageView10;
+ @BindView(R.id.imageView11)
+ ImageView imageView11;
+
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +57,7 @@ public class EnglishFragment extends Fragment {
public EnglishFragment() {
// Required empty public constructor
+ Log.e(TAG, "EnglishFragment: " );
}
/**
@@ -54,12 +85,81 @@ public class EnglishFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_english, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_english, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView(){
+ imageView5.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|英语");
+ }
+ });
+ imageView6.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/英语|e:JWFD");
+ }
+ });
+ imageView7.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_SOUNDMARK_PACKAGE_NAME,JxwPackageConfig.JXW_SOUNDMARK_CLASS_NAME);
+ }
+ });
+ imageView8.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_TRANSLATE_PACKAGE_NAME,JxwPackageConfig.JXW_TRANSLATE_CLASS_NAME);
+ }
+ });
+ imageView9.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_MEMORIZE_WORDS_PACKAGE_NAME,JxwPackageConfig.JXW_MEMORIZE_WORDS_CLASS_NAME);
+ }
+ });
+ imageView10.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_ORAL_TEST_PACKAGE_NAME,JxwPackageConfig.JXW_ORAL_TEST_CLASS_NAME);
+ }
+ });
+ imageView11.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("1");
+ }
+ });
}
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/main/MainFragment.java b/app/src/main/java/com/uiui/zyos/fragment/main/MainFragment.java
index 0631e16..21ec8f7 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/main/MainFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/main/MainFragment.java
@@ -1,32 +1,30 @@
package com.uiui.zyos.fragment.main;
-import android.app.Activity;
+import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
+import android.provider.Settings;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import com.flyco.tablayout.SlidingTabLayout;
import com.uiui.zyos.R;
import com.uiui.zyos.base.BaseFragment;
-import com.uiui.zyos.base.BaseFragmentPagerAdapter;
-import com.uiui.zyos.fragment.biology.BiologyFragment;
-import com.uiui.zyos.fragment.chemical.ChemicalFragment;
-import com.uiui.zyos.fragment.chinese.ChineseFragment;
-import com.uiui.zyos.fragment.english.EnglishFragment;
-import com.uiui.zyos.fragment.math.MathFragment;
-import com.uiui.zyos.fragment.physics.PhysicsFragment;
+import com.uiui.zyos.base.viewpager.BaseFragmentPagerAdapter;
+import com.uiui.zyos.fragment.subject.SubjectFragment;
+import com.uiui.zyos.fragment.user.UserFragment;
+import com.uiui.zyos.utils.OpenApkUtils;
import com.uiui.zyos.view.ScaleCircleNavigator;
import net.lucode.hackware.magicindicator.MagicIndicator;
-import net.lucode.hackware.magicindicator.ViewPagerHelper;
import java.util.ArrayList;
import java.util.List;
@@ -40,25 +38,43 @@ import butterknife.ButterKnife;
* create an instance of this fragment.
*/
public class MainFragment extends BaseFragment implements MainContact.MainView {
+ private static final String TAG = MainFragment.class.getSimpleName();
- @BindView(R.id.main_sliding_tab_layout)
- SlidingTabLayout main_sliding_tab_layout;
@BindView(R.id.viewPager)
ViewPager mViewPager;
@BindView(R.id.magicIndicator)
MagicIndicator mMagicIndicator;
- private MainFPresenter mPresenter;
+ @BindView(R.id.cl_0)
+ ConstraintLayout cl_0;
+ @BindView(R.id.cl_1)
+ ConstraintLayout cl_1;
+ @BindView(R.id.cl_2)
+ ConstraintLayout cl_2;
+ @BindView(R.id.cl_3)
+ ConstraintLayout cl_3;
+ @BindView(R.id.cl_4)
+ ConstraintLayout cl_4;
+ @BindView(R.id.cl_5)
+ ConstraintLayout cl_5;
+ @BindView(R.id.cl_6)
+ ConstraintLayout cl_6;
+ @BindView(R.id.cl_7)
+ ConstraintLayout cl_7;
+
+ private MainFPresenter mPresenter;
private View rootView;
private FragmentActivity mContext;
+
private ScaleCircleNavigator scaleCircleNavigator;
private FragmentManager mFragmentManager;
// private FragmentTransaction mFragmentTransaction;
private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter;
+
private List mFragments;
- private int defaultCurrent = 0;
- private String[] title = new String[]{"语文", "数学", "英语", "物理", "化学", "生物", "其他",};
+ private SubjectFragment mSubjectFragment;
+ private int defaultCurrent = 1;
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
@@ -71,6 +87,7 @@ public class MainFragment extends BaseFragment implements MainContact.MainView {
public MainFragment() {
// Required empty public constructor
+ Log.e(TAG, "MainFragment: ");
}
/**
@@ -98,25 +115,48 @@ public class MainFragment extends BaseFragment implements MainContact.MainView {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- rootView = inflater.inflate(R.layout.fragment_main, container, false);
- mContext = (FragmentActivity) rootView.getContext();
- mPresenter = new MainFPresenter(mContext);
- ButterKnife.bind(this, rootView);
- initView();
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_main, container, false);
+ mContext = (FragmentActivity) rootView.getContext();
+ mPresenter = new MainFPresenter(mContext);
+ mPresenter.attachView(this);
+ mPresenter.setLifecycle(lifecycleSubject);
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
return rootView;
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
@Override
public void fetchData() {
+ Log.e(TAG, "fetchData: ");
initData();
}
+ public void setCurrentItem() {
+ mViewPager.setCurrentItem(defaultCurrent);
+ mSubjectFragment.setCurrentItem();
+ }
+
private void initView() {
mFragmentManager = getChildFragmentManager();
// mFragmentTransaction = mFragmentManager.beginTransaction();
@@ -124,16 +164,12 @@ public class MainFragment extends BaseFragment implements MainContact.MainView {
mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments);
// fragmentTransaction.add(R.id.viewPager, appListFragment);
// fragmentTransaction.commit();
- mFragments.add(new ChineseFragment());
- mFragments.add(new MathFragment());
- mFragments.add(new EnglishFragment());
- mFragments.add(new PhysicsFragment());
- mFragments.add(new ChemicalFragment());
- mFragments.add(new BiologyFragment());
- mFragments.add(new ChineseFragment());
+ mFragments.add(new UserFragment());
+ mSubjectFragment = new SubjectFragment();
+ mFragments.add(mSubjectFragment);
scaleCircleNavigator = new ScaleCircleNavigator(mContext);
- scaleCircleNavigator.setCircleCount(mFragments.size());
+ scaleCircleNavigator.setCircleCount(1 + mSubjectFragment.getFragmentSize());
scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY);
scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY);
scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() {
@@ -144,13 +180,104 @@ public class MainFragment extends BaseFragment implements MainContact.MainView {
});
mViewPager.setAdapter(mBaseFragmentPagerAdapter);
- mViewPager.setOffscreenPageLimit(4);
+ mViewPager.setOffscreenPageLimit(8);
mMagicIndicator.setNavigator(scaleCircleNavigator);
- ViewPagerHelper.bind(mMagicIndicator, mViewPager);
+// ViewPagerHelper.bind(mMagicIndicator, mViewPager);
+ mSubjectFragment.setPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ mMagicIndicator.onPageScrolled(position + 1, positionOffset, positionOffsetPixels);
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ mMagicIndicator.onPageSelected(position + 1);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ mMagicIndicator.onPageScrollStateChanged(state + 1);
+ }
+ });
+ mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+// Log.e(TAG, "onPageScrolled: position = " + position + " positionOffset = " + positionOffset + " positionOffsetPixels = " + positionOffsetPixels);
+ if (position <= 1) {
+ mMagicIndicator.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ Log.e(TAG, "onPageSelected: position = " + position);
+ if (position <= 1) {
+ mMagicIndicator.onPageSelected(position);
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ Log.e(TAG, "onPageSelected: state = " + state);
+ if (state <= 1) {
+ mMagicIndicator.onPageScrollStateChanged(state);
+ }
+ }
+ });
if (mFragments.size() > 1) {
mViewPager.setCurrentItem(defaultCurrent);
}
- main_sliding_tab_layout.setViewPager(mViewPager, title);
+
+ cl_0.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zyappstore");
+ }
+ });
+ cl_1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zybrowser");
+ }
+ });
+ cl_2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.safe.uiui");
+ }
+ });
+ cl_3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.android.camera");
+ }
+ });
+ cl_4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(Settings.ACTION_SETTINGS);
+ startActivity(intent);
+ }
+ });
+ cl_5.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.android.gallery3d.app");
+ }
+ });
+ cl_6.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zyappstore");
+ }
+ });
+ cl_7.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openApp("com.uiui.zyappstore");
+ }
+ });
+
}
private void initData() {
diff --git a/app/src/main/java/com/uiui/zyos/fragment/math/MathFragment.java b/app/src/main/java/com/uiui/zyos/fragment/math/MathFragment.java
index 6a701b5..8bf5d5b 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/math/MathFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/math/MathFragment.java
@@ -1,21 +1,54 @@
package com.uiui.zyos.fragment.math;
+import android.app.Activity;
import android.os.Bundle;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.jxw.JxwPackageConfig;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link MathFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class MathFragment extends Fragment {
+public class MathFragment extends BaseFragment {
+ private static final String TAG = MathFragment.class.getSimpleName();
+
+ @BindView(R.id.iv_sync_video)
+ ImageView iv_sync_video;
+ @BindView(R.id.cl_tutoring)
+ ConstraintLayout cl_tutoring;
+ @BindView(R.id.cl_near_antonyms)
+ ConstraintLayout cl_near_antonyms;
+ @BindView(R.id.cl_composition)
+ ConstraintLayout cl_composition;
+ @BindView(R.id.cl_read)
+ ConstraintLayout cl_read;
+ @BindView(R.id.cl_rhetoric)
+ ConstraintLayout cl_rhetoric;
+ @BindView(R.id.cl_classical)
+ ConstraintLayout cl_classical;
+ @BindView(R.id.iv_precision_learning)
+ ImageView iv_precision_learning;
+
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +60,7 @@ public class MathFragment extends Fragment {
public MathFragment() {
// Required empty public constructor
+ Log.e(TAG, "MathFragment: ");
}
/**
@@ -54,12 +88,88 @@ public class MathFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_math, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_math, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView() {
+ iv_sync_video.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|数学");
+ }
+ });
+ cl_tutoring.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/数学|e:JWFD");
+
+ }
+ });
+ cl_near_antonyms.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("f:/ansystem/固化数据/小学应用题训练.JXW");
+ }
+ });
+ cl_composition.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("f:/ansystem/固化数据/小学奥数训练.JXW");
+ }
+ });
+ cl_read.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("f:/ansystem/固化数据/中学方程精解.JXW");
+ }
+ });
+ cl_rhetoric.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSolidifiedData("f:/ansystem/固化数据/小学趣味数学.JXW");
+ }
+ });
+ cl_classical.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openAppWithoutArgs(JxwPackageConfig.JXW_ARITHMETIC_PACKAGE_NAME,JxwPackageConfig.JXW_ARITHMETIC_CLASS_NAME);
+ }
+ });
+ iv_precision_learning.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("2");
+ }
+ });
}
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/physics/PhysicsFragment.java b/app/src/main/java/com/uiui/zyos/fragment/physics/PhysicsFragment.java
index 3a99406..44a77c3 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/physics/PhysicsFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/physics/PhysicsFragment.java
@@ -1,21 +1,43 @@
package com.uiui.zyos.fragment.physics;
+import android.app.Activity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.utils.OpenApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link PhysicsFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class PhysicsFragment extends Fragment {
+public class PhysicsFragment extends BaseFragment {
+ private static final String TAG = PhysicsFragment.class.getSimpleName();
+
+ @BindView(R.id.imageView1)
+ ImageView imageView1;
+ @BindView(R.id.imageView2)
+ ImageView imageView2;
+ @BindView(R.id.imageView3)
+ ImageView imageView3;
+ @BindView(R.id.imageView4)
+ ImageView imageView4;
+
+ private View rootView;// 设置为全局的
+ private Activity mContext;
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +49,7 @@ public class PhysicsFragment extends Fragment {
public PhysicsFragment() {
// Required empty public constructor
+ Log.e(TAG, "PhysicsFragment: " );
}
/**
@@ -54,12 +77,64 @@ public class PhysicsFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_physics, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_physics, container, false);
+ mContext = (Activity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView(){
+ imageView1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSyncVideo("同步视频|物理");
+ }
+ });
+ imageView2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openSynchronousTutoring("d:/同步学习/物理|e:JWFD");
+ }
+ });
+ imageView3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openLaboratory("物理实验室");
+ }
+ });
+ imageView4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ OpenApkUtils.getInstance().openPrecision("1");
+ }
+ });
+
}
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/subject/SubjectFragment.java b/app/src/main/java/com/uiui/zyos/fragment/subject/SubjectFragment.java
new file mode 100644
index 0000000..fffd3c0
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/fragment/subject/SubjectFragment.java
@@ -0,0 +1,173 @@
+package com.uiui.zyos.fragment.subject;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.viewpager.widget.ViewPager;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.flyco.tablayout.SlidingTabLayout;
+import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.base.viewpager.BaseFragmentPagerAdapter;
+import com.uiui.zyos.fragment.biology.BiologyFragment;
+import com.uiui.zyos.fragment.chemical.ChemicalFragment;
+import com.uiui.zyos.fragment.chinese.ChineseFragment;
+import com.uiui.zyos.fragment.complex.ComplexFragment;
+import com.uiui.zyos.fragment.english.EnglishFragment;
+import com.uiui.zyos.fragment.math.MathFragment;
+import com.uiui.zyos.fragment.physics.PhysicsFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link SubjectFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class SubjectFragment extends BaseFragment {
+ private static final String TAG = SubjectFragment.class.getSimpleName();
+
+ @BindView(R.id.main_sliding_tab_layout)
+ SlidingTabLayout main_sliding_tab_layout;
+ @BindView(R.id.viewPager)
+ ViewPager mViewPager;
+
+ private String[] title = new String[]{"语文", "数学", "英语", "物理", "化学", "生物", "综合",};
+
+ private View rootView;
+ private FragmentActivity mContext;
+ private ChineseFragment mChineseFragment;
+ private MathFragment mMathFragment;
+ private EnglishFragment mEnglishFragment;
+ private PhysicsFragment mPhysicsFragment;
+ private ChemicalFragment mChemicalFragment;
+ private BiologyFragment mBiologyFragment;
+ private ComplexFragment mComplexFragment;
+
+ private List mFragments;
+ private FragmentManager mFragmentManager;
+ private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter;
+ private ViewPager.OnPageChangeListener mListener;
+ private int defaultCurrent = 0;
+
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+
+ public SubjectFragment() {
+ // Required empty public constructor
+ Log.e(TAG, "SubjectFragment: ");
+ mFragments = new ArrayList<>();
+ mChineseFragment =new ChineseFragment();
+ mMathFragment = new MathFragment();
+ mEnglishFragment =new EnglishFragment();
+ mPhysicsFragment= new PhysicsFragment();
+ mChemicalFragment =new ChemicalFragment();
+ mBiologyFragment =new BiologyFragment();
+ mComplexFragment=new ComplexFragment();
+ mFragments.add(mChineseFragment);
+ mFragments.add(mMathFragment);
+ mFragments.add(mEnglishFragment);
+ mFragments.add(mPhysicsFragment);
+ mFragments.add(mChemicalFragment);
+ mFragments.add(mBiologyFragment);
+ mFragments.add(mComplexFragment);
+ }
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment SubjectFragment.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static SubjectFragment newInstance(String param1, String param2) {
+ SubjectFragment fragment = new SubjectFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ Log.e(TAG, "onCreate: ");
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_subject, container, false);
+ mContext = (FragmentActivity) rootView.getContext();
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
+ }
+
+ public int getFragmentSize() {
+ Log.e(TAG, "getFragmentSize: ");
+ return mFragments == null ? 0 : mFragments.size();
+ }
+
+ public void setCurrentItem() {
+ mViewPager.setCurrentItem(defaultCurrent);
+ }
+
+ public void setPageChangeListener(ViewPager.OnPageChangeListener listener) {
+ this.mListener = listener;
+ }
+
+ private void initView() {
+ mFragmentManager = getChildFragmentManager();
+ mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments);
+ mViewPager.setAdapter(mBaseFragmentPagerAdapter);
+ mViewPager.setOffscreenPageLimit(7);
+ mViewPager.setOnPageChangeListener(mListener);
+ main_sliding_tab_layout.setViewPager(mViewPager, title);
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/user/UserContact.java b/app/src/main/java/com/uiui/zyos/fragment/user/UserContact.java
new file mode 100644
index 0000000..bf4d176
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/fragment/user/UserContact.java
@@ -0,0 +1,27 @@
+package com.uiui.zyos.fragment.user;
+
+import android.graphics.Bitmap;
+
+import com.uiui.zyos.base.BasePresenter;
+import com.uiui.zyos.base.BaseView;
+import com.uiui.zyos.bean.BaseResponse;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.bean.SnInfo;
+
+import java.util.ArrayList;
+
+public class UserContact {
+ public interface Presenter extends BasePresenter {
+ /*获取设备信息*/
+ void getSnInfo();
+ void getQrCode();
+ void getInstalledApp();
+
+ }
+
+ public interface UserView extends BaseView {
+ void setSnInfo(BaseResponse response);
+ void setQrCode(Bitmap bitmap);
+ void setInstalledApp( ArrayList desktopIcons);
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java b/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
index 72083ce..ee5be5e 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
@@ -1,21 +1,99 @@
package com.uiui.zyos.fragment.user;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+import com.shehuan.niv.NiceImageView;
+import com.tencent.mmkv.MMKV;
import com.uiui.zyos.R;
+import com.uiui.zyos.adapter.AppAdapter;
+import com.uiui.zyos.base.BaseFragment;
+import com.uiui.zyos.bean.BaseResponse;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.bean.SnInfo;
+import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.utils.TimeUtils;
+import com.uiui.zyos.utils.ToastUtil;
+import com.uiui.zyos.view.RecyclerViewSpacesItemDecoration;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
* Use the {@link UserFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class UserFragment extends Fragment {
+public class UserFragment extends BaseFragment implements UserContact.UserView {
+ private static final String TAG = UserFragment.class.getSimpleName();
+
+ @BindView(R.id.iv_avatar)
+ NiceImageView iv_avatar;
+ @BindView(R.id.tv_name)
+ TextView tv_name;
+ @BindView(R.id.tv_grade)
+ TextView tv_grade;
+ @BindView(R.id.iv_speaker)
+ ImageView iv_speaker;
+ @BindView(R.id.tv_notification)
+ TextView tv_notification;
+ @BindView(R.id.cl_nodata)
+ ConstraintLayout cl_nodata;
+ @BindView(R.id.cl_usedata)
+ ConstraintLayout cl_usedata;
+ @BindView(R.id.tv_percent)
+ TextView tv_percent;
+ @BindView(R.id.tv_duration)
+ TextView tv_duration;
+ @BindView(R.id.cl_activation)
+ ConstraintLayout cl_activation;
+ @BindView(R.id.tv_date1)
+ TextView tv_date1;
+ @BindView(R.id.iv_applet_qrcode)
+ NiceImageView iv_applet_qrcode;
+ @BindView(R.id.iv_device_qrcode)
+ NiceImageView iv_device_qrcode;
+ @BindView(R.id.cl_app)
+ ConstraintLayout cl_app;
+ @BindView(R.id.tv_date2)
+ TextView tv_date2;
+ @BindView(R.id.cl_more)
+ ConstraintLayout cl_more;
+ @BindView(R.id.rv_app)
+ RecyclerView rv_app;
+ @BindView(R.id.iv_nodata)
+ ImageView iv_nodata;
+
+ private AppAdapter mAppAdapter;
+
+ private UserPresenter mPresenter;
+ private View rootView;
+ private FragmentActivity mContext;
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -27,6 +105,7 @@ public class UserFragment extends Fragment {
public UserFragment() {
// Required empty public constructor
+ Log.e(TAG, "UserFragment: " );
}
/**
@@ -54,12 +133,248 @@ public class UserFragment extends Fragment {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
+ Log.e(TAG, "onCreate: ");
+ }
+
+ @Override
+ public void fetchData() {
+ Log.e(TAG, "fetchData: ");
+ mPresenter.getSnInfo();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_user, container, false);
+ Log.e(TAG, "onCreateView: ");
+ if (null != rootView) {
+ ViewGroup parent = (ViewGroup) rootView.getParent();
+ if (null != parent) {
+ parent.removeView(rootView);
+ }
+ } else { // 如ongoing果rootView为空 ,就实例化该视图
+ rootView = inflater.inflate(R.layout.fragment_user, container, false);
+ mContext = (FragmentActivity) rootView.getContext();
+ mPresenter = new UserPresenter(mContext);
+ mPresenter.attachView(this);
+ mPresenter.setLifecycle(lifecycleSubject);
+ ButterKnife.bind(this, rootView);
+ initView();
+ }
+ return rootView;
}
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ rootView = null;
+ }
+
+ private void initView() {
+ Log.e(TAG, "initView: ");
+ registerOwnReceiver();
+ String name = mMMKV.decodeString("USERINFO_NAME", "");
+ if (TextUtils.isEmpty(name)) {
+ tv_name.setText(getString(R.string.default_name));
+ } else {
+ tv_name.setText(name);
+ }
+ String grade = mMMKV.decodeString("USERINFO_GRADE", "");
+ if (TextUtils.isEmpty(grade)) {
+ tv_grade.setText(getString(R.string.default_grade));
+ } else {
+ tv_grade.setText(grade);
+ }
+ int logined = mMMKV.decodeInt(CommonConfig.isLogined, 0);
+ if (logined == 1) {
+ cl_nodata.setVisibility(View.GONE);
+ cl_usedata.setVisibility(View.VISIBLE);
+ cl_activation.setVisibility(View.GONE);
+ cl_app.setVisibility(View.VISIBLE);
+ }
+ String avatar = mMMKV.decodeString("USERINFO_AVATAR", "");
+ Glide.with(iv_avatar).load(avatar).error(R.drawable.default_avatar).into(iv_avatar);
+ tv_date1.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
+ tv_date2.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
+ rv_app.setLayoutManager(new GridLayoutManager(mContext, 4));
+
+ HashMap stringIntegerHashMap = new HashMap<>();
+ WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+ DisplayMetrics dm = new DisplayMetrics();
+ wm.getDefaultDisplay().getRealMetrics(dm);
+ float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.TOP_DECORATION, (int) (density * 1));//top间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 1));//底部间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 20));//左间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 20));//右间距
+ rv_app.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap));
+
+ mAppAdapter = new AppAdapter();
+ rv_app.setAdapter(mAppAdapter);
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ Log.e(TAG, "setUserVisibleHint: " + isVisibleToUser);
+ if (isVisibleToUser && isViewInitiated) {
+ mPresenter.getInstalledApp();
+ mPresenter.getSnInfo();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ Log.e(TAG, "onResume: ");
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Log.e(TAG, "onDestroy: ");
+ unregisterOwnReceiver();
+ }
+
+ @Override
+ public void setSnInfo(BaseResponse response) {
+ if (response != null) {
+ //设备已经绑定
+ switch (response.code) {
+ case 200://设备已经绑定
+ SnInfo snInfo = response.data;
+ Glide.with(iv_avatar).load(snInfo.getAvatar()).error(R.drawable.default_avatar).into(iv_avatar);
+ String name = snInfo.getSn_name();
+ String grade = snInfo.getGrade();
+ if (TextUtils.isEmpty(name)) {
+ tv_name.setText(getString(R.string.default_name));
+ } else {
+ tv_name.setText(name);
+ }
+ if (TextUtils.isEmpty(grade)) {
+ tv_grade.setText(getString(R.string.default_grade));
+ } else {
+ tv_grade.setText(grade);
+ }
+ cl_nodata.setVisibility(View.GONE);
+ cl_usedata.setVisibility(View.VISIBLE);
+ cl_activation.setVisibility(View.GONE);
+ cl_app.setVisibility(View.VISIBLE);
+ break;
+ case 300: //设备没有绑定
+ case 400://没有授权的设备
+ case 403://设备归属不存在
+ tv_name.setText(getString(R.string.unbind));
+ tv_grade.setText(getString(R.string.notset));
+ cl_nodata.setVisibility(View.VISIBLE);
+ cl_usedata.setVisibility(View.GONE);
+ cl_activation.setVisibility(View.VISIBLE);
+ cl_app.setVisibility(View.GONE);
+ break;
+ case 402://sn不存在
+ ToastUtil.show(getString(R.string.device_unauthorized));
+ Log.e(TAG, "setSnInfo: " + getString(R.string.device_unauthorized));
+ tv_name.setText(getString(R.string.device_unauthorized));
+ tv_grade.setText(getString(R.string.device_unauthorized));
+ cl_nodata.setVisibility(View.GONE);
+ cl_usedata.setVisibility(View.GONE);
+ cl_activation.setVisibility(View.GONE);
+ cl_app.setVisibility(View.GONE);
+ break;
+ default:
+ }
+ }
+ mPresenter.getQrCode();
+ }
+
+ @Override
+ public void setQrCode(Bitmap bitmap) {
+ iv_device_qrcode.setImageBitmap(bitmap);
+ }
+
+ @Override
+ public void setInstalledApp(ArrayList desktopIcons) {
+ Log.e(TAG, "setInstalledApp: " + desktopIcons);
+ if (desktopIcons == null || desktopIcons.size() == 0) {
+ iv_nodata.setVisibility(View.VISIBLE);
+ } else {
+ iv_nodata.setVisibility(View.GONE);
+ mAppAdapter.setDesktopIcons(desktopIcons);
+ }
+ }
+
+ private void registerOwnReceiver() {
+ registerTimeReceiver();
+ registerRefreshReceiver();
+ }
+
+ private void unregisterOwnReceiver() {
+ if (mTimeChangedReceiver != null) {
+ mContext.unregisterReceiver(mTimeChangedReceiver);
+ }
+ if (mRefreshReceiver != null) {
+ mContext.unregisterReceiver(mRefreshReceiver);
+ }
+ }
+
+
+ private TimeChangedReceiver mTimeChangedReceiver;
+
+ /**
+ * 监听时间和日期变化
+ */
+ private void registerTimeReceiver() {
+ mTimeChangedReceiver = new TimeChangedReceiver();
+ IntentFilter filter = new IntentFilter();
+ filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+ filter.addAction(Intent.ACTION_DATE_CHANGED);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ mContext.registerReceiver(mTimeChangedReceiver, filter);
+ }
+
+ private class TimeChangedReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ Log.e(TAG, "TimeChangedReceiver:" + action);
+
+ switch (action) {
+ case Intent.ACTION_DATE_CHANGED:
+ case Intent.ACTION_TIME_CHANGED:
+ case Intent.ACTION_TIMEZONE_CHANGED:
+ case Intent.ACTION_TIME_TICK:
+ tv_date1.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
+ tv_date2.setText(TimeUtils.getDateAndWeek(System.currentTimeMillis()));
+ default:
+ break;
+ }
+ }
+ }
+
+ public static final String ACTION_REFRESH_BINDING_STATUS = "RefreshBindingStatus";
+
+ private void registerRefreshReceiver() {
+ if (mRefreshReceiver == null) {
+ mRefreshReceiver = new RefreshReceiver();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ACTION_REFRESH_BINDING_STATUS);
+ mContext.registerReceiver(mRefreshReceiver, filter);
+ }
+ }
+
+ private RefreshReceiver mRefreshReceiver;
+
+ private class RefreshReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ Log.e(TAG, "TimeChangedReceiver:" + action);
+ if (ACTION_REFRESH_BINDING_STATUS.equals(action)) {
+ mPresenter.getSnInfo();
+ }
+ }
+ }
+
}
diff --git a/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java b/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java
new file mode 100644
index 0000000..afa8230
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java
@@ -0,0 +1,105 @@
+package com.uiui.zyos.fragment.user;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.trello.rxlifecycle4.android.FragmentEvent;
+import com.uiui.zyos.bean.BaseResponse;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.bean.SnInfo;
+import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.disklrucache.CacheHelper;
+import com.uiui.zyos.manager.RemoteManager;
+import com.uiui.zyos.network.NetInterfaceManager;
+import com.uiui.zyos.network.UrlAddress;
+import com.uiui.zyos.utils.ApkUtils;
+import com.uiui.zyos.utils.CXAESUtil;
+import com.uiui.zyos.utils.Utils;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+public class UserPresenter implements UserContact.Presenter {
+ private static final String TAG = UserPresenter.class.getSimpleName();
+ private UserContact.UserView mView;
+ private Context mContext;
+ private CacheHelper mCacheHelper;
+
+ public UserPresenter(Context context) {
+ this.mContext = context;
+ this.mCacheHelper = new CacheHelper(context);
+ }
+
+ private BehaviorSubject lifecycle;
+
+ void setLifecycle(BehaviorSubject lifecycle) {
+ this.lifecycle = lifecycle;
+ }
+
+ public BehaviorSubject getLifecycle() {
+ return lifecycle;
+ }
+
+ @Override
+ public void attachView(@NonNull UserContact.UserView view) {
+ this.mView = view;
+ }
+
+ @Override
+ public void detachView() {
+ this.mView = null;
+ }
+
+ @Override
+ public void getSnInfo() {
+ NetInterfaceManager.getInstance().getSnInfo(getLifecycle(), new NetInterfaceManager.ObserverCallback() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.e("getSnInfo", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(BaseResponse response) {
+ Log.e("getSnInfo", "onNext: " + response);
+ mView.setSnInfo(response);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Log.e("getSnInfo", "onError: " + e.getMessage());
+ String jsonString = mCacheHelper.getAsString(UrlAddress.SNINFO);
+ Gson gson = new Gson();
+ Type type = new TypeToken>() {
+ }.getType();
+ BaseResponse userInfoBaseResponse = gson.fromJson(jsonString, type);
+ mView.setSnInfo(userInfoBaseResponse);
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("getSnInfo", "onComplete: ");
+ }
+ });
+ }
+
+ @Override
+ public void getQrCode() {
+ String encryptString = CXAESUtil.encrypt(CommonConfig.AES_KEY, RemoteManager.getInstance().getSerial());
+ Log.e("getQRCode", "setImageAndText: " + encryptString);
+ Bitmap bitmap = Utils.createQRImage(encryptString, 400, 400);
+ mView.setQrCode(bitmap);
+ }
+
+ @Override
+ public void getInstalledApp() {
+ ArrayList desktopIcons = ApkUtils.queryFilterAppInfo(mContext);
+ mView.setInstalledApp(desktopIcons);
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/gson/GsonUtils.java b/app/src/main/java/com/uiui/zyos/gson/GsonUtils.java
new file mode 100644
index 0000000..4f49994
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/gson/GsonUtils.java
@@ -0,0 +1,144 @@
+package com.uiui.zyos.gson;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+
+public class GsonUtils {
+ //https://blog.csdn.net/zte1055889498/article/details/122400299
+
+ public static JsonObject getJsonObject(String jsonString) {
+ JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
+ return jsonObject;
+ }
+
+ private static final Gson gson;
+
+ static {
+ GsonBuilder builder = new GsonBuilder();
+ builder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory());
+ builder.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter());
+ builder.registerTypeAdapter(int.class, new IntegerDefault0Adapter());
+ builder.disableHtmlEscaping();
+ builder.enableComplexMapKeySerialization();
+ // builder.excludeFieldsWithoutExposeAnnotation();
+ builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
+ gson = builder.create();
+ }
+
+ public static Type makeJavaType(Type rawType, Type... typeArguments) {
+ return TypeToken.getParameterized(rawType, typeArguments).getType();
+ }
+
+ public static String toString(Object value) {
+ if (Objects.isNull(value)) {
+ return null;
+ }
+ if (value instanceof String) {
+ return (String) value;
+ }
+ return toJSONString(value);
+ }
+
+ public static String toJSONString(Object value) {
+ return gson.toJson(value);
+ }
+
+ public static String toPrettyString(Object value) {
+ return gson.newBuilder().setPrettyPrinting().create().toJson(value);
+ }
+
+ public static JsonElement fromJavaObject(Object value) {
+ JsonElement result = null;
+ if (Objects.nonNull(value) && (value instanceof String)) {
+ result = parseObject((String) value);
+ } else {
+ result = gson.toJsonTree(value);
+ }
+ return result;
+ }
+
+ public static JsonElement parseObject(String content) {
+ return JsonParser.parseString(content);
+ }
+
+ public static JsonElement getJsonElement(JsonObject node, String name) {
+ return node.get(name);
+ }
+
+ public static JsonElement getJsonElement(JsonArray node, int index) {
+ return node.get(index);
+ }
+
+ public static T toJavaObject(JsonElement node, Class clazz) {
+ return gson.fromJson(node, clazz);
+ }
+
+ public static T toJavaObject(JsonElement node, Type type) {
+ return gson.fromJson(node, type);
+ }
+
+ public static T toJavaObject(JsonElement node, TypeToken> typeToken) {
+ return toJavaObject(node, typeToken.getType());
+ }
+
+ public static List toJavaList(JsonElement node, Class clazz) {
+ return toJavaObject(node, makeJavaType(List.class, clazz));
+ }
+
+ public static List